Zainspirowany chwalebnym Alexem Naucz się R dla wielkiego dobra, pokornie odtworzymy „jeden prawdziwy program R” Alexa - ale z pewnym zwrotem.
Dodawanie w stylu Alexa działa w ten sposób - ma 90% szansy na zwrócenie sumy dwóch podanych liczb i 10% szansy na rekurencyjne dodanie Alexa pierwszej liczby i drugiej liczby + 1. Oznacza to, że potencjalnie , dodanie może być wyłączone o 1 lub więcej.
Wyzwanie
Napisz pełny program lub funkcję, która przyjmuje dwie liczby całkowite, a Alex dodaje je zgodnie z definicją. Możesz założyć, że twój program nie przepełni stosu, jeśli twój język nie ma rekurencji ogona. (Pamiętaj, że nie musisz go implementować rekurencyjnie, o ile prawdopodobieństwa są takie same).
Wdrożenie referencyjne (Groovy)
int alexAdd(int a, int b) {
int i = new Random().nextInt(11);
if(i == 1) {
return alexAdd(a,b+1);
} else {
return a + b;
}
}
Tabela liderów
var QUESTION_ID=66522,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<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="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><div id="language-list"> <h2>Winners 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><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>
code-golf
arithmetic
random
recursion
spaghetto
źródło
źródło
Odpowiedzi:
Pyth, 8
Wypróbuj online
Używa drugiego trybu Pyth'a przy zmniejszaniu, który szuka powtarzanych danych wejściowych, a następnie kończy działanie.
Wyjaśnienie
Jeśli pojawi się dodatkowy alex-add, uruchomi się ponownie, ale jeśli nie, to zakończy działanie.
źródło
Python 2, 55 bajtów
Jest to absolutnie dziwny sposób na zrobienie tego.
Funkcja
random
podaje liczbę zmiennoprzecinkową w [0,1), a jej reprezentacja ciągu domyślnie ma 16 cyfr po przecinku, łącznie 18 znaków. Ponieważ jednak końcowe 0 są pomijane, może być krótszy. Odczytując cyfry od końca, każda z nich ma 1/10 szansy na 0, i zatrzymujemy się, gdy trafimy na niezerową cyfrę. Tak więc liczba zer zerowych jest rozkładana tak samo, jak liczba rekurencji Alexa, dzięki czemu możemy próbkować z tego rozkładu o 18 minus długość łańcucha.W rzeczywistości Python wyświetla więcej niż 18 cyfr dla małych liczb, czasem nawet notację naukową, więc dodajemy 1, aby to naprawić.
To nigdy nie da więcej niż 15 więcej niż suma, ale to jest OK, ponieważ 10 ^ 15 to znacznie mniej niż szansa, że promień kosmiczny zakłóci obliczenia .
źródło
R,
604728 bajtówJest to nienazwany obiekt funkcji, który akceptuje dwie liczby i zwraca liczbę. Nie używa rekurencji.
Jak zauważył xnor w komentarzu, problem ten można postrzegać jako zwykłe dodanie dwóch liczb plus geometrycznej zmiennej losowej z prawdopodobieństwem awarii 1/10.
Dlaczego to prawda? Pomyśl o tym w kategoriach rekurencji, jak opisano w poście. W każdej iteracji mamy 10% szansy na dodanie 1 i powtórzenia oraz 90% szansy na wyjście z funkcji bez dalszego dodawania. Każda iteracja jest własną niezależną próbą Bernoulliego z wynikami „dodaj 1, recurse” (porażka) i „wyjdź” (sukces). Zatem prawdopodobieństwo niepowodzenia wynosi 1/10, a prawdopodobieństwo sukcesu wynosi 9/10.
W przypadku szeregu niezależnych prób Bernoulliego liczba prób potrzebnych do uzyskania pojedynczego sukcesu zależy od rozkładu geometrycznego . W naszym przypadku każda rekurencja oznacza dodanie 1, więc kiedy w końcu wyjdziemy z funkcji, zasadniczo policzyliśmy liczbę awarii, które wystąpiły przed pierwszym sukcesem. Oznacza to, że kwota, o którą zostanie wyłączony wynik, jest losowa i różni się od rozkładu geometrycznego.
Tutaj możemy skorzystać z obszernego pakietu wbudowanych funkcji rozkładu prawdopodobieństwa R i ich zastosowania
rgeom
, które zwracają losową wartość z rozkładu geometrycznego.Nie golfowany:
źródło
Minkolang 0,14 ,
191112 bajtówTo jest wersja „funkcyjna”; zakłada
a
ib
jest już na stosie, wysuwa je i wypycha zmodyfikowaną wersjęa+b
. Najbliższym odpowiednikiem funkcji w Minkolang jest użycieF
, który pojawia sięb
,a
i skacze do(a,b)
w codebox. Następnie, gdy licznik programu uderzy wf
, przeskakuje z powrotem do miejsca, w którymF
został użyty.To jest pełna wersja programu, 15 bajtów . (
nn
pobiera dwie liczby z wejścia iN.
wysyła wynik i zatrzymuje się).Ukradłem algorytm z odpowiedzi Doorknob ; pętla while powtarza się, o ile wygenerowana liczba losowa jest mniejsza niż 0,1, dodając 1 za każdym razem. Wypróbuj tutaj (pełna wersja programu) i uruchom tutaj 100 razy .
Wyjaśnienie
Najmądrzejszą częścią tutaj jest
d
. Górna część stosu w tym momencie będzie wynosić 0 lub 1. Jeśli jest to 0, pętla while kończy działanie. W przeciwnym razie trwa. Gdy duplikuję górę stosu, będzie to[a+b,1]
drugi raz w pętli, więc+
na początku dodaje 1 (i podobnie w przypadku kolejnych podróży).źródło
f
na końcu liczbę znaków (i technicznie poprzedni nowy wiersz, jeśli czujesz się wyjątkowo pedantyczny, ale nie sądzę, że jest to konieczne).CJam,
1211 bajtówDzięki @ MartinBütter za uratowanie bajtu dzięki tej super sprytnej sztuczce!
Stara odpowiedź:
Wypróbuj online .
Wyjaśnienie:
Podstawowym algorytmem jest „while (szansa 0,1), zwiększanie liczby”, co eliminuje potrzebę rekurencji.
źródło
JavaScript ES6, 38 bajtów
źródło
f=(a,b)=>new Date%10<1?f(a,b+1):a+b
dla 35 bajtówDate
znacznika czasu nie będzie dokładne, ponieważ jeśli to ocenitrue
, będzie dodawać1
przez resztę milisekundy.f=(a,b)=>a+b-~~Math.log10(Math.random())
ale jest on o 2 bajty dłuższy.MATL ,
141312 bajtówTo tylko metoda pętli, dodaj dane wejściowe (wprowadzone jako
[a b]
), a następnie dodawaj jedną, podczas gdy jednolita liczba losowa między 0 a 1 jest mniejsza niż 0,1. Pełny opis poniżej:Wziął 1 bajt, zmieniając specyfikację wejścia (z
ii+
nais
).Stary sposób polegał na pobraniu logarytmu dziesiętnego liczby losowej z przedziału od 0 do 1, aby obliczyć sumę do dodania
a+b
, jednak działałoby to tylko do 15 powtórzeń z powodu dokładności zmiennoprzecinkowej.W tym kodzie
10,2$YlZo-
logarytm dziesiętny liczby losowej jest zaokrąglany w górę do najbliższej liczby całkowitej.źródło
ii+`10Yr1=tb+w]
jeszcze nie golfowa.Binarnie kodowane Golfical ,
3229 + 1 (-x
Flag) = 30 bajtówHexdump (ręcznie edytowany, aby poprawić błąd w części obrazu do binarnego transpilera, który został naprawiony):
To kodowanie można przekonwertować z powrotem do oryginalnej reprezentacji graficznej za pomocą dołączonego narzędzia Encoder lub uruchomić bezpośrednio przy użyciu
-x
flagi.Oryginalny obraz:
Powiększony 50x:
Objaśnienie: Górny rząd jest blokiem głównym. Odczytuje liczbę, kopiuje ją w prawo, czyta inną liczbę, dodaje je, kopiuje wynik w prawo, robi pewne rzeczy RNG i, z prawdopodobieństwem 90%, drukuje wynik dodania. Przez resztę czasu jest wysyłany do dolnego rzędu, gdzie umieszcza jeden w pierwszej komórce i wraca do głównego rzędu tuż przed instrukcją dodawania (używając skrętu na północ, a następnie na wschód).
źródło
Python,
66656463 bajtyWypróbuj online
Dzięki Sherlock9 za poprawki i zapisany bajt.
Dzięki Mathias Ettinger za kolejny bajt.
Dzięki mbomb007 za bajt.
źródło
.9>random()
nie jest całkiem 9 na 10, z powodu nierównomiernego rozmieszczenia pływakówJulia, 30 bajtów
Jest to funkcja rekurencyjna,
f
która akceptuje dwie liczby i zwraca liczbę tego samego typu. Powinien działać dobrze dla każdego typu liczbowego.Najpierw sprawdzamy, czy losowa liczba zmiennoprzecinkowa między 0 a 1 jest większa niż 0,9. Jeśli tak, powracamy z odrobiną czegoś, w przeciwnym razie po prostu dodajemy.
źródło
TI-BASIC, 15 bajtów
Pobiera dane wejściowe jako listę dwuelementową z
Ans
. Chociaż liczba losowa jest mniejsza niż0.1
, powoduje dodanie wektoryzacji do0.5
listy. Zwiększenie każdego elementu przez0.5
zwiększenie sumy o 1. Uważam, że jest to najkrótsze rozwiązanie TI-BASIC.Program 9-bajtowy
sum(Ans)-int(log(10rand
nie działa, ponieważrand
ma tylko 14 cyfr precyzji, a zatem nie może dać liczby mniejszej niż 10 -14 .źródło
APL, 17 bajtów
Jest to nienazwana funkcja dyadyczna.
Nie golfowany:
źródło
Pyth,
1412 bajtówMój pierwszy prawdziwy golf Pyth!
Pobiera dane wejściowe STDIN w formacie
a,b
.Wyjaśnienie:
Dzięki @FryAmTheEggman za golenie dwóch znaków, dając mi krótszy sposób na zwiększenie zmiennej!
źródło
Vitsy ,
1210 bajtówWypróbuj online!
Zauważ, że ma to niewielką szansę na błąd przepełnienia stosu. Mówimy o
(.1)^400
szansie. Wychodzi także z powodu błędu spowodowanego przez to, że spowodowałem rekurencję.źródło
Lisp, 58 bajtów
Mój pierwszy raz pisząc Lisp!
Możesz użyć tego specjalnego dodatku dokładnie tak, jak zwykle dodajesz w Lisp:
Bardzo chciałbym usłyszeć sugestie, ponieważ jestem zupełnie nowy w tym języku.
źródło
(- a(- -1 b))
zadziała? Oszczędza 2 bajty, jeśli tak jest.Poważnie, 10 bajtów
Ten program generuje zmienną losową z rozkładu geometrycznego, przekształcając rozkład równomierny. Pobiera dane wejściowe jako listę:
[2,3]
(nawiasy klamrowe opcjonalne). Wypróbuj online .Wyjaśnienie:
Biorąc pod uwagę zmienną losową
X ~ Uniform(0, 1)
, można ją przekształcić w zmienną losowąY ~ Geometric(p)
za pomocą formułyY = floor(log(X)/log(p))
.źródło
Mathematica, 32 bajty
Wyjaśnienie:
Pamiętaj, że ta funkcja działa dla dowolnej liczby wejść.
źródło
TeaScript , 18 bajtów
21To jest funkcja TeaScript. Przypisz ją do zmiennej lub po prostu uruchom bezpośrednio.
Wypróbuj online
źródło
Cukierki , 11 bajtów
Długa forma to:
źródło
C,
71513937 bajtówPierwszy golf w golfa, zrobiony w C ... Nie sądzę, że to coś pokona i może być często golfem
EDYCJA 3: obcięto 2 bajty dzięki @Mego, pisząc .1 zamiast 0.1 i przepisując operator trójskładnikowy
EDYCJA 2: obcięto 12 bajtów, po gnu99, każda zmienna jest liczbą całkowitą, jeśli nie podano inaczej. To samo dotyczy zwracanego typu funkcji
EDYCJA: obcięto 20 bajtów, zapomniałem, że podstawowe .h nie są konieczne w C99 (na przykład używając gcc). To wygeneruje ostrzeżenie :)
71 bajtów rozwiązanie:
Jeśli chcesz zobaczyć wiele wyników, możesz użyć następującego kodu
źródło
MATL , 12
1314bajtówDane wejściowe mają postać
[3 4]
, czyli wektor wiersza z dwiema liczbami.Przykład
Wyjaśnienie
To generuje geometryczną zmienną losową bez pętli, poprzez bezpośrednie zastosowanie transformacji do jednolitej zmiennej losowej. Zauważ, że log 0,1 a jest używany zamiast log a / log 0.1, aby zapisać 1 bajt.
źródło
Microscript ,
2921 bajtówPróbowałem udzielić odpowiedzi Microscript II, ale z jakiegoś powodu nie udało mi się poprawnie uruchomić pętli dodawania :(
źródło
Mysz-2002 ,
413938 bajtówBrak rekurencji.
Wyjaśniono:
Lub, jeśli jesteś fanem programowania funkcyjnego, a rekurencja jest twoją ofertą, to 57 bajtów :
Wyjaśniono:
źródło
Galaretka , 7 bajtów (niekonkurencyjna)
Wypróbuj online!
Jak to działa
źródło
APL (Dyalog Unicode) ,
1312 bajtów SBCSZasadniczo to samo co rozwiązanie Pyth FryAmTheEggman . -1 dzięki Erikowi Outgolfer.
Anonimowa funkcja ukrytej poprawki.
Wypróbuj online!
+
dodaj argumenty{
…}⍣=
Zastosuj następującą funkcję, aż dwie kolejne aplikacje będą miały taki sam wynik:?10
losowa liczba całkowita z zakresu 1–101=
czy jeden jest równy? (czyli 1 / 10 th szansa)⍵+
dodaj do tego argumentźródło
/
.Perl 6 , 26 bajtów
W rzeczywistości robi to rekurencyjnie:
Utwórz możliwie pustą sekwencję
1
s, po której następują argumenty, a następnie zsumuj je wszystkie razem.(w rzeczywistości może przyjąć dowolną liczbę argumentów)
stosowanie:
źródło
Pyth, 11 bajtów
Bezpośredni port Pyth mojej odpowiedzi w Pythonie .
źródło
Oktawa, 20 bajtów
Suma danych wejściowych plus losowa próbka z rozkładu geometrycznego z parametrem
0.9
.źródło
Poważnie, 13 bajtów
Stosuje strategię podobną do odpowiedzi CJam Doorknob (liczba przyrostu, gdy liczba zmiennoprzecinkowa jest mniejsza niż 0,1), z tym wyjątkiem, że używa liczb całkowitych i przyrostów, gdy liczba całkowita
[0,9]
jest mniejsza niż 1. Brak łatwej rekurencji boli.Wypróbuj online (wymaga ręcznego wprowadzenia)
Wyjaśnienie:
Pętla while pozostawia stos w następujący sposób:
Przesunięcie w
n
górę o 1 jest konieczne, aby uruchomić pętlę while, ponieważ0
jest to falsey. Łatwo sobie z tym poradzić, zmniejszając sięn
po pętli while, więc końcowy wynik jesta + b + (n - 1)
.źródło
MATLAB, 51 bajtów
Wynik znajduje się w zmiennej automatycznej „ans”
źródło