Biorąc pod uwagę wejście n
w których 3 <= n <= 25
należy wykonać następujące czynności, począwszy od pojedynczego n
-sided matrycy (twarze w zakresie [1, n]
włącznie):
- Wydrukuj wynik
n
rzutu aktualnymi kostkami w grze, w formie kdn: X
(gdzie X
jest wynikiem i k
liczbą kości w grze).
- Jeśli
X
jest większa lub równa n/2
liczbie kości w grze, dodaj kość. W przeciwnym razie usuń kostkę.
- Jeśli liczba kości w grze jest równa
0
lub n
, zatrzymaj się. W przeciwnym razie przejdź do kroku 1.
Przykład działa (zauważ, że dane wyjściowe w nawiasach podano w celu wyjaśnienia i nie są wymagane):
6-stronny:
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-stronny:
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)
Zasady
- Dane wyjściowe muszą być dokładnie w formacie
kdn: X
, z nowymi liniami oddzielającymi każdą rolkę
- Musisz faktycznie symulować wyrzucanie wielu kości; zwykłe zwracanie losowej liczby całkowitej z zakresu
[1, n]
(włącznie) pomnożonej przez liczbę kości aktualnie w grze jest niedozwolone, ponieważ nie symuluje to dokładnie rzucania wieloma kostkami.
- Standardowe luki są zabronione
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach
Tabela liderów
Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](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>
Odpowiedzi:
Pyth, 37 bajtów
Wypróbuj online.
źródło
Mathematica,
958980 znakówNie golfił
źródło
Echo
niestety nie może przyjmować sekwencji danych wejściowych tak jakPrint
robi.PHP,
164121112113109 bajtówOstateczna wersja, obiecuję. Ulepszono dzięki sugestii Tytusa:
EDYCJA: Dodano dodatkowy bajt do formatowania. Zapomniałem, że jest tam JEŻELI, który dzięki upuszczeniu tekstu „dodaj / pod” może być operatorem potrójnym:
Wyjście wygląda teraz następująco:
EDYCJA: Dzięki @Manatwork bardzo mnie uratował! Nowa i ulepszona wersja:
Poprzedni wpis:
Rzuca oddzielne matryce, wysyła to:
I tak się nazywa:
d(6, 1);
Czy wyświetlanie sufiksu
Add
i jestSub
obowiązkowe? Nie jest to jasne z twojego pytania.źródło
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
Zaoszczędź 3 bajty dzięki DSM.
Całkiem proste, rzuca wiązką kości i sprawdza średnią. Nie ma tu jeszcze nic wyszukanego.
To musi być wywołane z int. Wyprodukuje więc
x(6)
coś takiego:.
źródło
JavaScript (ES6), 97
102106112bajtówDzięki @ user81655 i @Jupotter za uratowanie mi kilku bajtów.
Próbny
Działa to tylko w przeglądarkach zgodnych z ES6 (w tym momencie obejmuje Firefox i Edge, prawdopodobnie z Chrome i Opera z włączonymi eksperymentalnymi funkcjami JavaScript):
źródło
while
dofor
pętli, okrągły dół z|0
zamiast~~()
i przejść kilka stwierdzeń, dzięki czemu można usunąć wsporniki zaoszczędzić kilka bajtów. Możesz także uczynić to funkcją anonimową (nief=
). 103 bajty: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
do drugiejfor
pętli (kosztowało mnie 1 znak więcej niż twoja). Nadalk&&k!=n
warunek porównaniemk%n!=0
k%n
działa jeszcze lepiej;)CJam, 45 bajtów
Wypróbuj online.
Implementuje specyfikację dosłownie (w tym matematycznie niepoprawną formułę „średniego rzutu”). Zgodnie z oczekiwaniami, przenoszenie oryginalny program GolfScript poniżej CJam zapisane kilka bajtów ze względu na krótszy wbudowaną nazw poleceń (
mr
,o
ig
zamiastrand
,puts
ido
).GolfScript, 51 bajtów
Oto mój oryginalny wpis w GolfScript. Do znaczących sztuczek golfowych należy użycie tej liczby
1
jako wygodnie wstępnie zainicjowanej zmiennej do przechowywania bieżącej liczby kości do rzucenia. (Zamiast tego używana jest wersja CJamX
, którą CJam inicjuje na wartość 1.)Ps. Widząc tytuł, pierwotnie chciałem odpowiedzieć na to w AnyDice . Ale okazuje się, że jest to okropny wybór dla tego wyzwania i nie sądzę, aby technicznie możliwe było użycie go do wdrożenia tej specyfikacji, jak podano.
Problem polega na tym, że AnyDice jest językiem specyficznym dla domeny do pisania deterministycznych programów do obliczania statystyk rzucania kostkami. Podczas sprawdzania możliwych wyników rzutu i wykonywania rzutów warunkowych na ich podstawie jest możliwe poprzez rekurencję, nie ma sposobu na wygenerowanie faktycznej losowości. Podczas gdy można symulować tę sekwencję rzutów kostką w AnyDice, wszystko, co można uzyskać, to dane statystyczne dotyczące takich rzeczy, jak, powiedzmy, liczba rzutów do zakończenia procesu lub rozkład wyników na danym etapie.
Wszystko, co powiedziałem, oto najbliższe, jakie mogłem uzyskać w AnyDice :
Nie jest to szczególnie golfowy kod, ponieważ wydawało się to ćwiczeniem na próżno. Standardowe sztuczki golfowe, takie jak skracanie nazw funkcji i eliminowanie niepotrzebnych białych znaków, powinny i tak wyczerpać większość potencjału golfowego.
Kluczową sztuczką stosowaną tutaj jest to, że kiedy wywołujesz funkcję oczekującą liczby (jak wskazuje
:n
definicja funkcji) w AnyDice i przekazujesz jej matrycę (tj. Rozkład prawdopodobieństwa), AnyDice automatycznie ocenia funkcję dla wszystkich możliwych wartości kości i łączy wyniki w nową kostkę.Oto zrzut ekranu wyników (w formacie wykresu słupkowego) dla pierwszych trzech rolek:
(Należy zauważyć, że kolumna „0” na każdym wykresie wskazuje prawdopodobieństwo zatrzymania iteracji z powodu liczby kości uderzających albo o 0, albo N przed bieżącym rzutem. Zdarza się, że jest to wygodny sposób na przedstawienie warunku zatrzymania, ponieważ oczywiście zebranie 0dN zawsze daje 0.)
źródło
R, 103 bajtów
Dość prosta implementacja. Rzuty kostką są wykonywane przez
sum(sample(n,i))
.Testowe uruchomienie
źródło
CoffeeScript,
10699 bajtówNie golfił
źródło
Julia, 77 bajtów
Większość z nich powinna być zrozumiała - w ciągu jest używana rzeczywista nowa linia
print
zamiastprintln
zapisywania bajtu.rand(1:n,N)
produkujeN
losowe liczby całkowite od 1 don
.źródło
Ruby,
939082 znakówPrzykładowy przebieg:
źródło
QBIC , 83 bajty (niekonkurujące)
Wyjaśnienie:
źródło
PHP, 104 bajty
Biegnij z
php -r '<code>' <N>
awaria
źródło