Imprimir la fórmula

8

Introducción

En química hay un tipo de extensión, extensión .xyz, ( https://en.wikipedia.org/wiki/XYZ_file_format ), que imprime en cada línea un elemento químico y las coordenadas en el plano del elemento. Esto es muy útil para que los químicos comprendan los compuestos químicos y visualicen los compuestos en 3D. Pensé que sería divertido , dado un archivo .xyz, imprimir la fórmula química.

Desafío

Dado un archivo .xyz, imprima la fórmula química del compuesto en cualquier lenguaje de programación en el menor número posible de bytes . Nota:

  • Originalmente, la entrada debía darse como un archivo. Como me han señalado, esto limita el desafío. Por lo tanto , puede suponer que la entrada es una lista / matriz de cadenas, cada una de las cuales representa una línea del archivo .xyz.
  • No hay restricciones en el orden de los elementos.
  • Cada elemento debe imprimirse con un guión bajo "_" delimitando el elemento y la cantidad de veces que aparece
  • Las dos primeras líneas de cualquier archivo .xyz es el número de elementos y una línea de comentario (tenlo en cuenta).

Ejemplo de entrada y salida

Suponga que tiene un archivo p.xyz que contiene lo siguiente (donde la primera línea es el número de elementos y la segunda un comentario), ingrese:

5  
A mystery chemical formula...  
Ba      0.000   0.000  0.000  
Hf      0.5     0.5    0.5  
O       0.5     0.5    0.000  
O       0.5     0.000  0.5  
O       0.000   0.5    0.5  

Salida:
Ba_1Hf_1O_3


Pruebas

Una prueba rápida es con el ejemplo mencionado. Una prueba más exhaustiva es la siguiente: dado que el archivo de prueba tiene miles de líneas, compartiré el archivo .xyz:
https://gist.github.com/nachonavarro/1e95cb8bbbc644af3c44

McGuire
fuente
Requerir que se lea la entrada de un archivo de forma innecesaria e injusta prohíbe que una parte muy importante de los lenguajes de programación participe en su desafío. Ver: meta.codegolf.stackexchange.com/a/8077/3808 , meta.codegolf.stackexchange.com/q/2447/3808
Doorknob
@Doorknob Buen punto. He cambiado eso.
McGuire
2
@Mego ¿qué tal ahora? :)
McGuire
55
¿Cuál es la respuesta para el caso de prueba grande?
Maltysen
3
¿Importa el pedido en la salida?
Trauma digital el

Respuestas:

2

Japt, 21 bytes

U=¢m¸mg)â £X+'_+Uè_¥X

¡Pruébelo en línea! La entrada se proporciona como un conjunto de cadenas (que pueden formatearse como en el enlace).

Sin golfos y explicación

U=¢   m¸  mg)â £    X+'_+Uè_  ¥ X
U=Us2 mqS mg)â mXYZ{X+'_+UèZ{Z==X

          // Implicit: U = input array of strings
Us2       // Slice off the first two items of U.
mqS mg    // Map each item by splitting at spaces, then taking the first item.
U=    )   // Set U to the result.
â mXYZ{   // Uniquify, then map each item X to:
UèZ{Z==X  //  Count the number of items Z in U where Z == X.
X+'_+     //  Prepend X and an underscore.
          // Implicit output
ETHproducciones
fuente
0

Utilidades Shell + GNU, 67

sed '1d;2d;s/ .*//'|sort|uniq -c|sed -Ez 's/\s*(\S+) (\S+)/\2_\1/g'

Pruébalo en línea.

Trauma digital
fuente
1d;2d1,2d
manatwork
Solo porque los espacios finales en la salida no están prohibidos:tail -n+3|cut -c-3|sort|uniq -c|sed -rz 's/\s*(\S+) (\S+)/\2_\1/g'
manatwork
0

Mathematica, 79 53 bytes

StringRiffle[Tally@StringExtract[#[[3;;]],1],"","_"]&

Bastante sencillo.

LegionMammal978
fuente