Codeium Golfide


28

この課題では、あなたの仕事は陰イオンと陽イオンを取り、化合物の化学式を出力することです。入力は次の規則に従います。

  • 陰イオンと陽イオン、例えば表現(任意の順序で)2列に乗りFNH_4、またはをAl
  • 各イオンの電荷を取り込むには、文字列の一部としてキャレット(例:)で区切るF^-1か、追加の数値引数を取り込むことができます。
    • 注:数値入力タイプが署名されている限り、陰イオンの電荷は負の数として渡されます。
  • シンボルは常に本物であり、正確に課金されます。

出力は次のルールに従う必要があります。

  • _下付き文字に使用:Fe 2 O 3はになりますFe_2O_3
  • 最初にカチオン:ClNaではなくNaCl。
  • 中性分子:リチウム2 O、ではないのLiOかのLiO -
  • 可能な最低係数:Fe 4 O 6ではなく、Fe 2 O 3
  • 下付き文字なし:NaCl、Na 1 Cl 1ではありません。
  • いいえ変速ない:NH 4 OH、NHない5 O.
  • 条件付き括弧:
    • 単一原子イオン(Mg(Cl)2ではなくMgCl 2)に括弧を使用しないでください。
    • 唯一の分子当たりのイオンの一つがある場合は、括弧を使用しないでください:KClO 3、ないK(のClO 3)。
    • ことができる:分子イオンの2つ以上存在する場合に使用括弧をDO 3(PO 42できない、3 PO 4 2又はて3 P 2 O 8

追加の入力および出力のサンプルを次に示します。

Input               Output
Fe^+3, O^-2         Fe_2O_3
Fe^+2, O^-2         FeO
H^+1, SO_4^-2       H_2SO_4
Al^+3, SO_4^-2      Al_2(SO_4)_3
NH_4^+1, SO_4^-2    (NH_4)_2SO_4
Hg_2^+2, PO_4^-3    (Hg_2)_3(PO_4)_2
NH_4^+1, OH^-1      NH_4OH
Hg_2^+2, O_2^-2     Hg_2O_2

これはであるため、バイト単位の最短回答が優先されます。


3
推奨テストケース:Fe^+2, OH^-1: Fe(OH)_2各要素が1つの多原子イオン(OH^-1)の場合。
pizzapants184

1
@Adám第2イオンが帯電します:NO_3^-1。また、別のテストケースは最初のものと対になるべきである^-2ので、それは作るでしょう(C(NH_2)_3)_2...。または、複数回必要なイオンが括弧で始まる場合。
ハイムダル

1
Fe_4(Fe(CN)_6)_3プルシアンブルーの@Adám 。
コレラSu

3
これは、このWebサイトでこれまで見た中で最も面白いチャレンジタイトルかもしれません。良い笑いをありがとう
osuka_

1
@osuka_ Arqadeで「私の家族を殺すための最速の方法は何ですか」を見ましたか?または、私のもう1つのPPCGチャレンジ、「イルミナティの確認」ですか?
ニッサ

回答:


4

APL(Dyalog)60 59 61バイト

チャージには署名が必要なため、+ 2。

匿名挿入関数。左側の引数としてイオンのリスト(アニオン、カチオン)を取り、右側の引数として対応する電荷のリストを取ります。

{∊(⍺{⍵∧1<≢⍺∩⎕D,⎕A:1')(',⍺⋄⍺}¨m),¨(ms1)/¨'_',∘⍕¨s←⍵÷⍨∧/⍵}∘|

オンラインでお試しください!

{}∘| 関数は、左引数で右引数の大きさです:

∧/⍵ 料金のLCM

⍵÷⍨ それで料金を分けます

s← 格納ssスクリプト用)

'_',∘⍕¨ フォーマット(文字列化)およびそれぞれにアンダーバーを追加

()/ それぞれの文字を、対応する値から複製します。

  s≠1 とはs違う1?(1または0を与える)

  m← 保管mm ultipleの場合)

(),¨ それぞれに次を追加します。

  ⍺{}¨m それぞれについて、この関数をイオンおよびm引数として呼び出します。

   ⎕D,⎕AD igitsの後に大文字のA lphabetが続く

   ⍺∩ イオンとその交差点

    その中の文字数を集計します

   1< それよりも1つ少ないですか?(つまり、多元素イオンがありますか?)

   ⍵∧ そして、そのイオンの倍数が必要ですか?

   : もしそうなら、それから:

    ')(',⍺ イオンに文字列を追加します

    1⌽ 1ステップ左に循環的に回転します()右側に配置)

    他に

     イオンを変更せずに返す

ϵ nlist(平坦化)


6

C、208の 205 175 169バイト

argv[1]:陽イオン
argv[2]:陰イオンイオンの
電荷は標準入力で取得されます。

#define z(b)for(i=*++v;*++i>95;);printf(b>1?*i?"(%s)_%d":"%s_%d":"%s",*v,b);
main(c,v,d,e,g,h,i)char**v,*i;{scanf("%d%d",&c,&d);for(e=c,h=-d;g=h;e=g)h=e%g;z(-d/e)z(c/e)}

OPは、イオンを任意の順序で指定できることを指定しました。
ハイムダル

6

網膜86 80バイト

6バイトの節約をしてくれたNeilに感謝

^
(
\^.+
)_$&$*
(1+)(\1|¶.+)+_(\1)+$
$#3$2_$#2
_1$

m)T`()``.+\)$|\(.[a-z]?\)
¶

オンラインでお試しください!

入力は改行で区切られます(テストスイートは便宜上コンマ区切りを使用します)。

説明

^
(

まず、(各分子の先頭にa を付けます。^上のマッチラインので始まりm)プログラムの終わりに向かって、すべての前の段で複数行モードを設定します。

\^.+
)_$&$*

^[-+]n部品をに置き換え)_、次にnコピーをコピーします1(つまり、料金を単項に変換し、記号を削除します)。

(1+)(\1|¶.+)+_(\1)+$
$#3$2_$#2

この段階では3つのことを行います。両方の料金をGCDで除算し、10進数に変換し、スワップします。GCDは1+、後方参照のみを使用して両方の料金を照合できる最長の照合により、正規表現で非常に簡単に見つけることができます\1。これで分けるには、Retinaの「キャプチャカウント」機能を使用します。これは、グループが使用された頻度を示します。そう$#2GCDによって分割された第1の電荷であり、$#3GCD(10進数の両方)によって分割された第2の電荷です。

_1$

_1両方の部分の端からs を削除します。

m)T`()``.+\)$|\(.[a-z]?\)

そして、aで終わる行)(つまり、_1そこにある行)、および単一のアトムのみを含む行から括弧をドロップします。

最後に、改行をドロップして2つの分子を連結します。





2

RPL(HP48 S / SX)、294.5バイト

はい、ばかげて大量の提出、それがどれほど競争力があるのか​​わかりません...

DIR
  M
    « S ROT S SWAP ABS 4 PICK ABS
      DUP2 WHILE DUP2 REPEAT MOD SWAP END DROP2
      SWAP OVER / 4 ROLL J 3 ROLLD / ROT J
      ROT 0 > IF THEN SWAP END + »
  S
    « DUP "^" POS DUP2 1 + OVER SIZE SUB OBJ🡢
      3 ROLLD 1 - 1 SWAP SUB »
  J
    IF OVER 1 ==
    THEN SWAP DROP
    ELSE DUP SIZE DUP2 DUP SUB "Z" > - 1 >
      IF
      THEN "(" SWAP + ")" +
      END
      "_" + SWAP +
    END
END

ディレクトリにきれいにパッケージ化された3つのルーチン。M主なものです。スタック上にイオンとしてフォーマットされた2つのストリングを想定し、分子ストリングをスタックにプッシュします。

Sイオンを電荷として数値として、元素式を文字列として分割します。例えば、"PO_4^-3"スタックから取り出されるであろうし、-3そして"PO_4"スタックにプッシュ。

Jイオンの数を計算式に結合し、計算式を括弧で囲むかどうかを決定します。前のビットELSEは1つのイオンを処理し、文字列をそのままにします。たとえば、1"PO_4"がスタック上にある場合、それらはに置き換えられ"PO_4"ます。1そして"H"与える"H"

残りは複数のイオンを扱います。単一のアトムである場合は括弧内にありませんが、そうでない場合は括弧内にあります。かどうかを判断するには、文字列の長さを確認し、最後の文字がであるかどうかを確認し>"Z"ます。ブール式は、trueの場合は1、falseの場合は0を返します。この比較の結果を文字列の長さから引くことにより、単一のアトムの場合は1以下、それ以外の場合はさらに多くなります。長さ1は単一のアトムです。長さ2の最後の文字は文字です。単一の原子の場合は小文字なので>"Z"、結果は1、そうでない場合は2になります。長さ3以上は、1つ以上の原子を意味し、長さから0または1を引くと、結果は少なくとも2に3なり"PO_4"ます"(PO_4)_3"3そして"Al"与える"Al_3"

M最初にを使用して各イオンを分割しSます。最初の行の後、スタックのレベル5(したがって最も深いオブジェクト)には、2番目のイオンの電荷、レベル4の2番目のイオンの式、レベル3の最初のイオンの式、最初のイオンの電荷のレベル2の絶対値、およびレベル1の絶対値が含まれます2番目のイオンの電荷の再。たとえば、スタック上の特定のイオンである場合には"Al^+3""SO_4^-2"我々が得ます-2"SO_4""Al"32

2行目は、2つの料金のgcdを計算します(料金をそのまま残します)。

3行目は、各電荷をgcdで除算し(倍数を計算する)、を使用してイオンの式と結合しJます。そのため、電荷が除去された(またはその倍数の)1つのイオンと、その後ろに埋め込まれた2つ目の電荷を持つ2つのストリングがあります。例えば、-2"Al_2""(SO_4)_3"(-2 SO_4の電荷です)。

4行目はチャージを埋め、それが正の場合、結合する前に2つのストリングを交換します(カチオンが最初に来るように)。したがって、上記の例では負であるため、それらはそのままの順序で結合されます"Al_2(SO_4)_3"


1

JavaScript、145バイト

(c,a,p,n,g=(a,b)=>b?g(b,a%b):a)=>`(${c})_${n/-g(p,-n)}(${a})_${p/g(p,-n)}`.replace(/\(((\w+)\)(?=_1)|([A-Z][a-z]*)\))/g,"$2$3").replace(/_1/g,"")

議論cは、陽イオン、a陰イオン、p正電荷、n負電荷です。

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