코디 움 골프 라이드


28

이 도전에서, 당신의 임무는 음이온과 양이온을 가지고 화합물의 화학식을 출력하는 것입니다. 입력은 다음 규칙을 따릅니다.

  • 음이온과 양이온, 예를 들어, 표현 (임의의 순서로)이 문자열에 타고 F, NH_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 .
  • 없음 첨자 사람 없습니다 : 염화나트륨,하지 나 1 CL 1 .
  • 변속 없음 : NH 5 O가 아닌 NH 4 OH
  • 조건부 괄호 :
    • 의 MgCl : 단일 원자 이온에 괄호를 사용하지 않는 2 가 아닌 마그네슘 (CL) 2 .
    • 분자 당 하나의 이온 만있는 경우 괄호를 사용하지 마십시오 : K (ClO 3 )가 아닌 KClO 3 .
    • DO 사용 괄호 더 다 원자 이온의 두 개있을 경우는 : 올려 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각 원소가 1 개인 다 원자 이온 ( OH^-1).
pizzapants184

1
@ Adám 2 차 이온 충전 : NO_3^-1. 또한 다른 테스트 케이스는 함께 짝 첫 번째해야 ^-2그것을 만들 것이다, 그래서 (C(NH_2)_3)_2.... 또는 한 번 이상 필요한 이온이 브래킷으로 시작하는 경우입니다.
Heimdall

1
Fe_4(Fe(CN)_6)_3프 러시안 블루 @ Adám .
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≠1s와 다른  가요 1? (1 또는 0 제공)

  m← 에 저장 m(대한 m의 ultiple)

(),¨ 그 각각에 다음을 추가하십시오.

  ⍺{}¨m 각각에 대해이 함수를 이온과 m함께 인수로 호출하십시오.

   ⎕D,⎕AD는 대문자 하였다 igits lphabet

   ⍺∩ 이온과 그 교차점

    그 문자의 수를 집계

   1< 하나보다 적습니까? (즉, 다중 원소 이온이 있습니까?)

   ⍵∧ 그 이온의 배수가 필요한가요?

   : 그렇다면 :

    ')(',⍺ 끈을 이온 앞에 붙이다

    1⌽ 주기적으로 한 단계 왼쪽으로 회전 ) 오른쪽에 입력)

    그밖에

     수정되지 않은 이온을 반환

ε NLIST (편평한)


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 바이트

6 바이트를 절약 해 준 Neil에게 감사합니다.

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

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

온라인으로 사용해보십시오!

입력은 줄 바꿈으로 구분됩니다 (테스트 스위트는 편의를 위해 쉼표 구분을 사용합니다).

설명

^
(

우리는 (각 분자 앞에 a 를 붙여서 시작합니다 . ^에 일치 라인 때문에 시작 m)프로그램의 끝으로 모든 이전 단계에 대한 여러 모드를 설정합니다.

\^.+
)_$&$*

^[-+]n부품을로 교체 한 )_다음 n사본을 복사합니다 1(예 : 청구 금액을 단항으로 변환하여 표시를 삭제함).

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

이 단계는 세 가지 작업을 수행합니다. 두 청구를 GCD로 나누고 다시 10 진수로 변환 한 다음 교체합니다. GCD는 1+역 참조만을 사용하여 두 요금을 모두 일치시킬 수 있는 가장 긴 것을 일치시켜 정규식에서 매우 쉽게 찾을 수 있습니다 \1. 이를 나누기 위해 Retina의 "캡처 수"기능을 사용하여 그룹이 얼마나 자주 사용되었는지 알려줍니다. 그래서 $#2공약수로 나눈 1 전하이고, $#3(십진수 모두)를 GCD에 의해 분할 된 제 2 전하이다.

_1$

우리 _1는 두 부분의 끝에서 s를 제거 합니다.

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

그리고 우리 는 하나의 원자 만 포함하는 줄뿐만 아니라 끝에있는 줄 )(즉 , 줄이있는 줄)에서 괄호를 삭제합니다 _1.

마지막으로, 라인 피드를 떨어 뜨려 두 분자를 연결합니다.





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 개 원자보다 그 결과, 적어도 예를 들면 2 일 것이다 길이로부터 감산 0 또는 1로 3하고 "PO_4"준다 "(PO_4)_3". 3그리고 "Al"제공합니다 "Al_3".

M먼저을 사용하여 각 이온을 분리합니다 S. 첫 번째 줄 다음에 스택의 레벨 5 (가장 깊은 매장물)에는 두 번째 이온, 레벨 4 초 이온 공식, 레벨 3 첫 번째 이온 공식, 레벨 2 첫 번째 이온 전하의 절대 값 및 레벨 1 절대 값이 들어 있습니다. 두 번째 이온 전하의 다시. 예를 들어, 스택에 주어진 이온이 경우 "Al^+3", "SO_4^-2"우리가 얻을 -2, "SO_4", "Al", 3,2 .

두 번째 줄은 두 청구 금액의 gcd를 계산합니다 (요금 그대로 유지).

세 번째 줄은 각 전하를 gcd로 나누고 (배수를 계산하기 위해)를 사용하여 이온의 공식과 결합시킵니다 J. 그래서 우리는 각각 하나의 주어진 이온이 전하가 제거 된 (또는 그것의 배수) 하나와 두 번째 스트링이 그 뒤에 묻힌 두 개의 줄을 가지고 있습니다. 예를 들어, -2, "Al_2","(SO_4)_3" (-2 SO_4의 전하이다).

네 번째 줄은 요금을 부과하지 않고 양수이면 두 줄을 교환하여 양이온이 먼저 오도록합니다. 따라서 위의 예에서 음수이므로 순서대로 다음과 같이 결합됩니다 "Al_2(SO_4)_3".


1

자바 스크립트, 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.