Dodatek w stylu Alexa

57

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;
  }
}

Wypróbuj to skrzypce online.

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>

spaghetto
źródło
6
Daje to sumę dwóch liczb plus geometryczną zmienną losową z prawdopodobieństwem uszkodzenia 1/10?
xnor
@ xnor Zasadniczo tak. Zdefiniowałem to rekurencyjnie, aby było łatwiejsze do zrozumienia, ale nie trzeba tego robić rekurencyjnie (na przykład rozwiązanie CJam nie ma)
spaghetto
10
Dlaczego piaskownica była używana przez 20 minut? Wydaje się, że nie ma sensu piaskownicy.
Peter Taylor,
3
@PeterTaylor Jedyny drobny problem został rozwiązany prawie natychmiast, a pytanie było tak proste, że nie sądziłem, że trzeba tak długo pozostawać w piaskownicy (obejrzało go już 10 osób, które moim zdaniem były wystarczające recenzja dla takiego prostego wyzwania). Głównym powodem, dla którego miałem to w piaskownicy, było sprawdzenie, czy ludzie myślą, że to zbyt proste.
spaghetto
2
Powiedziałbym, że nadal ma poważny problem, ponieważ nie jest jasne, czy nalegasz, aby implementacje były pisane jako funkcje rekurencyjne, czy tylko po to, aby zapewnić właściwą dystrybucję, ale jest o wiele za późno, aby cokolwiek wyjaśnić.
Peter Taylor

Odpowiedzi:

40

Pyth, 8

u+G!OTsQ

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

u+G!OTsQ  ##  Implicit: Q=eval(input())
u     sQ  ##  reduce with 2 arguments, which causes a loop until the reduce gets the
          ##  same argument twice
 +G       ##  lambda G,H: G + ...
   !OT    ##  boolean not of random value from 0 to 9 inclusive

Jeśli pojawi się dodatkowy alex-add, uruchomi się ponownie, ale jeśli nie, to zakończy działanie.

FryAmTheEggman
źródło
13
To ... to czysta czarna magia. O_o
Klamka
1
To jest niedorzeczne.
kot
36

Python 2, 55 bajtów

from random import*
lambda a,b:a+b+18-len(`1+random()`)

Jest to absolutnie dziwny sposób na zrobienie tego.

Funkcja randompodaje 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 .

xnor
źródło
1
Przepraszamy, ta odpowiedź jest nieprawidłowa, ponieważ ma 10–15 szans na nieprawidłowe funkcjonowanie , co jest wyraźnie zabronione przez powiązany meta post.
pppery
22

R, 60 47 28 bajtów

function(a,b)a+b+rgeom(1,.9)

Jest 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:

f <- function(a, b) {
    a + b + rgeom(n = 1, prob = 0.9)
}
Alex A.
źródło
13

Minkolang 0,14 , 19 11 12 bajtów

To jest wersja „funkcyjna”; zakłada ai bjest już na stosie, wysuwa je i wypycha zmodyfikowaną wersję a+b. Najbliższym odpowiednikiem funkcji w Minkolang jest użycie F, który pojawia się b, ai skacze do (a,b)w codebox. Następnie, gdy licznik programu uderzy w f, przeskakuje z powrotem do miejsca, w którym Fzostał użyty.

(+$01$h`d)xf

To jest pełna wersja programu, 15 bajtów . ( nnpobiera dwie liczby z wejścia i N.wysyła wynik i zatrzymuje się).

nn(+$01$h`d)xN.

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

(              Open a while loop
 +             Adds the top two items of the stack
  $0           Pushes 0.1
    1$h        Pushes a random number between 0.0 and 1.0, inclusive
       `       Pops b,a and pushes a > b
        d      Duplicate the top of stack
         )     Close the while loop when the top of stack is 0
          x    Dump the extra, leading 0

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).

El'endia Starman
źródło
Czy to naprawdę funkcja? Szybko przejrzałem dokumentację językową i nie znalazłem niczego, co opisywałoby definicje funkcji. Na podstawie wyjaśnienia wygląda bardziej jak fragment kodu.
Reto Koradi
@RetoKoradi: Mogę umieścić taki „fragment kodu” we własnej linii, przeskoczyć do niego z 0kF (gdzie k to pewna liczba) i wskoczyć z powrotem na końcu f. To najbliżej funkcji w Minkolang.
El'endia Starman,
2
Czy to nie jest technicznie podobne do powiedzenia „mój fragment kodu CJam jest funkcją; wystarczy go otoczyć nawiasami klamrowymi”? Przynajmniej powinieneś prawdopodobnie umieścić fna 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).
Klamka
1
Jeśli język nie ma funkcji, zawsze możesz opublikować pełne programy. Rozumiem, że kiedy mówi „funkcja”, musi to być funkcja nazwana lub funkcja anonimowa (zazwyczaj jest to wyrażenie, które można przypisać do zmiennej funkcji). Kiedyś opublikowałem coś podobnego do tego w CJam, a Martin szybko mnie do tego wezwał, mówiąc, że to fragment kodu, a nie funkcja.
Reto Koradi,
@RetoKoradi: W porządku, to zrozumiałe. Co sądzisz o sugestii Doorknob?
El'endia Starman
12

CJam, 12 11 bajtów

{{+Amr!}h;}

Dzięki @ MartinBütter za uratowanie bajtu dzięki tej super sprytnej sztuczce!

{         }
 {     }h    Do-while that leaves the condition on the stack.
  +          Add: this will add the numbers on the first iteration...
   Amr!      ... but a `1` (i.e. increment) on future ones.
         ;   Pop the remaining 0.

Stara odpowiedź:

{+({)Amr!}g}

Wypróbuj online .

Wyjaśnienie:

{          }  A "function."
 +            Add the input numbers.
  (           Decrement.
   {     }g   A while loop.
    )         Increment.
     Amr      Random number [0,9).
        !     Boolean NOT.

Podstawowym algorytmem jest „while (szansa 0,1), zwiększanie liczby”, co eliminuje potrzebę rekurencji.

Klamka
źródło
8

JavaScript ES6, 38 bajtów

f=(a,b)=>Math.random()<.1?f(a,b+1):a+b
SuperJedi224
źródło
f=(a,b)=>new Date%10<1?f(a,b+1):a+bdla 35 bajtów
WallyWest
2
@WallyWest Niestety prawdopodobieństwo użycia Dateznacznika czasu nie będzie dokładne, ponieważ jeśli to oceni true, będzie dodawać 1przez resztę milisekundy.
user81655,
Próbowałem rozkładu geometrycznego, f=(a,b)=>a+b-~~Math.log10(Math.random())ale jest on o 2 bajty dłuższy.
Neil,
8

MATL , 14 13 12 bajtów

is`r.1<tb+w]

To 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:

i         % input [a b]
s         % sum a and b
`         % do...while loop                                      
  r       % get a uniformly distributed pseudorandom numbers between 0 and 1       
  .1      % push 0.1 onto the stack                                   
  <       % is the random number less than 0.1?
  t       % duplicate the T/F values                                        
  b       % bubble a+b to the top of the stack                       
  +       % add the T/F to a+b     
  w       % swap elements in stack to get the other T/F back to exit/continue the loop                           
]         % end    

Wziął 1 bajt, zmieniając specyfikację wejścia (z ii+na is).


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.

iir10,2$YlZo-+

W tym kodzie 10,2$YlZo-logarytm dziesiętny liczby losowej jest zaokrąglany w górę do najbliższej liczby całkowitej.

David
źródło
Uczciwy komentarz, chociaż chciałbym zobaczyć, jak generujesz 15 przy użyciu dowolnego innego przedstawionego rozwiązania: P Innym sposobem, dla 15 bajtów, jest prosta wersja z zapętleniem: ii+`10Yr1=tb+w]jeszcze nie golfowa.
David
Właściwie mogę skrócić pętlę! Dzięki @ThomasKwa!
David
Bardzo ładnie wykonane!
Luis Mendo,
7

Binarnie kodowane Golfical , 32 29 + 1 ( -xFlag) = 30 bajtów

Hexdump (ręcznie edytowany, aby poprawić błąd w części obrazu do binarnego transpilera, który został naprawiony):

00 B0 02 15 14 0C 01 14 15 14 1B 1E 3A 14 0C 01
14 00 0A 14 38 00 01 23 1D 4C 14 17 14

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 -xflagi.

Oryginalny obraz: wprowadź opis zdjęcia tutaj

Powiększony 50x:

wprowadź opis zdjęcia tutaj

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).

SuperJedi224
źródło
2
Czy możesz dodać wyjaśnienie? To jest super fajne.
kot
7

Python, 66 65 64 63 bajty

from random import*
g=lambda*s:randint(0,9)and sum(s)or g(1,*s)

Wypróbuj online

Dzięki Sherlock9 za poprawki i zapisany bajt.

Dzięki Mathias Ettinger za kolejny bajt.

Dzięki mbomb007 za bajt.

Mego
źródło
62?
Tylko ASCII,
@ Tylko ASCII Używanie .9>random()nie jest całkiem 9 na 10, z powodu nierównomiernego rozmieszczenia pływaków
Mego
6

Julia, 30 bajtów

f(a,b)=rand()>0.9?f(a,b+1):a+b

Jest to funkcja rekurencyjna, fktó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.

Alex A.
źródło
6

TI-BASIC, 15 bajtów

While rand<.1
Ans+.5
End
sum(Ans

Pobiera dane wejściowe jako listę dwuelementową z Ans. Chociaż liczba losowa jest mniejsza niż 0.1, powoduje dodanie wektoryzacji do 0.5listy. Zwiększenie każdego elementu przez 0.5zwiększenie sumy o 1. Uważam, że jest to najkrótsze rozwiązanie TI-BASIC.

Program 9-bajtowy sum(Ans)-int(log(10randnie działa, ponieważ randma tylko 14 cyfr precyzji, a zatem nie może dać liczby mniejszej niż 10 -14 .

lirtosiast
źródło
1
Warto zauważyć, że aby dodać 14, musisz również obserwować latające świnie i piekło zamarzające. A zanim dodasz 14, zrobię coś ze swoim życiem.
Nic Hartley,
5

APL, 17 bajtów

{1=?10:⍺∇⍵+1⋄⍺+⍵}

Jest to nienazwana funkcja dyadyczna.

Nie golfowany:

{1=?10:            ⍝ If a random number between 1 and 10 is 1,
       ⍺∇⍵+1       ⍝ Recurse on the inputs with one incremented
            ⋄⍺+⍵}  ⍝ Otherwise return the sum of the inputs
Alex A.
źródło
5

Pyth, 14 12 bajtów

KsQW!OT=hK;K

Mój pierwszy prawdziwy golf Pyth!

Pobiera dane wejściowe STDIN w formacie a,b.

Wyjaśnienie:

KsQ       read STDIN, assign sum to variable K
W         while...
  !OT       not rand(10)
  =hK;      increment K
K         implicit-output of K

Dzięki @FryAmTheEggman za golenie dwóch znaków, dając mi krótszy sposób na zwiększenie zmiennej!

Klamka
źródło
5

Vitsy , 12 10 bajtów

aR)[1+0m]+
aR          Get a random number in [0,10)
  )[    ]   If its truncated int is 0, do the stuff in brackets.
    1+0m    Add 1 to one of the items and execute the 0th index of code.
         +  Add the numbers together.

Wypróbuj online!

Zauważ, że ma to niewielką szansę na błąd przepełnienia stosu. Mówimy o (.1)^400szansie. Wychodzi także z powodu błędu spowodowanego przez to, że spowodowałem rekurencję.

Addison Crump
źródło
4

Lisp, 58 bajtów

Mój pierwszy raz pisząc Lisp!

(defun +(a b)(if(<(random 10)9)(- a(- b))(- a(-(+ b 1)))))

Możesz użyć tego specjalnego dodatku dokładnie tak, jak zwykle dodajesz w Lisp:

> (+ 1 3)
4
> (+ 1 3)
5

Bardzo chciałbym usłyszeć sugestie, ponieważ jestem zupełnie nowy w tym języku.

sudo rm -rf slash
źródło
Czy (- a(- -1 b))zadziała? Oszczędza 2 bajty, jeśli tak jest.
Neil,
@Neil, nie sądzę, że to działa, ponieważ funkcja powinna być rekurencyjna
sudo rm -rf slash
Dziękujemy za wyjaśnienie, dlaczego wyrażenie wygląda tak nieporęcznie.
Neil,
4

Poważnie, 10 bajtów

,Σ1±╤_G_\+

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:

,Σ1±╤_G_\+
,Σ          get sum of input
  1±╤_      push ln(0.1)
      G_    push ln(random(0,1))
        \   floored division
         +  add

Biorąc pod uwagę zmienną losową X ~ Uniform(0, 1), można ją przekształcić w zmienną losową Y ~ Geometric(p)za pomocą formuły Y = floor(log(X)/log(p)).

Mego
źródło
3

Mathematica, 32 bajty

If[RandomReal[]<.1,+##,#0@##+1]&

Wyjaśnienie:

                               &   A function returning
If[                           ]     if
   RandomReal[]                       a random number in [0,1)
               <                     is less than
                .1                    .1
                  ,                 , then
                   +                 the sum of
                    ##                all arguments
                      ,             , otherwise,
                       #0@            this function applied to
                          ##           all arguments
                            +        plus
                             1        one.

Pamiętaj, że ta funkcja działa dla dowolnej liczby wejść.

LegionMammal978
źródło
3

TeaScript , 18 bajtów 21

#$r<.1?f(l,i¬):l+i

To jest funkcja TeaScript. Przypisz ją do zmiennej lub po prostu uruchom bezpośrednio.

Wypróbuj online

Downgoat
źródło
3

Cukierki , 11 bajtów

+#10H{.}10g

Długa forma to:

add          # add two numbers on the stack
number digit1 digit0 rand  # random int from 0 to 9         
if           # if non-zero
  retSub     # terminate loop
endif
digit1       # push 1 to stack
digit0 goto  # loop to start
Dale Johnson
źródło
3

C, 71 51 39 37 bajtów

Pierwszy 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

a(x,y){return(rand()<.1?a(1,y):y)+x;}

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

a(x,y){return rand()<0.1?a(x,y+1):x+y;}

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 :)

int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

71 bajtów rozwiązanie:

#include <stdlib.h>
int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

Jeśli chcesz zobaczyć wiele wyników, możesz użyć następującego kodu

#include <stdio.h> 
#include <stdlib.h>
int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

int main(void) 
{
    int i,j;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            printf("%d + %d = %d\n",i,j,a(i,j));
    return 0;
}
Katenkyo
źródło
3

MATL , 12 13 14 bajtów

r.1H$YlY[ihs

Dane wejściowe mają postać [3 4], czyli wektor wiersza z dwiema liczbami.

Przykład

>> matl r.1H$YlY[ihs
> [3 4]
7

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        % random number with uniform distribution in (0,1)
.1       % number 0.1
H$       % specify two inputs for next function
Yl       % logarithm in specified base (0.1)
Y[       % floor. This produces the geometric random variable with parameter 0.1
i        % input vector of two numbers
h        % concatenate horizontally with the previously generated random value
s        % sum of vector elements
Luis Mendo
źródło
3

Microscript , 29 21 bajtów

isi+vzr10!{l1vzr10!}l

Próbowałem udzielić odpowiedzi Microscript II, ale z jakiegoś powodu nie udało mi się poprawnie uruchomić pętli dodawania :(

SuperJedi224
źródło
3

Mysz-2002 , 41 39 38 bajtów

Brak rekurencji.

&TIME &SEED ??&RAND k*&INT 9=[+1+!|+!]

Wyjaśniono:

&TIME &SEED               ~ painfully obvious

? ?                       ~ get some input
&RAND 10 * &INT 8 >       ~ get a random number 0-1 * 10, make it an int & check if >8
[                         ~ if true
  + 1 + !                 ~ add the input then add 1 and print
|                         ~ else
  + !                     ~ add and print
]                         ~ endif
$                         ~ (implicit) end of program

Lub, jeśli jesteś fanem programowania funkcyjnego, a rekurencja jest twoją ofertą, to 57 bajtów :

&TIME &SEED #A,?,?;!$A&RAND k*&INT 9=[#A,1%,2%1+;|1%2%+]@

Wyjaśniono:

&TIME &SEED            ~ painfully obvious

#A, ?, ?; !            ~ call with input & print

$A                     ~ begin a definition of a function A

  &RAND 10 * &INT 8 >  ~ same as above
  [
    #A, 1%, 2% 1 +;    ~ call with args and add 1
  |
    1% 2% +            ~ else just add
  ]
@                      ~ end func
$                      ~ as above
kot
źródło
3

Galaretka , 7 bajtów (niekonkurencyjna)

‘⁵XỊ¤¿+

Wypróbuj online!

Jak to działa

‘⁵XỊ¤¿+  Main link. Arguments: n, m (integers)

    ¤    Combine the three atoms to the left into a niladic chain.
 ⁵       Yield 10.
  X      Pseudo-randomly generate a positive integer not greater than 10.
   Ị     Insignificant; test if the generated integer is 1 (or less).
     ¿   While chain yields 1:
‘          Increment n.
      +  Add m to the result.
Dennis
źródło
3

APL (Dyalog Unicode) , 13 12 bajtów SBCS

Zasadniczo to samo co rozwiązanie Pyth FryAmTheEggman . -1 dzięki Erikowi Outgolfer.

Anonimowa funkcja ukrytej poprawki.

{⍵+1=?10}⍣=+

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–10

1= czy jeden jest równy? (czyli 1 / 10 th szansa)

⍵+ dodaj do tego argument

Adám
źródło
Możesz wziąć dwie liczby całkowite jako dwa argumenty i usunąć /.
Erik the Outgolfer,
@EriktheOutgolfer Tak.
Adám
2

Perl 6 , 26 bajtów

W rzeczywistości robi to rekurencyjnie:

sub f{.1>rand??f |@_,1!![+] @_} # 31 bytes

Utwórz możliwie pustą sekwencję 1s, po której następują argumenty, a następnie zsumuj je wszystkie razem.

{[+] {1}...^{rand>.1},|@_} # 26 bytes

(w rzeczywistości może przyjąć dowolną liczbę argumentów)

stosowanie:

# give the lambda a name
my &f = {...}

say f 1,2; # one of 3,4,5 ... *
Brad Gilbert b2gills
źródło
23 bajty
bb94
2

Pyth, 11 bajtów

+sQ-18l`hO0

Bezpośredni port Pyth mojej odpowiedzi w Pythonie .

+             Add up
 sQ            the sum of the input and
   -           the difference of
    18          18 and
      l`         the string length of
        hO0       one plus a random number in [0,1)
xnor
źródło
2

Oktawa, 20 bajtów

@(a,b)a+b+geornd(.9)

Suma danych wejściowych plus losowa próbka z rozkładu geometrycznego z parametrem 0.9.

alephalpha
źródło
2

Poważnie, 13 bajtów

,,1W+9uJYWDkΣ

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:

,,1W+9uJYWDkΣ
,,1            get input, push 1
   W     W     while loop:
    +            add top two elements
     9uJ         push a random integer in [0, 9]
        Y        push 1 if random value is falsey (0) else 0
          DkΣ  decrement top value and add everything together

Pętla while pozostawia stos w następujący sposób:

n: the # of times the random value was < 0.1, plus 1
b: the second input
a: the first input

Przesunięcie w ngórę o 1 jest konieczne, aby uruchomić pętlę while, ponieważ 0jest to falsey. Łatwo sobie z tym poradzić, zmniejszając się npo pętli while, więc końcowy wynik jest a + b + (n - 1).

Mego
źródło
2

MATLAB, 51 bajtów

function f(a,b)
if rand > .1;a+b;else;f(a,b+1);end

Wynik znajduje się w zmiennej automatycznej „ans”

costrom
źródło