MASALAH
Diberi dua kata, cari pemenang dalam pertarungan root digital .
Tetapkan akar digital dari sebuah kata dengan cara ini:
- Setiap huruf alfabet diberi nomor: A = 1, B = 2, C = 3, ..., Z = 26
- Tambahkan nilai untuk setiap huruf untuk total kata. Ambil "CAT", misalnya. C + A + T = 3 + 1 + 20 = 24
- Tambahkan semua digit tunggal yang membentuk hasil itu: 24 => 2 + 4 = 6
- Ulangi langkah # 3 sampai Anda mencapai satu digit. Angka tunggal itu adalah akar digital dari kata tersebut.
Aturan:
- Pemenang dinyatakan jika akar digitalnya lebih besar dari yang lain.
- Jika nilai-nilai akar digital sama, perpendek kata-kata dengan menghapus setiap instance dari surat nilai tertinggi dari kedua kata dan menghitung ulang.
- Ulangi langkah # 1 dan # 2 sampai ada pemenang atau salah satu kata hanya memiliki satu huruf (atau tidak ada huruf) yang tersisa.
- Jika nilai akar digital sama setelah melalui proses pemendekan, kata yang lebih panjang dinyatakan sebagai pemenang.
- Jika kata-katanya sama panjang dan tidak ada pemenang yang ditemukan setelah melalui proses pemendekan, tidak ada pemenang yang dinyatakan.
Aturan khusus:
- Tidak ada penggunaan modulus yang diizinkan dalam perhitungan akar digital itu sendiri. Dapat digunakan di tempat lain.
- Anggap kata-kata hanya terdiri dari huruf besar - tanpa tanda baca, tanpa spasi, dll.
MEMASUKKAN
Tarik kata-kata melalui stdin (dipisahkan koma). parameter metode, atau apa pun yang Anda inginkan. Jelaskan dalam solusi Anda atau kode bagaimana kata-kata diuraikan atau disiapkan.
KELUARAN
Tampilkan kata yang menang. Jika tidak ada pemenang, tampilkan "STALEMATE".
Contoh:
intput: BISA, BAT
CAN = 18 = 9
BAT = 23 = 5
output: BISA
intput: ZOO, TIDAK
ZOO = 56 = 11 = 2
NO = 29 = 11 = 2
OO = 30 = 3
N = 14 = 5
output: TIDAK
UPDATE : Input harus dibaca menggunakan stdin dengan kata-kata sebagai string yang dipisahkan koma.
PEMBARUAN : Menambahkan beberapa contoh untuk diuji.
UPDATE : mengklarifikasi penghapusan surat bernilai tertinggi dalam kasus dasi - ini juga sedikit mengubah kondisi berhenti - jika sebuah kata panjang satu huruf atau nol huruf, proses pemendekan dihentikan
sumber
Jawaban:
J, 100
berjalan seperti ini:
itu tidak belum menerima masukan persis seperti yang diminta.
sumber
APL (Dyalog) (
9186)Penjelasan (sesuai urutan eksekusi):
⎕ML←3
: atur ML ke 3 (ini membuat⊂
partisi berarti, antara lain).G←Z⊂⍨','≠Z←⍞
: baca input, pisahkan dengan koma, simpan di G dan berikan fungsi.+/¨⎕A∘⍳¨⍵
: hitung skor untuk setiap kata. (⎕A
adalah daftar yang berisi alfabet.)Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨
: menghitung root digital untuk setiap skor (dengan menjumlahkan semua digit selama masih ada lebih dari satu digit) dan menyimpannya dalam Z.Z≡∪Z
: jika semua skor unik ...:G[↑⍒Z]
: ... lalu keluarkan kata dengan skor tertinggi (dari daftar asli).⋄1∊↑¨⍴¨⍵:'STALEMATE'
: dinyatakan (jika ada dasi), jika salah satu kata adalah panjang 1, hasilkan STALEMATE.⋄∇1∘↓¨⍵
: jika tidak, lepaskan huruf pertama dari setiap kata dan jalankan kembali fungsinya.sumber
Ruby - 210
Tes:
sumber
d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
."If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Haskell, 205 karakter
Sampel berjalan:
w
, impor yang lebih lama, modul yang lebih pendeksumber
',':b
→_:b
(-2), jika Anda tidak terlalu terikat dengan pemrosesan multilineinteract$unlines.map([...]).lines
→putStr.[...]=<<getLine
(-11), jika Anda membiarkan diri Anda mengurangi outputputStr
→print
(-1). Aku benci operasi negasi yang mengambil begitu banyak karakter, tetapi tidak bisa menemukan jalan keluarnya.Perl, 224
225229Golf dasar (belum ada yang pintar):
Perl 5.10 ke atas, jalankan dengan
perl -M5.010 <file>
atauperl -E '<code here>'
sumber
K, 106
Menggunakan penanganan pengecualian untuk menangkap kesalahan tumpukan, yang mengakibatkan kasus jalan buntu.
sumber
VBA (
242462)Ternyata kode di bawah ini tidak cocok dengan spek, jadi saya harus bekerja kembali, menambahkan banyak panjang (lihat di atas). : - / Ini mungkin bisa bermain golf lebih jauh, tapi sudah cukup kompak dan saya ragu saya akan bisa membawanya kembali ke skor kompetitif.
Dokumen asli (di bawah) tidak menghapus surat bernilai tertinggi dari kata-kata saat ada dasi.
sumber
Ini benar-benar disukai saya dan merupakan posting pertama saya. Meskipun sudah tua saya perhatikan tidak ada yang melakukan versi php jadi di sini adalah milik saya.
534 Karakter.
Sekarang saya tidak yakin dengan aturan untuk memulai jadi saya mulai dengan $ f = 'CAN, CBN' sebagai input saya. Saya harap itu benar. Saya telah menjalankan semua tes dan lulus semuanya meskipun tidak terlalu elegan. Saya benar-benar harus tidur sekarang tetapi saya sangat senang mengerjakannya - terima kasih untuk teka-teki yang bagus.
Dikodekan pada http://codepad.org/ZSDuCdin
sumber
$f=trim(fgets(fopen('php://stdin')));
untuk mengambil input.$w=fgetcsv(STDIN);
bekerja lebih baik.D: 326 Karakter
Lebih Jelas:
sumber
Mathematica
Beberapa detail masih hilang
sumber
Mathematica
220207Setelah menulis ini, saya perhatikan bahwa ini mengikuti alasan yang sama yang digunakan Belisarius,
Pemakaian
Karena responsnya tidak kompetitif (terlalu bertele-tele), saya memutuskan untuk menggunakan format input yang lebih cocok untuk Mathematica.
sumber
CoffeeScript - 335
Tidak setenang ini, tapi saya tetap akan melakukannya. Skor aktual sangat ringkas (
y
fungsi), tetapiif
untuk membandingkan hasil (dalamz
) cukup lama.Untuk menggunakannya, panggil
z
dengan dua kata Anda (misz 'FOO','BAR'
.). Ini akan skor kedua kata dan mengembalikan kata skor yang lebih tinggi. Jika ini adalah seri, itu akan muncul kembali dengan kata-kata yang diubah (menjaga aslinya untuk kembali pada akhirnya, maka dua parameter tambahan) yang didapat darix
fungsi.Avascript yang setara (diperluas) untuk mereka yang tertarik:
sumber
Racket 479 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
PHP,
339(bukan untuk spesifikasi),410382359339337 BytesEDIT 1 : +71 byte. Menggunakan
STDIN
bukanfopen('php://stdin','r');
dan tag pendek. Juga, kesesuaian penuh dengan spesifikasi.EDIT 2 : -28 byte. Menggunakan
fgetcsv(STDIN)
alih-alihexplode(',',trim(fgets(STDIN)))
, dan menggunakanfor
lingkaran sebagai gantiwhile
lingkaran.EDIT 3 : -23 byte. Fungsi digabung
a
danb
, digabung untuk loop.EDIT 4 : -20 byte. Berubah
c
dari rekursif menjadi loop. Kemudian, hapus fungsic
dan masukkan kodenya ke namespace global.EDIT 5 : -2 byte. Terima kasih kepada @Titus untuk
-r
benderanya.sumber
-r
benderaJAWA
sumber
C ++, 473 (Saya meminjam besi saja)
Saya yakin saya bisa memperpendeknya, tapi saya lelah.
Edit: awalnya mengambil argumen baris perintah, dimodifikasi untuk menggunakan cin Mungkin beberapa karakter lebih lama sekarang tapi saya terlalu lelah untuk menceritakannya.
sumber
Python: 383 karakter
jalankan fungsinya
c('CAN','BAT')
:sumber
F #,
559533530 byteBelum kompetitif. Saya yakin c dapat dibuat lebih pendek serta beberapa baris terakhir. Tidak memiliki akses yang lebih mudah ke args baris perintah juga menyakitkan di sini.
Cobalah online!
Versi tidak disatukan
sumber
PHP,
296 281267 bytejalankan dengan
-n
atau coba online (TiO termasuk kerusakan).Kembali pada Februari 2011, versi PHP saat ini adalah 5.3.5; jadi saya tidak bisa
[$a,$b]=fgetcsv(...)
dan semacamnya)count_chars
sebarissubstr
Tetapi tidak ada yang akan menabung banyak; jadi tidak masalah.
Hal yang paling mahal adalah loop (tentu saja) dan aturan # 4 (
4036 bytes).sumber