回到化学课


15

介绍

我从化学中学到的第一件事就是给出了烷烃燃烧的公式。最基本的示例是:2CH4 + 4O2 > 4H2O + 2CO2注意,可以通过将每个系数除以2来简化方程,我们将得到 CH4 + 2O2 > 2H2O + CO2为了使事情变得简单,我们将忽略此步骤

您会看到,随着任何烷烃的燃烧,都会使用氧气。反应后,仅产生CO 2和H 2O。

任务:

给出一个完整的程序,该程序接受来自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
@Mego,不。使用0个空格根本不使用空格,因此该规则不适用
Adnan

Answers:



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伤害自己。

感谢@TNT和@TFeld节省了20个字节!

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

很简单 基本上,我将输入从剪切CH,并获得该子字符串。如果没什么,我设置n为一个。否则,我将它设置为之间的数量CH。以下代码只是将其打印出来并放入正确的符号中。

取消高尔夫:

A级{
    公共静态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 2015年

有人告诉我,使用命令行参数可以替代STDIN。另外,您能否阐明您对我使用的意义printf?(对此有点挑剔,以前没有使用过。:D)
Addison Crump

printf使用来自的机械师java.util.Formatter。您可以在打印语句中有一个要打印的字符串,例如“%d”,然后在其后将打印一些值或变量。例如要打印许多变量的情况下,此功能很有用。
TNT 2015年

命令行参数可以代替STDIN接受的事实对我来说是新的(也是很有帮助的)新闻。:)
TNT

1
@VoteToClose是的,您正在使用Java伤害自己。
Kritixi Lithos 2015年

4

Python 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的数量。

在这里尝试


您在间隔上花费了六个字节,但从奖金中仅获得了五个字节,因此不值得。
lirtosiast

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并不关心它将是一个字符串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 2015年

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之间的数字转换为十进制。值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"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.