화학 수업으로 돌아 가기


15

소개

내가 화학에서 배운 첫 번째 것 중 하나는 알칸의 연소에 대한 공식을 제공하는 것이 었습니다. 가장 기본적인 예는 다음과 같습니다 2CH4 + 4O2 > 4H2O + 2CO2. 모든 계수를 2로 나누어 방정식을 단순화 할 수 있다는 점에 유의하십시오 CH4 + 2O2 > 2H2O + CO2 . 일을 더 쉽게하기 위해이 단계를 무시할 것 입니다.

알칸 연소시 산소가 사용됨을 알 수 있습니다. 반응 후 CO2와 H2O 만 생성됩니다.

작업:

STDIN 또는 가장 가까운 가능한 등가물을 입력하고 STDOUT 또는 가장 가까운 가능한 등가물을 사용하여 전체 반응을 출력하는 완전한 프로그램을 제공하십시오.

입력은 항상 형식 C(n)H(2n+2)으로되어 n > 0있습니다. 다음은 입력 예입니다.

CH4
C2H6
C3H8
C4H10
C5H12
C6H14

etc.

유용한 팁 :

모든 알칸에는 연소 반응에서 표준 패턴이 있습니다.

2C(n)H(2n+2) + (3n+1)O2 > (2n+2)H2O + (2n)CO2

예 :

C4H10다음 방정식을 제공합니다 2C(4)H(2*4+2) + (3*4+1)O2 > (2*4+2)H2O + (2*4)CO2. 모든 것을 계산 한 후 다음과 같은 최종 방정식을 얻습니다.2C4H10 + 13O2 > 10H2O + 8CO2

예 :

input:  CH4
output: 2CH4 + 4O2 > 4H2O + 2CO2

input:  C3H8
output: 2C3H8 + 10O2 > 8H2O + 6CO2

input:  C4H10
output: 2C4H10 + 13O2 > 10H2O + 8CO2

input:  C12H26
output: 2C12H26 + 37O2 > 26H2O + 24CO2

규칙 :

  • 전체 프로그램을 제공해야합니다.
  • 프로그램은 STDIN에서 입력을 받아야하거나 가능하지 않은 경우 가장 가까운 것에서 입력해야합니다.
  • 프로그램은 STDOUT 또는 가능하지 않은 경우 가장 가까운 제품을 사용하여 출력해야합니다.
  • 가독성을 높이기 위해 예제에 공백을 사용 했으므로 필요하지 않습니다 . 2CH4 + 4O2 > 4H2O + 2CO22CH4+4O2>4H2O+2CO2모두 유효한 출력한다. 그러나 출력에 공백을 계속 사용하면 -10 % 보너스 를받습니다.
  • 이것은 이므로 바이트 수가 가장 적은 프로그램이 승리합니다!


입력이 올바른 공식이라고 가정 할 수 있습니까?
TanMath

@ TanMath, 예, 당신은 잘못된 수식에 대해 걱정할 필요가 없습니다
Adnan

"일관된 공백 사용"-지속적으로 0 개의 공백을 사용합니까?
Mego

1
@ 메고 0 개의 공백을 사용하면 공백이 전혀 사용되지 않으므로 규칙이 적용되지 않습니다
Adnan

답변:



7

파이썬 3, 86 * 0.9 = 77.4 바이트

s=input()
N=int(s.split('H')[1])
print("2%s + %dO2 > %dH20 + %dCO2"%(s,N*1.5-2,N,N-2))

입력에서의 H개수 대신 의 개수를 추출합니다 C. 이렇게하면 특수한 대소 문자를 피하고로 CH4표현 식을 단순화 할 수 N=2n+2있습니다.

출력에는 문자열 형식을 통해 연결된 매개 변수가 있습니다. 첫 번째 summand는 입력 문자열이며 나머지는 연결된 숫자를 계산했습니다. N*1.5-2(와 동일 N*3/2-2)은 부동 소수점을 제공하지만 문자열 형식은 정수로 변환합니다.


4

자바, 0.9 * 202 = 181.8 바이트

때로는 Java로 인해 자신을 다치게하는지 궁금합니다.

좋은 20 바이트를 줄여준 @TNT와 @TFeld에 감사합니다!

클래스 A {공공 정적 무효 메인 (문자열 [] a) {문자열 s = a [0] .substring (1, a [0] .indexOf ( "H")); long n = Long.parseLong ((s.length ()> 0)? s : "1"); System.out.printf ( "2 % s + % dO2> % dH2O + % dCO2", a [0], 3 * n + 1,2 * n + 2 , 2 * n);}}

꽤 간단합니다. 기본적으로 입력을에서 C까지 잘라 내고 H해당 하위 문자열을 가져옵니다. 아무것도 없다면, 나는 1로 설정 n했습니다. 그렇지 않으면, 나는 사이의 숫자로 설정 C하고 H. 다음 코드는 그것을 인쇄하고 적절한 표기법으로 넣습니다.

언 골프 드 :

클래스 A {
    공개 정적 무효 메인 (문자열 [] a) {
         문자열 s = a [0] .substring (1, a [0] .indexOf ( "H"));
         long n = Long.parseLong ((s.length ()> 0)? s : "1");
         System.out.printf ( "2 % s + % dO2> % dH2O + % dCO2", a [0], 3 * n + 1,2 * n + 2,2 * n);
    }
}

2
좋은 대답이지만 명령 행 인수가 아닌 STDIN을 사용해야합니다. (정확하게 계산하면 원시 점수에서 11) printf대신 대신 사용하여 단축 할 수 있습니다 +.
TNT

커맨드 라인 인수를 사용하는 것이 STDIN의 수용 가능한 대안이라고 들었습니다. 또한, 내가 사용하는 것이 어떤 의미인지 명확히 할 수 printf있습니까? (그것에 약간의 까다로운, 전에 그것을 사용하지 않았습니다. : D)
애디슨 크럼프

printf의 역학을 사용합니다 java.util.Formatter. print 문에 "% d"와 같이 인쇄 할 문자열과 그 뒤에 인쇄 될 값 또는 변수가있을 수 있습니다. 예를 들어 인쇄 할 변수가 많은 상황에서 유용 할 수 있습니다 .
TNT

그리고 STDIN 대신 명령 줄 인수가 허용된다는 사실은 나에게 새롭고 도움이되는 뉴스입니다. :)
TNT

1
@VoteToClose 네, 당신은 Java로 자신을 다치게합니다.
Kritixi Lithos

4

파이썬 2, 122 91 * 0.9 = 81.9 바이트

i=input()
n=2*int(i[1:i.find('H')]or 1)
print'2%s + %dO2 > %dH2O + %dCO2'%(i,n*3/2+1,n+2,n)

3

자바 스크립트 ES6, 63 * .9 = 56.7 바이트

_=>`2${_} + ${$=_.split`H`[1],$*1.5-2}O2 > ${$}H2O + ${$-2}CO2`

내 ESMin 답변과 비슷합니다.


3

Pyth, 69 바이트 * 0.9 = 62 63 * 0.9 = 57 56 * 0.9 = 50 53 * 0.9 = 48 바이트

Js>z+xz\H1s[\2z%" + %dO2 > %dH2O + %dCO2"[-*1.5J2J-J2

그것은 X 값을 사용하는 xnor의 대답과 같습니다. 변수 J는 분자의 분자식에 H의 양을 저장하는 데 사용됩니다.

여기 사용해보십시오


간격에 6 바이트를 사용하지만 보너스에서 5 바이트 만 얻으므로 그만한 가치가 없습니다.
lirtosiast

2

자바 스크립트 ES6, 96 * 0.9 = 86.4

f=s=>`2C${(n=(s.match(/\d+(?!.*\d)/)[0]-2))>2?n/2:''}H${n+2} + ${1.5*n+1}O2 > ${n+2}H2O + ${n}CO2`

2

CJam, 45 44 바이트

2r_'H/1=[i_((_2/1$+)@@]"+%dO2>%dH2O+%dCO2"e%

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

특수한 대소 문자를 피하기 위해 CH4첫 번째 숫자를 전혀 사용하지 않고의 숫자 만 추출하십시오 H. 이 값을 제공합니다 2n+2. 그런 다음 나머지 값은이를 기반으로 계산되고 형식이 지정됩니다.

설명:

2       Push leading 2 for output.
r       Get input.
_'H/    Copy and split at 'H.
1=      Take second part after split, this is 2n+2.
[       Start list.
  i       Convert string value to integer.
  _((     Copy and decrement twice, giving 2n.
  _2/     Copy and divide by 2, giving n.
  1$      Copy the 2n to the top.
  +       Add, to get 3n.
  )       Increment, giving 3n+1. We now have 2n+2, 2n, 3n+1 on stack.
  @@      Rotate top 3 entries twice, to get 3n+1, 2n+2, 2n.
]       Close list.
"+%dO2>%dH2O+%dCO2"
        Format string for output.
e%      "printf" operator.

2r_[[~]W=_2/(3*)\_2-]"+%dO2>%dH2O+%dCO2"e%바이트를 저장합니다.
Dennis

2

펄, (84 + 1) * 0.9 = 76.5

(로 실행하기위한 +1 문자 -n 플래그 )

나의 첫번째 Perl 골프!

@x=(1,m/C(\d)/g);$n=$x[$#x];say"2$_ + ".(3*$n+1)."O2 > ".(($n*=2)+2)."H20 + ${n}CO2"

STDIN에는 후행 줄 바꿈이 포함되지 않아야합니다. 사용법 예 :

llama@llama:...code/perl/ppcg64412chemistry$ printf CH4 | perl -n chemistry.pl
2CH4 + 4O2 > 4H20 + 2CO2

언 골프 드 :

#!/usr/bin/perl
use 5.10.0;

$_ = 'C3H8';
my @x = (1, m/C(\d)/g);
my $n = $x[$#x];
say "2$_ + ".(3*$n+1)."O2 > ".(($n*=2)+2)."H20 + ${n}CO2";

my @x = (1, m/C(\d)/g);
my $n = $x[$#x];

여기서 상당히 흥미 롭습니다. $#x의 "마지막 인구 지수」를 나타냅니다 @x(와 SE의 구문 강조는 바보이기 때문에이 코멘트라고 생각) 그래서, $x[$#x]의 캡처 된 부분을 선택합니다 C(\d)정규식 경우 가 존재, 또는1 그렇지 않으면. (Perl은 문자열을 제외한 다른 모든 경우에는 문자열이 될지 신경 쓰지 않습니다 1; Perl에서 문자열에 숫자 연산자를 사용할 수 있습니다.)


1

JS, 118 (106) 바이트

x=prompt();y=x.replace("CH","C1H").match(/\d{1,}/g)[0];alert(2+x+" + "+(3*y+1)+"O2 > "+(2*y+2)+"H2O + "+(2*y)+"CO2");

1

𝔼𝕊𝕄𝕚𝕟, 51 * .9 = 45.9 자 / 64 * .9 = 57.6 바이트

a=ïČ`H”[1],`2⦃ï} + ⦃a*1.5-2}O2 > ⦃a}H2O + ⦃a-2}CO2`

Try it here (Firefox only).

설명

a=ïČ`H”[1],      // split input along H to get 2n+2
`  2⦃ï}          // 2C(n)H(2n+2) – this is the same as 2[input alkane's formula]
   + ⦃a*1.5-2}O2 // + 2(3n+1)O2
   > ⦃a}H2O      // > (2n+2)H2O
   + ⦃a-2}CO2    // + (2n)O2
`                // implicitly output the template string above

누가 내 답을 공감했는지 설명해 주시겠습니까?
Mama Fun Roll

1

파이썬, 0.9 * 195 = 175 0.9 * 190 = 171 0.9 * 148 = 133 바이트

i=raw_input()
O=3*int(i[1:i.find('H')]or 1)+1;C=2*int(i[1:i.find('H')]or 1);print"2"+i+" + "+`O`+"O2"+" > "+i[i.find('H')+1:]+"H2O"+ " + "+`C`+"CO2"

여기 사용해보십시오


당신은 사이에 공간이 필요하지 않습니다 print"문자를하고, CO2변수는 : 짧은 뭔가라는 이름의 수
undergroundmonorail

@undergroundmonorail 감사
TanMath

이후 i[1]여야 보장 "H"하거나 자리는 또 다른 바이트를 저장할 수있다 if i[1]>"9"(혹은 교체 "9"58 71 ASCII 값이 다른 문자)
undergroundmonorail

1

F #, 113

let s=stdin.ReadLine()
float s.[1+s.IndexOf 'H'..]|>fun f->printf"2%s + %gO2 > %gH2O + %gCO2"s<|f*1.5-2.<|f<|f-2.

1

MATLAB, 96 * 0.9 = 86.4 바이트

s=input('');i=[sscanf(s,'C%dH'),1];n=i(1);fprintf('%s + %dO2 > %dH2O + %dCO2',s,3*n+1,2*n+2,2*n)

공정한 자기 설명. 입력 문자열을 사용합니다 (MATLAB이 실행을 시도하지 않도록 따옴표로 묶어야 함). 그런 다음 입력에서 C와 H 사이의 숫자를 10 진수로 변환합니다. 값 1은 sscanf의 출력에 배열로 추가되므로CH4 의 첫 번째 인덱스를 추출 할 때n C와 H 사이에 숫자가 없으면 1을 얻습니다. 그런 다음 공백으로 인쇄합니다. 질문의 공식을 따르십시오.

온라인 인터프리터를 사용하여 옥타브 에서도 작동 합니다 .


1

C ++, 160 * 0.9 = 144 바이트

#include<iostream>
int main(){int n=1,t;std::cin.get();std::cin>>n;t=2*n;printf("2C");n-1&&printf("%i",n);printf("H%i + %iO2 > %iH2O + %iCO2",t+2,t+n+1,t+2,t);}

내가 기대했던 것보다 조금 더. 첫 번째 문자를 읽고 버린 다음 int를 읽고 결과를 출력합니다. 문제는 n1입니다. 나는 그것을 출력하는 더 짧은 방법을 생각할 수 없습니다.

언 골프

#include <iostream>
int main()
{
    int n = 1, t;
    std::cin.get();
    std::cin >> n;
    t = 2 * n;
    printf("2C");
    n - 1 && printf("%i", n);
    printf("H%i + %iO2 > %iH2O + %iCO2", t + 2, t + n + 1, t + 2, t);
}

1

Clojure / ClojureScript, 98 * 0.9 = 88.2 바이트

#(let[n(max 1(int((re-find #"C(.*)H"%)1)))m(* 2 n)](str "2"%" + "(inc(* 3 n))"O2 > "(+ 2 m)"H2O + "m"CO2"))

익명 함수를 만듭니다. 이동하여 그것을 시도 여기 및 입력 (def f #(let...))(f "C3H8").


1

엑셀, 123 * 0.9 = 110.7 바이트

=="2"&A1&" + "&(3*MID(A1,FIND("H",A1)+1,9)/2-2)&"O2 > "&MID(A1,FIND("H",A1)+1,9)&"H2O + "&(MID(A1,FIND("H",A1)+1,9)-2)&"CO2"

CH4 입력을 C1H4로 취할 수 있다면 122 * 0.9 = 109.8 바이트로 줄일 수 있습니다

="2"&A1&" + "&3*MID(A1,2,FIND("H",A1)-2)+1&"O2"&" > "&MID(A1,FIND("H",A1)+1,9)&"H2O + "&(MID(A1,FIND("H",A1)+1,9)-2)&"CO2"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.