Inspirado por el glorioso Alex's Learn you an R for great good, vamos a recrear humildemente el "único programa de R verdadero" de Alex, pero con un giro.
La adición al estilo Alex funciona así: tiene un 90% de posibilidades de devolver simplemente la suma de los dos números dados y un 10% de posibilidades de que Alex agregue recursivamente el primer número y el segundo número + 1. Esto significa que, potencialmente , una adición podría estar desactivada en 1 o más.
Desafío
Escriba un programa o función completa que tome dos enteros y Alex los agrega como se define. Puede suponer que su programa no se apilará si su idioma no tiene una recursión de cola. (Tenga en cuenta que no tiene que implementarlo de forma recursiva, siempre que las probabilidades sean las mismas).
Implementación de referencia (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;
}
}
Tabla de clasificación
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>
fuente
Respuestas:
Pyth, 8
Pruébalo en línea
Utiliza el segundo modo de Pyth en reducción, que busca entradas repetidas y luego sale.
Explicación
Si se produce el complemento adicional de alex, se ejecutará nuevamente, pero si no, se cerrará.
fuente
Python 2, 55 bytes
Esta es una forma absolutamente extraña de hacerlo.
La función
random
da un flotante en [0,1), y su representación de cadena por defecto tiene 16 dígitos después del punto decimal, para un total de 18 caracteres. Pero, debido a que se omiten los ceros finales, puede ser más corto. Leyendo dígitos desde el final, cada uno tiene una probabilidad de 1/10 de ser 0, y nos detenemos cuando tocamos un dígito distinto de cero. Entonces, el número de ceros al final se distribuye de la misma manera que el número de recursiones que hace Alex, por lo que podemos tomar muestras de esta distribución en 18 menos la longitud de la cadena.En realidad, Python mostrará más de 18 dígitos para números pequeños, a veces incluso notación científica, por lo que agregamos 1 para solucionar esto.
Esto nunca dará más de 15 más que la suma, pero está bien porque 10 ^ 15 es mucho menos que la posibilidad de que un rayo cósmico interrumpa el cálculo .
fuente
R,
604728 bytesEste es un objeto de función sin nombre que acepta dos números y devuelve un número. No usa recursividad.
Como xnor señaló en un comentario, este problema se puede ver simplemente agregando dos números más una variable aleatoria geométrica con probabilidad de falla 1/10.
¿Por qué es eso cierto? Piénselo en términos de recursividad, como se describe en la publicación. En cada iteración tenemos un 10% de posibilidades de sumar 1 y recurrir, y un 90% de posibilidades de salir de la función sin más adiciones. Cada iteración es su propio ensayo independiente de Bernoulli con resultados "agregar 1, recurse" (falla) y "salir" (éxito). Por lo tanto, la probabilidad de falla es 1/10 y la probabilidad de éxito es 9/10.
Cuando se trata de una serie de ensayos independientes de Bernoulli, el número de ensayos necesarios para obtener un único éxito sigue una distribución geométrica . En nuestro caso, cada recursión significa sumar 1, así que cuando finalmente salimos de la función, esencialmente hemos contado la cantidad de fallas que ocurrieron antes del primer éxito. Eso significa que la cantidad por la cual el resultado estará apagado es una variante aleatoria de una distribución geométrica.
Aquí podemos aprovechar el amplio conjunto de aplicaciones y uso de distribución de probabilidad de R
rgeom
, que devuelve un valor aleatorio de una distribución geométrica.Sin golf:
fuente
Minkolang 0.14 ,
191112 bytesEsta es la versión de "función"; asume
a
yb
ya está en la pila, los saca y empuja la versión modificada dea+b
. El equivalente más cercano a las funciones en Minkolang es utilizarF
, que se disparab
,a
y salta a(a,b)
la CODEBOX. Luego, cuando el contador del programa golpea unf
, salta de nuevo a dondeF
se utilizó.Esta es la versión completa del programa, 15 bytes . (
nn
toma dos números de entrada y daN.
salida al resultado y se detiene).Robé el algoritmo de la respuesta de Doorknob ; el ciclo while se repite siempre que el número aleatorio generado sea menor que 0.1, agregando 1 cada vez. Pruébelo aquí (versión completa del programa) y ejecútelo 100 veces aquí .
Explicación
La parte más inteligente aquí es
d
. La parte superior de la pila en ese momento será 0 o 1. Si es 0, el ciclo while sale. De lo contrario, continúa. Al duplicar la parte superior de la pila, será[a+b,1]
la segunda vez a través del ciclo, por lo que+
al principio agrega el 1 (y lo mismo para los viajes posteriores).fuente
f
al final en el recuento de caracteres (y técnicamente la nueva línea anterior si te sientes extra pedante, pero no creo que sea necesario).CJam,
1211 bytes¡Gracias a @ MartinBütter por guardar un byte con este truco súper inteligente!
Vieja respuesta:
Pruébalo en línea .
Explicación:
El algoritmo básico es "while (0.1 chance), increment the number", lo que elimina la necesidad de recurrencia.
fuente
Javascript ES6, 38 bytes
fuente
f=(a,b)=>new Date%10<1?f(a,b+1):a+b
para 35 bytesDate
marca de tiempo no será precisa porque si se evalúatrue
, seguirá aumentando1
durante el resto del milisegundo.f=(a,b)=>a+b-~~Math.log10(Math.random())
pero es 2 bytes más larga.MATL ,
141312 bytesEste es solo el método de bucle, agregue las entradas (ingresadas como
[a b]
) y luego continúe agregando una mientras un número aleatorio uniforme entre 0 y 1 es menor que 0.1. Descripción completa a continuación:Despegó 1 byte cambiando la especificación de entrada (de
ii+
ais
).La forma antigua se basaba en tomar el registro de base 10 de un número aleatorio entre 0 y 1 para calcular la cantidad a agregar
a+b
, sin embargo, solo funcionaría hasta 15 repeticiones debido a la precisión del punto flotante.En este código,
10,2$YlZo-
hace el logaritmo en base 10 del número aleatorio y se redondea al entero más cercano.fuente
ii+`10Yr1=tb+w]
aún no golfizada.Binario-codificado Golfical ,
3229 + 1 (-x
bandera) = 30 bytesHexdump (editado manualmente para corregir un error en la parte de imagen a binaria del transpiler, que desde entonces se ha solucionado):
Esta codificación se puede volver a convertir en la representación gráfica original usando la utilidad Encoder incluida, o ejecutarla directamente usando la
-x
bandera.Imagen original:
Magnificado 50x:
Explicación: La fila superior es el bloque principal. Lee un número, lo copia a la derecha, lee otro número, los agrega, copia el resultado a la derecha, hace algunas cosas RNG y, con una probabilidad del 90%, imprime el resultado de la suma. El resto del tiempo, se envía a la fila inferior, donde coloca un uno en la primera celda y vuelve a la fila principal justo antes de la instrucción de adición (usando un giro al norte y luego al este).
fuente
Python,
66656463 bytesPruébalo en línea
Gracias a Sherlock9 por las correcciones y el byte guardado.
Gracias a Mathias Ettinger por otro byte.
Gracias a mbomb007 por un byte.
fuente
.9>random()
no es del todo 9 de 10, debido a la distribución desigual de flotadoresJulia, 30 bytes
Esta es una función recursiva
f
que acepta dos números y devuelve un número del mismo tipo. Debería funcionar bien para cualquier tipo numérico.Primero verificamos si un flotante aleatorio entre 0 y 1 es mayor que 0.9. Si es así, recurrimos con un poco de algo extra, de lo contrario solo agregamos.
fuente
TI-BASIC, 15 bytes
Esto toma la entrada como una lista de dos elementos de
Ans
. Si bien un número aleatorio es menor que0.1
, hace una adición vectorizada0.5
en la lista. Aumentar cada elemento0.5
aumenta la suma en 1. Creo que esta es la solución TI-BASIC más corta.El programa de 9 bytes
sum(Ans)-int(log(10rand
no funciona, porquerand
solo tiene 14 dígitos de precisión y, por lo tanto, no puede dar un número menor que 10-14 .fuente
APL, 17 bytes
Esta es una función diádica sin nombre.
Sin golf:
fuente
Pyth,
1412 bytesMi primer verdadero Pyth golf!
Toma entrada en STDIN en el formato
a,b
.Explicación:
¡Gracias a @FryAmTheEggman por eliminar dos caracteres al darme una forma más corta de incrementar una variable!
fuente
Vitsy ,
1210 bytesPruébalo en línea!
Tenga en cuenta que esto tiene una pequeña posibilidad de un error de desbordamiento de pila. Estamos hablando de
(.1)^400
oportunidad. También sale por error debido a cómo causé la recursión.fuente
Lisp, 58 bytes
¡La primera vez que escribo Lisp!
Puede usar esta adición especial exactamente como normalmente agregaría en Lisp:
Me encantaría escuchar sugerencias ya que soy nuevo en el idioma.
fuente
(- a(- -1 b))
? Le ahorra 2 bytes si lo hace.En serio, 10 bytes
Este programa genera una variable aleatoria a partir de una distribución geométrica transformando una distribución uniforme. Toma la entrada como una lista:
[2,3]
(llaves opcionales). Pruébalo en línea .Explicación:
Dada una variable aleatoria
X ~ Uniform(0, 1)
, se puede transformar en una variable aleatoriaY ~ Geometric(p)
con la fórmulaY = floor(log(X)/log(p))
.fuente
Mathematica, 32 bytes
Explicación:
Tenga en cuenta que esta función funciona para cualquier cantidad de entradas.
fuente
TeaScript , 18 bytes
21Esta es una función TeaScript. Asignarlo a una variable o simplemente ejecutarlo directamente.
Pruébalo en línea
fuente
Candy , 11 bytes
La forma larga es:
fuente
C,
71513937 bytesPrimer código de golf, hecho en C ... No creo que vaya a vencer a nada, y puede ser mucho menos.
EDIT 3: recortó 2 bytes gracias a @Mego, escribiendo .1 en lugar de 0.1 y reescribiendo el operador ternario
EDIT 2: recortado 12 bytes, después de gnu99, cada variable es un int si no se indica lo contrario. Lo mismo ocurre con el tipo de función de retorno
EDITAR: recortó 20 bytes, olvidé que .h básico no es necesario en C99 (usando gcc por ejemplo). Producirá una advertencia :)
Solución de 71 bytes:
Si desea ver muchos resultados, puede usar el siguiente código
fuente
MATL , 12
1314bytesLa entrada es de la forma
[3 4]
, es decir, un vector de fila con los dos números.Ejemplo
Explicación
Esto genera la variable aleatoria geométrica sin bucles, aplicando directamente una transformación a una variable aleatoria uniforme. Tenga en cuenta que se utiliza log 0.1 a en lugar de log a / log 0.1 para guardar 1 byte.
fuente
Microscript ,
2921 bytesTraté de hacer una respuesta Microscript II, pero por alguna razón no pude hacer que el ciclo de suma funcionara correctamente :(
fuente
Mouse-2002 ,
413938 bytesSin recursión
Explicado:
O, si eres un fanático de la programación funcional, y la recursión es tu oferta, entonces 57 bytes :
Explicado:
fuente
Gelatina , 7 bytes (no competitiva)
Pruébalo en línea!
Cómo funciona
fuente
APL (Dyalog Unicode) ,
1312 bytes SBCSBásicamente lo mismo que la solución Pyth de FryAmTheEggman . -1 gracias a Erik the Outgolfer.
Función de infijo tácito anónimo.
Pruébalo en línea!
+
agrega los argumentos{
...}⍣=
aplique la siguiente función hasta que dos aplicaciones sucesivas tengan el mismo resultado:?10
entero aleatorio en el rango 1–101=
es uno igual a eso? (es decir, 1 / 10 º oportunidad)⍵+
agregue el argumento a esofuente
/
.Perl 6 , 26 bytes
Realmente haciéndolo recursivamente:
Cree una secuencia de
1
s posiblemente vacía seguida de los argumentos, luego sume todos juntos.(en realidad puede tomar cualquier cantidad de argumentos)
uso:
fuente
Pyth, 11 bytes
Un puerto Pyth directo de mi respuesta Python .
fuente
Octava, 20 bytes
Suma de las entradas, más una muestra aleatoria de la distribución geométrica con parámetro
0.9
.fuente
En serio, 13 bytes
Utiliza una estrategia similar a la respuesta CJam de Doorknob (el número de incremento mientras el flotante aleatorio es menor que 0.1), excepto que usa números enteros e incrementa mientras que el entero aleatorio
[0,9]
es menor que 1. La falta de recursión fácil duele.Pruébelo en línea (necesita entrada manual)
Explicación:
El ciclo while deja la pila de esta manera:
El cambio
n
por 1 es necesaria para obtener el bucle while a plazo, ya que0
es Falsey-. Se trata fácilmente disminuyendon
después del ciclo while, por lo que el resultado final esa + b + (n - 1)
.fuente
MATLAB, 51 bytes
El resultado se encuentra en la variable automática 'ans'
fuente