数式を印刷する


8

前書き

化学には、.xyz拡張子(https://en.wikipedia.org/wiki/XYZ_file_format)のタイプがあり、化学要素と各要素の平面の座標が各行に出力されます。これは、化学者が化合物を理解し、3Dで化合物を視覚化するのに非常に役立ちます。.xyzファイルを指定して、化学式を印刷するのは楽しいと思いました。

チャレンジ

.xyzファイルを指定して、任意のプログラミング言語で化合物の化学式を可能な限り少ないバイト数で出力します。注意:

  • もともと、入力はファイルとして与えられるべきでした。私が指摘したように、これは挑戦を制約します。したがって、入力が文字列のリスト/配列であり、それぞれが.xyzファイルの行を表すと想定する場合があります。
  • 要素の順序に制限はありません。
  • 各要素は、要素とその出現回数を区切るアンダースコア「_」で印刷する必要があります
  • .xyzファイルの最初の2行は、要素の数とコメント行です(覚えておいてください)。

入力と出力の例

以下を含むファイルp.xyzがあるとします(最初の行は要素の数、2番目の行はコメントです)。

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  

出力:
Ba_1Hf_1O_3


テスト中

簡単なテストは、上記の例で行われます。より徹底的なテストは次のとおりです。テストファイルは数千行なので、.xyzファイルを共有します。https://gist.github.com/nachonavarro/1e95cb8bbbc644af3c44


入力をファイルから不必要にそして不当に読み取るよう要求することは、プログラミング言語の非常に重要な部分があなたの挑戦に参加することを禁止します。参照:meta.codegolf.stackexchange.com/a/8077/3808meta.codegolf.stackexchange.com/q/2447/3808
ドアノブ

@Doorknob良い点。私はそれを変更しました。
McGuire

2
@Mego今はどう?:)
McGuire

5
大規模なテストケースの答えは何ですか?
Maltysen

3
出力の順序は重要ですか?
デジタルトラウマ2016年

回答:



2

Japt、21バイト

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

オンラインでテストしてください!入力は文字列の配列として与えられます(リンクのようにフォーマットできます)。

未ゴルフと説明

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



0

Mathematica、79 53バイト

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

かなりシンプルです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.