化学のクラスに戻る


15

前書き

化学で最初に学んだことの1つは、アルカンの燃焼式を与えることでした。最も基本的な例は次のとおり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 + 2CO2および2CH4+4O2>4H2O+2CO2は両方とも有効な出力です。ただし、出力に一貫してスペースを使用すると、-10%のボーナスが得られます
  • これはなので、バイト数が最小のプログラムが勝ちです!

まったく異なるが関連している:アルカンのルイス構造の描画
チャールズではない

したがって、入力が正しい式になると仮定できますか?
TanMath

@TanMath、はい、無効な数式を心配する必要はありません
Adnan

「一貫してスペースを使用する」-一貫して0個のスペースを使用するとカウントされますか?
メゴ

1
@Mego、いいえ。ルールが適用されないように、0のスペースを使用すると、すべてのスペースを使用していない
アドナン・

回答:



7

Python 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

出力には、文字列フォーマットを介して接続されたパラメーターがあります。最初の被加数は単なる入力文字列であり、残りは計算された数値が差し込まれています。N*1.5-2(と同じN*3/2-2)は浮動小数点数を与えますが、文字列の書式設定はそれをintに変換します。


4

Java、0.9 * 202 = 181.8バイト

時々、私はJavaで自分自身を傷つけているのではないかと思います。

良い20バイトを削り取ってくれた@TNTと@TFeldに感謝します!

クラスA {public static void main(String [] a){String 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);}}

ものすごく単純。基本的に、入力をCto から切り取り、Hそのサブストリングを取得します。何もなければ、1に設定nします。そうでなければ、私は間の番号に設定CしてH。次のコードは、それを単に出力し、適切な表記法に入れます。

ゴルフをしていない:

クラスA {
    public static void main(String [] 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を使用する必要があります。printf代わりに+(私が正しく数えた場合、生のスコアから-11)を使用して短縮できますが。
TNT

コマンドライン引数を使用することは、STDINの代替として受け入れられると言われました。また、私が使用する意味を明確にできますprintfか?(それについて少し気難しい、それを以前に使用したことがありません。:D)
アディソン・クランプ

printfのメカニズムを使用しjava.util.Formatterます。printステートメントで "%d"などの印刷する文字列を使用し、その後に代わりに印刷される値または変数を含めることができます。たとえば、印刷する変数がたくさんある状況で役立ちます。
TNT

そして、コマンドライン引数がSTDINの代わりに受け入れられるという事実は、私にとって新しい(そしてかなり役立つ)ニュースです。:)
TNT

1
@VoteToCloseはい、あなたはJavaを傷つけています。
クリティキシリソス

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

Javascript 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

これは、xnorの答えのように、H値を使用しています。変数Jは、分子の分子式にHの量を格納するために使用されます。

ここで試してみてください


6バイトをスペーシングに費やしますが、ボーナスからは5バイトしか獲得できないため、その価値はありません。
リトシアスト

2

Javascript 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%バイトを保存します。
デニス

2

Perl、(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は、それ以外のすべての場合に文字列になることを気にしません; Perlでは文字列に1数値演算子を使用できます。)


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

誰が私の答えに反対票を投じたとしても、説明をいただけますか?
ママファンロール

1

Python、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になります。質問の式に従ってください。

これは、ここでオンラインインタープリターを使用してOctaveでも動作するはずです


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

私が期待したもう少し。最初のcharを読み取り、それを破棄してから、intを読み取り、結果を出力します。問題はn 1であることです。それを出力するより短い方法を考えることはできません。

非ゴルフ

#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

Excel、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.