Codeium Golfide


28

ในความท้าทายนี้งานของคุณคือการใช้ไอออนและไอออนบวกและส่งออกสูตรทางเคมีของสารประกอบ อินพุตเป็นไปตามกฎเหล่านี้:

  • ใช้เวลาใน 2 สตริง (ในลำดับใด ๆ ) ที่เป็นตัวแทนของประจุลบและประจุบวกเช่นF, หรือNH_4Al
  • ในการรับผิดชอบแต่ละไอออนคุณสามารถให้มันเป็นส่วนหนึ่งของสตริงที่คั่นด้วยเครื่องหมายรูปหมวก (เช่นF^-1) หรือรับอาร์กิวเมนต์ที่เป็นตัวเลขเพิ่มเติม
    • หมายเหตุ:ตราบใดที่คุณป้อนประเภทตัวเลขของคุณแล้วประจุประจุลบจะถูกส่งผ่านเป็นตัวเลขติดลบ
  • สัญลักษณ์จะเป็นของจริงเสมอและชาร์จอย่างแม่นยำ

ผลลัพธ์ควรเป็นไปตามกฎเหล่านี้:

  • ใช้_สำหรับห้อย: เฟ2 O 3Fe_2O_3จะเป็น
  • การอ้างถึงครั้งแรก: NaCl ไม่ใช่ ClNa
  • โมเลกุล Neutral: หลี่2 O ไม่ Lio หรือ Lio -
  • ค่าสัมประสิทธิ์ที่เป็นไปได้ต่ำสุด: เฟ2 O 3ไม่เฟ4 O 6
  • ไม่มีคนที่ห้อย: โซเดียมคลอไรด์ไม่นา1 Cl 1
  • ไม่มีการขยับ: NH 4 OH ไม่ใช่ NH 5 O
  • วงเล็บแบบมีเงื่อนไข:
    • อย่าใช้วงเล็บบนไอออนเดียวอะตอม: MgCl 2ไม่ Mg (Cl) 2
    • อย่าใช้วงเล็บหากมีเพียงไอออนเดียวต่อโมเลกุล: KClO 3ไม่ใช่ K (ClO 3 )
    • จะใช้วงเล็บถ้ามีสองหรือมากกว่าของไอออน polyatomic: Be 3 (PO 4 ) 2ไม่ได้เป็น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สำหรับไอออน polyatomic ที่มี 1 ในแต่ละองค์ประกอบ ( OH^-1)
pizzapants184

1
@ NO_3^-1อดัมไอออนที่สองเป็นค่าใช้จ่าย: นอกจากนี้ยังมีกรณีการทดสอบอื่นที่ควรจะเป็นคนแรกที่จับคู่กับดังนั้นมันจะทำให้^-2 (C(NH_2)_3)_2...หรือกรณีที่ไอออนที่ต้องการมากกว่าหนึ่งครั้งเริ่มต้นด้วยวงเล็บ
Heimdall

1
@ Adám Fe_4(Fe(CN)_6)_3สำหรับ Blue Prussian
Colera Su

3
นี่อาจเป็นชื่อความท้าทายที่สนุกที่สุดที่ฉันเคยเห็นในเว็บไซต์นี้จนถึงตอนนี้ ขอบคุณสำหรับเสียงหัวเราะที่ดี
osuka_

1
@osuka_ คุณเคยเห็น "สิ่งที่เป็นวิธีที่เร็วที่สุดในการฆ่าครอบครัวของฉัน" ที่ Arqade? หรือความท้าทาย PPCG อื่น ๆ ของฉัน "ยืนยันการ Illuminati"?
Nissa

คำตอบ:


4

APL (Dyalog) , 60 59 61 ไบต์

+2 เนื่องจากต้องมีการลงชื่อค่าธรรมเนียม

ฟังก์ชั่นมัดไม่ระบุชื่อ รับรายการไอออน (ประจุลบประจุบวก) เป็นอาร์กิวเมนต์ซ้ายและรายการประจุที่สอดคล้องกันเป็นอาร์กิวเมนต์ขวา

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

ลองออนไลน์!

{... }∘| ฟังก์ชั่นที่ถูกทิ้งไว้โต้แย้งและเป็นขนาดโต้แย้งสิทธิ:

∧/⍵ LCM ของค่าธรรมเนียม

⍵÷⍨ หารประจุด้วยสิ่งนั้น

s← เก็บในs(สำหรับs ubscripts)

'_',∘⍕¨ รูปแบบ (stringify) และเพิ่มแถบใต้แต่ละอัน

()/ ทำซ้ำตัวอักษรแต่ละตัวของแต่ละตัวด้วยค่าที่สอดคล้องกันจาก:

  s≠1 คือsแตกต่างจาก1? (ให้ 1 หรือ 0)

  m← เก็บในm(สำหรับm ultiple)

(…เพิ่ม),¨ สิ่งต่อไปนี้ตามลำดับให้กับสิ่งเหล่านั้น:

  ⍺{}¨m สำหรับแต่ละฟังก์ชันเรียกใช้ฟังก์ชันนี้ด้วยไอออนและmเป็นอาร์กิวเมนต์:

   ⎕D,⎕AD igits ตามด้วยตัวพิมพ์ใหญ่A lphabet

   ⍺∩ จุดตัดของไอออนกับสิ่งนั้น

    นับจำนวนตัวอักษรในนั้น

   1< น้อยกว่านั้นไหม? (เช่นเรามีไอออนหลายองค์ประกอบหรือไม่)

   ⍵∧ และเราต้องการไอออนหลายตัว?

   : ถ้าเป็นเช่นนั้น:

    ')(',⍺ เติมสตริงให้กับไอออน

    1⌽ หมุนหนึ่งก้าวไปทางซ้ายเป็นวงกลม (หมุน)ด้านขวา)

    อื่น

     คืนไอออนที่ไม่ได้แก้ไข

ϵ รายการ (แผ่)


6

C, 208 205 175 169 ไบต์

argv[1]: ไอออนบวก
argv[2]: ประจุลบประจุ
ของไอออนถูกนำไปใช้กับ stdin

#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 ระบุไอออนที่สามารถให้ในลำดับใด ๆ
Heimdall

6

เรติน่า , 86 80 ไบต์

ขอบคุณ Neil สำหรับการบันทึก 6 ไบต์

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

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

ลองออนไลน์!

อินพุตถูกแยกบรรทัดด้วยฟีด (ชุดทดสอบใช้การคั่นด้วยเครื่องหมายจุลภาคเพื่อความสะดวก)

คำอธิบาย

^
(

เราเริ่มต้นด้วยการเติม a (ให้กับแต่ละโมเลกุล การ^จับคู่ที่เริ่มต้นบรรทัดเนื่องจากm)จุดสิ้นสุดของโปรแกรมกำหนดโหมดหลายบรรทัดสำหรับขั้นตอนก่อนหน้านี้ทั้งหมด

\^.+
)_$&$*

เราเปลี่ยนชิ้น^[-+]nส่วนด้วย)_แล้วตามด้วยnสำเนาของ1(เช่นเราแปลงค่าใช้จ่ายเป็น unary วางสัญลักษณ์)

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

ขั้นตอนนี้ทำสามสิ่ง: มันแบ่งค่าใช้จ่ายทั้งสองโดย GCD ของพวกเขาแปลงพวกมันกลับเป็นทศนิยมและสลับพวกมัน GCD นั้นสามารถพบได้ง่ายใน regex โดยการจับคู่ที่ยาวที่สุด1+ที่ให้เราจับคู่ค่าใช้จ่ายทั้งสองโดยใช้การอ้างอิงย้อน\1หลังเท่านั้น ในการหารด้วยสิ่งนี้เราใช้คุณลักษณะ "จำนวนการจับภาพ" ของ Retina ซึ่งบอกเราว่ามีการใช้กลุ่มบ่อยแค่ไหน ดังนั้น$#2ประจุแรกหารด้วย GCD และ$#3ประจุที่สองหารด้วย GCD (ทั้งเป็นทศนิยม)

_1$

เราลบ_1s จากปลายทั้งสองส่วน

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

และเราปล่อยวงเล็บจากเส้นที่ลงท้ายด้วย a )(เช่นที่มี_1อยู่ตรงนั้น) เช่นเดียวกับเส้นที่มีอะตอมเดียวเท่านั้น

ในที่สุดเราเชื่อมโมเลกุลทั้งสองเข้าด้วยกันโดยปล่อยไลน์ฟีด



2

Python 3 , 131 ไบต์

lambda c,a,C,A:g(c,A/gcd(C,A))+g(a,C/gcd(C,A))
from math import*
g=lambda s,n:[s,[s,'(%s)'%s][sum(c<'`'for c in s)>1]+'_%d'%n][n>1]

ลองออนไลน์!

Python 2 , 196 174 170 155 149 140 136 ไบต์

lambda c,a,C,A:g(c,A/gcd(C,A))+g(a,C/gcd(C,A))
from fractions import*
g=lambda s,n:[s,[s,'(%s)'%s][sum(c<'`'for c in s)>1]+'_'+`n`][n>1]

ลองออนไลน์!


Python 3 สำหรับ131 ไบต์
pizzapants184

2

Python 3 , 129 ไบต์

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*

ลองออนไลน์!


หากเราต้องการจัดการประจุลบของประจุลบดังนั้น153 ไบต์:

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*

ลองออนไลน์!


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"การตัดสินใจไม่ว่าจะเป็นผมตรวจสอบความยาวของสตริงและตรวจสอบว่าตัวอักษรตัวสุดท้ายคือ นิพจน์บูลีนส่งคืน 1 สำหรับจริงและ 0 สำหรับเท็จ ด้วยการลบผลลัพธ์ของการเปรียบเทียบนี้จากความยาวของสตริงฉันจะได้ 1 หรือน้อยกว่าเมื่อมันเป็นอะตอมเดี่ยวมิฉะนั้นก็มากขึ้น: ความยาว 1 เป็นอะตอมเดียว ความยาว 2 จะมีตัวอักษรเป็นอักขระตัวสุดท้าย สำหรับอะตอมเดี่ยวมันเป็นตัวพิมพ์เล็กดังนั้นให้>"Z"ผลลัพธ์ 1 เป็นอย่างอื่น 2; ความยาว 3 หรือวิธีการอื่น ๆ อีกกว่า 1 อะตอมและ 0 หรือ 1 หักออกจากความยาวของผลที่จะมีอย่างน้อย 2 ตัวอย่างเช่น3และช่วยให้"PO_4" และช่วยให้"(PO_4)_3"3"Al""Al_3"

MSแยกแรกแต่ละไอออนใช้ หลังจากบรรทัดแรกระดับ 5 ของสแต็ก (ดังนั้นวัตถุฝังที่ลึกที่สุด) จะมีประจุของไอออนตัวที่สองสูตรของไอออนระดับ 4 วินาทีสูตรของไอออนระดับ 3 แรกระดับ 3 ค่าสัมบูรณ์สัมบูรณ์ของประจุไอออนแรกและค่าสัมบูรณ์ระดับ 1 ของประจุไอออนที่สองอีกครั้ง ตัวอย่างเช่นถ้าไอออนที่กำหนดในกองมี"Al^+3", "SO_4^-2"เราได้รับ-2, "SO_4", "Al", ,32

บรรทัดที่สองคำนวณ gcd ของค่าใช้จ่าย 2 ครั้ง

บรรทัดที่สามแบ่งแต่ละค่าใช้จ่ายโดย GCD (เพื่อคำนวณหลาย) Jและร่วมกับสูตรไอออนที่ใช้ ดังนั้นเราจึงมีสองสายแต่ละอันที่มีไอออนหนึ่งที่มีประจุถูกลบออก (หรือหลาย ๆ อัน) และประจุที่สองถูกฝังอยู่ข้างหลังพวกเขา ตัวอย่างเช่น-2, "Al_2", "(SO_4)_3"(-2 เป็นค่าใช้จ่ายของ SO_4) ที่

บรรทัดที่สี่ปล่อยประจุออกมาและถ้าเป็นบวกมันจะทำการสลับสองสาย (เพื่อให้ประจุบวกนั้นมาก่อน) ก่อนที่จะเข้าร่วม "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.