Trở lại lớp hóa học


15

Giới thiệu

Một trong những điều đầu tiên tôi học được trong hóa học, là đưa ra công thức đốt cháy ankan. Ví dụ cơ bản nhất là : 2CH4 + 4O2 > 4H2O + 2CO2. Lưu ý rằng phương trình có thể đã được đơn giản hóa bằng cách chia mọi hệ số cho 2, chúng ta sẽ nhận được CH4 + 2O2 > 2H2O + CO2 . Để làm cho mọi thứ dễ dàng hơn, chúng ta sẽ bỏ qua bước này .

Bạn có thể thấy rằng với sự đốt cháy của bất kỳ ankan, oxy được sử dụng. Sau phản ứng, chỉ có CO2 và H2O được tạo ra.

Nhiệm vụ:

Đưa ra một chương trình hoàn chỉnh lấy đầu vào từ STDIN hoặc tương đương gần nhất có thể và đưa ra phản ứng tổng thể bằng STDOUT hoặc tương đương gần nhất có thể.

Đầu vào sẽ luôn ở dạng C(n)H(2n+2), với n > 0. Đây là một số ví dụ đầu vào:

CH4
C2H6
C3H8
C4H10
C5H12
C6H14

etc.

Một lời khuyên hữu ích:

Mỗi ankan có một mẫu chuẩn trong phản ứng đốt cháy:

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

ví dụ

C4H10đưa ra phương trình sau : 2C(4)H(2*4+2) + (3*4+1)O2 > (2*4+2)H2O + (2*4)CO2. Sau khi tính toán mọi thứ, chúng ta có được phương trình cuối cùng này:2C4H10 + 13O2 > 10H2O + 8CO2

Ví dụ:

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

Quy tắc:

  • Bạn cần cung cấp một chương trình đầy đủ.
  • Chương trình của bạn cần lấy đầu vào từ STDIN hoặc tương đương gần nhất nếu không thể.
  • Chương trình của bạn cần xuất ra bằng STDOUT hoặc tương đương gần nhất nếu không thể.
  • Lưu ý rằng tôi đã sử dụng khoảng trắng cho các ví dụ để tăng khả năng đọc, những điều này là không cần thiết . 2CH4 + 4O2 > 4H2O + 2CO22CH4+4O2>4H2O+2CO2là cả hai đầu ra hợp lệ. Tuy nhiên, nếu bạn luôn sử dụng khoảng trắng cho đầu ra, bạn sẽ nhận được phần thưởng -10%
  • Đây là , vì vậy chương trình có số byte ít nhất sẽ thắng!

hoàn toàn khác nhau nhưng có liên quan: Vẽ cấu trúc Lewis của kiềm
Không phải là Charles

Vì vậy, chúng ta có thể giả định rằng đầu vào sẽ là công thức chính xác?
TanMath

@TanMath, vâng, bạn không phải lo lắng về các công thức không hợp lệ
Adnan

"nhất quán sử dụng khoảng trắng" - sẽ liên tục sử dụng 0 khoảng trắng?
Mego

1
@Mego, không. Sử dụng 0 dấu cách hoàn toàn không sử dụng khoảng trắng, vì vậy quy tắc không được áp dụng
Adnan

Câu trả lời:



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

Trích xuất số lượng Hchứ không phải số lượng Ctừ đầu vào. Điều này tránh vỏ đặc biệt CH4và đơn giản hóa các biểu thức đầu ra theo N=2n+2.

Đầu ra có các tham số được cắm thông qua định dạng chuỗi. Triệu hồi đầu tiên chỉ là chuỗi đầu vào và phần còn lại đã tính các số được cắm vào. Lưu ý rằng N*1.5-2(giống như N*3/2-2) đưa ra một dấu phẩy, nhưng định dạng chuỗi chuyển đổi nó thành một int.


4

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

Đôi khi, tôi tự hỏi nếu tôi chỉ làm tổn thương bản thân mình với Java.

Cảm ơn @TNT và @TFeld đã loại bỏ 20 byte tốt!

class A {public static void main (String [] a) {String s = a [0] .sub chuỗi (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);}}

Khá đơn giản. Về cơ bản, tôi cắt đầu vào từ Cđến Hvà lấy chuỗi con đó. Nếu không có gì, tôi đặt nthành một. Mặt khác, tôi đặt nó thành số giữa CH. Các mã sau chỉ in nó ra và đặt nó vào ký hiệu thích hợp.

Ung dung:

lớp A {
    công tĩnh void chính (Chuỗi [] a) {
         Chuỗi s = a [0] .sub chuỗi (1, a [0] .indexOf ("H"));
         dài 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
Câu trả lời tốt, nhưng bạn phải sử dụng STDIN và không phải dòng lệnh args. Mặc dù bạn có thể rút ngắn nó bằng cách sử dụng printfthay vì +(-11 từ điểm số thô của bạn nếu tôi đếm đúng).
TNT

Tôi đã được thông báo rằng sử dụng các đối số dòng lệnh là một thay thế chấp nhận được cho STDIN. Ngoài ra, bạn có thể làm rõ ý của bạn đối với tôi để sử dụng printf? (Một chút khó khăn về điều đó, chưa từng sử dụng nó trước đây .: D)
Addison Crump

printfsử dụng cơ học từ java.util.Formatter. Bạn có thể có một chuỗi để in, chẳng hạn như "% d" trong câu lệnh in của bạn và sau đó một số giá trị hoặc biến sẽ được in thay thế. Nó có thể hữu ích trong các tình huống mà bạn có rất nhiều biến để in, ví dụ .
TNT

Và thực tế là các đối số dòng lệnh được chấp nhận thay cho STDIN là tin tức mới (và khá hữu ích) đối với tôi. :)
TNT

1
@VoteToC Đóng Có, bạn đang tự làm tổn thương mình với 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)

3

Javascript ES6, 63 * .9 = 56,7 byte

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

Tương tự như câu trả lời ESMin của tôi.


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

Nó giống như câu trả lời của xnor, nơi tôi sử dụng các giá trị H. Một biến J được sử dụng để lưu trữ lượng H trong công thức phân tử của phân tử.

Hãy thử nó ở đây


Bạn dành sáu byte cho khoảng cách, nhưng chỉ kiếm được năm byte từ phần thưởng, vì vậy nó không xứng đáng.
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 byte

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

Dùng thử trực tuyến

Để tránh vỏ đặc biệt CH4, tôi hoàn toàn không sử dụng số đầu tiên và chỉ trích xuất số sauH . Điều này cho giá trị của 2n+2. Các giá trị còn lại sau đó được tính toán dựa trên đó và được định dạng.

Giải trình:

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%tiết kiệm một byte.
Dennis

2

Perl, (84 + 1) * 0,9 = 76,5

(+1 char để chạy với -ncờ)

Golf Perl đầu tiên của tôi!

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

Điều quan trọng là STDIN không chứa một dòng mới. Ví dụ sử dụng:

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

Những dòng kẻ

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

ở đây khá thú vị. $#xđại diện cho "chỉ số dân cư cuối cùng" của @x(và nổi bật cú pháp SE nghĩ đó là một bình luận vì nó câm), do đó $x[$#x]sẽ chọn một phần bắt của C(\d)regex nếu nó tồn tại, hoặc 1ngược lại. (Perl không quan tâm rằng đó sẽ là một chuỗi trong tất cả các trường hợp khác ngoại trừ 1; bạn có thể sử dụng các toán tử số trên các chuỗi tốt trong Perl.)


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

1

, 51 * .9 = 45,9 ký tự / 64 * .9 = 57,6 byte

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

Try it here (Firefox only).

Giải trình

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

Bất cứ ai đánh giá thấp câu trả lời của tôi, tôi có thể vui lòng nhận được lời giải thích?
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"

Hãy thử nó ở đây


Bạn không cần một khoảng trống giữa printvà một "nhân vật, và các CO2biến thể được đặt tên là một cái gì đó ngắn hơn :)
undergroundmonorail

@undergroundmonorail cảm ơn
TanMath

i[1]được đảm bảo là một "H"hoặc một chữ số, bạn có thể lưu một byte khác bằng if i[1]>"9"(hoặc thay thế "9"bằng bất kỳ ký tự nào khác có giá trị ascii từ 58 đến 71)
ngầm trong

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

Khá tự giải thích. Có một chuỗi đầu vào (cần phải bọc nó trong dấu ngoặc kép để MATLAB không cố thực hiện nó!). Sau đó chuyển đổi số giữa C và H trong đầu vào thành số thập phân. Giá trị 1 được gắn dưới dạng một mảng vào đầu ra của sscanf để trong trường hợp CH4khi chúng tôi trích xuất chỉ mục đầu tiên trong mảng vào, nchúng tôi nhận được 1 nếu không có số giữa C và H. Sau đó chỉ cần in ra với khoảng trắng theo công thức trong câu hỏi

Điều này cũng sẽ làm việc với Octave bằng cách sử dụng trình thông dịch trực tuyến tại đây .


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

Một chút nữa mà tôi mong đợi. Đọc char đầu tiên và loại bỏ nó, sau đó đọc int và xuất kết quả. Vấn đề là vớin 1. Tôi không thể nghĩ ra cách ngắn hơn để xuất nó.

Ung dung

#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 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"))

Tạo một chức năng ẩn danh. Hãy thử nó bằng cách vào đây và nhập (def f #(let...)), sau đó (f "C3H8").


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"

Nếu chúng ta có thể lấy đầu vào CH4 làm C1H4, có thể giảm xuống 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"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.