Khối lượng mol của các hợp chất


14

Bài tập

Viết chương trình lấy một hợp chất chỉ gồm các nguyên tố có số nguyên tử nhỏ hơn hoặc bằng 92 (Urani) và tạo ra khối lượng mol của hợp chất grams/mole.

Quy tắc và hạn chế

  • Bạn không thể sử dụng hàm tính toán trực tiếp khối lượng mol cho bạn.
  • Chương trình của bạn phải có khả năng chạy trên máy ngoại tuyến.
  • Bạn có thể sử dụng một tệp dữ liệu riêng biệt. Nội dung của tập tin này phải được cung cấp.
  • Điểm của bạn là độ dài chương trình của bạn tính bằng byte, cộng với độ dài của tệp dữ liệu tính theo byte, bạn nên chọn sử dụng một byte.
  • Đây là , do đó, điểm số thấp nhất sẽ thắng.

Đầu vào

Một chuỗi chứa hợp chất. Chuỗi này có thể được đọc qua STDIN, chuyển qua làm đối số hoặc được đặt thành một biến (vui lòng chỉ định chuỗi nào). Sau đây là tất cả các đầu vào hợp lệ:

  • CH2 (một Carbon, hai Hydrogens)
  • (CH2)8 (8 nguyên tử cacbon, 16 hydrogens)
  • U (1 Urani)

Chương trình của bạn không bắt buộc phải hoạt động cho dấu ngoặc đơn (nghĩa là ((CH3)2N4)4), cũng như đối với bất kỳ hợp chất nào có chứa một phần tử có số nguyên tử lớn hơn 92. Nếu chương trình của bạn không hoạt động cho một trong hai trường hợp trên, nó phải xuất ra Invalid formulacho các trường hợp đó - không có hành vi không xác định.

Đầu ra

Bạn nên xuất, đến STDOUThoặc tới một biến, khối lượng mol của hợp chất trong grams/mole. Một danh sách các khối nguyên tử của các nguyên tố có sẵn ở đây (Wikipedia) . Câu trả lời của bạn phải chính xác đến vị trí thập phân cho các hợp chất chứa ít hơn 100 nguyên tử (làm tròn).

Nếu đầu vào không hợp lệ, Invalid formulaphải được xuất ra.

Thông tin về tính toán khối lượng mol của hợp chất trong grams/mole(Wikipedia).

Ví dụ

Input                   Output
H2O                     18.015
O                       15.999 (16 acceptable)
C6H2(NO2)3CH3           227.132
FOOF                    69.995
C6H12Op3                Invalid formula
Np                      237 (or Invalid formula)
((C)3)4                 144.132 (or Invalid formula)
CodeGolf                Invalid formula

1
"Đến dấu thập phân" - cho các phân tử lớn như thế nào? Khối lượng của U1000000khó xác định đến dấu thập phân hơn khối lượng củaU2
John Dvorak

đến dấu thập phân cho các phân tử có ít hơn 100 nguyên tử. Đã thêm điều này vào câu hỏi.
es1024

Tôi cũng cho rằng tôi được phép xuất ra 13nếu khối lượng nguyên tử là 12.999?
John Dvorak

1
Điều đó không có vẻ đúng @ es1024. 13, ok, nhưng 12?
RubberDuck

1
"Câu trả lời của bạn phải chính xác đến vị trí thập phân" có nghĩa là một chữ số thập phân hoặc số nguyên gần nhất?

Câu trả lời:


5

Bash, 977 708 675 673 650 636 632 631 598 594

211 byte cho chương trình và 382 byte cho dữ liệu.

Đầu vào là trên STDIN, đầu ra là trên STDOUT. CẢNH BÁO: tạo các tệp được gọi ganếu chúng tồn tại, chúng sẽ bị ghi đè!

zcat y>g 2>a
s=(`sed 's/[A-Z][a-z]*/& /g;q'<g`)
p=1.008
v=`sed 's/[0-9]\+/*&/g;s/(/+(0/g'`
r=(`tail -1 g`)
for n in {0..91};{
p=`bc<<<$p+${r[n]}`
v=${v//${s[n]}/+$p}
}
o=`bc<<<0$v 2>a`
echo ${o:-Invalid formula}

Tập tin dữ liệu

Điều này đòi hỏi một tệp được gọi y, đó là dạng nén của zopfli của dữ liệu này (không có dòng mới). zopfli là một thuật toán nén tương thích với gzip và có thể được giải nén bằng các công cụ gzip tiêu chuẩn. Nó được chạy với 1024 lần lặp (điều này có lẽ là quá nhiều). 8 byte cuối cùng sau đó đã bị xóa.

HHeLiBeBCNOFNeNaMgAlSiPSClKArCaScTiVCrMnFeNiCoCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbITeXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcPaThU
0 2.995 2.937 2.072 1.798 1.201 1.996 1.992 2.999 1.182 2.81 1.315 2.677 1.103 2.889 1.086 3.39 3.648 .850 .130 4.878 2.911 3.075 1.054 2.942 .907 2.848 .24 4.613 1.834 4.346 2.904 2.292 4.038 .944 3.894 1.670 2.152 1.286 2.318 1.682 3.054 2.04 3.07 1.836 3.514 1.448 4.543 2.407 3.892 3.050 5.144 .696 3.693 1.612 4.422 1.578 1.211 .792 3.334 .758 5.36 1.604 5.286 1.675 3.575 2.43 2.329 1.675 4.120 1.913 3.523 2.458 2.892 2.367 4.023 1.987 2.867 1.883 3.625 3.788 2.82 1.78 .02 1 12 1 3 1 4.036 1.002 5.991

Base64 của ylà (sử dụng base64 -dđể tái tạo tệp gốc):

H4sIAAAAAAACAwTB226DMAwA0G9LvEJQIbVi70LfHPBoJAiSaR729zsnBB2LVw/x0UWNMm1up4IE
+90ZCC1cvsCm2mkscEJ71l56dRept7ulTDY/Lebp5CW19MLVbbAOlSrlgfVH4fIyCihaXPGg49b6
lfPHXzhvxsecxxZ+Wb6TPq7B8O1a2HjH7Aue7p1qZ0ncgsKvz/8WxuRGoigGgfcfxYvA8r7kn9iA
ei6ohAt/+lzuihmD1PFnMrdIV0PeNfOczh3Ylrw8hnHaM6w1WC8V3X4hcYjOfbKlTyz0pewsP5nh
plOUK9mkPzkd4HLiCbktIGyQI5uaUvZzNBrwLhOf9hJij+Jo5WBf6mHLfh2OFqeaxOHbaGAZl5mL
h5UBI3Hlx99GX4llPumDjgw+NIee7uCaRbrZkzluIhJYi2E0ZU2gb5OnYBTSJQMRfv91irmCz4KK
B5Va5J7T7IGjHnR22PeAd+m3F3KW/voz4BMFPGNgxHE0Loq65M6+Pw==

Md5sum là d392b0f5516033f2ae0985745f299efd.

Giải trình

Các số trong tệp là số gia của khối lượng nguyên tử tương đối (vì vậy khối lượng nguyên tử tương đối của lithium là 1.008 + 0 + 2.995 + 2.937).

Kịch bản này hoạt động bằng cách chuyển đổi công thức hóa học thành biểu thức số học bằng +*, thay thế từng ký hiệu bằng khối lượng nguyên tử tương đối của nó, sau đó cho biểu thức vào bc. Nếu công thức chứa các ký hiệu không hợp lệ, bcsẽ đưa ra lỗi cú pháp và không xuất ra gì cho STDOUT; trong trường hợp đó, đầu ra là Invalid formula.

Nếu STDIN trống, đầu ra là 0. Dấu ngoặc lồng được hỗ trợ.

zcat y>g 2>a # Unzip the file y and output result to the file g. Send standard error to file a (there will be an error because the last 8 bytes are missing)
s=(`sed 's/[A-Z][a-z]*/& /g;q'<g`)  # Read from g to sed; append a space after any capital letter optionally followed by a lowercase letter; exit at the end of the first line so the atomic masses are not processed in this way; parse result as space-separated array and save to variable $s
p=1.008 # In the upcoming loop, $p is the value obtained in the previous iteration
v=`sed 's/[0-9]\+/*&/g;s/(/+(0/g'` # Read from standard input to sed; prepend a * after any sequence of digits; replace ( with +(0; save to $v
r=(`tail -1 g`) # Get the last line of file g; parse as space-separated array; save to $r
for n in {0..91};{ # Loop once for each number from 0 to 91; set $n to the current number each iteration
p=`bc<<<$p+${r[n]}` # Concatenate $p, + and the next number from $r; send to bc and evaluate as arithmetic expression; save to $p (i.e. add the next increment from the file to $p)
v=${v//${s[n]}/+$p} # Replace every occurence of the current element symbol with + and $p (i.e. replace each symbol with a + and its relative atomic mass
} # end loop
o=`bc<<<0$v 2>a` # Prepend 0 to $v; send to bc and evaluate as arithmetic expression; redirect any errors on standard error to the file a; save result to $o
echo ${o:-Invalid formula} # If $o is empty (if there was a syntax error), output Invalid formula; otherwise output $o

Thí dụ

C6H2(NO2)3CH3  #input
C*6H*2+(0NO*2)*3CH*3  #after line 3
+12.011*6+*1.008*2+(0+14.007+15.999*2)*3+12.011+1.008*3  #after the loop in lines 4-6
0+12.011*6+*1.008*2+(0+14.007+15.999*2)*3+12.011+1.008*3  #given to bc in line 7
227.132 #output as evaluated by bc

1
Bạn có thể tiết kiệm rất nhiều bằng cách lưu trữ sự khác biệt giữa khối lượng của các yếu tố và tính toán khi đang bay. Sự khác biệt tối thiểu và maximmm là -1,002 và +6,993 (hai bên của Pa.) Bằng cách sắp xếp lại các phần tử theo thứ tự khối lượng nguyên tử thay vì thứ tự số nguyên tử, phạm vi trở thành 0 đến 5,991. Khi bảng tuần hoàn được đưa ra, có nhiều tranh luận về thứ tự nào tốt hơn. (Rõ ràng, từ quan điểm Hóa học , thứ tự số nguyên tử là tốt hơn, nhưng họ đã mất một thời gian để quyết định điều đó.)
Level River St

@steveverrill Tôi đã nghĩ về điều đó khi viết mã, tôi sẽ sớm xem xét nó

@steveverrill Xong, tiết kiệm khoảng 33 ký tự

2

Perl - 924

Nó sử dụng một loạt các hoạt động thay thế regex trên công thức đã nhập để mở rộng các phần tử và nhóm được đăng ký, thay thế các phần tử bằng trọng lượng nguyên tử và biến nó thành một chuỗi các bổ sung mà sau đó nó đánh giá.

$_=<>;chop;@g='H1008He4003Li6940Be9012B10810C12011N14007O15999F18998Ne20179Na22989Mg24305Al26981Si28085P30974S32060Cl35450Ar39948K39098Ca40078Sc44955Ti47867V50942Cr51996Mn54938Fe55845Co58933Ni58693Cu63546Zn65380Ga69723Ge72630As74922Se78960Br79904Kr83798Rb85468Sr87620Y88906Zr91224Nb92906Mo95960Tc98Ru101070Rh102906Pd106420Ag107868Cd112411In114818Sn118710Sb121760Te127600I126904Xe131293Cs132905Ba137327La138905Ce140116Pr140907Nd144242Pm145Sm150360Eu151964Gd157250Tb158925Dy162500Ho164930Er167259Tm168934Yb173054Lu174967Hf178490Ta180948W183840Re186207Os190230Ir192217Pt195084Au196967Hg200592Tl204380Pb207200Bi208980Po209At210Rn222Fr223Ra226Ac227Th232038Pa231036U238028'=~/(\D+)([\d\.]+)/g;for$b(0..91){$d=2*$b+1;$g[$d]=$g[$d]>999?$g[$d]/1000:$g[$d]}%h=@g;for$a('(\(((?>[^()]|(?1))*)\))(\d+)','()([A-Z][a-z]?)(\d+)'){for(;s/$a/$2x$3/e;){}}s/([A-Z][a-z]?)/($h{$1}||_).'+'/ge;if(/_/){print'Invalid formula';exit}$_.=0;print eval;

2

Toán học 9 - 247 227

Đây rõ ràng là gian lận vì tôi đang sử dụng một hàm tính trực tiếp khối lượng atomatic (nhưng không phải là khối lượng mol!):

r=StringReplace;f[s_]:=Check[ToExpression@r[r[r[s,x:RegularExpression["[A-Z][a-z]*"]:>"ElementData[\""<>x<>"\",\"AtomicWeight\"]+"],x:DigitCharacter..:>"*"<>x<>"+"],{"+*"->"*","+"~~EndOfString->"","+)"->")"}],"Invalid formula"]

Cách sử dụng: Gọi hàm fvới một chuỗi chứa công thức, đầu ra sẽ là khối.

Kiểm tra:

f["H2O"]           (* => 18.0153 *)
f["O"]             (* => 15.9994 *)
f["C6H2(NO2)3CH3"] (* => 227.131 *)
f["FOOF"]          (* => 69.9956 *)
f["C6H12Op3"]      (* => Invalid formula *)
f["Np"]            (* => 237 *)
f["((C)3)4"]       (* => 144.128 *)
f["CodeGolf"]      (* => Invalid formula *)

Mathicala 10 không xuất ra một số nguyên, nhưng một số có một đơn vị, do đó có thể không được chấp nhận.


@ MartinBüttner Cảm ơn, về cơ bản tôi chỉ sao chép một hàm từ tệp init của mình và đánh gôn nó một chút. Việc chơi golf chắc chắn có thể được cải thiện.
Tyilo

2

Javascript, 1002

Đầu vào là trong qvà đầu ra là trong a. Tôi không chắc chắn các quy tắc làm tròn là gì, vì vậy tôi đã rút ngắn xuống 3 vị trí sau số thập phân (hoặc ít hơn, nếu các chữ số không có sẵn từ Wikipedia).

H=1.008
He=4.002
Li=6.94
Be=9.012
B=10.812
C=12.011
N=14.007
O=15.999
F=18.998
Ne=20.179
Na=22.989
Mg=24.305
Al=26.981
Si=28.085
P=30.973
S=32.06
Cl=35.45
Ar=39.948
K=39.098
Ca=40.078
Sc=44.955
Ti=47.867
V=50.941
Cr=51.996
Mn=54.938
Fe=55.845
Co=58.933
Ni=58.693
Cu=63.546
Zn=65.38
Ga=69.723
Ge=72.630
As=74.921
Se=78.96
Br=79.904
Kr=83.798
Rb=85.467
Sr=87.62
Y=88.905
Zr=91.224
Nb=92.906
Mo=95.96
Tc=98
Ru=101.07
Rh=102.905
Pd=106.42
Ag=107.868
Cd=112.411
In=114.818
Sn=118.710
Sb=121.760
Te=127.60
I=126.904
Xe=131.293
Cs=132.905
Ba=137.327
La=138.905
Ce=140.116
Pr=140.907
Nd=144.242
Pm=145
Sm=150.36
Eu=151.964
Gd=157.25
Tb=158.925
Dy=162.500
Ho=164.930
Er=167.259
Tm=168.934
Yb=173.054
Lu=174.966
Hf=178.49
Ta=180.947
W=183.84
Re=186.207
Os=190.23
Ir=192.217
Pt=195.084
Au=196.966
Hg=200.592
Tl=204.38
Pb=207.2
Bi=208.980
Po=209
At=210
Rn=222
Fr=223
Ra=226
Ac=227
Th=232.038
Pa=231.035
U=238.028
try{a=eval(q.replace(/(\d+)/g,'*$1').replace(/(\w)(?=[A-Z\(])/g,'$1+'))}catch(e){a="Invalid formula"}

+1 cho ý tưởng sử dụng các biến đơn giản ... bây giờ tôi có thể để lại câu trả lời overcomplex của mình cho sự xấu hổ trong tương lai
edc65

Đầu vào thực sự là trong q, mặc dù mọi thứ khác có vẻ tốt. +1
es1024

Bạn có thể lưu một số byte bằng cách xóa các số 0 ở cuối: 121.760 = 121.76
Fels

1

Javascript (E6) 1231

Là một hàm với đầu vào là đối số và trả về đầu ra. Chính xác: 3 chữ số thập phân

Sử dụng regrec để biến đổi công thức hóa học trong một biểu thức arithmethic đơn giản, với các khoản tiền và sản phẩm, thay thế:

  • ( với +(
  • bất kỳ chuỗi số nào có '*', sau đó là chuỗi số
  • bất kỳ chữ in hoa nào theo sau là các chữ cái có '+', sau đó khối lượng nguyên tử của phần tử tương ứng (nếu tìm thấy)

Sau đó biểu thức được ước tính và giá trị trả về. Trong trường hợp có lỗi hoặc nếu giá trị là NaN (hoặc không) thì hàm trả về 'Công thức không hợp lệ'

Bây giờ tôi thấy rằng tất cả các câu trả lời khác đều sử dụng cùng một phương pháp ... ồ đây là phiên bản javascript

F=f=>{
  T={H:1.008,He:4.002,Li:6.94,Be:9.012,B:10.81,C:12.011
  ,N:14.007,O:15.999,F:18.998,Ne:20.179,Na:22.989,Mg:24.305
  ,Al:26.981,Si:28.085,P:30.973,S:32.06,Cl:35.45,Ar:39.948
  ,K:39.098,Ca:40.078,Sc:44.955,Ti:47.867,V:50.941,Cr:51.996,Mn:54.938
  ,Fe:55.845,Co:58.933,Ni:58.693,Cu:63.546,Zn:65.38,Ga:69.723,Ge:72.630
  ,As:74.921,Se:78.96,Br:79.904,Kr:83.798,Rb:85.467,Sr:87.62,Y:88.905,Zr:91.224
  ,Nb:92.906,Mo:95.96,Tc:98,Ru:101.07,Rh:102.905,Pd:106.42,Ag:107.868,Cd:112.411
  ,In:114.818,Sn:118.710,Sb:121.760,Te:127.60,I:126.904,Xe:131.293
  ,Cs:132.905,Ba:137.327,La:138.905,Ce:140.116,Pr:140.907,Nd:144.242,Pm:145
  ,Sm:150.36,Eu:151.964,Gd:157.25,Tb:158.925,Dy:162.500,Ho:164.930,Er:167.259
  ,Tm:168.934,Yb:173.054,Lu:174.966,Hf:178.49,Ta:180.947,W:183.84,Re:186.207
  ,Os:190.23,Ir:192.217,Pt:195.084,Au:196.966,Hg:200.592,Tl:204.38,Pb:207.2
  ,Bi:208.980,Po:209,At:210,Rn:222,Fr:223,Ra:226,Ac:227,Th:232.038,Pa:231.035
  ,U:238.028,Np:237,Pu:244,Am:243,Cm:247,Bk:247,Cf:251,Es:252,Fm:257,Md:258
  ,No:259,Lr:266,Rf:267,Db:268,Sg:269,Bh:270,Hs:269,Mt:278
  ,Ds:281,Rg:281,Cn:285,Uut:286,Fl:289,Uup:289,Lv:293,Uus:294,Uuo:294};
  e='Invalid formula';
  try{return eval(f.replace(/([A-Z][a-z]*)|(\d+)|(\()/g,(f,a,b,c)=>c?'+(':b?'*'+b:a='+'+T[a]))||e}
  catch(x){}return e
}

Tôi đã sử dụng gần như cùng một phương thức, nhưng tôi đã tạo ra hàm này ít nhất một năm trước, vì vậy ít nhất tôi đã không sao chép bạn. ;)
Tyilo

1

PHP - 793 (583 + 210)

Lớn hơn nhiều so với câu trả lời của professorfish , người đang sử dụng một phương pháp tương tự, nhưng hey, Các biểu tượng và khối lượng được nén bằng gzip trong tệp athu được với đoạn mã sau:

$symbolsList = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar', 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mg', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U'];
$massesList = [1.008, 4.003, 6.94, 9.012, 10.81, 12.011, 14.007, 15.999, 18.998, 20.18, 22.99, 24.305, 26.982, 28.085, 30.974, 32.06, 35.45, 39.948, 39.098, 40.078, 44.956, 47.867, 50.942, 51.996, 54.938, 55.845, 58.933, 58.6934, 63.546, 65.38, 69.726, 72.630, 74.922, 78.96, 79.904, 83.798, 85.468, 87.62, 88.906, 91.224, 92.906, 95.96, 98, 101.07, 102.906, 106.42, 107.868, 112.411, 114.818, 118.710, 121.760, 127.60, 126.904, 131.293, 132.905, 137.327, 138.905, 140.116, 140.908, 144.242, 145, 150.36, 151.964, 157.25, 158.925, 162.5, 164.93, 167.259, 168.934, 173.054, 174.967, 178.49, 180.948, 183.84, 186.207, 190.23, 192.217, 195.084, 196.967, 200.592, 204.38, 207.2, 208.98, 209, 210, 222, 223, 226, 227, 232.038, 231.036, 238.029];

$fileArrayContent = [$symbolsList, $massesList];
$fileStringContent = json_encode($fileArrayContent);

$file = gzopen('a', 'w9');
gzwrite($file, $fileStringContent);
gzclose($file);

Công thức nên được lưu trữ trong $fbiến:

$a=json_decode(gzfile('a')[0]);$r=@eval('return '.str_replace($a[0],$a[1],preg_replace(['#(?<=(?!\().)(\(|'.implode('|',$a[0]).')#','#\d+#'],['+${1}','*$0'],$f)).';');echo error_get_last()?'Invalid formula':$r;

Đây là phiên bản chưa được chỉnh sửa và nhận xét:

// Recover the data stored in the compressed file
$fileStringContent = gzfile('a')[0];
$fileArrayContent = json_decode($fileStringContent);
$symbolsList = $fileArrayContent[0];
$massesList = $fileArrayContent[1];

$formula = preg_replace('#(?<=(?!\().)(\(|'. implode('|', $symbolsList) .')#', '+${1}', $formula); // Add a "+" before each opening paranthesis and symbol not at the beginning of the string and not preceded by an opening paranthesis
$formula = preg_replace('#\d+#', '*$0', $formula); // Add a "*" before each number

$formula = str_replace($symbolsList, $massesList, $formula); // Replace each symbol with its corresponding mass

$result = @eval('return '. $formula .';'); // Evaluate the value without showing the errors
echo error_get_last() ? 'Invalid formula' : $result; // Print the value, or "Invalid formula" if there was an error

Bây giờ tôi đang đánh bại bạn một byte, tôi có 673 byte

@professorfish Thật vậy! Ngoài ra, tôi đã tính sai kích thước tệp, lớn hơn những gì tôi đã nói trước đây. Bạn là người chiến thắng, hiện tại ^^!
Hố đen

1

Scala, 1077

Tôi thấy tất cả các giải pháp của bạn bằng các ngôn ngữ được gõ động với evalchức năng khối nguyên tử giống như hoặc tích hợp sẵn và nâng cao cho bạn một giải pháp ngôn ngữ được nhập tĩnh:

object M{type S=String;type Z=(Int,S)
val d="H  *dHe JVLi inBe!!rB !5\"C !AiN !W!O !l3F \".*Ne\":_Na\"XUMg\"fUAl#%#Si#0iP #OOS #[&Cl$!,Ar$P|K $GxCa$RBSc%(7Ti%G5V %gwCr%s.Mn&4JFe&>)Co&^yNi&\\ECu'2\"Zn'ERGa'seGe(4^As(M#Se(x Br)$$Kr)MLRb)_5Sr)v,Y *%kZr*>LNb*PBMo*ppTc+(TRu+I4Rh+\\ePd,$,Ag,3RCd,cqIn,}LSn-HrSb-i>Te.IJI .B$Xe.peCs/#sBa/RwLa/ccCe/pXPr/y!Nd0>NPm0FTSm1!VEu12\\Gd1jrTb1|aDy2DdHo2^VEr2wATm3+0Yb3W Lu3k@Hf42nTa4L{W 4kfRe5&wOs5QdIr5fqPt6'BAu6;DHg6azTl7,8Pb7J8Bi7]2Po7]FAt7h$Rn9+bFr96@Ra9V8Ac9`tTh:8NPa:-mU :x4".grouped(5).map{s=>(s.take(2).trim,s(2)*8836+s(3)*94+s(4)-285792)}.toMap
def k(n:S):Z={val x=n.takeWhile(_.isDigit);(if(x=="")1 else x.toInt,n drop x.length)}
def o(m:S):Z={if(m(0)==40){val(i,s)=a(m.tail);if(s(0)!=41)???;val(j,t)=k(s.tail);(j*i,t)}else{val l=if(m.size>1&&m(1).isLower)2 else 1;val(i,s)=d(m.take(l))->m.drop(l);val(j,t)=k(s);(j*i,t)}}
def a(m:S)={var(r,s)=(m,0);do{val(y,z)=o(r);r=z;s+=y}while(r!=""&&r(0)!=41);s->r}
def main(q:Array[S]){println(try{val(m,s)=a(io.Source.stdin.getLines.next);if(s!="")???;m/1e3}catch{case _=>"Invalid formula"})}}

Tôi nên xem xét một số nén cho dữ liệu, nhưng bây giờ chúng ta hãy có khối lượng nguyên tử trong cơ sở 94, không nén.


Cung cấp cho tôimolarmass.scala:5: error: ';' expected but identifier found. def a(m:S)={var(r,s)=(m,0);do{val(y,z)=o(r);r=z;s+=y}while(r!=""&&r(0)!=41)s->r}
es1024

Đã sửa. Ngoài ra tôi phát hiện ra trình phân tích cú pháp của Scala là lạ.
Karol S
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.