С учетом ввода, n
где 3 <= n <= 25
выполните следующие шаги, начиная с одностороннего n
штампа (грани в диапазоне [1, n]
включительно):
- Выведите результат
n
броска текущих игральных костей в игре в виде kdn: X
(где X
результат и k
количество игральных костей).
- Если количество игральных костей
X
больше или равно n/2
разу, добавьте кубик. Остальное, убери кубик.
- Если количество игральных костей равно
0
или n
, остановитесь. Иначе, перейдите к шагу 1.
Пример запускается (обратите внимание, что вывод в скобках для пояснения и не требуется):
6-сторонний:
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-сторонний:
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)
правила
- Выходные данные должны быть точно в формате
kdn: X
, с символами новой строки, разделяющими каждый рулон
- Вы должны фактически симулировать бросание нескольких кубиков; простое возвращение случайного целого числа в диапазоне
[1, n]
(включительно), умноженном на количество играющих в данный момент костей, не допускается, так как это не позволяет точно имитировать бросание нескольких костей.
- Стандартные лазейки запрещены
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах
Leaderboard
Фрагмент стека в нижней части этого поста создает таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая затем будет отображаться во фрагменте:
## [><>](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>
Ответы:
Pyth, 37 байт
Попробуйте онлайн.
источник
Mathematica,
958980 символовUngolfed
источник
Echo
к сожалению, не может принять последовательность входных данных, как этоPrint
делает.PHP,
164121112113109 байтОкончательный вариант, обещаю. Улучшено с помощью предложения Тита:
РЕДАКТИРОВАТЬ: Добавлен дополнительный байт для форматирования. Забыл, что там есть IF, который, благодаря удалению текста "add / sub", мог быть троичным оператором:
Вывод теперь выглядит так:
РЕДАКТИРОВАТЬ: Благодаря @Manatwork, спас меня много! Новая и улучшенная версия:
Предыдущая запись:
Бросает отдельные штампы, выводит это:
И это называется так:
d(6, 1);
Является ли отображение
Add
иSub
суффикс обязательным? Это неясно из вашего вопроса.источник
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
Питон 3, 125
Сохранено 3 байта благодаря DSM.
Довольно просто, бросает кучу кубиков и проверяет среднее. Здесь пока ничего особенного.
Это должно быть вызвано с int. Итак,
x(6)
будет производить что-то вроде этого:,
источник
JavaScript (ES6), 97
102106112байтСпасибо @ user81655 и @Jupotter за то, что сэкономили мне несколько байтов.
демонстрация
Это работает только в браузерах, совместимых с ES6 (на данный момент включает в себя Firefox и Edge, возможно, с Chrome и Opera с включенными экспериментальными функциями JavaScript):
источник
while
кfor
петле, округление с|0
вместо~~()
и двигаться несколько заявлений , так что вы можете удалить скобки , чтобы сэкономить несколько байт. Также вы можете сделать это анонимной функцией (нетf=
). 103 байта: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
в другойfor
цикл (стоил мне на 1 символ больше, чем ваш). Все еще получил его до 106k&&k!=n
условие сравнениемk%n!=0
k%n
работает еще лучше;)CJam, 45 байтов
Попробуйте онлайн.
Реализует спецификацию буквально (включая математически неверную формулу "среднего броска"). Как и следовало ожидать, портирование оригинальной программы GolfScript ниже CJam сэкономил кучу байт из - за более короткие имена встроенных команд (
mr
,o
иg
вместоrand
,puts
аdo
).GolfScript, 51 байт
Вот моя оригинальная запись GolfScript. Известные трюки игры в гольф включают использование числа
1
в качестве удобно предварительно инициализированной переменной для хранения текущего количества игральных костей, которые нужно бросить. (Вместо этого используется версия CJamX
, которую CJam инициализирует значением 1.)Ps. Увидев заголовок, я изначально хотел ответить на это в AnyDice . Но это оказывается ужасным выбором для этой задачи, и я не думаю, что даже технически возможно использовать его для реализации данной спецификации как дано.
Проблема заключается в том, что AnyDice является предметно-ориентированным языком для написания детерминированных программ для расчета статистики бросков костей. Осматривая возможные результаты рулона и делать условные рулоны на их основе является возможным с помощью рекурсии, нет никакого способа , чтобы произвести какую - либо фактическую случайность. Таким образом, хотя вы можете смоделировать эту последовательность бросков костей в AnyDice, все, что вы можете получить в качестве выходных данных, - это статистика по таким вещам, как, например, количество бросков до завершения процесса или распределение результатов на данном шаге.
Все, что сказал, вот самое близкое, что я мог получить в AnyDice :
Это не особо удачный код, поскольку это казалось бесполезным упражнением. Стандартные уловки игры в гольф, такие как сокращение имен функций и устранение ненужных пробелов, должны в любом случае исчерпать большую часть потенциала игры в гольф.
Используемый здесь ключевой прием заключается в том, что когда вы вызываете функцию, ожидающую число (как указано
:n
в определении функции) в AnyDice, и вместо этого передаете ей матрицу (т.е. распределение вероятностей), AnyDice автоматически оценивает функцию для всех возможных значения кубика и объединяет результаты в новый кубик.Вот скриншот вывода (в формате гистограммы) для первых трех рулонов:
(Обратите внимание , что столбец «0» в каждом графике указывает на вероятность того, что итерации остановлен, из - за числа кубиков , поражающих либо 0 или N, перед текущим рулоне. Это происходит , чтобы быть удобным способом , чтобы представить условие остановки, так как конечно, бросок 0dN всегда дает 0.)
источник
R 103 байта
Довольно прямолинейная реализация. Броски в кости сделаны
sum(sample(n,i))
.Тестовый забег
источник
CoffeeScript,
10699 байтUngolfed
источник
Юлия, 77 байт
Большая часть этого должна быть самоочевидной - в
print
строке используетсяprintln
новая строка, а не для сохранения байта.rand(1:n,N)
производитN
случайные целые числа от 1 доn
.источник
Рубин,
939082 персонажаОбразец прогона:
источник
QBIC , 83 байта (не конкурирующий)
Объяснение:
источник
PHP, 104 байта
Бежать с
php -r '<code>' <N>
сломать
источник