Drucken Sie die Formel

8

Einführung

In der Chemie gibt es eine Art von Erweiterung, die .xyz-Erweiterung ( https://en.wikipedia.org/wiki/XYZ_file_format ), die in jeder Zeile ein chemisches Element und die Koordinaten in der Ebene des Elements druckt. Dies ist für Chemiker sehr nützlich, um chemische Verbindungen zu verstehen und die Verbindungen in 3D zu visualisieren. Ich dachte, es würde Spaß machen , mit einer .xyz-Datei die chemische Formel auszudrucken.

Herausforderung

Drucken Sie bei einer .xyz-Datei die chemische Formel der Verbindung in einer beliebigen Programmiersprache in der kleinstmöglichen Anzahl von Bytes . Hinweis:

  • Ursprünglich sollte die Eingabe als Datei erfolgen. Wie ich bereits erwähnt habe, schränkt dies die Herausforderung ein. Daher können Sie annehmen, dass die Eingabe eine Liste / ein Array von Zeichenfolgen ist, die jeweils eine Zeile der .xyz-Datei darstellen.
  • Es gibt keine Einschränkungen bei der Reihenfolge der Elemente.
  • Jedes Element sollte mit einem Unterstrich "_" gedruckt werden, der das Element und die Häufigkeit seines Auftretens begrenzt
  • Die ersten beiden Zeilen einer .xyz-Datei sind die Anzahl der Elemente und eine Kommentarzeile (beachten Sie dies).

Beispiel für Ein- und Ausgabe

Angenommen, Sie haben eine Datei p.xyz , die Folgendes enthält (wobei die erste Zeile die Anzahl der Elemente und die zweite einen Kommentar enthält):

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  

Ausgabe:
Ba_1Hf_1O_3


Testen

Ein schneller Test ist mit dem genannten Beispiel. Ein gründlicherer Test ist der folgende: Da die Testdatei Tausende von Zeilen umfasst, werde ich die .xyz-Datei freigeben:
https://gist.github.com/nachonavarro/1e95cb8bbbc644af3c44

McGuire
quelle
Das unnötige und unfaire Lesen von Eingaben aus einer Datei verhindert, dass ein sehr großer Teil der Programmiersprachen an Ihrer Herausforderung teilnimmt. Siehe: meta.codegolf.stackexchange.com/a/8077/3808 , meta.codegolf.stackexchange.com/q/2447/3808
Türknauf
@ Doorknob Guter Punkt. Ich habe das geändert.
McGuire
2
@ Mego wie wäre es jetzt? :)
McGuire
5
Was ist die Antwort für den großen Testfall?
Maltysen
3
Ist die Bestellung in der Ausgabe wichtig?
Digitales Trauma

Antworten:

2

Japt, 21 Bytes

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

Testen Sie es online! Die Eingabe erfolgt als Array von Zeichenfolgen (die wie im Link formatiert werden können).

Ungolfed und Erklärung

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
ETH-Produktionen
quelle
0

Shell + GNU Utilities, 67

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

Probieren Sie es online aus.

Digitales Trauma
quelle
1d;2d1,2d
Manatwork
Nur weil nachgestellte Leerzeichen in der Ausgabe nicht verboten sind: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],"","_"]&

Ziemlich einfach.

LegionMammal978
quelle