Codeium Golfide


28

Bu zorlukta, sizin göreviniz bir anyon ve bir katyon almak ve bileşiğin kimyasal formülünü vermektir. Giriş bu kuralları takip eder:

  • Anyon ve katyon, örneğin temsil (herhangi bir sırada) 2 dizeleri al F, NH_4ya da Al.
  • Her bir iyonun sorumluluğunu almak için, onu bir pelerinle (örneğin F^-1) ayıran ipin bir parçası olarak alabilir veya ek sayısal argümanlar alabilir.
    • Not: Sayısal giriş türünüz imzalandığı sürece, anyon ücreti bir negatif sayı olarak kabul edilir.
  • Semboller her zaman gerçek olacak ve doğru şarj olur.

Çıktı şu kuralları takip etmelidir:

  • _Abonelikler için kullanımı : Fe 2 O 3 olacaktır Fe_2O_3.
  • Önce katyon: NaCl, ClNa değil.
  • Nötr molekülü: Li 2 , O, olup LiO veya LiO - .
  • Mümkün olan en düşük katsayıları Fe 2 O 3 değil, Fe 4 O 6 .
  • Resim indis olanlar: NaCI, Na 1 Cl 1 .
  • Resim vites değişimi: NH 4 , OH, NH 5 O.
  • Koşullu parantez:
    • MgCl: Tek-atomu iyonunun parantez kullanmayın 2 değil, Mg (CI) 2 .
    • Sadece, molekül başına iyonu varsa parantez kullanmayın: KCIO 3 değil, K (ClO 3 ).
    • İki veya daha fazla poliyatomik iyon varsa parantez kullanın: Be 3 (PO 4 ) 2 , Be 3 PO 4 2 veya Be 3 P 2 O 8 değil .

İşte bazı ek örnek giriş ve çıkışlar:

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

Bu , bayt cinsinden en kısa cevap kazanır.


3
Önerilen test durumu: Fe^+2, OH^-1: Fe(OH)_2Her bir elemanın 1'inden oluşan bir poliyatomik iyon için ( OH^-1).
pizzapants184

1
@ ADAM ikinci iyon şarj edilir: NO_3^-1. Ayrıca başka bir test durumu, a ile eşleştirilen ilk olmalıdır ^-2, böylece yapacaktır (C(NH_2)_3)_2.... Veya bir kereden fazla ihtiyaç duyulan iyonun bir braket ile başladığı bir durum.
Heimdall

1
@ Fe_4(Fe(CN)_6)_3Prusya mavisi için adám .
Colera Su

3
Bu, şimdiye kadar bu web sitesinde gördüğüm en komik meydan okuma olabilir ve bu bir ppcg sorusu için çok şey söylüyor. İyi kahkaha için teşekkürler
osuka_

1
@osuka_ Arqade'de "ailemi öldürmenin en hızlı yolu nedir" gördün mü? Ya da diğer PPCG mücadelem, "İlluminati'yi onayla" mı?
Nissa,

Yanıtlar:


4

APL (Dyalog) , 60 59 61 bayt

+2, çünkü suçlamalar imzalanmalı.

Anonim infix işlevi. İyonların listesini (anyon, katyon) sol argüman olarak ve karşılık gelen yüklerin listesini doğru argüman olarak alır.

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

Çevrimiçi deneyin!

{}∘| İşlev , sol argümanın olduğu ve sağ argümanın büyüklüğü olan işlev :

∧/⍵ Ücretlerin LCM'si

⍵÷⍨ suçlamaları buna göre böl

s← sakla s( s ubscripts için)

'_',∘⍕¨ biçimlendirmek (dize) ve her biri için alt çizgi hazırlamak

()/ Her birinin harfini karşılık gelen değerle kopyalayın:

  s≠1 Mı sfarklı 1? (1 veya 0 verir)

  m← saklayın m( m ultiple için)

(),¨ Bunlara sırasıyla aşağıdakileri hazırlayın:

  ⍺{}¨m Her biri için, bu işlevi iyonlarla ve margümanlar olarak adlandırın:

   ⎕D,⎕AD büyük ardından igits bir lphabet

   ⍺∩ iyon ve bunun kesişimi

    oradaki karakterlerin sayısını hesapla

   1< Bundan daha az mı? (yani çok elemanlı bir iyonumuz var mı?)

   ⍵∧ ve bu iyonun çoğuna ihtiyacımız var mı?

   : öyleyse, o zaman:

    ')(',⍺ dize iyonuna hazırlamak

    1⌽ döngüsel olarak bir adım sola döndürün ( )sağa koyar )

    Başka

     değiştirilmemiş iyonu döndür

ε nlist (düzleştirmek)


6

C, 208 205 175 169 bayt

argv[1]: katyon
argv[2]: anyon
İyon yükleri stdin üzerinden alınır.

#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)}

Belirlenen OP iyonları herhangi bir sırada verilebilir.
Heimdall

6

Retina , 86 80 bayt

Neil'e 6 byte kaydettiği için teşekkür ederiz.

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

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

Çevrimiçi deneyin!

Giriş satır besleme ile ayrılmıştır (test paketi kolaylık sağlamak için virgülle ayırma kullanır).

açıklama

^
(

(Her bir moleküle bir a hazırlayarak başlıyoruz . ^Üzerinde maçlar çizgi nedeniyle başlangıçlar m)programın sonuna doğru tüm önceki aşamaları için çok satırlı modunu ayarlar.

\^.+
)_$&$*

Biz değiştirmek ^[-+]nile parçasını )_ardından nkopyaları 1(biz işaretleri bırakarak tekli alınmasını, dönüştürmek yani).

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

Bu aşama üç şey yapar: her iki ücreti de GCD'lerine ayırır, tekrar ondalık basamağa dönüştürür ve değiştirir. GCD, regex'te oldukça kolay bir şekilde bulunabiliyor, 1+sadece geri dönüşü kullanarak her iki şarjı da eşleştirmemize izin veren en uzun eşleşmeyi sağlıyor \1. Buna bölünmek için, bir grubun ne sıklıkla kullanıldığını söyleyen Retina'nın "yakalama sayısı" özelliğini kullanıyoruz. Yani $#2ilk ücret GCD'ye bölünmüş ve $#3ikinci ücret GCD'ye bölünmüş (her ikisi de ondalık).

_1$

Her _1iki parçanın da ucundan s kaldırıyoruz .

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

Ve parantezleri biten satırlardan )(yani _1orada olanlar var) ve sadece tek bir atom içeren satırlardan düşürürüz.

Son olarak, iki molekülü çizgiyi düşürerek birleştirdik.


3

Haskell , 101 97 bayt

(s#t)n m|let x#i|j<-div(lcm n m)i=l$x:[l(x:['(':x++")"|l x<':'])++'_':show j|j>1]=s#n++t#m
l=last

Çevrimiçi deneyin! Örnek kullanım: Fe^+3, O^-2olarak alınmıştır ("Fe"#"O")3 2.



2

Python 3 , 129 bayt

lambda E,e,I,i,m=lambda e,i:(len(e)>2<=i)*"("+e+(len(e)>2<=i)*")"+"_%d"%i*(i>1):m(E,i/gcd(i,I))+m(e,I/gcd(i,I))
from math import*

Çevrimiçi deneyin!


Anyonların negatif yüklerini ele almamız gerekirse, 153 bayt:

lambda E,e,I,i,a=abs,m=lambda e,i:(len(e)>2<=i)*"("+e+(len(e)>2<=i)*")"+"_%d"%i*(i>1):m(E,a(i)/gcd(a(i),a(I)))+m(e,a(I)/gcd(a(i),a(I)))
from math import*

Çevrimiçi deneyin!


2

RPL (HP48 S / SX), 294,5 bayt

Evet, gülünç derecede büyük bir sunum, ne kadar rekabetçi olacağından emin değilsiniz ...

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

Bir dizinde özenle paketlenmiş 3 rutin. Masıl olanı. İyon olarak biçimlendirilmiş yığında 2 dizi bekler ve molekül molekülünü yığına iter.

Siyonu sayı olarak ve eleman formülünü bir dize olarak ayırır. Örneğin, "PO_4^-3"istiften alınacaktı ve -3ve "PO_4"yığının üzerine itilir.

Jİyon sayısını formülle birleştirir ve formülün köşeli parantezlere sarılıp sarılmayacağına karar verir. Önündeki bit ELSE, ipi olduğu gibi bırakarak 1 iyonla ilgilidir. Örneğin, 1ve "PO_4"yığın üzerinde, onlar tarafından değiştirilir "PO_4". 1ve "H"verir "H".

Gerisi çoklu iyonlarla ilgilidir; Tek bir atom ise, parantez içerisinde değildir, aksi halde öyledir. Bunun olup olmadığına karar vermek için dizenin uzunluğunu ve son karakterin olup olmadığını kontrol ederim >"Z". Boole ifadeleri true için 1, false için 0 döndürür. Bu karşılaştırmanın sonucunu dizenin uzunluğundan çıkartarak, tek atom olduğunda 1 veya daha azını alırım, aksi takdirde daha fazla: uzunluk 1 tek bir atomdur; uzunluk 2, son karakter olarak bir harfe sahip olacaktır; tek bir atom için küçük harf olur, bu nedenle >"Z"sonuç 1, aksi takdirde 2; uzunluk 3 veya daha fazla, 1 atomdan daha fazla anlamına gelir ve sonuçtan en az 2 olacak şekilde uzunluktan çıkarılmış 0 veya 1 ile, örneğin, verir 3ve "PO_4"verir "(PO_4)_3". 3ve "Al"verir "Al_3".

Milk önce her bir iyonu kullanarak böler S. İlk satırdan sonra istifin 5. seviyesi (en derin cisimler nesnesi), ikinci iyonun yükünü, 4. seviye ikinci iyonun formülünü, 3. seviye ilk iyonun formülünü, 2. seviye ilk iyonun yükünün mutlak değerini ve 1. seviye mutlak değeri içerir. İkinci iyonun şarjı tekrardan. Örneğin, yığında verilen iyonları ise "Al^+3", "SO_4^-2"elde ederiz -2, "SO_4", "Al", 3, 2.

İkinci satır, 2 yükün gcd değerini hesaplar (yükleri bozulmadan bırakır).

Üçüncü satır, her yükü gcd'ye (katları hesaplamak için) böler ve onu kullanarak iyon formülüyle birleştirir J. Bu yüzden, her biri bir tanesi tahliye edilmiş (veya bunun bir çoğunu) verilen bir iyon ve arkalarında gömülü bir tane yüke sahip iki telimiz var. Örneğin -2, "Al_2", "(SO_4)_3"(-2 SO_4 yüküdür).

Dördüncü satır, yükü hafifletir ve eğer pozitifse, iki diziyi değiştirir (böylece katyon önce gelir) birleşmeden önce. Oldukları gibi Yani örnekte, yukarıda 's negatif çünkü onlar sırayla birleştirilir: "Al_2(SO_4)_3".


1

JavaScript, 145 bayt

(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,"")

Argümanlar alır ckatyon, aanyon, ppozitif yük, nnegatif yüktür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.