Saya ingin bermain Dungeons and Dragons, tapi saya tidak punya dadu! Tantangan Anda adalah melempar beberapa dadu D & D.
Spesifikasi format input dalam formulir Backus-Naur adalah:
<valid-input> ::= <opt-integer> "d" <integer> <opt-modifier>
<opt-integer> ::= | <integer>
<opt-modifier> ::= | "+" <integer>
<integer> ::= "0" | "1" | "2" | "3" | "4" | "5" |
"6" | "7" | "8" | "9" | <integer> <integer>
Bilangan bulat opsional sebelum d
adalah jumlah dadu untuk digulung; itu harus setidaknya 1
, dan default ke 1
jika tidak disediakan.
Bilangan bulat yang diperlukan segera setelah d
jumlah sisi yang dimiliki masing-masing die; setidaknya harus 1
. Sisi setiap dadu adalah bilangan bulat positif berurutan yang berbeda mulai dari 1
.
Pengubah opsional mungkin +0
, dan standarnya adalah +0
jika tidak ditentukan.
Misalnya, untuk input 2d10+5
, Anda menghasilkan dua angka acak dari 1 hingga 10 inklusif, tambahkan bersama-sama, dan tambahkan 5. Kemudian Anda akan menampilkan hasilnya.
Jika Anda menerima input tidak valid, seperti 2d
, d20+
, 0d4
, 2d5+1+2
, 2+2
, atau apa pun yang tidak sesuai format ini, Anda harus output " Invalid input
". Jika tidak, Anda harus mengeluarkan hanya satu bilangan bulat acak, yang dibobot menurut input. Misalnya, 3d6
harus menghasilkan lebih 10
dari 4
s .
Uji kasus
Input Minimum possible output Maximum possible output
d1 1 1
d6 1 6
d1+3 4 4
d20+3 4 23
2d1 2 2
2d6+2 4 14
d01 1 1
d01+0 1 1
01d01+01 2 2
3d20+10 13 70
d Invalid input
d0 Invalid input
d+0 Invalid input
d0+0 Invalid input
0d1 Invalid input
0d1+1 Invalid input
d1+ Invalid input
1d Invalid input
1d1+ Invalid input
1d+1 Invalid input
2d+2d Invalid input
d2+d2 Invalid input
d2+2+2 Invalid input
d2-1 Invalid input
-d2 Invalid input
-2d2 Invalid input
4*3 Invalid input
4*d2 Invalid input
Ini adalah kode-golf , jadi kode terpendek dalam byte akan menang!
02d05+073
input yang valid?n
danp
sebagai opsional, tetapi input yang memilih untuk tidak memasukkannya (d20+
) sebagai tidak valid.+
tanda hanya akan ditambahkan jika pengubahp
disediakan.1d4+1d6
untuk penyamun licik menyerang dengan belati) atau memiliki negatifp
(misalnya,1d20-1
untuk pemeriksaan keterampilan tanpa peringkat / pelatihan dan pengubah kemampuan negatif).2d8 + 1d6 + 4
? Anda akan memiliki waktu yang burukJawaban:
Perl,
10995939689 byteMembutuhkan
-p
sakelar, yang menyumbang dua byte. Cobalah online di Ideone .Bagaimana itu bekerja
Karena
-p
saklar, sebuah baris dibaca dari STDIN dan disimpan di$_
.Perintah
s/^d/1d/
menambahkan awal 1 ke$_
jika dimulai dengan d , yaitu, jika jumlah dadu belum ditentukan.Ekspresi reguler
/^(\d+)d(\d+)(\+\d+)?/
memeriksa apakah garis terdiri dari angka, d literal , angka lain dan, opsional, angka ketiga didahului dengan tanda + .Jika ada kecocokan, angkanya akan disimpan
$1
,$2
dan$3
.Dalam hal ini, input akan valid jika dan hanya jika
$1
dan$2
keduanya positif.$d += 1 + rand $2 | 0
menambahkan bilangan bulat pseudo-acak yang dipilih dari 1 ke jumlah sisi yang ditentukan$d
(awalnya diperlakukan sebagai nol).for 1 .. $1
melakukan hal di atas satu kali untuk setiap bilangan bulat antara 1 dan jumlah dadu.Perintah
$_ = $1 * $2 ? $d + $3 : 'Invalid input'
melakukan hal berikut:Jika
$1 * $2
nol, ini ditetapkan$_
ke input tidak valid .Jika tidak, input tersebut valid dan set
$_
ke jumlah gulungan dadu dan pengubah.Karena
-p
beralih, Perl mencetak konten$_
.Karena tidak ada lagi baris input, skrip keluar.
sumber
-p
hanya akan dikenakan biaya satu, menjadikan ini solusi 108 byte./^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/||die"Invalid input$/";$a+=1+int rand$2for(1..$1||1);$_=$a+$3
|0
cast ke int, karenarand
mengembalikan float yang dipilih secara acak semu .-e
akan bermasalah di sini, kecuali jika Anda mengganti tanda kutip tunggal dengan tanda kutip ganda.Fortran: 145
Kekerasan mengetik secara implisit (
i-n
semuanya bilangan bulat, yang lainnya nyata). Peringatan kecil: input harus dipisahkan dengan spasi, jadi2d10+5
harus dimasukkan sebagai2 d 10 + 5
, jika tidak, Anda akan mendapatkaninput conversion error
.sumber
Ruby, 116
Versi Ruby alternatif. Saya mencoba menemukan cara untuk melakukannya tanpa ekspresi reguler, tetapi validasi yang harus Anda lakukan jauh lebih sulit tanpa mereka.
Yang ini 112, menggunakan algoritma Perl 'Dennis pintar:
sumber
Javascipt, 158
Tidak bisa bermain golf lebih baik dari ini. Sudah waktunya untuk kembali bekerja.
sumber
s="Invalid input";if(m=prompt().match(/^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/))for(s=m[3]|0,i=0;i<(m[1]||1);i++)s+=Math.random()*m[2]+1|0;alert(s)
hanya memiliki 137 byte.02d05+073
.GolfScript (
120106 byte)Ini tidak hanya lebih pendek dari versi pertama, tetapi juga lebih elegan. Bagian yang benar-benar melakukan rolling mati adalah
Sisanya sebagian besar input validasi, dan beberapa karakter untuk parsing.
Demo online dengan kerangka uji
sumber
n./
? Mungkin juga10,n*
untuk satu karakter lebih sedikit.J - 130 (45?) Char
Tantangan ini tampaknya sedikit bias terhadap ekspresi reguler, terutama dengan harus membedakan input yang tidak valid. J memiliki perpustakaan regex POSIX, jadi tidak seburuk itu, tetapi tidak terintegrasi seperti halnya dengan Perl, jadi J harganya tidak lebih baik daripada bahasa lain.
Jika Anda hanya menerapkan logika untuk ekspresi yang valid, seperti yang tampak pada solusi Python / PHP, itu adalah 45 karakter yang lebih masuk akal:
Bit penting:
1!:1]1
adalah input, dan(rxmatch rxfrom])
merupakan logika yang mengembalikan kecocokan subekspresi.Apakah input legal atau tidak ditangani oleh pencocokan regex, sehingga kita dapat mengatur default untuk n dan p dengan
0 1 1>.
. Itu terlihat mundur (n adalah 1 secara default dan p adalah 0) karena kami harus membalikkan (|.
) daftar sebelumnya, sehingga logika pada akhirnya dijalankan dalam urutan yang benar.@.
adalah Agenda konjungsi, pada dasarnya pernyataan switch J-ish. Jika kecocokan kosong (jika 0 adalah e.lement dari $ hape:)0 e.$
, kami memancarkan pesan kesalahan, jika tidak, kami melanjutkan dengan menggulirkan dadu:#~
untuk mengatur dadu,1+?
untuk menggulung, dan+/@,
menambahkan pengubah p dan jumlah.sumber
01d01+01
?TinyMUSH , 239
Empat baris pertama berurusan dengan fakta bahwa "d" adalah alias untuk keluar "turun" universal dengan pesan kegagalan bawaan ketika tidak ada; keluar dipindai sebelum perintah yang ditentukan pengguna. Baris yang tersisa membuat objek dengan perintah yang ditentukan pengguna dengan memanfaatkan fungsi die () bawaan.
sumber
PHP, 129
Menggunakan regex untuk membuat ekspresi yang kemudian dievaluasi oleh PHP. Input dimasukkan melalui url:? 0 = argumen . Pastikan Anda memasukkan kode + ke% 2b. Begini tampilannya dalam bentuk yang lebih mudah dibaca:
Bitwise membalikkan string menggunakan
~
tidak hanya menyimpan karakter karena Anda tidak perlu tanda kutip (PHP menganggap itu adalah string) tetapi juga menyimpan karakter karena Anda tidak harus melarikan diri dari garis miring terbalik dalam ekspresi reguler.The
?:
operator adalah bentuk khusus dari operator ternary.$foo = $a ? $a : $b
sama dengan$foo = $a ?: $b
.sumber
Jawa, 378
Hanya ingin mencoba solusi dengan Java jauh dari solusi terbaik. Tapi hei: Jawa bukan bahasa golf!
Ia mendapat input dari baris perintah. Parameter pertama
args[0]
adalah nilai input.Tahukah Anda, itu
decode
lebih pendek darivalueOf
?sumber
Python 3, 184 byte
Lewati semua tes. Jika nol dadu diizinkan, itu akan menjadi 6 byte lebih pendek dengan meninggalkan
(or q)
.sumber
re.match
secara implisit berlabuh di awal tetapi tidak di akhir. Saya tidak mengetahui ada perpustakaan regex lain yang melakukan itu.t=int(c or 0)
; dan mungkin untuk menggabungkan jawaban Anda dengan Python yang ada (yang menggunakan spasi lebih sedikit) untuk menghemat lebih banyak pasangan.JavaScript 134
sumber
02d05+073
.Ruby,
167147Menggunakan regexp untuk melakukan semua pekerjaan. Karena saya menggunakan
\d+
, satu-satunya hal yang saya perlu periksa untuk input yang tidak valid adalah bahwa ada kecocokan, tidak adan
ataum
tidak0
, dan adam
. Jika ada yang ditemukan, itu dibatalkan dengan pesan ('Invalid input'
). Maka itu hanya mencetak hasilnya, karena itu akan dibatalkan sekarang jika input tidak valid.Hasil-mencetak tidak begitu menarik, tapi ...
Saya kemudian berubah
.inject(:+)
menjadieval(...*?+)
, tetapi idenya sama.sumber
Python3, 204B
Tambang mengalahkan jawaban Python yang ada dengan menambahkan dalam penanganan kesalahan yang diperlukan dan membaca
d20
sebagai1d20
bukan0d20
:)diedit untuk memperbaiki 2 kesalahan ketik:
I(x) => I(c)
,Invalid Input => Invalid input
diedit untuk memperbaiki regex:
\+?(\d*) => (\+\d+)?
sumber
3d20+
.01d01+01
.