Imprimir a fórmula

8

Introdução

Na química, existe um tipo de extensão, extensão .xyz, ( https://en.wikipedia.org/wiki/XYZ_file_format ), que imprime em cada linha um elemento químico e as coordenadas no plano do elemento. Isso é muito útil para os químicos entenderem os compostos químicos e visualizarem os compostos em 3D. Eu pensei que seria divertido , dado um arquivo .xyz, imprimir a fórmula química.

Desafio

Dado um arquivo .xyz, imprima a fórmula química do composto em qualquer linguagem de programação no menor número possível de bytes . Nota:

  • Originalmente, a entrada deveria ser fornecida como um arquivo. Como fui indicado, isso restringe o desafio. Portanto, você pode assumir que a entrada é uma lista / matriz de seqüências de caracteres, cada uma representando uma linha do arquivo .xyz.
  • Não há restrições na ordem dos elementos.
  • Cada elemento deve ser impresso com um sublinhado "_", delimitando o elemento e o número de vezes que aparece
  • As duas primeiras linhas de qualquer arquivo .xyz são o número de elementos e uma linha de comentário (lembre-se disso).

Exemplo de entrada e saída

Suponha que você tenha um arquivo p.xyz que contenha o seguinte (onde a primeira linha é o número de elementos e a segunda um comentário), insira:

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  

Saída:
Ba_1Hf_1O_3


Teste

Um teste rápido é com o exemplo mencionado. Um teste mais completo é o seguinte: como o arquivo de teste possui milhares de linhas, compartilharei o arquivo .xyz:
https://gist.github.com/nachonavarro/1e95cb8bbbc644af3c44

McGuire
fonte
Exigir que a entrada seja lida de um arquivo desnecessariamente e injustamente proíbe que uma parte muito significativa das linguagens de programação participe do seu desafio. Veja: meta.codegolf.stackexchange.com/a/8077/3808 , meta.codegolf.stackexchange.com/q/2447/3808
Maçaneta da
@Doorknob Bom ponto. Eu mudei isso.
26416 McGuire
2
@ Megego e agora? :)
McGuire
5
qual é a resposta para o grande caso de teste?
Maltysen
3
O pedido é importante na saída?
Digital Trauma

Respostas:

2

Japonês, 21 bytes

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

Teste online! A entrada é fornecida como uma matriz de strings (que pode ser formatada como no link).

Ungolfed e explicação

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
ETHproductions
fonte
0

Utilitários Shell + GNU, 67

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

Experimente online.

Trauma Digital
fonte
1d;2d1,2d
manatwork
Só porque os espaços finais na saída não são proibidos: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],"","_"]&

Bem simples.

LegionMammal978
fonte