กลับไปเรียนวิชาเคมี


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 + 2CO2และ2CH4+4O2>4H2O+2CO2เป็นทั้งผลลัพธ์ที่ถูกต้อง อย่างไรก็ตามหากคุณใช้ช่องว่างสำหรับผลลัพธ์อย่างสม่ำเสมอคุณจะได้รับโบนัส -10%
  • นี่คือดังนั้นโปรแกรมที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ!

ต่างกันโดยสิ้นเชิง แต่เกี่ยวข้องกัน: การวาดโครงสร้างลูอิสของอัลเคน
ไม่ใช่ว่าชาร์ลส์

ดังนั้นเราสามารถสรุปได้ว่าอินพุตจะเป็นสูตรที่ถูกต้องหรือไม่
TanMath

@ Tanath ใช่คุณไม่ต้องกังวลเกี่ยวกับสูตรที่ไม่ถูกต้อง
Adnan

"ใช้ช่องว่างอย่างสม่ำเสมอ" - จะใช้จำนวน 0 ช่องว่างอย่างสม่ำเสมอหรือไม่
Mego

1
@ Mego ไม่มี การใช้ช่องว่าง 0 ไม่ได้ใช้ช่องว่างเลยดังนั้นกฎจึงไม่สามารถใช้งานได้
Adnan

คำตอบ:



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และลดความซับซ้อนการแสดงออกการส่งออกในแง่ของ

เอาต์พุตมีพารามิเตอร์เสียบผ่านการจัดรูปแบบสตริง Summand แรกเป็นเพียงอินพุตสตริงและส่วนที่เหลือมีการคำนวณตัวเลขเสียบโปรดทราบว่าN*1.5-2(เหมือนN*3/2-2) ให้ลอย แต่การจัดรูปแบบสตริงแปลงเป็น int


4

Java, 0.9 * 202 = 181.8 ไบต์

บางครั้งฉันสงสัยว่าฉันเพิ่งทำร้ายตัวเองด้วย Java

ขอบคุณ @TNT และ @TFeld สำหรับการตัดออกที่ดี 20 ไบต์!

class A {โมฆะคงที่สาธารณะหลัก (String [] a) {String s = a [0]. สตริง (1, a [0] .indexOf ("H")); long n = Long.parseLong (s.length ()> 0)? s: "1"); System.out.printf ("2% s +% dO2>% dH2O +% dCO2", [0], 3 * n + 1,2 * n + 2 2 * n);}}

ค่อนข้างง่าย โดยทั่วไปฉันตัดอินพุตจากCเป็นHและรับสตริงย่อยนั้น หากไม่มีอะไรฉันตั้งค่าnเป็นหนึ่ง มิฉะนั้นผมตั้งจำนวนระหว่างและC Hรหัสต่อไปนี้จะพิมพ์ออกมาและใส่ลงในเครื่องหมายที่เหมาะสม

Ungolfed:

คลาส A {
    โมฆะคงที่สาธารณะหลัก (String [] a) {
         String s = a [0] .substring (1, [0] .indexOf ("H"));
         ยาว n = ยาว. parseLong ((s.length ()> 0)? s: "1");
         System.out.printf ("2% s +% dO2>% dH2O +% dCO2", [0], 3 * n + 1,2 * n + 2,2 * n);
    }
}

2
คำตอบที่ดี แต่คุณต้องใช้ STDIN ไม่ใช่บรรทัดคำสั่ง args แม้ว่าคุณจะสามารถย่อให้สั้นลงได้โดยใช้printfแทน+(-11 จากคะแนนดิบของคุณหากฉันนับอย่างถูกต้อง)
ทีเอ็นที

ฉันได้รับแจ้งว่าการใช้อาร์กิวเมนต์บรรทัดคำสั่งเป็นทางเลือกที่ยอมรับได้ของ STDIN นอกจากนี้คุณสามารถอธิบายให้ชัดเจนว่าคุณหมายถึงให้ฉันใช้printfหรือไม่? (จู้จี้จุกจิกเล็กน้อยเกี่ยวกับเรื่องนั้นไม่เคยใช้มาก่อน: D)
Addison Crump

printfjava.util.Formatterใช้กลศาสตร์จาก คุณสามารถมีสตริงที่จะพิมพ์เช่น "% d" ในคำสั่งการพิมพ์ของคุณและหลังจากนั้นค่าหรือตัวแปรที่จะถูกพิมพ์แทน มันอาจจะเป็นประโยชน์ในกรณีที่คุณมีจำนวนมากของตัวแปรที่จะพิมพ์ตัวอย่างเช่น
ทีเอ็นที

และความจริงที่ว่าอาร์กิวเมนต์บรรทัดคำสั่งนั้นเป็นที่ยอมรับแทน STDIN นั้นเป็นข่าวใหม่ (และค่อนข้างมีประโยชน์) สำหรับฉัน :)
TNT

1
@VoteToClose ใช่คุณกำลังทำร้ายตัวเองด้วย Java
Kritixi Lithos


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

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

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

Ungolfed-ish:

#!/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)regex หากมีอยู่หรือ1อย่างอื่น (Perl ไม่สนใจว่ามันจะเป็นสตริงในทุกกรณียกเว้น1คุณสามารถใช้ตัวดำเนินการเชิงตัวเลขกับสตริงได้ดีใน Perl)



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

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"ด้วยอักขระอื่นใดที่มีค่า ascii ตั้งแต่ 58 ถึง 71)
undergroundmonorail


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เราจะได้ 1 ถ้าไม่มีตัวเลขระหว่าง C และ H จากนั้นก็พิมพ์ด้วยช่องว่าง ติดตามสูตรในคำถาม

นี้ควรนอกจากนี้ยังทำงานร่วมกับคู่ใช้ล่ามออนไลน์ที่นี่


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 และแสดงผลลัพธ์ มีปัญหากับnการเป็น 1 ฉันไม่สามารถคิดถึงวิธีที่สั้นกว่าในการส่งออก

Ungolfed

#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.