Cetak Formula

8

pengantar

Dalam kimia ada jenis ekstensi, ekstensi .xyz, ( https://en.wikipedia.org/wiki/XYZ_file_format ), yang mencetak pada setiap baris elemen kimia, dan koordinat dalam bidang elemen. Ini sangat berguna bagi ahli kimia untuk memahami senyawa kimia dan memvisualisasikan senyawa dalam 3D. Saya pikir akan menyenangkan untuk, mengingat file .xyz, mencetak formula kimia.

Tantangan

Diberikan file .xyz, cetak rumus kimia senyawa dalam bahasa pemrograman apa pun dalam jumlah sekecil mungkin byte . catatan:

  • Awalnya, input harus diberikan sebagai file. Seperti yang telah saya tunjukkan, ini membatasi tantangan. Oleh karena itu Anda dapat mengasumsikan input adalah daftar / array string, masing-masing mewakili baris file .xyz.
  • Tidak ada batasan dalam pemesanan elemen.
  • Setiap elemen harus dicetak dengan garis bawah "_" yang membatasi elemen dan berapa kali elemen itu muncul
  • Dua baris pertama dari setiap file .xyz adalah jumlah elemen, dan baris komentar (ingatlah itu).

Contoh Input dan Output

Misalkan Anda memiliki file p.xyz yang berisi yang berikut (di mana baris pertama adalah jumlah elemen, dan yang kedua komentar), masukan:

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  

Keluaran:
Ba_1Hf_1O_3


Pengujian

Tes cepat dengan contoh yang disebutkan. Tes yang lebih menyeluruh adalah sebagai berikut: karena file uji adalah ribuan baris, saya akan membagikan file .xyz:
https://gist.github.com/nachonavarro/1e95cb8bbbc644af3c44

McGuire
sumber
Membutuhkan input untuk dibaca dari file yang tidak perlu dan tidak adil melarang sebagian besar bahasa pemrograman berpartisipasi dalam tantangan Anda. Lihat: meta.codegolf.stackexchange.com/a/8077/3808 , meta.codegolf.stackexchange.com/q/2447/3808
Doorknob
@ Doorknob Poin bagus. Saya sudah mengubahnya.
McGuire
2
@Mego, bagaimana dengan sekarang? :)
McGuire
5
apa jawaban untuk test case besar?
Maltysen
3
Apakah pemesanan penting dalam output?
Digital Trauma

Jawaban:

2

Japt, 21 byte

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

Uji secara online! Input diberikan sebagai larik string (yang dapat diformat seperti pada tautan).

Tanpa penjelasan dan penjelasan

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
Produksi ETH
sumber
0

Shell + GNU Utilities, 67

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

Cobalah online.

Trauma Digital
sumber
1d;2d1,2d
manatwork
Hanya karena spasi di output tidak dilarang:tail -n+3|cut -c-3|sort|uniq -c|sed -rz 's/\s*(\S+) (\S+)/\2_\1/g'
manatwork
0

Mathematica, 79 53 byte

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

Cukup sederhana.

LegionMammal978
sumber