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
, input
dll.
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!
sumber
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.Jawaban:
CJam,
337297293232220201200 byteKode di atas menggunakan notasi tanda kuret, karena mengandung karakter kontrol.
Dengan biaya 24 byte tambahan (dengan total 224), karakter tersebut dapat dihindari.
Anda dapat mencoba kode ini di juru bahasa CJam .
Uji kasus
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] :
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:
Array kode karakter akan dikonversi dari basis 256 ke basis 7 dan 6 diganti dengan menjalankan tiga 0.
Ini adalah tabel keputusan D:
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.
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:
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:
Sekarang, kami melanjutkan untuk menghitung nama elemen potensial.
Tumpukan sekarang berisi
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:
sumber
C, 452
Fungsi hash yang baik membantu. Mungkin ada yang lebih baik. (Perbaikan disarankan oleh @ugoren et al.)
Tidak dikoleksi dengan komentar:
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.
sumber
(h+c%32+74)*311%441
.. 2. Jatuhkanp
dan gunakans
. 3.main(c)
menyimpan satu koma.JavaScript ES6, 690
708byteArray 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:
sumber
Neo
sebelum menyentuhNeon
karena memiliki lebih sedikit huruf.if
pernyataan ini (Ini adalahfor
kondisi yang sempurna ) dan juga untuk menggarisbawahi atau menggeser posisi beberapa variabel, untuk mempersingkat kode;)).toLowerCase(
->)[L='toLowerCase'](
kemudian di akhira.toLowerCase(
->a[L](
harus memotong 4 karakterRuby 1.9+,
565 471 447444Satu garis. Karena tidak ada yang "tidak mungkin dilakukan dengan
regex " ... (Baru saja menyelamatkan 94 karakter dengan menambahkan regex lain) ((dan 24 dengan menyederhanakannya))
(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).
sumber
Ruby, 1068 byte
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:
sumber
CJam,
462 449 434 401 391 384382Dengan bantuan dari Dennis.
Kode
Sarang terner bersarang mungkin bukan cara yang tepat untuk melakukan ini di CJam.
Dengan indentasi:
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 (
TelLurium
vsThaLlium
, atauSILicon
vsSILver
, atauRUThenium
vsRUTherfordium
). Ini ditangani secara terpisah.Banyak golf dapat dilakukan di sini, sebagian besar dengan menggunakan kembali blok kode dan meningkatkan penanganan laskar.
sumber
"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. JikaB
Boolean,B{...}{}?
danB{...}*
mencapai hal yang sama. 4. terner The jika mengambil blok atau elemen stack, sehingga Anda dapat mempersingkat{"Si"}
untuk"Si"
._
dan di;
semua tempatPHP,
507485476466 karakterPenggunaan: 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:
Kental:
sumber
JavaScript (1100)
Implementasi naif bersinar dalam kesederhanaannya. Sub string unik dari awal nama hanya dipetakan ke simbol.
sumber
Python -
652 649637Tabel hash saya didasarkan pada kombinasi setiap detik dan setiap karakter ketiga dari nama huruf besar:
Berikut adalah generator yang sesuai:
Mungkin ada ruang untuk perbaikan, terutama mengompresi dua string panjang.
Diuji dengan:
sumber
Golfscript -
1052821Penjelasan:
sumber
n/
Haskell,
920817807776 CharsSetelah 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
e
sebagai 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.Versi Human-Readable (baris baru, spasi, nama verbose, komentar: 2311 Karakter)
Jika ada yang tertarik pada penjelasan untuk bagian ini, jangan ragu untuk bertanya.
sumber
C # (826)
bukan yang terbesar tapi saya pikir saya akan mencobanya dengan cacat c #.
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.)
sumber
var
. Anda dapat menyimpan beberapa lagi dengan menghapus kawat gigi setelah satu-pernyataan jika blok. Jika Anda menetapkant.Substring(int, int)
untukFunc<int, int, string>
Anda dapat menyimpan pasangan lain.var
ingstring[] r
dan 3 lebih lanjut olehvar
ingstring t = Console....
, terakhir, Anda akan menghemat 7 lebih dengan mengubahreturn new string[]
ke dalamreturn new[]
di akhir.if(...) break;
logika Anda ke dalam kondisi keluar loop. Sejumlah inversi logika lainnya dapat diterapkan, sepertido { } 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.JavaScript (E6) 1433
Ini adalah batas atas un
Tes di konsol FireFox / FireBug
Keluaran
sumber
SmileBASIC,
1763141812041128 byteSaya 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.sumber
T-SQL,
900 894676 bytePengembalian 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 (
X
cukup untuk Xenon , tapi RUTHERFORDIUM membutuhkanRuther
untuk membedakannya dari Rutenium ).EDIT 1 : Menyimpan 218 karakter dengan menghapus 44 entri dari daftar yang simbolnya adalah dua huruf pertama dari namanya; yang
ISNULL
fungsi digunakan untuk melihat apakah permintaan pertama gagal untuk kembali berturut-turut, dan jika demikian, menghasilkan simbol (benar cased) dari nama elemen input.sumber