Tugas Anda adalah menentukan apakah string yang diberikan memiliki panjang yang sesuai dan dapat diwakili dengan ubin Scrabble dan, jika demikian, output jumlah skor setiap huruf.
Jika Anda tidak tahu cara bermain Scrabble :, Anda memiliki 100 ubin dengan berbagai huruf A – Z yang tercetak di atasnya, serta dua wildcard yang dapat mewakili huruf apa pun. Setiap huruf memiliki jumlah poin tertentu, dan setiap ubin (tetapi tidak harus kata) hanya dapat digunakan satu kali. Ketika sebuah kata dimainkan, nilai poin dari setiap ubin yang digunakan ditambahkan, yang menjadi skor. Karena jumlah surat yang tersedia terbatas, sebuah kata hanya dapat memiliki huruf tertentu sebanyak surat itu memiliki ubin + setiap wildcard yang tidak digunakan. Papan Scrabble berukuran 15 × 15 sel, jadi kata itu harus antara 2 dan 15 karakter.
Untuk daftar jumlah dan skor setiap huruf dalam versi bahasa Inggris, lihat di bawah atau http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( arsip ).
Letter Qty Points Letter Qty Points ------------------- ------------------- A 9 1 O 8 1 B 2 3 P 2 3 C 2 3 Q 1 10 D 4 2 R 6 1 E 12 1 S 4 1 F 2 4 T 6 1 G 3 2 U 4 1 H 2 4 V 2 4 I 9 1 W 2 4 J 1 8 X 1 8 K 1 5 Y 2 4 L 4 1 Z 1 10 M 2 3 [liar] 2 0 N 6 1
Aturan lebih lanjut
- Program harus mengambil satu string input dari STDIN atau sejenisnya.
- Masukan akan selalu hanya berisi huruf besar.
- Jika string berisi lebih banyak salinan surat daripada ada wildcard atau ubin yang tidak digunakan untuk surat itu ATAU panjang string tidak antara 2 dan 15 inklusif, program harus menampilkan
Invalid
. - Jika tidak, skor harus ditambahkan dengan menggunakan data dari bagan di atas dan output.
- Jangan gunakan wildcard kecuali jika diperlukan.
- Jangan khawatir tentang bonus seperti skor kata ganda atau apakah string itu kata yang nyata.
- Program harus menampilkan hasilnya melalui STDOUT atau sejenisnya.
- Celah yang dilarang secara default tidak diizinkan.
- Menggunakan sumber eksternal seperti situs web, serta perpustakaan, API, fungsi, atau sejenisnya apa pun yang menghitung skor Scrabble atau jumlah yang tepat tidak diizinkan.
- Ini adalah kode-golf , byte paling sedikit menang.
Panduan
Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15
Testcases
Input output ------------------------ GELOMBANG 14 JAZZ 19 STACKEXCHANGE 32 XYWFHQYVZVJKHFW 81 PIZZAZZ Tidak Valid KIXOKEJAJAX Tidak Valid MISUNDERSTANDING Tidak Valid
sumber
-1
,?Invalid
.Jawaban:
Perl 5
228 205 186 184 178 177 153 150 149 142 137135Jalankan dengan perl -E.
Golf:
Solusi ini menggunakan beberapa karakter yang tidak dapat dicetak, jadi hexdump disediakan di bawah ini:
Atau, gunakan Ctrl + Key:
Ungolfed + berkomentar:
sumber
-M5.010
(penalti 0 karena ini menentukan versi bahasa yang akan digunakan) daripada-e
(penalti 1)? Anda mungkin bisa menyimpan byte dalam argumen.C, Why 2,
151 145138Terinspirasi oleh kode 159-byte dalam komentar @ bebe, saya memeras
8 1421 karakter lainnya:4 byte disimpan dengan mengatur ulang penghitung panjang
i
. Ini diinisialisasi ke 1 (dengan asumsi program tidak mengambil argumen) kemudian dikalikan dengan 4 setiap kali surat dibaca. Itu meluap ke nol ketika panjang kata lebih besar dari 15, jadi untuk memeriksa apakah panjang kata itu buruk, kita cukup memeriksa apakahi<5
(saya taruhi<9
jadi itu akan tetap memberikan kata-kata satu huruf yang tidak valid jika pengguna secara tidak sengaja memulai pembicaraani
ke 2 dengan meletakkan satu argumen di baris perintah.)4 byte disimpan dengan mengubah tes kondisi loop menjadi sederhana
&31
. Ini mengharuskan kata diakhiri dengan spasi (ASCII 32) atau karakter nol (ASCII 0.) Biasanya input keyboard diakhiri oleh baris baru (ASCII 10) sehingga program agak tidak nyaman untuk digunakan, karena Anda harus mengetikkan spasi kemudian tekan kembali juga untuk membuat komputer membaca buffer. Untuk string yang diakhiri baris baru, saya dapat mencocokkan tetapi tidak mengalahkan cara bebe melakukannya.613 byte disimpan dengan mengubah encoding ke - (jumlah ubin dari setiap huruf) - (skor untuk huruf-1) * 13 . Sekarang ini membutuhkan rentang dari -4 untuk L, S, U hingga -118 untuk Q, Z. Alasan menggunakan angka negatif adalah untuk menghindari rentang ASCII yang tidak dapat dicetak 0 hingga 31. Alih-alih rentang yang digunakan adalah komplemen dua angka negatif 256-4 = 252 hingga 256-118 = 138. Ini adalah karakter ASCII yang dapat dicetak dan diperluas. Ada masalah dengan menyalin dan menempel ini di Unicode (cara menyederhanakan kembali ke ASCII tergantung pada halaman kode yang diinstal yang dapat menyebabkan hasil yang tidak terduga) jadi saya telah memasukkan kode ASCII yang benar dalam komentar program.Keuntungan dari pengkodean ini adalah penghapusan variabel
r
karena jumlah ubin selalu dikurangi dengan 1 (karena disimpan sebagai angka negatif, kita lakukant[x]++
. Selain itu, operator postfix berarti kita dapat melakukan kenaikan ini pada saat yang sama dengan menambahkan skor kes
.C,
184Rev 1 173 (atau 172 dengan opsi kompiler)Saya menggunakan GCC, dan dengan opsi kompiler
-std=c99
itu akan memungkinkan saya untuk pindahchar t[]="...."
ke inisialisasifor
loop untuk menghemat satu titik koma tambahan. Untuk keterbacaan, saya telah menunjukkan program tanpa perubahan ini, dan dengan spasi tersisa.Caranya ada di datatable. Untuk setiap huruf kode ASCII dari formulir (skor total ubin untuk huruf itu) * 10 + (skor satu ubin-1) disimpan dalam tabel
t[]
. Saat runtime, skor total ini dikurangi karena ubin digunakan.Skor total semua ubin untuk setiap huruf berkisar dari 12 untuk E hingga 4 untuk L, S, U. Bentuk pengodean ini memungkinkan hanya karakter ASCII yang dapat dicetak untuk digunakan (ASCII 120,
x
untuk E turun ke ASCII 40,(
untuk L, S, U.) Menggunakan jumlah ubin akan membutuhkan kisaran dari 120 hingga 10, itulah sebabnya saya menghindarinya.Berkat
#define
makro, satu simbolT
yang digunakan dalam program utama untuk mengambil indeks surati
dari argumen pertama commandline, ASCII kurangiA
= 65 dari itu untuk memberikan indeks, dan mencarinya di meja T:t[x[1][i]-65]
.The
for
loop digunakan lebih sepertiwhile
lingkaran: loop berakhir ketika nol byte (string terminator) ditemui dalam string masukan.Jika ubin surat itu tidak habis (
T/10
bukan nol)s
ditambahkan oleh skor ubinT%10+1
untuk menjaga skor total. Pada saat yang sama skor petak disimpanr
, sehingga nilai dalam dapat diwakili olehT
dapat dikurangi denganr*10
untuk menunjukkan bahwa satu petak telah digunakan. Jika ubin habis, penghitung wildcard / blankb
bertambah.The
printf
Pernyataan ini cukup jelas. jika panjang kata di luar batas atau jumlah kosong terlalu tinggi, cetakInvalid
jika tidak cetak skors
.sumber
?
dan:
. Poin Anda yang lain digantikan, karena saya telah sepenuhnya mengubah pengkodean sehingga tidak perlu untuk penanganan khusus dari Q dan Z. Sekarang ke 173/172 dengan bantuan Anda.getchar()
159 ini:l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}
meskipun saya masih belum mengerti mengapachar*foo=<string>
crash. itu bisa menghemat 2 karakter.char*foo="string"
adalah string literal, dan kontennya tidak diizinkan untuk dimodifikasi. Di sisi lain,char foo[]="string"
membuat array karakter yang diinisialisasistring\0
, yang kemudian dapat dimodifikasi.getchar().
Saya telah menggunakan perbaikan Anda untuk kode (dengan nama variabel saya untuk konsistensi dengan sisa jawaban saya), ditambah perbaikan untuk pemeriksaan validitas kata-panjang, dan perbaikan kurang ajar untuk kondisi loop test (Saya mencoba memperpendek milik Anda tetapi tidak dapat melakukannya dengan fungsi yang sama.) Saya juga mencobagetche()
dangetch()
tetapi kompiler saya (gcc di cygwin) tidak akan menautkannya secara otomatis.JavaScript (ES6) -
241230199182Sunting - mengubah cara saya menyandikan jumlah / skor untuk mengurangi ukuran dan menghapus variabel non-ascii
Sunting 2 - mengubah pengkodean kuantitas / skor menjadi bilangan bulat, bukan string
Sunting 3 - beralih ke
%13
(terima kasih @ edc65), membalikkan penyandian, mengubah nilai secara langsung, dan beberapa perbaikan kecil lainnyaDiuji di konsol Firefox.
sumber
f[c]=1+f[c]||1
->f[c]=-~f[c]
, 2.mengapa tidak menggunakan% 13%13
adalah jenius sekalipun. Saya terjebak berpikir saya harus menyimpan barang-barang dalam angka, tetapi matematika tidak peduli tentang perbedaan antara base10 dan base13.SyntaxError: Unexpected token >
)f=s=>{...}
notasi).Python 3,
217201Tidak Disatukan:
Sunting: Berkat @BeetDemGuise untuk tip yang akhirnya membuat saya lebih dari sekadar pengurangan 1 karakter! Kode asli di bawah ini:
sumber
int('1332142418513113a11114484a'[o],16)
:)BEFUNGE 93 - 210 bytes.
Tapi itu tidak memeriksa batas 15 huruf.
sumber
C, 197
Mengasumsikan string diberikan sebagai argumen baris perintah, misalnya
./scrabble STACKEXCHANGE
sumber
JavaScript -
232201z
menyimpan kata. Keluaran sebagai peringatan.Sunting: ditingkatkan sesuai rekomendasi di bawah ini.
sumber
s
hanya digunakan sekali, jadi Anda tidak perlu menjadikannya variabel sama sekali; Anda dapat menghapus deklarasi itu dan menggantinyar+=s[x]
denganr+=-~"02210313074020029000033739"[x]
. Selain itu, Anda tidak perlu tanda kurung(w>2|y<2|y>15)
di peringatan.Haskell - 538
Simpan sebagai scrabble.hs dan kemudian kompilasi menggunakan
Kemudian masukkan kata Anda sebagai input dan tekan enter
sumber
"ABCDEFG"
dapat ditulis sebagai['A'..'G']
,[1,2,3]
dapat ditulis sebagai[1..3]
Python 2.7 - 263
Saya tidak bisa mendekati jawaban DLosc , tetapi ini memperlakukan setiap huruf sebagai 'tas' yang Anda tarik, sampai kosong, lalu Anda tarik kosong, dan ketika itu kosong kesalahannya.
sumber
raw_input
jika itu Python2 (satu hal yang saya sukai tentang Python3). Input dijamin huruf besar, jadi hapus.lower()
dan ubah97+i
menjadi65+i
. Masukan kurang dari 2 karakter juga harus tidak valid. Anda dapat meningkatkan kesalahan pembagian nol tanpaif
pernyataan: bagi skor total Anda dengan(1<len(S)<16)
. Beberapa tweak lain seperti meletakkanprint
s pada baris yang sama dengan header blok dan menghapus ruang sebelum"Invalid"
membawanya ke 250 menurut hitungan saya. :)Haskell,
290283Sejauh yang saya bisa lakukan untuk saat ini:
Kode ini mematuhi aturan dengan sangat ketat, jadi pastikan Anda tidak memberikan karakter tambahan (seperti end-of-line). Gunakan seperti ini:
echo -n "JAZZ" | runghc scrabble.hs
.Penjelasan
Pola
(_:_:_)
memastikan bahwa hanya string setidaknya dua karakter dipertimbangkan, semuanya menghasilkan"Invalid"
(pola mundur_
). Tabel ubin dikodekan sebagai11*nTiles+value
dikonversi ke ASCII dengan offset yang memungkinkan modulo 11 lookup bekerja, di mana hurufAEIO
- huruf diduplikasi karena mereka terjadi lebih dari 6 kali masing-masing. Kumpulan ubin kemudian dibuat menggunakanreplicate
, dari mana karakter dalam kata tersebut dihapus saat terjadi (daftar perbedaan,\\
). Kolam berisi 98 ubin, jadi jika panjang total kata dan bagian yang tersisa dari kolam lebih besar dari 100, maka kami telah menggunakan terlalu banyak wildcard. Juga, kata minus 15 huruf pertama ditambahkan tiga kali ke dalam perhitungan panjang sehingga kata yang lebih dari 15 huruf secara otomatis tampaknya menggunakan tiga wildcard dan karenanya tidak valid. Penilaian dilakukan pada kelompok yang tersisa, yang awalnya memiliki 187 poin, yang kami kurangi. Perhatikan bahwaf 61
alih - alihf 65
, 65 menjadi nomor ASCII'A'
, karena duplikat"AEIO"
di awal kolam. Sisanya hanya boilerplate.sumber
Python3 - 197
Mari kita gunakan bignum untuk digunakan: D (Ini tidak menangani wildcard saat ini, saya telah melewatkan membaca aturan itu sepenuhnya, sialan)
sumber
Ruby - 195
Saya mengasumsikan output
"Invalid"
baik-baik saja, jika tidak saya perlu melakukan$><<(-b<1&&w.size<16?s:'Invalid')
yang akan menabraknya hingga 198Clojure - 325
Saya belum melakukan clojure dalam beberapa saat jadi saya yakin ada beberapa cara untuk meningkatkan solusi saya. Yaitu daftar qty dan pts
Beberapa yang tidak golf
sumber
ES6: 184 (tidak ketat)
w
Diasumsikan sudah mengandung kata.r
adalah string output.Ini dijelaskan dan sedikit kurang golf:
sumber
Dart - 201
Ini membutuhkan bignum, sehingga tidak dapat dikompilasi dengan JavaScript.
Dengan lebih banyak ruang putih:
sumber
PHP,
180170168 byteYay! mengalahkan JS!
kerusakan
Saya sangat senang tidak ada skor surat lebih besar dari 10.
sumber