Kembali ke kelas kimia

15

pengantar

Salah satu hal pertama yang saya pelajari dalam kimia, adalah memberikan formula untuk pembakaran alkana. Contoh yang paling dasar adalah: 2CH4 + 4O2 > 4H2O + 2CO2. Perhatikan bahwa persamaan bisa disederhanakan dengan membagi setiap koefisien dengan 2, kita akan dapatkan CH4 + 2O2 > 2H2O + CO2 . Untuk mempermudah, kita akan mengabaikan langkah ini .

Anda dapat melihat bahwa dengan pembakaran alkana apa pun, oksigen digunakan. Setelah reaksi, hanya CO2 dan H2O yang dibuat.

Tugas:

Berikan program lengkap yang mengambil input dari STDIN atau setara terdekat yang mungkin, dan output total reaksi menggunakan STDOUT atau setara terdekat yang mungkin.

Masukan akan selalu dalam bentuk C(n)H(2n+2), dengan n > 0. Ini adalah beberapa contoh input:

CH4
C2H6
C3H8
C4H10
C5H12
C6H14

etc.

Kiat yang bermanfaat:

Setiap alkana memiliki pola standar dalam reaksi pembakaran:

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

misalnya

C4H10memberikan persamaan berikut: 2C(4)H(2*4+2) + (3*4+1)O2 > (2*4+2)H2O + (2*4)CO2. Setelah menghitung semuanya, kita mendapatkan persamaan terakhir ini:2C4H10 + 13O2 > 10H2O + 8CO2

Contoh:

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

Aturan:

  • Anda perlu menyediakan program lengkap.
  • Program Anda perlu mengambil input dari STDIN, atau yang setara terdekat jika tidak memungkinkan.
  • Program Anda perlu output menggunakan STDOUT, atau yang setara terdekat jika tidak memungkinkan.
  • Perhatikan bahwa saya menggunakan spasi untuk contoh untuk meningkatkan keterbacaan, ini tidak perlu . 2CH4 + 4O2 > 4H2O + 2CO2dan 2CH4+4O2>4H2O+2CO2keduanya merupakan output yang valid. Namun, jika Anda secara konsisten menggunakan spasi untuk output, Anda mendapatkan bonus -10%
  • Ini adalah , sehingga program dengan jumlah byte terkecil menang!
Adnan
sumber
sama sekali berbeda tetapi terkait: Menggambar Struktur Lewis dari Alkanes
Bukannya Charles
Jadi kita dapat berasumsi bahwa input akan menjadi formula yang benar?
TanMath
@TanMath, ya, Anda tidak perlu khawatir tentang formula yang tidak valid
Adnan
"konsisten menggunakan spasi" - apakah konsisten menggunakan 0 spasi akan dihitung?
Mego
1
@Mego, tidak. Menggunakan 0 spasi sama sekali tidak menggunakan spasi, jadi aturannya tidak berlaku
Adnan

Jawaban:

7

Python 3, 86 * 0,9 = 77,4 byte

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

Mengekstrak jumlah H's bukannya jumlah C' dari input. Ini menghindari casing khusus CH4dan menyederhanakan ekspresi output dalam hal N=2n+2.

Output memiliki parameter terhubung melalui pemformatan string. Sumand pertama hanyalah string input, dan sisanya telah menghitung angka yang terhubung. Perhatikan bahwa N*1.5-2(sama seperti N*3/2-2) memberikan float, tetapi format string mengubahnya menjadi int.

Tidak
sumber
4

Java, 0,9 * 202 = 181,8 byte

Terkadang, saya bertanya-tanya apakah saya hanya menyakiti diri sendiri dengan Java.

Terima kasih kepada @TNT dan @TFeld untuk mencukur 20 byte yang bagus!

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

Cukup mudah. Pada dasarnya, saya memotong input dari Cke H, dan mendapatkan substring itu. Jika bukan apa-apa, saya set nke satu. Kalau tidak, saya mengaturnya ke nomor antara Cdan H. Kode berikut hanya mencetaknya dan memasukkannya ke dalam notasi yang tepat.

Tidak Disatukan:

kelas A{
    public static static utama (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);
    }
}
Addison Crump
sumber
2
Jawaban yang bagus, tetapi Anda harus menggunakan STDIN dan bukan args baris perintah. Meskipun Anda bisa mempersingkat dengan menggunakan printfalih-alih +(-11 dari skor mentah Anda jika saya menghitung dengan benar).
TNT
Saya telah diberitahu bahwa menggunakan argumen baris perintah adalah alternatif yang dapat diterima untuk STDIN. Juga, dapatkah Anda menjelaskan maksud Anda untuk saya gunakan printf? (Sedikit rewel tentang itu, belum pernah menggunakannya sebelumnya.: D)
Addison Crump
printfmenggunakan mekanik dari java.util.Formatter. Anda dapat memiliki string untuk dicetak seperti "% d" dalam pernyataan cetak Anda dan setelah itu beberapa nilai atau variabel yang akan dicetak sebagai gantinya. Ini bisa berguna dalam situasi di mana Anda memiliki banyak variabel untuk dicetak, misalnya .
TNT
Dan fakta bahwa argumen baris perintah dapat diterima sebagai pengganti STDIN adalah berita baru (dan agak membantu) bagi saya. :)
TNT
1
@VoteToTutup Ya, Anda menyakiti diri sendiri dengan Java.
Kritixi Lithos
4

Python 2, 122 91 * 0,9 = 81,9 byte

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)
TFeld
sumber
3

Javascript ES6, 63 * .9 = 56.7 byte

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

Mirip dengan jawaban ESMin saya.

Mama Fun Roll
sumber
3

Pyth, 69 byte * 0,9 = 62 63 * 0,9 = 57 56 * 0,9 = 50 53 * 0,9 = 48 byte

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

Sama seperti jawaban xnor, di mana saya menggunakan nilai H. Variabel J digunakan untuk menyimpan jumlah H dalam rumus molekul.

Coba di sini

TanMath
sumber
Anda menghabiskan enam byte untuk spasi, tetapi hanya mendapatkan lima byte dari bonus, jadi itu tidak sepadan.
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`
Dendrobium
sumber
2

CJam, 45 44 byte

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

Cobalah online

Untuk menghindari casing khusus CH4, saya tidak menggunakan nomor pertama sama sekali, dan hanya mengekstrak nomor setelah H. Ini memberi nilai 2n+2. Nilai yang tersisa kemudian dihitung berdasarkan itu, dan diformat.

Penjelasan:

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.
Reto Koradi
sumber
2r_[[~]W=_2/(3*)\_2-]"+%dO2>%dH2O+%dCO2"e%menghemat satu byte.
Dennis
2

Perl, (84 +1) * 0.9 = 76.5

(+1 char untuk berjalan dengan -n bendera)

Golf Perl pertama saya!

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

Sangat penting bahwa STDIN tidak mengandung baris baru. Contoh penggunaan:

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

Isgolfed-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";

Garis

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

cukup menarik di sini. $#xmewakili "indeks populasi terakhir" @x(dan penyorotan sintaksis SE menganggap itu komentar karena bodoh), sehingga $x[$#x]akan memilih bagian yang diambil dari C(\d)regex jika ada, atau 1sebaliknya. (Perl tidak peduli bahwa itu akan menjadi string dalam semua kasus lain kecuali 1; Anda dapat menggunakan operator numerik pada string dengan baik di Perl.)

Gagang pintu
sumber
1

JS, 118 (106) byte

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");
Nautilus
sumber
1

𝔼𝕊𝕄𝕚𝕟, 51 * .9 = 45.9 karakter / 64 * .9 = 57.6 byte

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

Try it here (Firefox only).

Penjelasan

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
sumber
Siapa pun yang menolak jawaban saya, bisakah saya mendapatkan penjelasan?
Mama Fun Roll
1

Python, 0,9 * 195 = 175 0,9 * 190 = 171 0,9 * 148 = 133 byte

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"

Coba di sini

TanMath
sumber
Anda tidak perlu spasi di antara printdan "karakter, dan CO2variabel dapat dinamai lebih pendek :)
undergroundmonorail
@undergroundmonorail terima kasih
TanMath
Karena i[1]dijamin berupa "H"angka atau digit, Anda dapat menyimpan byte lain dengan if i[1]>"9"(atau mengganti "9"dengan karakter lain dengan nilai ascii dari 58 hingga 71)
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.
Sehnsucht
sumber
1

MATLAB, 96 * 0.9 = 86.4 byte

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)

Cukup jelas. Mengambil string input (perlu membungkusnya dengan tanda kutip sehingga MATLAB tidak mencoba untuk mengeksekusinya!). Kemudian, konversi angka antara C dan H pada input menjadi desimal. Nilai 1 ditambahkan sebagai array ke output sscanf sehingga dalam kasus CH4ketika kita mengekstrak indeks pertama dalam array nkita mendapatkan 1 jika tidak ada angka antara C dan H. Kemudian hanya mencetak dengan spasi mengikuti rumus dalam pertanyaan.

Ini juga harus bekerja dengan Oktaf menggunakan penerjemah online di sini .

Tom Carpenter
sumber
1

C ++, 160 * 0,9 = 144 byte

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

Sedikit lagi yang saya harapkan. Baca dulu char dan buang, lalu baca int dan output hasilnya. Masalahnya dengan nmenjadi 1. Saya tidak bisa memikirkan cara yang lebih pendek untuk menghasilkannya.

Tidak disatukan

#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);
}
Zereges
sumber
1

Clojure / ClojureScript, 98 * 0.9 = 88.2 byte

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

Menciptakan fungsi anonim. Cobalah dengan masuk ke sini dan masuk (def f #(let...)), lalu (f "C3H8").

MattPutnam
sumber
1

Excel, 123 * 0,9 = 110,7 byte

=="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"

Jika kita dapat mengambil input CH4 sebagai C1H4, dapat dikurangi menjadi 122 * 0,9 = 109,8 byte

="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"
Wernisch
sumber
0

Jelly , 33 byte

ṣ”HṪVµ2³”+2⁸_©+H“O2>”⁸“H2O+”®“CO2

Cobalah online!

Bonus tidak membantu di sini.

Erik the Outgolfer
sumber