몰 질량의 화합물


14

직무

원자 번호 92 이하의 원소 (우라늄)로만 이루어진 화합물을 취하여에 몰의 질량을 출력하는 프로그램을 작성하시오 grams/mole.

규칙 및 제한

  • 몰 질량을 직접 계산하는 함수를 사용할 수 없습니다.
  • 프로그램은 오프라인 컴퓨터에서 실행할 수 있어야합니다.
  • 별도의 데이터 파일을 사용할 수 있습니다. 이 파일의 내용이 제공되어야합니다.
  • 점수는 프로그램을 사용하기로 선택한 경우 프로그램 길이 (바이트)와 데이터 파일 길이 (바이트)입니다.
  • 이것은 이므로 최저 점수가 이깁니다.

입력

화합물을 포함하는 문자열 이 문자열은을 통해 읽 STDIN거나 인수로 전달하거나 변수로 설정할 수 있습니다 (어떤 것을 지정하십시오). 다음은 모두 유효한 입력입니다.

  • CH2 (1 개의 탄소, 2 개의 수소)
  • (CH2)8 (8 개의 탄소, 16 개의 수소)
  • U (우라늄 1 개)

프로그램은 포함 된 괄호 (예 :) ((CH3)2N4)4또는 원자 번호가 92보다 큰 원소를 포함하는 화합물에 대해 기능 할 필요가 없습니다. 위 두 경우 중 하나에 대해 프로그램이 작동하지 않으면 다음 Invalid formula과 같은 경우에 출력되어야합니다. 정의되지 않은 동작이 없습니다.

산출

STDOUT의 화합물의 몰 질량을 변수 로 또는 변수로 출력해야합니다 grams/mole. 원소의 원자 질량 목록은 여기 (Wikipedia)에서 볼 수 있습니다 . 100 개 미만의 원자 (반올림)를 포함하는 화합물의 소수점 이하 자릿수에 대한 답은 정확해야합니다.

입력이 유효하지 않은 경우 Invalid formula출력해야합니다.

grams/mole(Wikipedia) 에서 화합물의 몰 질량을 계산하는 정보 .

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
"소수점까지"-얼마나 큰 분자? 의 질량은 질량 U1000000보다 소수점으로 결정하기가 더 어렵습니다U2
John Dvorak

100 개 미만의 원자를 갖는 분자의 소수점까지. 이것을 질문에 추가했습니다.
es1024

또한 13원자 질량이 12.999? 이면 출력 이 허용된다고 가정합니다 .
John Dvorak

1
@ es1024에서 제대로 들리지 않습니다. 13 살, 12 살?
RubberDuck

1
"답은 소수점 이하 자릿수 여야합니다"는 소수점 이하 자릿수 또는 가장 가까운 정수를 의미합니까?

답변:


5

세게 때리다, 978708675 6736506366326323198 594

프로그램의 경우 211 바이트, 데이터의 경우 382 바이트

입력이 STDIN에 있고 출력이 STDOUT에 있습니다. 경고 : g및 이라는 파일을 작성합니다 (있는 a경우) 덮어 씁니다!

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}

데이터 파일

이 파일 yzopfli로 압축 된이 데이터 형식 인 파일 (후행 줄 바꿈 없음)이 필요합니다. zopfli는 gzip 호환 압축 알고리즘이며 표준 gzip 도구로 압축 해제 할 수 있습니다. 1024 반복으로 실행되었습니다 (아마도 너무 많습니다). 그런 다음 마지막 8 바이트가 제거되었습니다.

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는 다음 y과 같습니다 ( base64 -d원본 파일을 재생하는 데 사용 ).

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

md5sum은 d392b0f5516033f2ae0985745f299efd입니다.

설명

파일의 숫자는 상대 원자 질량의 증분입니다 (따라서 리튬의 상대 원자 질량은 1.008 + 0 + 2.995 + 2.937).

이 스크립트로 산술 식으로 화학식 변환하여 작동 +하고 *다음 식에 먹이의 원자량에 각각의 심볼을 대체 bc. 수식에 유효하지 않은 기호가 포함되어 있으면 bc구문 오류가 발생하고 STDOUT에 아무것도 출력되지 않습니다. 이 경우 출력은 Invalid formula입니다.

STDIN이 비어 있으면 출력은 0입니다. 중첩 괄호가 지원됩니다.

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

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
요소의 질량 차이를 저장하고 즉시 계산하여 많은 비용을 절약 할 수 있습니다. 최소 및 최대 차이는 -1.002 및 +6.993 (Pa의 양쪽)입니다. 원자 번호 순서 대신 원자 질량 순서로 요소를 재 배열하면 범위가 0-5.991이됩니다. 주기율표가 고안되었을 때 어떤 순서가 더 나은지에 대한 많은 논쟁이있었습니다. (분명히 화학 의 관점에서, 원자 번호 순서가 더 좋지만, 그것들을 결정하는 데 약간의 시간이 걸렸습니다.)
Level River St

@steveverrill 나는 생각 코드를 작성할 때, 곧 그것으로 볼 것이라는 점에 대해

@steveverrill 완료, 절약 약 33 문자

2

펄-924

입력 된 수식에서 일련의 정규식 대체 연산을 사용하여 아래 첨자 요소 및 그룹을 확장하고 요소를 원자 가중치로 대체 한 다음 평가 순서로 변환합니다.

$_=<>;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

매스 매 티카 (9) - 247 227

원자 질량을 직접 계산하는 함수 (몰 질량은 아님)를 사용하면서 분명히 부정 행위입니다.

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

사용법 : f수식이 포함 된 문자열로 함수 를 호출하면 출력이 질량이됩니다.

테스트:

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

Mathematica 10은 원시 숫자를 출력하지 않지만 단위를 가진 숫자를 출력하므로 허용되지 않을 수 있습니다.


@ MartinBüttner 고마워, 기본적으로 내 init 파일에서 함수를 복사하고 약간 골프를 쳤다. 골프는 확실히 향상 될 수 있습니다.
Tyilo

2

자바 스크립트, 1002

입력이 q있고 출력이입니다 a. 반올림 규칙이 무엇인지 확실하지 않았으므로 소수점 이하 3 자리로 자릅니다 (또는 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 ... 이제 나는 미래의 수치심을
극복

입력은 실제로에 q있지만 다른 모든 것은 괜찮아 보입니다. +1
es1024

후행 0을 삭제하여 바이트를 절약 할 수 있습니다. 121.760 = 121.76
Fels

1

자바 스크립트 (E6) 1231

입력을 인수로 사용하고 출력을 반환하는 함수로. 정밀도 : 소수점 3 자리

정규식을 사용하여 다음과 같은 합계와 곱을 사용하여 간단한 산술 식으로 화학식을 변환하십시오.

  • (+(
  • '*'가있는 숫자 시퀀스, 숫자 시퀀스
  • 대문자와 '+'가 붙은 문자, 해당 원소의 원자 질량 (발견 된 경우)

그런 다음 표현식이 평가되고 값이 리턴됩니다. 오류가 발생하거나 값이 NaN (또는 0) 인 경우 함수는 '잘못된 수식'을 반환합니다.

이제 다른 모든 답변이 동일한 방법을 사용한다는 것을 알았습니다 ... 오 여기 자바 스크립트 버전이 있습니다.

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
}

나는 거의 같은 방법을 사용했지만 적어도 1 년 전에 함수를 만들었으므로 적어도 나는 당신을 복사하지 않았습니다. ;)
Tyilo

1

PHP — 793 (583 + 210)

비슷한 방법을 사용하는 professorfish의 답변에 크게 뒤떨어 졌지만 a다음 코드로 얻은 파일에서 기호와 질량이 gzip 압축됩니다 .

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

수식은 $f변수에 저장해야 합니다.

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

ungolfed 및 주석이 달린 버전은 다음과 같습니다.

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

나는 지금 당신을 1 바이트 씩 때리고있다, 나는 673 바이트를 가지고있다

@professorfish 참으로! 게다가, 파일 크기를 잘못 계산했습니다. 이는 이전에 말한 것보다 큽니다. 당신은 지금까지 승자입니다 ^^!
Blackhole

1

스칼라, 1077

나는 eval원자 질량 함수와 같은 cop-out을 가진 동적 유형 언어의 모든 솔루션을보고 정적 유형 언어 솔루션을 제공합니다.

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

나는 데이터에 대한 압축을 고려해야하지만, 지금은 기본 94의 원자 질량을 압축하지 않아야합니다.


제공molarmass.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

결정된. 또한 Scala의 파서가 이상하다는 것을 알았습니다.
Karol S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.