Bileşiklerin mol kütleleri


14

Görev

Sadece atom numarası 92 (Uranyum) 'a eşit veya daha az olan elemanlardan oluşan bir bileşiği alan ve bileşiğin molar kütlesini veren bir program yazın grams/mole.

Kurallar ve Kısıtlamalar

  • Molar kütleleri sizin için doğrudan hesaplayan bir işlev kullanamazsınız.
  • Programınız çevrimdışı bir makinede çalışabilmelidir.
  • Ayrı bir veri dosyası kullanabilirsiniz. Bu dosyanın içeriği sağlanmalıdır.
  • Puanınız, programınızın bayt cinsinden uzunluğunun yanı sıra bir tane kullanmayı seçerseniz veri dosyanızın bayt cinsinden uzunluğudur.
  • Bu , bu nedenle, en düşük puan kazanır.

Giriş

Bileşiği içeren bir dize. Bu dize okunabilir STDIN, bağımsız değişken olarak geçirilebilir veya bir değişkene ayarlanabilir (lütfen hangisini belirtin). Aşağıdakilerin tümü geçerli girdilerdir:

  • CH2 (bir Karbon, iki Hidrojen)
  • (CH2)8 (8 Karbon, 16 Hidrojen)
  • U (1 Uranyum)

Programınızın gömülü parantez (örn. ((CH3)2N4)4) İçin veya atom numarası 92'den büyük olan bir öğe içeren herhangi bir bileşik için çalışması gerekmez. Programınız yukarıdaki iki durumdan hiçbirinde çalışmazsa, bu Invalid formulagibi durumlar için çıktı almalıdır - tanımlanmamış davranış yok.

Çıktı

STDOUTBileşiğin molar kütlesini bir değişkene veya bir değişkene vermelisiniz grams/mole. Elementlerin atomik kütlelerinin bir listesi burada bulunmaktadır (Wikipedia) . Cevabınız 100'den az atom içeren (yuvarlatılmış) bileşikler için ondalık basamağa kadar doğru olmalıdır.

Giriş geçersizse, çıktı Invalid formulaalınmalıdır.

Bir bileşiğin molar kütlesinin grams/mole(Wikipedia) hesaplanması hakkında bilgi .

Örnekler

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
"ondalık noktaya" - ne kadar büyük moleküller için? Kütlesi U1000000ondalık noktaya kütlesinden daha zorU2
John Dvorak

100'den az atomlu moleküller için ondalık noktaya kadar. Bunu soru ifadesine ekledi.
es1024

Ben de 13atom kütlesi ise çıktı almak için izin varsayalım 12.999?
John Dvorak

1
Kulağa hoş gelmiyor @ es1024. 13, tamam, ama 12?
RubberDuck

1
"Cevabınız ondalık basamağa doğru olmalı", bu bir ondalık basamağa mı yoksa en yakın tam sayı mı anlamına geliyor?

Yanıtlar:


5

Bash, 9787087575673 65063663263959 594

Program için 211 bayt ve veriler için 382 bayt.

Giriş STDIN'de, çıkış STDOUT'ta. UYARI: adlı dosyalar oluşturur gve avarsa bunların üzerine yazılır!

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}

Veri dosyası

Bu , bu verilerin zopfli sıkıştırılmış formu yolan bir dosya gerektirir (son satırsonu yok). zopfli, gzip uyumlu bir sıkıştırma algoritmasıdır ve standart gzip araçlarıyla açılabilir. 1024 yineleme ile çalıştırıldı (bu muhtemelen çok fazladır). Son 8 bayt daha sonra çıkarıldı.

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öğesi ( base64 -dorijinal dosyayı yeniden oluşturmak için kullanın ):

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

Md5sum olduğunu d392b0f5516033f2ae0985745f299efd.

açıklama

Dosyadaki sayılar bağıl atom kütlesinin artışlarıdır (yani lityumun bağıl atom kütlesi 1.008 + 0 + 2.995 + 2.937).

Bu komut dosyası, kimyasal formülü aritmetik bir ifadeye dönüştürerek ve her bir sembolü bağıl atom kütlesi ile değiştirerek +ve *ardından ifadeyi besleyerek çalışır bc. Formül geçersiz simgeler içeriyorsa, bcbir sözdizimi hatası verir ve STDOUT'a hiçbir şey vermez; bu durumda çıktı olur Invalid formula.

STDIN boşsa, çıktı olur 0. İç içe parantezler desteklenir.

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

Misal

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
Elemanların kütleleri arasındaki farkları saklayarak ve anında hesaplayarak çok tasarruf edebilirsiniz. Minimum ve maksimmm farklılıklar -1.002 ve +6.993'tür (Pa'nın her iki tarafı). Öğeleri atom numarası sırası yerine atomik kütle düzeninde yeniden düzenleyerek aralık 0 ila 5.991 olur. Periyodik tablo tasarlandığında, hangi düzenin daha iyi olduğu hakkında çok fazla tartışma vardı. (Açıkçası, Kimya açısından atom numarası sırası daha iyidir, ancak buna karar vermek biraz zaman aldı.)
Level River St

@steveverrill Ben kodu yazarken, yakında içine bakacağım düşündüm

@steveverrill Bitti, tasarruf yaklaşık 33 karakterdi

2

Perl - 924

Abone olunan öğeleri ve grupları genişletmek, elementleri atomik ağırlıklarla değiştirmek ve daha sonra değerlendirdiği bir ekleme dizisine dönüştürmek için girilen formülde bir dizi regex ikame işlemi kullanır.

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

Mathematica 9 - 247 227

Doğrudan otomatik kütleleri (ancak molar kütleleri değil!) Hesaplayan bir işlev kullandığım için bu açıkça hile yapıyor:

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

Kullanımı: fFormülü içeren bir dize ile fonksiyonu çağırın, çıktı kütle olacaktır.

Ölçek:

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 bir ham sayı değil, birim içeren bir sayı üretir, bu nedenle kabul edilemeyebilir.


@ MartinBüttner Teşekkürler, temelde init dosyamdan bir fonksiyon kopyaladım ve biraz golf oynadım. Golf kesinlikle geliştirilebilir.
Tyilo

2

Javascript, 1002

Giriş var qve çıkış var a. Yuvarlama kurallarının ne olduğundan emin değildim, bu nedenle ondalık basamaktan sonra 3 yere kısıldım (veya rakamlar Wikipedia'dan kullanılamıyorsa daha az).

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

Basit değişkenleri kullanma fikri için +1 ... şimdi gelecekteki utanç için aşırı karmaşık cevabımı bırakabilirim
edc65

Girdi aslında qher şey yolunda gözükse de. +1
es1024

Sondaki sıfırları silerek bazı baytlar kaydedebilirsiniz: 121.760 = 121.76
Fels

1

Javascript (E6) 1231

Girdi bağımsız değişken olarak ve çıktı döndüren bir işlev olarak. Hassasiyet: 3 ondalık basamak

Kimyasal formülü, toplamları ve ürünleri içeren basit bir aritmetik ifadede dönüştürmek için regexp kullanın:

  • ( ile +(
  • '*' ile herhangi bir sayısal dizi, ardından sayısal dizi
  • herhangi bir Büyük harf ve ardından '+' harfleri, ardından karşılık gelen öğenin atom kütlesi (bulunursa)

Daha sonra ifade değerlendirilir ve değer döndürülür. Hata olması durumunda veya değer NaN (veya sıfır) ise işlev 'Geçersiz formül' döndürür

Şimdi diğer tüm cevapların aynı yöntemi kullandığını görüyorum ... oh işte javascript sürümü

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
}

Neredeyse aynı yöntemi kullandım, ancak en az bir yıl önce işlevi yarattım, en azından seni kopyalamadım. ;)
Tyilo

1

PHP - 793 (583 + 210)

Benzer bir yöntem kullanan professorfish'in cevabıyla büyük ölçüde geride kaldı , ama hey… Semboller ve kitleler a, aşağıdaki kodla elde edilen dosyada gzip sıkıştırılmış :

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

Formül $fdeğişkente saklanmalıdır :

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

İşte ungolfed ve yorumlanmış versiyonu:

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

Şimdi seni bir bayt atıyorum, 673 bayt var

@professorfish Gerçekten! Ayrıca, daha önce söylediğimden daha büyük olan dosya boyutunu yanlış saydım. Şimdiye kadar kazanan sizsiniz, şu anda ^^!
Kara delik

1

Scala, 1077

Tüm çözümlerinizi dinamik olarak yazılan dillerde bulunan evalveya yerleşik atomik kütle fonksiyonu gibi cop-out'larla görüyorum ve size statik olarak yazılan bir dil çözümü yetiştiriyorum:

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

Veriler için biraz sıkıştırma düşünmeliyim, ancak şimdilik sadece taban 94'teki atomik kütleleri sıkıştırılmadan alalım.


Bana verirmolarmass.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

Sabit. Ayrıca Scala'nın ayrıştırıcısının garip olduğunu öğrendim.
Karol S
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.