Tabel Unsur Berkala - Golf Kode

47

Berdasarkan Golf Praktis - Amerika Serikat

Tugas Anda adalah menemukan singkatan (simbol) elemen yang diberi nama elemen, hingga dan termasuk ununoctium (118). Gunakan tabel periodik di Wikipedia .

Berkat squeamish ossifrage, Anda dapat menemukan daftar lengkap elemen untuk singkatan di http://pastebin.com/DNZMWmuf .

Anda tidak boleh menggunakan sumber daya eksternal apa pun. Selain itu, Anda tidak boleh menggunakan data bawaan apa pun secara khusus tentang elemen tabel periodik. Celah standar berlaku.

Memasukkan

Masukan mungkin dari stdin, file prompt, inputdll.

Masukkan format:

Semua yang berikut ini adalah input yang valid:

Carbon
carbon
CARBON
cArBOn

Pada dasarnya, nama elemen - case sensitif.

Anda tidak harus menangani kesalahan ejaan atau nama elemen yang tidak valid. Input tidak valid adalah perilaku yang tidak terdefinisi.

Keluaran :

Simbol untuk elemen. Karakter pertama harus ditulis dengan huruf besar dan sisanya harus huruf kecil.

Contoh output: C

Kasus uji:

Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn

Ada lebih banyak elemen daripada negara, jadi saya berharap akan lebih sulit untuk menemukan aturan umum untuk ini.

Ini kode golf. Kode terpendek menang!

soktinpk
sumber
4
@squeamishossifrage Terima kasih. Kedua versi ("belerang" dan "belerang") dapat diterima. Namun, program Anda tidak harus menangani keduanya, hanya satu.
soktinpk
1
... tidak mungkin dilakukan dengan regex. Anda membuat kami baik.
Josiah Winslow
2
@Xrylite Coba baca aturan: " Input ... nama elemen - case sensitive ... Output ... Karakter pertama harus dikapitalisasi dan sisanya harus huruf kecil".
Jim Balter
2
Bagaimana dengan ejaan yang tepat (Aluminium) versus ejaan AS (Aluminium)?
Paul R
4
@codebreaker Ya, jika input tidak valid, program Anda mungkin macet, hang, cetak Au, atau apa pun yang Anda inginkan. @ Paul R Jika ada banyak cara untuk mengeja elemen (mis. Sulfur vs sulfur atau aluminium vs aluminium) gunakan mana saja yang membuat program Anda lebih pendek. Anda tidak harus menangani kedua kasus.
soktinpk

Jawaban:

27

CJam, 337 297 293 232 220 201 200 byte

leu:E2f^3b2+4%_"53N5903CVCT4":i3/=~Ef+b\%]53b"gØâ^ÃP·^À4ξ^ß^E5^W^Ma{áª^B¤±´oòæ»^XÊQÑ»4žDÙÝòÙ 0^ÝþKa6^Ó£,Ûkû¥¡ùh^E"256b7b6a/0a3**<)5md@5a/,(" ¬^GH/N¿·%^U^RU1²Bd
òë^м~í^ÌéáU"256b25b'Af+2/='J-'Q/"UU"*\)_5=)*E%2<?(\el

Kode di atas menggunakan notasi tanda kuret, karena mengandung karakter kontrol.

Dengan biaya 24 byte tambahan (dengan total 224), karakter tersebut dapat dihindari.

leu:E2f^3b2+4%_"53N5903CVCT4":i3/=~Ef+b\%]53b
"' NwEvKv6e8@]jO4G)=b{L!v@hFQ/oCN)*|BRxvNRL+LO7NI(pLs4[d87$Q%8R\t+' M5JU"
{32f-95b}:B~7b6a/0a3**<)5md@5a/,(
"&y.$h*z^t\rQPUc]l8F h$=18C^r|vD~S"
B25b'Af+2/='J-'Q/"UU"*\)_5=)*E%2<?(\el

Anda dapat mencoba kode ini di juru bahasa CJam .

Uji kasus

$ base64 -d > elements.cjam <<< bGV1OkUyZl4zYjIrNCVfIjUzTjU5MDNDVkNUNCI6aTMvPX5FZitiXCVdNTNiImfY4oNQt4A0zr6fBTUXDWF74aoCpLG0b/LmuxjKUdG7NMW+RNnd8tmgMJ3+S2E2k6Ms22v7paH5aAUiMjU2YjdiNmEvMGEzKio8KTVtZEA1YS8sKCIgrAdIL06/tyUVElUxskJkCvLrkLx+7Yzp4VUiMjU2YjI1YidBZisyLz0nSi0nUS8iVVUiKlwpXzU9KSpFJTI8PyhcZWw=
$ cksum elements.cjam 
952664534 200 elements.cjam
$ for e in Carbon NiTROGen Sodium Gold Silver Tin; do LANG=en_US cjam elements.cjam <<< $e; echo; done
C                                                                                                       
N                                                                                                       
Na                                                                                                      
Au                                                                                                      
Ag                                                                                                      
Sn

Bagaimana itu bekerja

Langkah pertama adalah membaca nama elemen dari STDIN dan menerapkan fungsi hash yang agak rumit, yang memetakan semua nama elemen dalam rentang [0, 225] :

l eu :E          " Read a line from STDIN, convert to uppercase and save in E.            ";
2 f^             " XOR each character code with 2.                                        ";
3 b              " Convert to integer; consider the resulting array a base 3 number.      ";
2 + 4 %          " Add 2 and take the result modulo 4. Result: R                          ";
"53N5903CVCT4":i " Push [53 51 78 53 57 48 51 67 86 67 84 52].                            ";
3 / =            " Retrieve the chunk of length 3 that corresponds to R. Result: C        ";
~ E f+           " Add C[2] to all character codes of E.                                  ";
b                " Convert to integer; consider the resulting array a base C[1] number.   ";
\ %              " Take the integer modulo C[0]. Result: M                                ";
] 53 b           " Push H := 53 * R + M.                                                  ";

Banyak simbol elemen dibentuk oleh karakter pertama dan kedua, pertama dan ketiga, pertama dan keempat, pertama dan kelima atau pertama dan kesepuluh (yang hanya merupakan yang pertama) dari nama bahasa Inggris elemen. Kita akan mewakili elemen-elemen ini dengan angka dari 0 hingga 4 masing-masing. Semua elemen yang tersisa (diwakili oleh 5) akan membutuhkan tabel pencarian.

Tabel yang dihasilkan dapat didorong sebagai berikut:

"gØâ^ÃP·^À4ξ^ß^E5^W^Ma{áª^B¤±´oòæ»^XÊQÑ»4žDÙÝòÙ 0^ÝþKa6^Ó£,Ûkû¥¡ùh^E"256b7b6a/0a3**

Array kode karakter akan dikonversi dari basis 256 ke basis 7 dan 6 diganti dengan menjalankan tiga 0.

Ini adalah tabel keputusan D:

[4 0 0 0 1 0 0 0 0 0 0 3 0 2 0 1 0 0 0 0 0 0 0 0 4 1 1 0 0 0 0 2 0 4 0 5 2 0 0 3 4 0 0 0 0 4 0 1 0 0 3 1 0 0 2 1 1 1 0 0 0 1 0 5 5 0 0 2 0 0 0 5 5 0 0 0 5 0 3 0 0 0 0 5 0 0 0 0 0 0 0 0 5 2 3 0 1 0 5 0 4 0 0 0 0 4 0 5 0 0 0 0 0 5 0 0 0 2 5 1 4 1 5 0 0 0 5 0 0 5 1 1 0 0 0 0 0 0 2 0 5 0 0 0 3 1 0 2 0 0 0 2 0 0 0 5 0 0 0 0 1 0 0 0 0 0 4 0 2 2 5 2 0 0 5 1 0 0 0 0 4 0 5 0 0 3 5 0 0 5 0 1 0 0 0 2 0 0 0 0 0 5 0 4 0 0 0 0 0 0 0 0 3 0 4 0 0 1 2 2 0 0 0 0 0]

Tindakan yang diperlukan untuk elemen dengan hash 1 , misalnya, sesuai dengan elemen pertama dari array ini. Elemen array yang tidak sesuai dengan hash elemen apa pun juga nol, yang memungkinkan kompresi (0 0 0) ↦ 6 .

Sekarang, kami menafsirkan D untuk hash H.

< ) 5 md     " Push D[:H-1] (D[H-1] / 5) (D[H-1] % 5).                                    ";
@ 5a / , (   " Count the number of 5's in D[:H-1] (by splitting at [5]). Result: I        ";

Selanjutnya, kita dorong tabel pencarian. Jika kita menambahkan j ke simbol karakter tunggal dan mengganti Uu dengan Q , masing-masing simbol akan memiliki panjang dua karakter. Itu bisa didorong sebagai berikut:

" ¬^GH/N¿·%^U^RU1²Bd
òë^м~í^ÌéáU"256b25b'Af+2/

Array kode karakter akan dikonversi dari basis 256 ke basis 25, kode karakter A akan ditambahkan ke semua digit (casting ke Karakter dalam proses) dan hasilnya dibagi menjadi potongan-potongan dengan panjang dua.

Ini adalah tabel pencarian L:

["QP" "YB" "PD" "SN" "QO" "QT" "QS" "SB" "KJ" "TM" "FE" "PB" "AU" "WJ" "CN" "SG" "RF" "CM" "CU" "HG" "NA" "RG" "AG"]

Sekarang, kami melanjutkan untuk menghitung nama elemen potensial.

=                " Push L[I].                                                             ";
'J - 'Q / "UU" * " Remove J's and replace Q's with runs of two U's.                       ";
\ ) _ 5 = ) *    " Push S := (D[H-1] % 5 + 1) * ((D[H-1] % 5 + 1 == 5) + 1).              ";
E %              " Push every Sth character of E.                                         ";
2 <              " Discard all but the first two characters.                              ";

Tumpukan sekarang berisi

B M N

di mana B adalah Boolean D [H-1] / 5 , M adalah nama yang diambil dari tabel pencarian dan N adalah nama elemen yang dibentuk dengan memilih karakter dari E.

Kita hampir selesai:

?                " If B, push M; else, push N.                                            ";
( \              " Extract the first character from the string.                           ";
el               " Convert the rest to lowercase.                                         ";
Dennis
sumber
Tetapi bagaimana cara kerjanya?
Claudiu
2
@Claudiu: Saya sudah menambahkan penjelasan.
Dennis
3
Saya sudah membaca penjelasan ketiga dari yang pertama, dan sejauh ini yang saya miliki adalah "Sihir". Luar biasa
Mooing Duck
7
"AcAlAmSbArAsAtBaBkBeBiBhBBrCdCsCaCfCCeClCrCoCnCuCmDsDbDyEsErEuFmFlFFrGdGaGeAuHf HsHeHoHInIIrFeKrLaLrPbLiLvLuMgMnMtMdHgMoNdNeNpNiNbNNoOsOPdPPtPuPoKPrPmPaRaRnReRh RgRbRuRfSmScSgSeSiAgNaSrSTaTcTeTbTlThTmSnTiWUuoUupUusUutUVXeYbYZnZr" = 226 chars. Solusi Anda = 200 karakter. Ada beberapa voodoo yang tepat terjadi di sini.
ossifrage mual
Saya telah menerima jawaban ini karena tampaknya yang paling pendek tetapi merasa bebas untuk mengirim jawaban tambahan.
soktinpk
43

C, 452

Fungsi hash yang baik membantu. Mungkin ada yang lebih baik. (Perbaikan disarankan oleh @ugoren et al.)

h;main(c){char*p="Sn)Cu&V$U#Mo#Rf#Sg&Cs#Y+FTa%Rb)S'Nd#GaK&Mg'Zr$PtPm%ReUuo#SmDy(Ac$Lu%W&CaRa(Cf)EuB#Ds%Md$Uus*NpIn$H&YbIr*BeEs*Tc#I(FlRuC#ThSrBh/NaCoLrKr&Nb$CePb$Ne'Am)At*PdLa#Tl%HgMt,CrTbBk$Rh&Rn4TeZn$HfAg%Fm)Xe$AlScFePo$As'HeO#LvN&DbGe#Ho&Mn$Cd+Ni$Rg$HsBr$AuSi#Pr&Uup#Se*Ti#Tm$Er$Sb&PPu&Cm$GdBa'Cn&UutLiFr#Ar#Bi#NoOs%Pa4Cl";while((c=getchar())>64)h=(h+c%32+74)*311%441;while(h)if(*p<65?h-=*p++-34,0:1)for(h--;*++p>96;);do putchar(*p++);while(*p>96);}

Tidak dikoleksi dengan komentar:

int h;
main(c) {

  /* Hashed element symbols. Characters #$% etc. are used as padding: */
  char *p="Sn)Cu&V$U#Mo#Rf#Sg&Cs#Y+FTa%Rb)S'Nd#GaK&Mg'Zr$PtPm%ReUuo#SmDy(Ac$Lu%W&C"
          "aRa(Cf)EuB#Ds%Md$Uus*NpIn$H&YbIr*BeEs*Tc#I(FlRuC#ThSrBh/NaCoLrKr&Nb$CeP"
          "b$Ne'Am)At*PdLa#Tl%HgMt,CrTbBk$Rh&Rn4TeZn$HfAg%Fm)Xe$AlScFePo$As'HeO#Lv"
          "N&DbGe#Ho&Mn$Cd+Ni$Rg$HsBr$AuSi#Pr&Uup#Se*Ti#Tm$Er$Sb&PPu&Cm$GdBa'Cn&Uu"
          "tLiFr#Ar#Bi#NoOs%Pa4Cl";

  /* This hash function gives a unique result for each element: */
  while((c=getchar())>64) h=(h+c%32+74)*311%441;

  /* Find the corresponding position in the hashed data */
  while(h) {
    if(*p<65?h-=*p++-34,0:1) {      /* Step over an abbreviation */
      for(h--;*++p>96;);            /* Skip padding */
    }
  }

  /* Output first uppercase character and all following lowercase characters: */
  do {
    putchar(*p++);
  } while(*p>96);
}

Saya menggunakan kekerasan untuk menemukan hash ini; Ini adalah satu-satunya dengan ukuran hash ≤512 yang tidak memiliki tabrakan. Saya tidak memeriksa ejaan alternatif, dan mungkin ada fungsi yang lebih baik dengan algoritma yang berbeda (misalnya menggunakan XOR alih-alih penambahan).

Fungsi hash memetakan string teks ke nilai dari 0 hingga 440. hash "Tin" menjadi nol, jadi "Sn" ada di awal tabel. 7 posisi berikutnya kosong. Agar kode tetap ringkas, ini ditunjukkan oleh nilai ASCII 34 + 7 = 41 (")"). Berikutnya adalah "Tembaga" (8), empat sel kosong (34 + 4 = 38 = "&"), dan "Vanadium" (13). Setelah menghitung hash, program langkah melalui tabel, mengurangi 1 untuk setiap huruf kapital diikuti dengan 0 atau lebih huruf kecil, dan mengurangi (ASCII VALUE) -34 untuk setiap karakter non-alfabet. Ketika nilainya mencapai nol, kami telah menemukan hasil yang benar.

lubang keras melengking
sumber
3
@soktinpk Brute memaksanya :-) Ini adalah satu-satunya dengan ukuran hash ≤512 yang tidak memiliki tabrakan. Saya tidak memeriksa ejaan alternatif, dan mungkin ada fungsi yang lebih baik dengan algoritma yang berbeda (misalnya menggunakan XOR alih-alih penambahan).
ossifrage pelit
2
Buat itu 464 ... Anda memiliki sepasang kawat gigi yang tidak perlu.
Jim Balter
1
Jika Anda berpikir tentang tata bahasa, itu tidak ambigu dan harus dibiarkan ... itu hanya terlihat ambigu bagi kami . Oh, dan Anda menangkap satu lagi saya tidak! Selamat atas ini ... Saya berusaha keras untuk memperketat algoritme tetapi Anda telah melakukan semuanya dengan benar.
Jim Balter
5
@Harshdeep - Fungsi hash memetakan string teks ke nilai dari 0 hingga 440. "Tin" hash ke nol, jadi "Sn" ada di awal tabel. 7 posisi berikutnya kosong. Agar kode tetap ringkas, ini ditunjukkan oleh nilai ASCII 34 + 7 = 41 (")"). Berikutnya adalah "Tembaga" (8), empat sel kosong (34 + 4 = 38 = "&"), dan "Vanadium" (13). Setelah menghitung hash, program langkah melalui tabel, mengurangi 1 untuk setiap huruf kapital diikuti dengan 0 atau lebih huruf kecil, dan mengurangi (ASCII VALUE) -34 untuk setiap karakter non-alfabet. Ketika nilainya mencapai nol, kami telah menemukan hasil yang benar.
ossifrage pelit
2
Bagus Simpan beberapa karakter dengan: 1 (h+c%32+74)*311%441.. 2. Jatuhkan pdan gunakan s. 3. main(c)menyimpan satu koma.
ugoren
13

JavaScript ES6, 690 708 byte

for(n=prompt()[l='toLowerCase'](i=0);!(c='HHeLiBeBCNFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'.match(x=/[A-Z][a-z]*/g)['HyHeLitBeryBorCarNitFluNeonSoMagAlSiliPhSuChlArgPotCalcScTitVChrManIroCobNicCoppZinGalGeArsSelBrKRubStYttrZirNioMoTecRuthenRhoPaSilvCadInTinAnTelIoXCaeBaLanCePraNeodPromSaEuGadTerDyHoErThuYtteLuHafTaTuRheOsIriPlaGoMerThaLeBiPolAsRadoFrRadiAcThoProtUrNepPluAmCuBerkCaliEiFeMenNoLawRutherDuSeaBohHasMeiDaRoCopeUnuntFleUnunpLivUnunsUnuno'.match(x).map(a=>a[l]()).indexOf(n.slice(0,i++))]);)
alert(c)

Array pertama memegang simbol-simbol, dan array kedua memegang huruf minimum yang diperlukan untuk mengetahui elemen mana yang sedang dirujuk. Terima kasih kepada core1024 dan edc65 untuk membantu mempersingkatnya. Tes di http://jsfiddle.net/xjdev4m6/2/ . Sedikit lebih mudah dibaca:

n=prompt().toLowerCase()
e='HyHeLitBeryBorCarNitFluNeonSoMagAlSiliPhSuChlArgPotCalcScTitVChrManIroCobNicCoppZinGalGeArsSelBrKRubStYttrZirNioMoTecRuthenRhoPaSilvCadInTinAnTelIoXCaeBaLanCePraNeodPromSaEuGadTerDyHoErThuYtteLuHafTaTuRheOsIriPlaGoMerThaLeBiPolAsRadoFrRadiAcThoProtUrNepPluAmCuBerkCaliEiFeMenNoLawRutherDuSeaBohHasMeiDaRoCopeUnuntFleUnunpLivUnunsUnuno'.match(x=/[A-Z][a-z]*/g).map(a=>a.toLowerCase())
s='HHeLiBeBCNFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'.match(x)
for(i=0;i<7;i++){
  if(c=s[e.indexOf(n.slice(0,i))]){
    alert(c,i=8) // i=8 breaks out of the loop so the result is only alerted once
  }
}
NinjaBearMonkey
sumber
Bisakah Anda mencukur beberapa byte dengan menggunakan fakta bahwa Neo cocok dengan Neodymium, mengingat Neon telah disahkan dalam daftar?
Dancrumb
1
@ Dancrumb Sayangnya tidak. Pengulangan dimulai dengan substring terpendek, sehingga ia akan mengenai Neosebelum menyentuh Neonkarena memiliki lebih sedikit huruf.
NinjaBearMonkey
1
+1 untuk JS terpendek sejauh ini. Meskipun Anda dapat menghilangkan ifpernyataan ini (Ini adalah forkondisi yang sempurna ) dan juga untuk menggarisbawahi atau menggeser posisi beberapa variabel, untuk mempersingkat kode;)
core1024
2
di awal ).toLowerCase(-> )[L='toLowerCase'](kemudian di akhir a.toLowerCase(-> a[L](harus memotong 4 karakter
edc65
10

Ruby 1.9+, 565 471 447 444

Satu garis. Karena tidak ada yang "tidak mungkin dilakukan dengan
regex " ... (Baru saja menyelamatkan 94 karakter dengan menambahkan regex lain) ((dan 24 dengan menyederhanakannya))

p"VAlAmA.sArAcAnt|SbA.tBaB..kBeBiB.hBrBDyD.+sD.bE..sErEuF..mFrFlu|[email protected]|AuH.fH.sHeHoHInIro|FeIrIKrL.vL.+rLaLiLuL|PbM.gMoM.+dM.nM.+tM|HgC.+sC.dC.+fCeCar|[email protected]|CmCop|CuCoC.rC.lN.+dN.+pNeN..bNit|[email protected]|PdP...aPrP.uP..tPot|KPoPR.*n$RaR.+gR.eRhR.+bR.+fRuS.mScS.+gSeS..v|AgSiSo|NaS.rSTaT.cT.+bTeThu|TmT..lThTin|SnTiTu|WU.u.oU.u.pU.u.sU.u.tUXeY.+bYZ.nZ.r"
.split(/(?<!\|)(?=[A-Z])/).find{|r|/^#{r}/i.match *$*}.gsub /.*\||\W/,''

(baris baru setelah string ditambahkan untuk "keterbacaan", hapus untuk pengujian)

penggunaan: ruby periodic.rb aluminum$>

Penjelasan:
Memisahkan string pada huruf kapital terkemuka mengembalikan array regex yang cocok dengan nama elemen. Satu-satunya karakter alfabet yang diperbolehkan di masing-masing adalah karakter dari singkatan *. Mereka diperintahkan sedemikian rupa sehingga kecocokan pertama yang ditemukan ketika membandingkan dengan argumen baris perintah *$*adalah yang benar. Gsub trailing menghapus karakter non-alfa sebelum mencetak.

* Singkatan aneh seperti "Fe" untuk "Besi" ditangani oleh |elemen: "Iro | Fe". Pilihan pertama adalah apa yang sebenarnya cocok; gsub kemudian menghapus semua karakter hingga '|', meninggalkan singkatan sebenarnya.

Kerangka uji (memerlukan daftar @ squeamish: diunduh sebagai 'table.txt' di direktori kerja).

def testfunc(name) 
  #replace with however you call your code
  return `ruby1.9.3 periodic2.rb #{name}`.chomp()
end

elements= File.new('table.txt').readlines.map{|s|s.chomp}

elements.each{|l|
  a,n=l.split(' ')
  r = testfunc(n)
  print "#{n} => #{a} "
  if r!=a then
    print ("FAIL: gave #{r}\n")
    exit
  else 
    print("\tOK\n")
  end
}
print("PASS: #{elements.size} elements matched\n")
ASHelly
sumber
1
Berdiri tepuk tangan jika berhasil untuk semua 100+ kasus
edc65
Tentu saja kerjanya: ideone.com/7FZlAt
AShelly
Seseorang memiliki keberanian untuk menyatakan sesuatu tidak dapat dilakukan dengan regex. Terima kasih telah membuktikan bahwa mereka (salah satu kata, banyak yang berpikir) salah :)
Mast
4

Ruby, 1068 byte

require"zlib"
require"base64"
$><<eval(Zlib::Inflate.inflate(Base64.decode64"eJwlU8tu2zAQ/Bee+QW6CLYTx0FiR7CdtsmNkmhJCEUKfKQViv57Z9YnE+vd2ZnZ0d+1j2Go6oO2bipzpQ5W6SmPU6nU66S0jatzldqiGmLwVb3VJrZ87NAmoyf9Zx0sKm/alRCnqt5riw514lAvqCejtBm8TZU6Dgp984SGjcMuN3WhUhfsGkNaxqpudHG3Eqv6okdHPLVDXxwIuYmAzCalqn7RxnWkuQN2Z3yPxktH8sbjeQWg8QbV+oceY5iJE1kbDICOHpBE3JNka1zG3wHT3ZeF3hOmw7LYiGpB1XeV+sSIcY4rnwydmQn0hPmYLFduEqpOnhdWg4jcYmlclwyRL3iWdiLTc6s07PNYe0E15wjc+kNPsSOrT9Sm0HLXCZ3BrW0P0iBou9FbyIPSkkfYrs6F1vXsPY9C0aC36entNxVs4LjpZ/EKVX8/ybOnLqzHr8/TzCO0FODgvbreb4dV9bO2npx+oWSTzO6g1ER5bnlZn0eDvIgr9wbqN8kCtIEUG/qVKejFFQvRzYyx2fC6FzxLDAuej4VMg8PzqSeYOHAFrTUtEWAPK80QKQeYwf+B+4gVY5HLXGeaicFKfbS0yGaAvRL35mXsJnwNjnwF3+KHlKv6p4aV4iCIp1lQ3yAyTuLrMxY4k2lXk8kABm8KCXY06wCDR0YDmIiqFf+xfUpzgdYtw+QCc9GAdMqGnDZZtPKAzKLxHYp7JvR+nzNjjZVs7XjhKPpGWpgN8tgYGWNu3rVdcuEnt/DjykRtwG/GOdC5EYfvh5nJWjK+/WJYphts3d2YhZQRrMck0eauPXt9z95jz6/EUuEJEszvyOS9xnsIYcH5xmiLhQ9MkWkDqhcYE0YhvmU0U5ITcMWUGeMjTYgzTqAeUA3W5wFgHMPHhxU7prP4DLD3gmZnY/gGNSflxbIMzROCDnWv31JOUk7yDh3fQf37D7D/kWs="))[gets.downcase[1..5].to_sym]

Masukan melalui STDIN.

Substring unik terpendek dari nama elemen adalah dari karakter kedua hingga keenam (atau akhir nama jika terlalu pendek). Jadi saya hanya mendapatkan itu dan mencari di hash. Saya juga mengkompresi hash karena itu menyimpan 200 byte lagi. Berikut ini tampilan dari hash itu sendiri:

{ydrog:?H,elium:"He",ithiu:"Li",eryll:"Be",oron:?B,arbon:?C,itrog:?N,xygen:?O,luori:?F,eon:"Ne",
 odium:"Na",agnes:"Mg",lumin:"Al",ilico:"Si",hosph:?P,ulfur:?S,hlori:"Cl",rgon:"Ar",otass:?K,
 alciu:"Ca",candi:"Sc",itani:"Ti",anadi:?V,hromi:"Cr",angan:"Mn",ron:"Fe",obalt:"Co",ickel:"Ni",
 opper:"Cu",inc:"Zn",alliu:"Ga",erman:"Ge",rseni:"As",eleni:"Se",romin:"Br",rypto:"Kr",ubidi:"Rb",
 tront:"Sr",ttriu:?Y,ircon:"Zr",iobiu:"Nb",olybd:"Mo",echne:"Tc",uthen:"Ru",hodiu:"Rh",allad:"Pd",
 ilver:"Ag",admiu:"Cd",ndium:"In",in:"Sn",ntimo:"Sb",ellur:"Te",odine:?I,enon:"Xe",esium:"Cs",
 arium:"Ba",antha:"La",erium:"Ce",raseo:"Pr",eodym:"Nd",romet:"Pm",amari:"Sm",uropi:"Eu",
 adoli:"Gd",erbiu:"Tb",yspro:"Dy",olmiu:"Ho",rbium:"Er",huliu:"Tm",tterb:"Yb",uteti:"Lu",
 afniu:"Hf",antal:"Ta",ungst:?W,heniu:"Re",smium:"Os",ridiu:"Ir",latin:"Pt",old:"Au",ercur:"Hg",
 halli:"Tl",ead:"Pb",ismut:"Bi",oloni:"Po",stati:"At",adon:"Rn",ranci:"Fr",adium:"Ra",ctini:"Ac",
 horiu:"Th",rotac:"Pa",raniu:?U,eptun:"Np",luton:"Pu",meric:"Am",urium:"Cm",erkel:"Bk",alifo:"Cf",
 inste:"Es",ermiu:"Fm",endel:"Md",obeli:"No",awren:"Lr",uther:"Rf",ubniu:"Db",eabor:"Sg",
 ohriu:"Bh",assiu:"Hs",eitne:"Mt",armst:"Ds",oentg:"Rg",opern:"Cn",nuntr:"Uut",lerov:"Fl",
 nunpe:"Uup",iverm:"Lv",nunse:"Uus",nunoc:"Uuo"}
Martin Ender
sumber
3

CJam, 462 449 434 401 391 384 382

Dengan bantuan dari Dennis.

Kode

Sarang terner bersarang mungkin bukan cara yang tepat untuk melakukan ini di CJam.

rel_"ruthen"#!"Ru"{_"tel"#!"Te"{__5{\_ceu\@=+_}:U~"PdYbRgCmCn"{\#)!}:X~{;__4U"RnPaCfDs"X{;_3U"NbCsNdPmTbPtTlBkEsFmMdLrMt"X{;2U"MgClCrMnZnAsRbSrZrTcCdSmGdHfReAtNpPuDbBhHsLv"X{;__"sili"#{;__ceu\1=@2=++"SodIroCopSilTinAntThuGolMerLeaTunPotRutSeaHydBorCarNitOxyFluPhoSulVanYttIodUra"\#3d/m[)"_NaFeCuAgSnSbTmAuHgPbWKRfSgHBCNOFPSVYIU"S%\=_"_"={;_1U"Un"={;4="Uu"\+}*}*}"Si"?}*}*}*}*}?}?]W=

Dengan indentasi:

rel
_"ruthen"#!"Ru"
{
_"tel"#!"Te"
{
  __5{\_ceu\@=+_}:U~
  "PdYbRgCmCn"{\#)!}:X~
  {
   ;__4U
   "RnPaCfDs"X
   {
    ;_3U
    "NbCsNdPmTbPtTlBkEsFmMdLrMt"X
    {
     ;2U
     "MgClCrMnZnAsRbSrZrTcCdSmGdHfReAtNpPuDbBhHsLv"X
     {

       ;__"sili"#
       {
        ;__ceu\1=@2=++"SodIroCopSilTinAntThuGolMerLeaTunPotRutSeaHydBorCarNitOxyFluPhoSulVanYttIodUra"\#3d/m[)"_ Na Fe Cu Ag Sn Sb Tm Au Hg Pb W K Rf Sg H B C N O F P S V Y I U"S%\=_"_"=
        {;_1U"Un"={;4="Uu"\+}*}*
       }
      "Si"?

     }*
    }*
   }*
  }*
 }?
}?
]W=

Banyak simbol hanya dua huruf pertama dari nama elemen. Ini ditangani di lapisan terdalam kedua pernyataan bersarang jika. Banyak lainnya adalah huruf pertama dan ketiga, atau huruf pertama dan keempat - ini ditangani dalam lapisan luar berturut-turut. Simbol di mana hanya huruf pertama yang muncul, dan laskar lengkap, ditangani masing-masing di lapisan terdalam kelima dan ketiga.

Ada beberapa di mana ia menjadi bingung ( TelLuriumvs ThaLlium, atau SILiconvs SILver, atau RUTheniumvs RUTherfordium). Ini ditangani secara terpisah.

Banyak golf dapat dilakukan di sini, sebagian besar dengan menggunakan kembali blok kode dan meningkatkan penanganan laskar.


sumber
1
Beberapa kiat: 1. Perilaku untuk nama elemen yang tidak valid mungkin tidak ditentukan, jadi "RUTHENIUM"=Anda tidak dapat menggunakannya "RUTHEN"#!. 2. Anda tidak perlu mencetak secara eksplisit ( o) atau menghapus apa pun sebelum nama elemen yang sebenarnya ( ;"Si"); cukup tambahkan ]W=ke akhir kode Anda untuk menghapus semuanya kecuali elemen tumpukan paling atas. 3. Itu membuat beberapa blok kosong. Jika BBoolean, B{...}{}?dan B{...}*mencapai hal yang sama. 4. terner The jika mengambil blok atau elemen stack, sehingga Anda dapat mempersingkat {"Si"}untuk "Si".
Dennis
@ Dennis Saya pikir saya telah menambahkan semua itu. Manajemen tumpukan perlu bekerja, meskipun - terlalu banyak _dan di ;semua tempat
@ Dennis Dan saya telah mencukur beberapa karakter dengan mengubah huruf default menjadi huruf kecil dan dengan menggunakan blok kode alias lebih banyak
3

PHP, 507 485 476 466 karakter

Penggunaan: masukkan nama elemen sebagai parameter GET '0' - elements.php? 0 = karbon

Algoritma: Jalankan melalui string data, menarik keluar substring, pasangan kode singkatan. Jika substring cocok dengan awal elemen yang diteruskan, gunakan kode singkatan untuk menentukan apa yang akan dihasilkan: Jika kode dimulai dengan huruf, output sebagai string. Jika angka N, output huruf pertama elemen + huruf N. Elemen Unun dibuat khusus dengan kode '|'. Jika tidak ada substring yang cocok dengan nama yang dilewatkan, output dua karakter pertama dari nama sebagai singkatan.

Kode yang Dapat Dibaca:

<?
$l=ucfirst(strtolower($_GET[0]));
for(
  $m[3]="AnSbArs2As2Berk3Boh2BoBCad2Cae3Cali4CarCChl2Ch2Cope5CopCuCu5Da4Du2Ei3Fe3FluFGad2GoAuHaf2Ha2HyHIo0IroFeLaw3LePbLiv2Mag2Man2Mei3Men3MeHgNeod3Nep2Nio3NiNOxOPa5PhPPla3Plu2PotKProm3Pro4Rado4Rhe2Roe5Rub2Ruther6Sa2Sea6SilvAgSoNaSt2SuSTec2Ter3Tha3Thu6TinSnTuWUn|UUVVYtte5YYZin2Z2";
  preg_match('/(.[a-z]*)(.[a-z]*)(.*)/',$m[3],$m)
;)
    if(strstr($l,$m[1]))
        echo($x=$m[2][0])>'@'?$x>'{'?"Uu$l[4]":$m[2]:$l[0].$l[$x],die;
echo$l[0],$l[1];

Kental:

<?$l=ucfirst(strtolower($_GET[0]));for($m[3]="AnSbArs2As2Berk3Boh2BoBCad2Cae3Cali4CarCChl2Ch2Cope5CopCuCu5Da4Du2Ei3Fe3FluFGad2GoAuHaf2Ha2HyHIo0IroFeLaw3LePbLiv2Mag2Man2Mei3Men3MeHgNeod3Nep2Nio3NiNOxOPa5PhPPla3Plu2PotKProm3Pro4Rado4Rhe2Roe5Rub2Ruther6Sa2Sea6SilvAgSoNaSt2SuSTec2Ter3Tha3Thu6TinSnTuWUn|UUVVYtte5YYZin2Z2";preg_match('/(.[a-z]*)(.[a-z]*)(.*)/',$m[3],$m);)if(strstr($l,$m[1]))echo($x=$m[2][0])>'@'?$x>'{'?"Uu$l[4]":$m[2]:$l[0].$l[$x],die;echo$l[0],$l[1];
Sir_Lagsalot
sumber
2

JavaScript (1100)

Implementasi naif bersinar dalam kesederhanaannya. Sub string unik dari awal nama hanya dipetakan ke simbol.

e={hy:"H",he:"He",lit:"Li",bery:"Be",bor:"B",car:"C",nit:"N",ox:"O",flu:"F",neon:"Ne",so:"Na",mag:"Mg",al:"Al",sili:"Si",ph:"P",su:"S",chl:"Cl",arg:"Ar",pot:"K",calc:"Ca",sc:"Sc",tit:"Ti",v:"V",chr:"Cr",man:"Mn",iro:"Fe",cob:"Co",nic:"Ni",copp:"Cu",zin:"Zn",gal:"Ga",ge:"Ge",ars:"As",sel:"Se",br:"Br",k:"Kr",rub:"Rb",st:"Sr",yttr:"Y",zir:"Zr",nio:"Nb",mo:"Mo",tec:"Tc",ruthen:"Ru",rho:"Rh",pa:"Pd",silv:"Ag",cad:"Cd",in:"In",tin:"Sn",an:"Sb",tel:"Te",io:"I",x:"Xe",cae:"Cs",ba:"Ba",lan:"La",ce:"Ce",pra:"Pr",neod:"Nd",prom:"Pm",sa:"Sm",eu:"Eu",gad:"Gd",ter:"Tb",dy:"Dy",ho:"Ho",er:"Er",thu:"Tm",ytte:"Yb",lu:"Lu",haf:"Hf",ta:"Ta",tu:"W",rhe:"Re",os:"Os",iri:"Ir",pla:"Pt",go:"Au",mer:"Hg",tha:"Tl",le:"Pb",bi:"Bi",pol:"Po",as:"At",rado:"Rn",fr:"Fr",radi:"Ra",ac:"Ac",tho:"Th",prot:"Pa",ur:"U",nep:"Np",plu:"Pu",am:"Am",cu:"Cm",berk:"Bk",cali:"Cf",ei:"Es",fe:"Fm",men:"Md",no:"No",law:"Lr",ruther:"Rf",du:"Db",sea:"Sg",boh:"Bh",has:"Hs",mei:"Mt",da:"Ds",ro:"Rg",cope:"Cn",ununt:"Uut",fle:"Fl",ununp:"Uup",liv:"Lv",ununs:"Uus",ununo:"Uuo"}
n=prompt().toLowerCase()
for(i in e)n.indexOf(i)?i:alert(e[i])
Mika Lammi
sumber
2

Python - 652 649 637

Tabel hash saya didasarkan pada kombinasi setiap detik dan setiap karakter ketiga dari nama huruf besar:

import re
def f(s,c='S<8F0FCE;2.ACR;J@W$;BI8>GD*?GnHQ<K>&T\(51IAg/Y?S2=169.,325(F(98?>?=^97DUCITX;SJ`0C<P9iLP/G4B,A(-A?(3QLLZ;81D(.4F;L8GaVP[=\=cOX3U,LQl6:E9/OXdSe(4,TSV/=FN98?K.18Q>R$+<GG[IS-4?;4H;T/IMq9<LXMYH4HG<>>KTT,>IIEM,[Nf<,:Z60(A9fImZTMRTcM?[lVg^qC}',e='HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'):
 U=s.upper();X=lambda x:chr(32+sum(ord(u)-65for u in x))
 return re.findall('[A-Z][a-z]*',e)[zip(c[::2],c[1::2]).index((X(U[1::3]),X(U[:-1:2])))]

Berikut adalah generator yang sesuai:

table = '''
H     Hydrogen
He    Helium
...
Uuo   Ununoctium
'''

table = map(lambda l: l.split(), table.split('\n')[1:-1])

abbr = []
for name in map(str.upper, zip(*table)[1]):
    abbr.append(chr(32+sum(ord(u)-65 for u in name[1::3]))+
                chr(32+sum(ord(u)-65 for u in name[:-1:2])))
print 'c=' + ''.join(abbr)
print 'e=' + ''.join(zip(*table)[0])
print 'Unique' if len(table) == len(set(abbr)) else 'Duplicates'

Mungkin ada ruang untuk perbaikan, terutama mengompresi dua string panjang.

Diuji dengan:

for short, name in table:
    if f(name) != short:
        print "Wrong result!"
Falko
sumber
2

Golfscript - 1052 821

{.91<32*+}%:x;'H
He
Li
Be
B
C
N
F
Ne
Na
Mg
Al
Si
P
S
Cl
Ar
K
Ca
Sc
Ti
V
Cr
Mn
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
Np
Pu
Am
Cm
Bk
Cf
Es
Fm
Md
No
Lr
Rf
Db
Sg
Bh
Hs
Mt
Ds
Rg
Cn
Uut
Fl
Uup
Lv
Uus'n/'hy
he
lit
bery
bor
car
nit
flu
neon
so
mag
al
sili
ph
su
chl
arg
pot
calc
sc
tit
v
chr
man
iro
cob
nic
copp
zin
gal
ge
ars
sel
br
k
rub
st
yttr
zir
nio
mo
tec
ruthen
rho
pa
silv
cad
in
tin
an
tel
io
x
cae
ba
lan
ce
pra
neod
prom
sa
eu
gad
ter
dy
ho
er
thu
ytte
lu
haf
ta
tu
rhe
os
iri
pla
go
mer
tha
le
bi
pol
as
rado
fr
radi
ac
tho
prot
ur
nep
plu
am
cu
berk
cali
ei
fe
men
no
law
ruther
du
sea
boh
has
mei
da
ro
cope
ununt
fle
ununp
liv
ununs
ununo'n/[{x\?)}/]1?=

Penjelasan:

{        }%                              Map these ops to the input string:
 .91<32*+                                   Add 32 if less than 91 (convert to lowercase, in essence)
           :x;                           Store to x.
              '...'  '...'               The first array is the symbols, the second is the names.
                                         (stripped down to the minimum necessary)
                   n/     n/             Convert them to arrays.
                             {    }/     For each element in the name array...
                              x\?)          ...return 1 if the element is found in the input.
                            [       ]    Gather every element in an array...
                                     1?  Find the 1 in the array (the only element name match)...
                                       = ...then return that symbol in the symbol array.
                               (implied) Print.
Josiah Winslow
sumber
11
OMG, Sepotong Golfscript yang bukan 10 karakter atau kurang!
WallyWest
1
Anda bisa mendapatkan peningkatan besar pada array string dengan menggunakan satu string dengan baris baru sebagai pemisah dan kemudian melakukann/
Peter Taylor
Saya melakukan itu terakhir kali, mengapa sih saya tidak memikirkan itu? Memperbarui sekarang.
Josiah Winslow
2

Haskell, 920 817 807 776 Chars

Setelah bekerja terlalu lama membuat sistem aturan untuk karakter apa nama elemen termasuk dalam simbolnya, dan sedikit bermain-main, saya berhasil menulis skrip yang menerjemahkan elemen ke simbol dengan mudah. Besi adalah masalah bagi saya, karena saya dapat mencicipi karakter tertentu dari GOld, SilVer, TiN, LEad, SoDium, MerCury, ANtimony, PotaSsium, dan TUngsten, mengubahnya menjadi simbol periodik yang tidak digunakan (saya memilih sampel mana saja yang membuatnya paling mudah untuk diintegrasikan mereka ke dalam aturan yang ada), dan kemudian menerjemahkan setelah konversi simbolik; Besi, bagaimanapun, adalah masalah, karena Ir, Io, dan In sudah digunakan. Ini awalnya 920 karakter, tetapi saya menyadari bahwa pertandingan pola terakhir (yang terbesar) tidak perlu ada di sana, karena ia membiarkan segala sesuatunya menerobos (yang tidak) atau cocok dengan semuanya; karena itu, Saya menggantinya dengan wildcard catch-all. Setelah itu, saya lanjut bermain golf dari 817 hingga 808 dengan menyingkat beberapa pola menggunakan wild-card sedemikian rupa sehingga mereka masih unik untuk nama elemen itu (misalnya satu-satunya elemen dengan huruf 'w' dalam namanya adalah Lawrencium, jadi "* w "cocok dengan 1 karakter yang kurang dari" Law ").

Ini kode saya. Saya mengujinya untuk semua elemen, dan saya mengkodekannya sehingga secara otomatis mengkonversi inputnya ke titlecase, jadi tidak ada masalah dengan sensitivitas case.

EDIT 1

Saya kemudian menguranginya menjadi 776 karakter dengan mengganti ekspresi case t dengan pencocokan pola (ini masuk akal karena ekspresi case sedang menguji operan mentah sebagai lawan dari ekspresi dalam hal operan), menghilangkan tanda kurung yang tidak perlu, dan mengulangi diekspresikan esebagai string yang dibatasi oleh baris baru alih-alih daftar string, dan kemudian membaginya dalam fungsi utama. Karena perubahan ini murni golf, saya membiarkan versi yang bisa dibaca manusia tidak berubah.

import Data.Char
m _[]=True;m[]_=False;m k@(c:s)x@(y:z)=case y of{']'->m s x;'['->let(i,(_:j))=break(==']')z in(c`elem`i)&&m s j;'?'->m s z;'*'->null z||m k z||m s z||m s x;_->c==y&&m s z};p(a:t)(x:y)=case a of{'.'->x:p t y;'_'->p t y;_->a:p t y};p[]_=[];e="Iro\nUn\nCu Pa Ro Y*e\nR*r\n*pp\nCop Rado\nSea Thu\nCali Da P*ot Tha\nA*s Boh ?ub Ch [CG]ad [HM]a Liv Nep Plu Rhe S[ato] Tec Tin Z\nB*k Cae [ES]i *w Nio [FM]e N*d Pro Pla Ter\nBor Car Flu Hy Io Nit Ox Ph Su [UVY]\n*";s="Fe ._._. .____. .f .u .n ._____. .___. ._. .__. . ..";t"Sv"="Ag";t"Sd"="Na";t"Go"="Au";t"Le"="Pb";t"Mc"="Hg";t"An"="Sb";t"Ps"="K";t"Tu"="W";t"Tn"="Sn";t x=x;main=interact$unlines.map(\(a:b)->let y=toUpper a:map toLower b in t$p(snd.head.filter(any(m y).fst)$zip(map words$lines e)$words s)y).lines

Versi Human-Readable (baris baru, spasi, nama verbose, komentar: 2311 Karakter)

import Data.Char

-- Test against search-pattern strings
match _ [] = True
match [] _ = False
match k@(c:s) x@(y:z) = case y of
']' -> match s x
'[' -> let (i,(_:j)) = break (==']') z in (c `elem` i) && match s j
'?' -> match s z
'*' -> null z || match k z || match s z || match s x
 _  -> c == y && match s z

-- Write according to name-pattern string
pattern (a:t) (x:y) = case a of
'.' -> x : (pattern t y)
'_' -> (pattern t y)
 _  -> a : (pattern t y)
pattern [] _ = []

-- Search-Patterns for the elements
elements=["Iro", -- Iron -> Fe
      "Un", -- UnUn-Blank-ium (1,3,5)
      "Cu Pa Ro Y*e", -- CuriuM PallaDium RoentGenium YtterBium (1,6)
      "R*r", -- Rutherfordium (1,f)
      "*pp", -- Copper (1,u)
      "Cop Rado", -- Copernicium Radon (1,n)
      "Sea Thu", -- SeaborGium ThuliuM (1,7)
      "Cali Da P*ot Tha", -- CaliFornium DarmStadtium ProtActinium PotaSsium (1,5)

      {- AsTatine ArSenic BoHrium DuBnium RuBidium ChLorine ChRome CaDmium
      GaDolinium HaFnium HaSsium MaNganese MaGnesium LiVermorium NePtunium
      PlUtonium RhEnium SaMarium StRontium SoDium TeChnetium TiN ZiNc
      ZiRconium (1,3) -}

      "A*s Boh ?ub Ch [CG]ad [HM]a Liv Nep Plu Rhe S[ato] Tec Tin Z", 

      {- BerKelium CaeSium EinSteinum SilIcon SilVer LawRencium NioBium
      FerMium MenDelevium MeiTnerium MerCury NeoDymium ProMethium PlaTinum
      TerBium (1,4) -}

      "B*k Cae [ES]i *w Nio [FM]e N*d Pro Pl Ter",

      {- Boron Carbon Fluorine Hydrogen Nitrogen Oxygen Phosphorous Sulphur
      Uranium Vanadium Yttrium (1) -}

      "Bor Car Flu Hy Io Nit Ox Ph Su [UVY]",
      "*"] -- Everything else (1,2)

-- respective naming patterns for searches
symbol = "Fe ._._. .____. .f .u .n ._____. .___. ._. .__. . .."

-- Translate fake symbols
translate x = case x of
"Sv" -> "Ag" -- SilVer
"Sd" -> "Na" -- SoDium
"Go" -> "Au" -- GOld
"Le" -> "Pb" -- LEad
"Mc" -> "Hg" -- MerCury
"An" -> "Sb" -- ANtimony
"Ps" -> "K" -- PotaSsium
"Tu" -> "W" -- TUngsten
"Tn" -> "Sn" -- TiN
  _  -> x  -- Keep everything else the same

main = interact $ unlines . map (\(a:b) -> let y = (toUpper a) : (map toLower b) in t $ p (snd.head.filter (any (m y) . fst) $ zip (map words e) $ words s) $ y) . lines

Jika ada yang tertarik pada penjelasan untuk bagian ini, jangan ragu untuk bertanya.

archaephyrryx
sumber
2

C # (826)

bukan yang terbesar tapi saya pikir saya akan mencobanya dengan cacat c #.

using System;class P{static string s="HyHHe1Li1Be1BoBCaCNitNOxOFlFNe1SoNaMaMgAl1Sil1PhPSuSChClAr1PotKCal1Sc1Tit1VaVChrCrManMnIrFeCo1Ni1CopCuZiZnGa1Ge1ArsAsSe1Br1Kr1RuRbStSrYtYZirZrNioNbMo1TecTcRut1Rh1PaPdSiAgCadCdIn1TiSnAnSbTel1IoIXe1CaeCsBa1La1Ce1Pra1NeoNdPrPmSaSmEu1GadGdTeTbDy1Ho1Er1ThTmYttYbLu1HaHfTa1TuWRheReOs1Iri1PlPtGoAuMeHgThaTlLePbBi1Po1AsAtRaRnFr1Rad1Ac1Tho1ProPaUrUNepNpPluPuAm1CuCmBerBkCaliCfEiEsFeFmMenMdNo1LawLrRuthRfDuDbSeaSgBohBhHasHsMeiMtDaDsRoRgCopeCnUnUutFle1UnuUupLivLvUnunUus",n,t,k;static void Main(){var d=new System.Collections.Specialized.StringDictionary();while(s!=""){k=g;d[k]=g;if(d[k]=="1")d[k]=k.Substring(0,2);};t=Console.ReadLine();while(t!=""&!d.ContainsKey(t))t=t.Remove(t.Length-1);Console.Write(d[t]);}static string g{get{n="";do n+=s[0];while((s=s.Remove(0,1))!=""&&s[0]>96);return n;}}}

Jadi saya menulis sebuah program untuk mengubah nama lengkap elemen (misalnya karbon) menjadi string terkecil namun tetap unik dan melakukan ini untuk semua elemen sehubungan dengan semua string unik lainnya. Saya kemudian membuat serial itu menjadi string jelek besar di mana huruf kapital menunjukkan awal dari "potongan", dengan potongan bergantian antara menjadi kunci dan nilai. Seperti KeyValueKey2Value2 dll.

Script ini menghilangkan string besar dan memotong karakter dari ujung string yang dimasukkan sampai menemukannya dalam kamus yang dibuat dari string besar.

(Saya harus menambahkan pengetahuan saya tentang C # tidak luar biasa dan pengiriman asli yang saya buat hanya menggunakan hal-hal yang saya tahu, tetapi saya kemudian memiliki beberapa trik yang ditunjukkan kepada saya oleh orang lain.)

miethpo
sumber
Anda dapat melakukan golf ini lebih jauh dengan mengubah semua definisi tipe menjadi var. Anda dapat menyimpan beberapa lagi dengan menghapus kawat gigi setelah satu-pernyataan jika blok. Jika Anda menetapkan t.Substring(int, int)untuk Func<int, int, string>Anda dapat menyimpan pasangan lain.
Brandon
Saya membuat def variabel paling "var" tetapi tampaknya saya melewatkan satu atau dua, juga benar-benar lupa tentang ifs bracketless, terima kasih.
miethpo
Anda bisa mencukur lebih lanjut 5 karakter dengan varing string[] rdan 3 lebih lanjut oleh varing string t = Console...., terakhir, Anda akan menghemat 7 lebih dengan mengubah return new string[]ke dalam return new[]di akhir.
Brandon
Ada beberapa perbaikan kecil lain yang dapat Anda lakukan seperti memindahkan if(...) break;logika Anda ke dalam kondisi keluar loop. Sejumlah inversi logika lainnya dapat diterapkan, seperti do { } while(..)dalam metode ekstraksi Anda. Ini lebih pendek daripada menambahkan operasi logis terpisah untuk kasus entri. Saya telah memposting hasil edit ke kode Anda yang masih perlu ditinjau / diterima karena perwakilan saya rendah di situs ini. Dapatkan hingga 870 karakter.
nicholas
1
@ Nicholas Saya tidak yakin mengedit kode golf orang lain sopan ...
miethpo
1

JavaScript (E6) 1433

Ini adalah batas atas un

F=n=>'0H0HYDROGEN0He0HELIUM0Li0LITHIUM0Be0BERYLLIUM0B0BORON0C0CARBON0N0NITROGEN0O0OXYGEN0F0FLUORINE0Ne0NEON0Na0SODIUM0Mg0MAGNESIUM0Al0ALUMINIUM0Si0SILICON0P0PHOSPHORUS0S0SULFUR0Cl0CHLORINE0Ar0ARGON0K0POTASSIUM0Ca0CALCIUM0Sc0SCANDIUM0Ti0TITANIUM0V0VANADIUM0Cr0CHROMIUM0Mn0MANGANESE0Fe0IRON0Co0COBALT0Ni0NICKEL0Cu0COPPER0Zn0ZINC0Ga0GALLIUM0Ge0GERMANIUM0As0ARSENIC0Se0SELENIUM0Br0BROMINE0Kr0KRYPTON0Rb0RUBIDIUM0Sr0STRONTIUM0Y0YTTRIUM0Zr0ZIRCONIUM0Nb0NIOBIUM0Mo0MOLYBDENUM0Tc0TECHNETIUM0Ru0RUTHENIUM0Rh0RHODIUM0Pd0PALLADIUM0Ag0SILVER0Cd0CADMIUM0In0INDIUM0Sn0TIN0Sb0ANTIMONY0Te0TELLURIUM0I0IODINE0Xe0XENON0Cs0CAESIUM0Ba0BARIUM0La0LANTHANUM0Ce0CERIUM0Pr0PRASEODYMIUM0Nd0NEODYMIUM0Pm0PROMETHIUM0Sm0SAMARIUM0Eu0EUROPIUM0Gd0GADOLINIUM0Tb0TERBIUM0Dy0DYSPROSIUM0Ho0HOLMIUM0Er0ERBIUM0Tm0THULIUM0Yb0YTTERBIUM0Lu0LUTETIUM0Hf0HAFNIUM0Ta0TANTALUM0W0TUNGSTEN0Re0RHENIUM0Os0OSMIUM0Ir0IRIDIUM0Pt0PLATINUM0Au0GOLD0Hg0MERCURY0Tl0THALLIUM0Pb0LEAD0Bi0BISMUTH0Po0POLONIUM0At0ASTATINE0Rn0RADON0Fr0FRANCIUM0Ra0RADIUM0Ac0ACTINIUM0Th0THORIUM0Pa0PROTACTINIUM0U0URANIUM0Np0NEPTUNIUM0Pu0PLUTONIUM0Am0AMERICIUM0Cm0CURIUM0Bk0BERKELIUM0Cf0CALIFORNIUM0Es0EINSTEINIUM0Fm0FERMIUM0Md0MENDELEVIUM0No0NOBELIUM0Lr0LAWRENCIUM0Rf0RUTHERFORDIUM0Db0DUBNIUM0Sg0SEABORGIUM0Bh0BOHRIUM0Hs0HASSIUM0Mt0MEITNERIUM0Ds0DARMSTADTIUM0Rg0ROENTGENIUM0Cn0COPERNICIUM0Uut0UNUNTRIUM0Fl0FLEROVIUM0Uup0UNUNPENTIUM0Lv0LIVERMORIUM0Uus0UNUNSEPTIUM0Uuo0UNUNOCTIUM'
.match(RegExp('([^0]+)0+'+n,'i'))[1]

Tes di konsol FireFox / FireBug

F('Rutherfordium')

Keluaran

Rf
edc65
sumber
1

SmileBASIC, 1763 1418 1204 1128 byte

INPUT E$Hro$="H
Hiu$="He
Lhi$="Li
Byl$="Be
Bon$="B
Cbo$="C
Nro$="N
Oge$="O
For$="F
Nn$="Ne
Siu$="Na
Mne$="Mg
Ami$="Al
Sic$="Si
Psp$="P
Sfu$="S
Cor$="Cl
Aon$="Ar
Pas$="K
Cci$="Ca
Snd$="Sc
Tan$="Ti
Vad$="V
Com$="Cr
Mga$="Mn
In$="Fe
Cal$="Co
Nke$="Ni
Cpe$="Cu
Zc$="Zn
Gli$="Ga
Gma$="Ge
Aen$="As
Sen$="Se
Bmi$="Br
Kpt$="Kr
Rid$="Rb
Son$="Sr
Yri$="Y
Zco$="Zr
Nbi$="Nb
Myb$="Mo
Thn$="Tc
Rhe$="Ru
Rdi$="Rh
Pla$="Pd
Sve$="Ag
Cmi$="Cd
Iiu$="In
T$="Sn
Aim$="Sb
Tlu$="Te
Iin$="I
Xon$="Xe
Csi$="Cs
Biu$="Ba
Lth$="La
Pse$="Pr
Ndy$="Nd
Pme$="Pm
Sar$="Sm
Eop$="Eu
Gol$="Gd
Tbi$="Tb
Dpr$="Dy
Hmi$="Ho
Eiu$="Er
Tli$="Tm
Yer$="Yb
Let$="Lu
Hni$="Hf
Tta$="Ta
Tgs$="W
Rni$="Re
Oiu$="Os
Idi$="Ir
Pti$="Pt
Gd$="Au
Mcu$="Hg
Tll$="Tl
Ld$="Pb
Bmu$="Bi
Pon$="Po
Aat$="At
Ron$="Rn
Fnc$="Fr
Riu$="Ra
Ain$="Ac
Tri$="Th
Pta$="Pa
Uni$="U
Ntu$="Np
Pto$="Pu
Ari$="Am
Ciu$="Cm
Bke$="Bk
Cif$="Cf
Est$="Es
Fmi$="Fm
Mde$="Md
Nel$="No
Lre$="Lr
Dni$="Db
Sbo$="Sg
Bri$="Bh
Hsi$="Hs
Mtn$="Mt
Dms$="Ds
Rnt$="Rg
Cer$="Cn
Unt$="Uut
Fro$="Fl
Unp$="Uup
Ler$="Lv
Uns$="Uus
Uno$="Uuo
S$=VAR(E$[0]+MID$(E$,3,2))IF"Cm"==S$*!VAL(".1"+E$[1])THEN S$="Ce
IF LEN(E$)>12THEN S$="Rf
?S$

Saya memilih 3 karakter yang sebagian besar unik (0, 2, dan 3), yang meninggalkan 2 kasus khusus: Cerium / Curium keduanya "Ciu", dan Ruthenium / Rutherfordium keduanya "Rhe". Untuk Ciu, saya memeriksa apakah karakter kedua dari nama itu adalah "e" atau "E", dan untuk "Rhe", saya memeriksa panjang nama.

VAR(name)mengembalikan variabel dengan nama itu. Nama variabel tidak sensitif huruf.

12Me21
sumber
0

T-SQL, 900 894 676 byte

SELECT ISNULL((SELECT LEFT(value,3)FROM
STRING_SPLIT('Sb An-As Ars-At Ast-Bk Berk-Bh Boh-B  Bor-Cd Cad-Cs Cae-Cf Cali-C  Car-Cl Chl-Cr Chr-Cn Cope-Cu Copp-Cm Cu-Ds Da-Db Du-Es Ei-Fm Fe-F  Flu-Gd Gad-Au Go-Hf Haf-Hs Has-H  Hy-I  Io-Fe Iro-Lr Law-Pb Le-Lv Liv-Mg Mag-Mn Man-Mt Mei-Md Men-Hg Mer-Nd Neod-Np Nep-Nb Nio-N  Nit-O  Ox-Pd Pa-P  Ph-Pt Pla-Pu Plu-K  Pot-Pm Prom-Pa Prot-Rn Rado-Re Rhe-Rg Ro-Rb Rub-Rf Ruther-Sm Sa-Sg Sea-Ag Silv-Na So-Sr St-S  Su-Tc Tec-Tb Ter-Tl Tha-Tm Thu-Sn Tin-W  Tu-UuoUnuno-UupUnunp-UusUnuns-UutUnunt-U  Ur-V  V-Yb Ytte-Y  Yttr-Zn Zin-Zr Zir'
    ,'-')m,t WHERE e LIKE SUBSTRING(value,4,9)+'%'),
(SELECT UPPER(LEFT(e,1))+LOWER(SUBSTRING(e,2,1))FROM t))

Pengembalian hanya untuk keterbacaan, baris kedua adalah satu string yang sangat panjang.

STRING_SPLIT didukung dalam SQL 2016 dan lebih tinggi.

Input diambil melalui tabel t yang sudah ada sebelumnya dengan bidang varchar e , sesuai standar IO kami . Output diisi dengan spasi hingga 3 karakter; aturannya tidak jelas apakah itu baik-baik saja. Jika perlu, saya bisa menambahkan TRIM.

Tabel input bergabung dengan tabel yang dihasilkan dengan daftar semua simbol elemen (empuk untuk 3 karakter) dengan awalan unik terpendek untuk setiap nama elemen ( Xcukup untuk Xenon , tapi RUTHERFORDIUM membutuhkan Rutheruntuk membedakannya dari Rutenium ).

EDIT 1 : Menyimpan 218 karakter dengan menghapus 44 entri dari daftar yang simbolnya adalah dua huruf pertama dari namanya; yang ISNULLfungsi digunakan untuk melihat apakah permintaan pertama gagal untuk kembali berturut-turut, dan jika demikian, menghasilkan simbol (benar cased) dari nama elemen input.

BradC
sumber