Tugas Anda adalah menulis sebuah program kecil, yang menghitung poin-poin dari tangan Skat. Deck Skat memiliki kartu 7 hingga 10, Jack, Queen, King dan Ace (disebut Unter, Ober, König dan Daus). Kami menggunakan jas Jerman, yang memiliki Acorns, Leaves, Hearts and Bells, bukan Club, Spades, Hearts dan Diamonds. Poin ditentukan oleh nomor pada kartu:
- 7, 8 dan 9 adalah 0 poin
- Unter adalah 2 poin
- Ober adalah 3 poin
- König adalah 4 poin
- 10 adalah 10 poin
- Daus adalah 11 poin.
Input output
Format input terdiri dari dua simbol, yang pertama mewakili nilai, sedangkan yang kedua adalah singkatan dari suit:
- 7, 8 dan 9 mewakili mereka sendiri
- 0 (nol) adalah 10
- Unter, Ober, König dan Daus diberi nama sesuai dengan huruf pertama mereka (U, O dan D)
- Hal yang sama untuk Acorns, Leaves, Hearts and Bellys (A, L, H dan B)
Input adalah satu baris kartu, dipisahkan oleh spasi tunggal. Anda dapat mengambil input dari mana saja, argumen baris perintah juga oke. Outputnya adalah nilai tangan, baik dicetak atau dikembalikan sebagai kode keluar. Output dari program Anda harus menunjukkan kesalahan, jika ada kartu yang muncul dua kali di tangan. (Jadi 7A 0L 7A
harus mengembalikan kesalahan, bukan 10
). Tidak apa-apa untuk berhenti dengan kode keluar 255 bukannya menunjukkan kesalahan, jika ini adalah cara default program Anda untuk menampilkan hasilnya.
Contohnya
7A 8A 9A UA OA KA 0A DA 7L 8L 9L UL OL KL 0L DL 7H 8H 9H UH OH KH 0H DH 7B 8B 9B UB OB KB 0B DB
memberi 1207A 8L 0K DB 8L
memberikan kesalahanUA OB DL KH
memberi 20
Aturan
- Golf kode: Kode terpendek menang
- Aturan golf kode biasa berlaku
- Program harus bekerja untuk semua tangan, bukan hanya contoh
- GIGO: Jika input tidak valid, output mungkin arbitrer
sumber
Jawaban:
APL (
5448)Ada memiliki untuk menjadi cara yang lebih pendek memilih nilai kartu, tapi saya tidak melihatnya.
Anda mendapatkan
DOMAIN ERROR
jika ada kartu duplikat.Penjelasan:
A←⍞~' '
: store (←
) keA
dalam baris input pengguna (⍞
) tanpa (~
) spasi.2,⍨2÷⍨⍴A
: daftar dua elemen, yang berisi panjang (⍴
)A
dibagi dengan (÷⍨
) 2, diikuti oleh (,⍨
) angka 2. (Jadi, jika input adalahUA OB DL KH
daftar adalah (4, 2)).↓A⍴⍨
: define a matrix (⍴
), dengan dimensi daftar itu, berisi nilai-nilai A. Kemudian gabungkan elemen-elemen dari barisnya bersama-sama (↓
), memberikan daftar daftar, misalnya['UA','OB','DL','KH']
.A←
: Simpan daftar ini di A.A≡∪A
:∪A
adalah daftar elemen unik dalam A. Jika ini sama dengan A, tidak ada duplikat dan ini mengembalikan 1, jika tidak 0.÷
: bagi apa yang ada di sebelah kiri (yang melakukan perhitungan aktual) dengan hasil tes kesetaraan. Jadi jika tidak ada duplikat, skornya tidak berubah, dan jika ada duplikat Anda mendapatkanDOMAIN ERROR
karena pembagian dengan nol.⊃¨A
: Daftar yang memberikan elemen pertama (⊃
) dari setiap elemen (¨
) A. Jadi ini menjatuhkan surat gugatan, meninggalkan surat skor. (UODK
)'D0.....KOU.'⍳
: memberikan indeks dari masing-masing huruf skor dalam string ini, mengembalikan 12 untuk nilai-nilai yang tidak ada dalam string. (10 9 1 8
)+/12-
: kurangi semua ini dari 12, dan kemudian tambahkan bersama-sama. (2 + 3 + 11 + 4 = 20
)sumber
Ruby 1.9, 52 karakter
Masukan melalui argumen baris perintah. Saya berasumsi pesan kesalahan ketika memiliki kartu duplikat tidak masalah, jadi itu hanya mengeluh tentang kesalahan konversi jenis / eval.
Contoh penggunaan:
sumber
Scala,
8782 karakterMelempar pengecualian pada kartu yang diulang.
sumber
Haskell,
122108107 karaktersumber
error""
lebih pendek dariundefined
. Simpan satu char menggunakaninteract
.interact
tidak akan mencetak baris baru, jadi saya tidak yakin apakah itu dapat diterima. Namun, saya bisa menghemat lebih banyak dengan menggunakan pola yang tidak lengkapundefined
.GolfScript
545352Edit 1:
Saya baru saja menemukan kesalahan dalam kode. Itu tidak mendeteksi kartu duplikat jika duplikat adalah dua yang pertama dalam input (karena saya menggunakan
*
operator lipat dan bukan/
masing - masing operator untuk loop pertama).Sekarang saya memperbaiki kode dan juga berhasil menghapus 1 char dalam proses. Ini versi baru:
Masukan harus berada di tumpukan sebagai string, dalam format yang ditentukan (contoh
'7A UA DA'
:).Jika inputnya valid, program akan mencetak nilai total kartu.
Jika setidaknya ada satu kartu duplikat, program melempar pengecualian berikut:
Edit 2:
Setelah melihat posting ini di situs meta , saya memutuskan untuk mengirim deskripsi kode. Ini juga membantu saya menemukan dan memperbaiki kesalahan. Jadi begini:
sumber
Python, 114 karakter
Sayangnya,
index
metode daftar di Python memunculkan kesalahan jika elemen tidak ditemukan daripada mengembalikan nilai negatif, dan mengimpordefaultdict
akan membutuhkan lebih banyak karakter daripada yang akan disimpan.sumber
eTeX, 201 karakter (tidak termasuk dua linebreak yang tidak relevan)
Digunakan sebagai
etex filename.tex [UA OB DL KH]
. Menempatkan argumen dalam tanda kurung diperlukan: jika tidak, eTeX tidak memiliki cara untuk menentukan bahwa kita mencapai akhir dari daftar argumen.EDIT: sebagaimana diizinkan dalam pernyataan pertanyaan, input yang salah dapat menyebabkan (an) kesalahan. Misalnya,
etex filename.tex [OK]
crash parah (karenaK
bukan warna yang valid).sumber
etex -v
? Apa pesan kesalahan (kurang-lebih)? Kode harus dimasukkan ke dalam file (dengan namafilename.tex
, atau apa pun yang berakhir dengan.tex
), dan gunakan nama itu di baris perintahetex filename.tex [<argument>]
. (maaf untuk mengirim ulang komentar yang sama, saya lupa "@FUZxxl
")K
bukan warna yang valid, dan menggantinya denganX
dalam contoh Anda menghilangkan kesalahan (rusakK
karena surat itu memiliki arti lain, Raja). Saya bisa membuat kesalahan lebih buruk dengan menambahkan\string
sebelum masing-masing##1
, tetapi itu akan membutuhkan 12 karakter lebih banyak.PowerShell, 79
80Lempar »Berusaha membagi dengan nol.« Jika kartu muncul dua kali.
sumber