Sân gôn Codeium


28

Trong thử thách này, nhiệm vụ của bạn là lấy một anion và một cation, và đưa ra công thức hóa học của hợp chất. Đầu vào tuân theo các quy tắc sau:

  • Đi trong 2 chuỗi (trong bất kỳ thứ tự) đại diện cho các anion và cation, ví dụ F, NH_4hoặc Al.
  • Để chịu trách nhiệm cho mỗi ion, bạn có thể có nó như là một phần của chuỗi được phân tách bằng dấu mũ (ví dụ F^-1) hoặc đưa vào các đối số số bổ sung.
    • Lưu ý: Miễn là loại đầu vào số của bạn được ký, thì điện tích của anion sẽ được chuyển vào dưới dạng số âm.
  • Các biểu tượng sẽ luôn luôn là thật, và tính phí chính xác.

Đầu ra phải tuân theo các quy tắc sau:

  • Sử dụng _cho các mục con: Fe 2 O 3 sẽ là Fe_2O_3.
  • Cation đầu tiên: NaCl, không phải ClNa.
  • Phân tử trung tính: Li 2 O, không phải LiO hay LiO - .
  • Các hệ số thấp nhất có thể có: Fe 2 O 3 , không phải Fe 4 O 6 .
  • Không có chỉ số phụ: NaCl, không phải Na 1 Cl 1 .
  • Không dịch chuyển: NH 4 OH, không NH 5 O.
  • Dấu ngoặc đơn có điều kiện:
    • Không sử dụng dấu ngoặc đơn trên ion đơn nguyên tử: MgCl 2 , không phải Mg (Cl) 2 .
    • Không sử dụng dấu ngoặc đơn nếu chỉ có một trong số các ion trên mỗi phân tử: KClO 3 , không phải K (ClO 3 ).
    • NÊN sử dụng dấu ngoặc đơn nếu có hai hoặc nhiều ion đa nguyên tử: Be 3 (PO 4 ) 2 , không phải Be 3 PO 4 2 hoặc Be 3 P 2 O 8 .

Dưới đây là một số mẫu đầu vào và đầu ra bổ sung:

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

Vì đây là , câu trả lời ngắn nhất tính bằng byte sẽ thắng.


3
Trường hợp thử nghiệm được đề xuất: Fe^+2, OH^-1: Fe(OH)_2cho một ion đa nguyên tử với 1 của mỗi phần tử ( OH^-1).
pizzapants184

1
@ Adám ion thứ hai được sạc : NO_3^-1. Ngoài ra, một trường hợp thử nghiệm khác phải là trường hợp đầu tiên được ghép nối với a ^-2, vì vậy nó sẽ thực hiện (C(NH_2)_3)_2.... Hoặc trường hợp ion cần nhiều hơn một lần bắt đầu bằng dấu ngoặc.
Heimdall

1
@ Adám Fe_4(Fe(CN)_6)_3cho màu xanh Phổ.
Colera Su

3
Đây có thể là tiêu đề thử thách hài hước nhất mà tôi thấy trên trang web này cho đến nay và điều đó nói lên rất nhiều cho câu hỏi ppcg. Cảm ơn vì tiếng cười vui vẻ
osuka_

1
@osuka_ Bạn đã thấy "cách nhanh nhất để giết gia đình tôi" trên Arqade là gì chưa? Hoặc thách thức PPCG khác của tôi, "xác nhận Illuminati"?
Nissa

Câu trả lời:


4

APL (Dyalog) , 60 59 61 byte

+2 vì các khoản phí phải được ký.

Hàm infix ẩn danh. Lấy danh sách các ion (anion, cation) làm đối số bên trái và danh sách các khoản phí tương ứng làm đối số bên phải.

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

Hãy thử trực tuyến!

{... }∘| chức năng nơi còn lại tranh cãi và là độ lớn ngay lập luận của:

∧/⍵ LCM của các khoản phí

⍵÷⍨ chia phí cho điều đó

s← lưu trữ trong s(cho s ubcripts)

'_',∘⍕¨ định dạng (xâu chuỗi) và thêm vào thanh dưới cho mỗi

(... )/ tái tạo từng chữ cái của mỗi với giá trị tương ứng từ:

  s≠1 Có skhác 1gì không? (cho 1 hoặc 0)

  m← lưu trữ trong m(cho m ultipl)

(Trước đó, hãy ),¨ chuẩn bị những thứ sau đây cho những người sau:

  ⍺{... }¨m cho mỗi, gọi hàm này với các ion và mnhư các đối số:

   ⎕D,⎕AD igits theo sau là chữ hoa A lph.us

   ⍺∩ giao điểm của ion và đó

    kiểm đếm số lượng nhân vật trong đó

   1< Là một ít hơn thế? (tức là chúng ta có ion đa nguyên tố không?)

   ⍵∧ và chúng ta có cần nhiều ion đó không?

   : nếu vậy, thì:

    ')(',⍺ nối chuỗi vào ion

    1⌽ xoay vòng một bước sang trái (đặt )bên phải)

    khác

     trả lại ion không biến đổi

ε nlist (flatten)


6

C, 208 205 175 169 byte

argv[1]: cation
argv[2]: Anion
Phí của các ion được lấy trên 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 chỉ định các ion có thể được cung cấp theo bất kỳ thứ tự nào.
Heimdall

6

Võng mạc , 86 80 byte

Cảm ơn Neil vì đã lưu 6 byte.

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

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

Hãy thử trực tuyến!

Đầu vào được phân tách theo dòng (bộ kiểm tra sử dụng phân tách bằng dấu phẩy để thuận tiện).

Giải trình

^
(

Chúng tôi bắt đầu bằng cách chuẩn bị một (cho mỗi phân tử. Các ^trận đấu bắt đầu trên dòngm)cuối chương trình sẽ đặt chế độ đa dòng cho tất cả các giai đoạn trước.

\^.+
)_$&$*

Chúng tôi thay thế ^[-+]nmột phần bằng )_, theo sau là các nbản sao của 1(nghĩa là chúng tôi chuyển đổi các khoản phí thành đơn nguyên, bỏ các dấu hiệu).

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

Giai đoạn này thực hiện ba điều: nó chia cả hai điện tích cho GCD của chúng, chuyển chúng trở lại thành số thập phân và hoán đổi chúng. GCD có thể được tìm thấy khá dễ dàng trong regex, bằng cách khớp dài nhất 1+cho phép chúng ta khớp cả hai khoản phí chỉ bằng cách sử dụng độ phản hồi \1. Để phân chia điều này, chúng tôi sử dụng tính năng "số lần chụp" của Retina, cho chúng tôi biết tần suất một nhóm được sử dụng. Vậy $#2điện tích thứ nhất chia cho GCD và $#3là điện tích thứ hai chia cho GCD (cả hai đều ở dạng thập phân).

_1$

Chúng tôi loại bỏ _1s từ đầu của cả hai phần.

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

Và chúng ta thả các dấu ngoặc đơn từ các dòng kết thúc bằng một )(tức là các dòng _1có ở đó), cũng như các dòng chỉ chứa một nguyên tử.

Cuối cùng, chúng tôi nối hai phân tử bằng cách bỏ linefeed.




2

Python 3 , 129 byte

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*

Hãy thử trực tuyến!


Nếu chúng ta cần xử lý các điện tích âm của các anion, thì 153 byte:

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*

Hãy thử trực tuyến!


2

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

Phải, đệ trình lớn một cách lố bịch, không chắc nó sẽ cạnh tranh đến mức nào ...

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 thói quen đóng gói gọn gàng trong một thư mục. Mlà một trong những chính. Nó mong đợi 2 chuỗi trên ngăn xếp được định dạng là các ion và đẩy một chuỗi phân tử lên ngăn xếp.

Stách ion thành điện tích dưới dạng số và công thức nguyên tố dưới dạng chuỗi. Ví dụ, "PO_4^-3"sẽ được lấy từ ngăn xếp -3"PO_4"đẩy lên ngăn xếp.

Jnối số lượng ion với công thức và quyết định có nên bọc công thức vào ngoặc hay không. Các bit trước khi ELSEgiao dịch với 1 ion, để lại chuỗi như vậy. Ví dụ, nếu 1"PO_4"nằm trên ngăn xếp, chúng được thay thế bằng "PO_4". 1"H"cho "H".

Phần còn lại liên quan đến nhiều ion; nếu nó là một nguyên tử thì nó không nằm trong ngoặc, nếu không thì là vậy. Để quyết định xem nó có phải không, tôi kiểm tra độ dài của chuỗi và kiểm tra xem ký tự cuối cùng có phải không >"Z". Biểu thức Boolean trả về 1 cho true và 0 cho false. Bằng cách trừ kết quả so sánh này từ độ dài của chuỗi, tôi nhận được 1 hoặc ít hơn khi nó là một nguyên tử, nếu không thì nhiều hơn: chiều dài 1 là một nguyên tử; chiều dài 2 sẽ có một chữ cái là ký tự cuối cùng; đối với một nguyên tử, nó viết thường, vì vậy >"Z", tạo kết quả 1, nếu không thì 2; chiều dài 3 hoặc nhiều hơn có nghĩa là nhiều hơn 1 nguyên tử và bằng 0 hoặc 1 trừ vào chiều dài kết quả sẽ có ít nhất 2. Ví dụ, 3"PO_4"cung cấp cho "(PO_4)_3". 3"Al"cho "Al_3".

Mđầu tiên tách từng ion bằng cách sử dụng S. Sau dòng thứ nhất, cấp 5 của ngăn xếp (vì vậy vật thể chôn sâu nhất) chứa điện tích của ion thứ hai, công thức của ion cấp 4, cấp 3 của ion thứ nhất, giá trị tuyệt đối cấp 2 của điện tích ion thứ nhất và giá trị tuyệt đối cấp 1 của điện tích của ion thứ hai một lần nữa. Ví dụ, nếu các ion đưa ra trên stack là "Al^+3", "SO_4^-2"chúng tôi có được -2, "SO_4", "Al", 3, 2.

Dòng thứ hai tính gcd của 2 khoản phí (giữ nguyên các khoản phí).

Dòng thứ ba chia mỗi điện tích cho gcd (để tính bội số) và nối nó với công thức của ion bằng cách sử dụng J. Vì vậy, chúng ta có hai chuỗi, mỗi chuỗi có một ion đã cho với điện tích bị loại bỏ (hoặc bội số của chuỗi đó) và điện tích của chuỗi thứ hai được chôn sau chúng. Ví dụ, -2, "Al_2", "(SO_4)_3"(-2 là chịu trách nhiệm về SO_4).

Dòng thứ tư giải phóng điện tích và nếu nó dương, nó hoán đổi hai chuỗi (để cation đến trước) trước khi nối chúng. Vì vậy, trong ví dụ ở trên, vì nó âm tính, chúng được nối theo thứ tự như sau : "Al_2(SO_4)_3".


1

JavaScript, 145 byte

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

Đưa ra các đối số clà cation,a là anion, plà điện tích dương, nlà điện tích âm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.