Diberikan input di n
mana 3 <= n <= 25
, lakukan langkah-langkah berikut, dimulai dengan n
die satu sisi (wajah dalam kisaran [1, n]
, inklusif):
- Cetak hasil dari menggulirkan
n
dadu sisi-sisi saat ini dalam bentuk kdn: X
(di mana X
hasilnya dan k
jumlah dadu yang dimainkan).
- Jika
X
lebih besar atau sama dengan n/2
jumlah dadu yang dimainkan, tambahkan dadu. Lain, lepaskan dadu.
- Jika jumlah dadu yang dimainkan sama dengan
0
atau n
, berhenti. Lain, lanjutkan ke langkah 1.
Contoh berjalan (perhatikan bahwa output dalam tanda kurung adalah untuk penjelasan dan tidak diperlukan):
6-sisi:
1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)
9-sisi:
1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)
Aturan
- Output harus persis dalam format
kdn: X
, dengan baris baru memisahkan setiap gulungan
- Anda harus benar-benar mensimulasikan rolling dadu ganda; cukup mengembalikan bilangan bulat acak dalam rentang
[1, n]
(inklusif) dikalikan dengan jumlah dadu yang saat ini dimainkan tidak diperbolehkan, karena itu tidak secara akurat mensimulasikan pengguliran banyak dadu.
- Celah standar dilarang
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang
Papan peringkat
Cuplikan Stack di bagian bawah posting ini menghasilkan leaderboard dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 65904; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Jawaban:
Pyth, 37 byte
Cobalah online.
sumber
Mathematica,
958980 karakterTidak disatukan
sumber
Echo
sayangnya tidak dapat mengambil urutan input sepertiPrint
halnya.PHP,
164121112113109 byteVersi final, aku janji. Ditingkatkan menggunakan saran Titus:
EDIT: Menambahkan byte ekstra untuk pemformatan. Lupa ada IF di sana yang, berkat menjatuhkan teks "add / sub", bisa jadi operator ternary:
Output sekarang terlihat seperti:
EDIT: Terima kasih kepada @Manatwork, saya banyak menyelamatkan! Versi baru dan segera:
Entri sebelumnya:
Rolls terpisah mati, menampilkan ini:
Dan itu disebut demikian:
d(6, 1);
Apakah menampilkan
Add
danSub
akhiran wajib? Ini tidak jelas dari pertanyaan Anda.sumber
function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
$y-=$r/$y>$x/2?:-1
Python 3, 125
Disimpan 3 byte berkat DSM.
Cukup sederhana, melempar banyak dadu dan memeriksa rata-rata. Belum ada yang terlalu mewah di sini.
Perlu dipanggil dengan int. Jadi,
x(6)
akan menghasilkan sesuatu seperti ini:.
sumber
JavaScript (ES6), 97
102106112byteTerima kasih @ user81655 dan @Jupotter karena telah menyelamatkan saya beberapa byte.
Demo
Ini hanya berfungsi di browser yang sesuai dengan ES6 (saat ini termasuk Firefox dan Edge, mungkin dengan Chrome dan Opera dengan fitur JavaScript eksperimental diaktifkan):
sumber
while
kefor
loop, bulat dengan|0
alih - alih~~()
dan memindahkan beberapa pernyataan sehingga Anda dapat menghapus tanda kurung untuk menyimpan beberapa byte. Anda juga diizinkan menjadikannya fungsi anonim (tidakf=
). 103 byte:n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
console.log
kefor
loop lain (harganya 1 char lebih mahal dari milik Anda). Masih turun ke 106k&&k!=n
kondisi dengan perbandingank%n!=0
k%n
bekerja lebih baik;)CJam, 45 byte
Cobalah online.
Menerapkan spesifikasi secara harfiah (termasuk rumus "mean roll" yang salah secara matematis). Seperti yang diharapkan, porting program GolfScript asli di bawah ini ke CJam menyimpan banyak byte karena nama perintah built-in yang lebih pendek (
mr
,o
dang
bukannyarand
,puts
dando
).GolfScript, 51 byte
Inilah entri GolfScript asli saya. Trik golf terkenal termasuk menggunakan nomor
1
sebagai variabel pra-diinisialisasi nyaman untuk menyimpan jumlah dadu saat ini untuk digulung. (Versi CJam sebagai gantinya menggunakanX
, yang diinisialisasi CJam ke nilai 1.)Ps. Melihat judulnya, saya awalnya ingin menjawab ini di AnyDice . Tapi ternyata itu menjadi pilihan yang mengerikan untuk tantangan ini, dan saya tidak berpikir itu secara teknis mungkin untuk menggunakannya untuk mengimplementasikan spesifikasi ini seperti yang diberikan.
Masalahnya adalah bahwa AnyDice adalah bahasa khusus domain untuk menulis program deterministik untuk menghitung statistik dadu bergulir. Sementara memeriksa hasil yang mungkin dari gulungan dan melakukan gulungan bersyarat berdasarkan pada mereka adalah mungkin melalui rekursi, tidak ada cara untuk menghasilkan setiap keacakan yang sebenarnya. Jadi, sementara Anda bisa mensimulasikan urutan gulungan dadu di AnyDice, yang bisa Anda dapatkan sebagai output adalah statistik pada hal-hal seperti, katakanlah, jumlah gulungan hingga proses berakhir, atau distribusi hasil pada langkah tertentu.
Semua yang dikatakan, inilah yang paling dekat yang bisa saya dapatkan di AnyDice :
Ini bukan kode golf khusus, karena sepertinya latihan sia-sia. Trik golf standar bahasa penjepit, seperti memperpendek nama fungsi dan menghilangkan ruang kosong yang tidak perlu, harus menghabiskan sebagian besar potensi golf.
Trik kunci yang digunakan di sini adalah bahwa, ketika Anda memanggil fungsi yang mengharapkan angka (seperti yang ditunjukkan oleh
:n
definisi fungsi) di AnyDice, dan memberikannya die (mis. Distribusi probabilitas), AnyDice secara otomatis mengevaluasi fungsi tersebut untuk semua kemungkinan nilai mati, dan menggabungkan hasilnya menjadi mati baru.Berikut screenshot dari output (dalam format grafik batang) untuk tiga gulungan pertama:
(Perhatikan bahwa "0" kolom di setiap grafik menunjukkan probabilitas bahwa iterasi berhenti, karena jumlah dadu memukul baik 0 atau N, sebelum roll saat ini. Hal ini terjadi menjadi cara yang nyaman untuk mewakili kondisi berhenti, karena tentu saja bergulir 0dN selalu menghasilkan 0.)
sumber
R, 103 Bytes
Implementasi yang cukup lurus ke depan. Gulungan dadu dilakukan oleh
sum(sample(n,i))
.Uji coba
sumber
CoffeeScript,
10699 byteTidak disatukan
sumber
Julia, 77 byte
Sebagian besar harus jelas - baris baru yang sebenarnya sedang digunakan dalam
print
string daripada menggunakanprintln
untuk menyimpan byte.rand(1:n,N)
menghasilkanN
bilangan bulat acak antara 1 dann
.sumber
Ruby,
939082 karakterContoh dijalankan:
sumber
QBIC , 83 byte (tidak bersaing)
Penjelasan:
sumber
PHP, 104 byte
Jalankan dengan
php -r '<code>' <N>
kerusakan
sumber