Inspirados no glorioso aprendizado de Alex para você, para o bem, vamos recriar humildemente o "único programa de verdade R" de Alex - mas com uma reviravolta.
A adição no estilo Alex funciona assim - tem 90% de chance de retornar a soma dos dois números fornecidos e 10% de chance de recursivamente Alex adicionar o primeiro número e o segundo número + 1. Isso significa que, potencialmente , uma adição pode ser desativada em 1 ou mais.
Desafio
Escreva um programa ou função completo que use dois números inteiros e Alex os adicione conforme definido. Você pode presumir que o seu programa não excederá a pilha se o seu idioma não tiver recursão de cauda. (Observe que você não precisa implementá-lo recursivamente, desde que as probabilidades sejam as mesmas.)
Implementação de referência (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;
}
}
Experimente este violino online.
Entre os melhores
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>
fonte
Respostas:
Pitão, 8
Experimente online
Isso usa o segundo modo de Pyth em reduzir, que procura por entradas repetidas e sai.
Explicação
Se o alex-add extra ocorrer, ele será executado novamente, mas, se não, será encerrado.
fonte
Python 2, 55 bytes
Esta é uma maneira absolutamente bizarra de fazer isso.
A função
random
fornece um ponto flutuante em [0,1) e sua representação de cadeia por padrão possui 16 dígitos após o ponto decimal, com um total de 18 caracteres. Mas, como os zeros à direita são omitidos, pode ser mais curto. Lendo dígitos do final, cada um tem uma chance de 1/10 de ser 0, e paramos quando atingimos um dígito diferente de zero. Portanto, o número de zeros à direita é distribuído exatamente como o número de recursões que Alex faz, para que possamos amostrar nessa distribuição em 18 menos o comprimento da string.Na verdade, o Python exibirá mais de 18 dígitos para números pequenos, às vezes até notação científica, então adicionamos 1 para corrigir isso.
Isso nunca dará mais que 15 a mais do que a soma, mas tudo bem, porque 10 ^ 15 é muito menor que a chance de um raio cósmico interromper a computação .
fonte
R,
604728 bytesEste é um objeto de função sem nome que aceita dois números e retorna um número. Não usa recursão.
Como o xnor apontou em um comentário, esse problema pode ser visto como simplesmente adicionando dois números mais uma variável aleatória geométrica com probabilidade de falha 1/10.
Por que isso é verdade? Pense nisso em termos de recursão, conforme descrito no post. Em cada iteração, temos 10% de chance de adicionar 1 e recorrente e 90% de sair da função sem adição adicional. Cada iteração é seu próprio teste independente de Bernoulli, com os resultados "adicione 1, recorra" (falha) e "saia" (êxito). Assim, a probabilidade de falha é 1/10 e a probabilidade de sucesso é 9/10.
Ao lidar com uma série de ensaios independentes de Bernoulli, o número de ensaios necessários para obter um único sucesso segue uma distribuição geométrica . No nosso caso, cada recursão significa adicionar 1; portanto, quando finalmente saímos da função, contamos essencialmente o número de falhas que ocorreram antes do primeiro sucesso. Isso significa que a quantidade pela qual o resultado será calculado é uma variável aleatória de uma distribuição geométrica.
Aqui, podemos tirar proveito do amplo conjunto de R de embutidos e uso de distribuição de probabilidade
rgeom
, que retorna um valor aleatório de uma distribuição geométrica.Ungolfed:
fonte
Minkolang 0.14 ,
191112 bytesEsta é a versão "function"; assume
a
eb
já está na pilha, abre e empurra a versão modificada dea+b
. O mais próximo equivalente a funções em Minkolang é usarF
, que aparece forab
,a
e salta para(a,b)
no codebox. Então, quando o contador de programa atinge umf
, ele volta para ondeF
foi usado.Esta é a versão completa do programa, 15 bytes . (
nn
pega dois números da entrada eN.
gera o resultado e para.)Eu roubei o algoritmo da resposta da maçaneta da porta ; o loop while se repete desde que o número aleatório gerado seja menor que 0,1, adicionando 1 a cada vez. Experimente aqui (versão completa do programa) e execute-o 100 vezes aqui .
Explicação
A parte mais inteligente aqui é
d
. A parte superior da pilha nesse momento será 0 ou 1. Se for 0, o loop while será encerrado. Caso contrário, continua. Como eu duplico o topo da pilha, será[a+b,1]
a segunda vez no loop, então+
o começo adiciona o 1 (e da mesma forma para as viagens subseqüentes).fonte
f
no final da contagem de caracteres (e tecnicamente a nova linha anterior, se estiver se sentindo extremamente pedante, mas acho que não é necessário).CJam,
1211 bytesAgradecemos a @ MartinBütter por salvar um byte com este truque super inteligente!
Resposta antiga:
Experimente online .
Explicação:
O algoritmo básico é "while (0.1 chance), incrementa o número", o que elimina a necessidade de recursão.
fonte
Javascript ES6, 38 bytes
fonte
f=(a,b)=>new Date%10<1?f(a,b+1):a+b
para 35 bytesDate
carimbo de data e hora não será precisa, porque, se avaliartrue
, continuará adicionando1
o restante do milissegundo.f=(a,b)=>a+b-~~Math.log10(Math.random())
mas é 2 bytes mais.MATL ,
141312 bytesEste é apenas o método do loop, adicione as entradas (inseridas como
[a b]
) e continue adicionando uma enquanto um número aleatório uniforme entre 0 e 1 é menor que 0,1. Descrição completa abaixo:Retirou 1 byte alterando as especificações de entrada (de
ii+
parais
).A maneira antiga era baseada no registro da base 10 de um número aleatório entre 0 e 1 para calcular a quantidade a ser adicionada
a+b
, no entanto, só funcionaria até 15 repetições devido à precisão do ponto flutuante.Nesse código,
10,2$YlZo-
o logaritmo de base 10 do número aleatório é arredondado para o número inteiro mais próximo.fonte
ii+`10Yr1=tb+w]
:, ainda não jogada.Golfical codificado em binário ,
3229 + 1 (-x
sinalizador) = 30 bytesHexdump (editado manualmente para corrigir um erro na parte da imagem para o binário do transpiler, que foi corrigida desde então):
Essa codificação pode ser convertida novamente na representação gráfica original usando o utilitário Encoder incluído ou executada diretamente usando o
-x
sinalizador.Imagem original:
Ampliado 50x:
Explicação: A linha superior é o bloco principal. Ele lê um número, copia para a direita, lê outro número, os adiciona, copia o resultado para a direita, faz algumas coisas de RNG e, com probabilidade de 90%, imprime o resultado da adição. No restante do tempo, ele é enviado para a linha inferior, onde coloca uma na primeira célula e volta para a linha principal pouco antes da instrução de adição (usando uma curva norte e uma curva leste).
fonte
Python,
66656463 bytesExperimente online
Obrigado a Sherlock9 pelas correções e pelo byte salvo.
Obrigado a Mathias Ettinger por outro byte.
Obrigado a mbomb007 por um byte.
fonte
.9>random()
não é exatamente 9 de 10, por causa da distribuição desigual de flutuadoresJulia, 30 bytes
Essa é uma função recursiva
f
que aceita dois números e retorna um número do mesmo tipo. Deve funcionar bem para qualquer tipo numérico.Primeiro, verificamos se um flutuador aleatório entre 0 e 1 é maior que 0,9. Nesse caso, recorremos a algo extra, caso contrário, apenas adicionamos.
fonte
TI-BASIC, 15 bytes
Isso leva a entrada como uma lista de dois elementos
Ans
. Embora um número aleatório seja menor que0.1
, ele adiciona vetorizado à0.5
lista. Aumentar cada elemento0.5
aumenta a soma em 1. Acredito que esta seja a solução TI-BASIC mais curta.O programa de 9 bytes
sum(Ans)-int(log(10rand
não funciona, porquerand
possui apenas 14 dígitos de precisão e, portanto, não pode fornecer um número menor que 10 -14 .fonte
APL, 17 bytes
Esta é uma função diádica sem nome.
Ungolfed:
fonte
Pitão,
1412 bytesMeu primeiro verdadeiro golfe Pyth!
Recebe entrada em STDIN no formato
a,b
.Explicação:
Obrigado a @FryAmTheEggman por cortar dois caracteres, oferecendo uma maneira mais curta de incrementar uma variável!
fonte
Vitsy ,
1210 bytesExperimente online!
Observe que isso tem uma pequena chance de um erro de estouro de pilha. Estamos falando de
(.1)^400
chance. Ele também sai por erro devido a como eu causei recursão.fonte
Lisp, 58 bytes
Minha primeira vez escrevendo Lisp!
Você pode usar esta adição especial exatamente como você normalmente adicionaria no Lisp:
Gostaria muito de ouvir sugestões, pois sou novo no idioma.
fonte
(- a(- -1 b))
? Economiza 2 bytes, se houver.Sério, 10 bytes
Este programa gera uma variável aleatória a partir de uma distribuição geométrica, transformando uma distribuição uniforme. Ele recebe a entrada como uma lista:
[2,3]
(chaves opcionais). Experimente online .Explicação:
Dada uma variável aleatória
X ~ Uniform(0, 1)
, ela pode ser transformada em uma variável aleatóriaY ~ Geometric(p)
com a fórmulaY = floor(log(X)/log(p))
.fonte
Mathematica, 32 bytes
Explicação:
Observe que esta função funciona para qualquer número de entradas.
fonte
TeaScript , 18 bytes
21Esta é uma função TeaScript. Atribua-o a uma variável ou apenas execute-o diretamente.
Experimente online
fonte
Doces , 11 bytes
A forma longa é:
fonte
C,
71513937 bytesPrimeiro código-golfe, feito em C ... Eu não acho que ele vai bater em nada, e pode ser muito jogado para baixo
EDIT 3: cortou 2 bytes graças a @Mego, escrevendo 0,1 em vez de 0,1 e reescrevendo o operador ternário
EDIT 2: cortado 12 bytes, seguindo o gnu99, toda variável é um int se não declarado de outra forma. O mesmo vale para o tipo de retorno de função
EDIT: cortou 20 bytes, esqueceu que o .h básico não é necessário no C99 (usando o gcc por exemplo). Isso produzirá um aviso :)
Solução de 71 bytes:
Se você deseja ver muita saída, pode usar o seguinte código
fonte
MATL , 12
1314bytesA entrada é do formato
[3 4]
, ou seja, um vetor de linha com os dois números.Exemplo
Explicação
Isso gera a variável aleatória geométrica sem loops, aplicando diretamente uma transformação a uma variável aleatória uniforme. Observe que o log 0.1 a é usado em vez do log a / log 0.1 para salvar 1 byte.
fonte
Microscript ,
2921 bytesTentei fazer uma resposta do Microscript II, mas por algum motivo não consegui fazer o loop de adição funcionar corretamente :(
fonte
Mouse-2002 ,
413938 bytesSem recursão.
Explicado:
Ou, se você é um fanboy da programação funcional, e a recursão é sua, então 57 bytes :
Explicado:
fonte
Gelatina , 7 bytes (não concorrente)
Experimente online!
Como funciona
fonte
APL (Dyalog Unicode) ,
1312 bytes SBCSBasicamente, o mesmo que a solução Pyth de FryAmTheEggman . -1 graças a Erik, o Outgolfer.
Função de infixo tácito anônimo.
Experimente online!
+
adicione os argumentos{
…}⍣=
Aplique a seguinte função até que dois aplicativos sucessivos tenham o mesmo resultado:?10
número inteiro aleatório no intervalo de 1 a 101=
é igual a isso? (ou seja, 1 / 10 th acaso)⍵+
adicione o argumento a issofonte
/
.Perl 6 , 26 bytes
Na verdade, fazer isso recursivamente:
Crie uma sequência possivelmente vazia de
1
s seguida pelos argumentos e depois some todos eles.(na verdade, pode levar qualquer número de argumentos)
uso:
fonte
Pitão, 11 bytes
Uma porta Pyth direta da minha resposta Python .
fonte
Oitava, 20 bytes
Soma das entradas, além de uma amostra aleatória da distribuição geométrica com parâmetro
0.9
.fonte
Sério, 13 bytes
Usa uma estratégia semelhante à resposta CJam da maçaneta da porta (número de incremento enquanto a flutuação aleatória é menor que 0,1), exceto que ele usa números inteiros e incrementa enquanto o número inteiro aleatório
[0,9]
é menor que 1. A falta de recursão fácil é prejudicial.Experimente on-line (precisa de entrada manual)
Explicação:
O loop while deixa a pilha assim:
Mudar
n
para 1 é necessário para que o loop while seja executado, pois0
é falsey. É fácil lidar com isso, diminuindon
após o loop while, portanto o resultado final éa + b + (n - 1)
.fonte
MATLAB, 51 bytes
O resultado é encontrado na variável automática 'ans'
fonte