Veamos qué tan bueno es su idioma de elección en la aleatoriedad selectiva.
Dadas 4 caracteres, A
, B
, C
, y D
, o una cadena de 4 caracteres ABCD
como entrada , una salida de los caracteres con las siguientes probabilidades:
A
debe tener una probabilidad de 1/8 (12.5%) de ser elegidoB
debería tener una probabilidad de 3/8 (37.5%) de ser elegidoC
debe tener una probabilidad de 2/8 (25%) de ser elegidoD
debe tener una probabilidad de 2/8 (25%) de ser elegido
Esto está en línea con el siguiente diseño de la máquina Plinko :
^
^ ^
^ ^ ^
A B \ /
^
C D
Su respuesta debe hacer un intento genuino de respetar las probabilidades descritas. Una explicación adecuada de cómo se calculan las probabilidades en su respuesta (y por qué respetan las especificaciones, sin tener en cuenta los problemas de pseudoaleatoriedad y números grandes) es suficiente.
Tanteo
Este es el código de golf, por lo que gana menos bytes en cada idioma .
ceil(abs(i - 6)/ 2.0)
asignará un índice a partir0-7
de un índice a partir0-3
de la distribución apropiada (0 111 22 33
) para este desafío ...Respuestas:
Lean Mean Bean Machine ,
554342 bytes-13 bytes gracias a Alex Varga
Espero que no les importe que responda mi propia pregunta después de solo 2 horas, pero dudo mucho que alguien más haya planeado publicar una respuesta en LMBM.
Esto literalmente refleja el diseño de Plinko que se muestra en el OP, volteado horizontalmente para reducir el espacio en blanco innecesario.
fuente
Jalea , 6 bytes
Un enlace monádico que toma una lista de cuatro caracteres y devuelve uno con la distribución de probabilidad descrita.
Pruébalo en línea!
¿Cómo?
fuente
ṁ
!Cubix ,
3924222119 bytesVer en el intérprete en línea!
Esto se asigna a la siguiente red de cubos:
Explicación de implementación de distribución aleatoria
Cubix es un lenguaje en el que un puntero de instrucción viaja alrededor de las caras de un cubo, ejecutando los comandos que encuentra. La única forma de aleatoriedad es el comando
D
, que envía la IP en una dirección aleatoria: una posibilidad igual de1/4
cada sentido.Sin embargo, podemos usar esto para generar las probabilidades ponderadas correctas: usando
D
dos veces. El primeroD
tiene un1/4
rumbo a un segundoD
. Este segundoD
, sin embargo, tiene dos direcciones bloqueadas con flechas (> D <
) que envían el puntero de instrucción de regreso alD
para elegir otra dirección. Esto significa que solo hay dos direcciones posibles desde allí, cada una con una1/8
posibilidad general de suceder. Esto se puede usar para generar el carácter correcto, como se muestra en el siguiente diagrama:(Tenga en cuenta que, en el código real, la flecha a la derecha se reemplaza con un espejo
|
)Explicación del código
El puntero de instrucciones comienza a la derecha, en el personaje
i
, mirando hacia la derecha. Ejecuta estoi
, toma el primer carácter como entrada y luego se mueve hacia elD
, comenzando el proceso aleatorio que se muestra arriba.Char A: En el caso de que el primero
D
nos envíe al este, y el segundo al sur, necesitamos imprimir el carácter A. Esto ya está en la pila del primeroi
. Se ejecuta lo siguiente:\
- Refleja la IP para que se dirija al estei;
- Tome una entrada, luego vuelva a abrirla (sin operación)U
- Realizar un cambio de sentido, girando la IP a la izquierda dos veceso
- Salida del TOS, carácter A@
- Terminar el programaChar B: Si la primera o la segunda se
D
dirigen al norte, necesitamos generar el carácter B, que será la próxima entrada. Ambas rutas ejecutan los siguientes comandos:^
- Dirígete al norte<
- Dirígete hacia el oeste, envolviendo para ...i
- Toma otra entrada, personaje Bo
- Salida del TOS, carácter B;
- Pop los TOS@
- Terminar el programaChar C: Si el primero
D
nos envía al oeste, se ejecuta lo siguiente:i
- Toma otra entrada, personaje Bi
- Toma otra entrada, personaje Co
- TOS de salida, carácter C@
- Terminar el programaChar D: Si el primero
D
nos envía al sur, se ejecuta lo siguiente:i
- Toma otra entrada, personaje B..
- Dos no-opsi
- Toma otra entrada, personaje C|
- Este espejo refleja este-oeste, pero el IP se dirige hacia el norte, por lo que lo atravesamos.^
- Esto se une con la ruta tomada para el carácter B. Sin embargo, debido a que ya hemos tomado dos entradas, el cuarto carácter (carácter D) terminará siendo impreso.fuente
Python , 50 bytes
Una función sin nombre que toma y devuelve cadenas (o listas de caracteres).
Pruébalo en línea!
¿Cómo?
random.choice
elige un elemento aleatorio de una lista, por lo que la función forma una cadena con la distribución correcta, es decir, dada"ABCD"
,"ABCD"[:2] = "AB"
más"ABCD"[1:]*2 = "BCD"*2 = "BCDBCD"
cuál es"ABBCDBCD"
.fuente
R , 31 bytes
Lee los caracteres
stdin
separados por espacios.sample
toma muestras aleatorias de su primera entrada en cantidad de la segunda entrada (entonces1
), (argumento de reemplazo opcional), con los pesos dados por el último argumento.Pruébalo en línea!
Pruébalo
n
veces!Para el último código, muestro los
n
tiempos (establecidosn
en el encabezado) con el reemplazo establecido enT
rue (es falso por defecto), tabulo los resultados y divido porn
para ver las probabilidades relativas de las entradas.fuente
PHP, 28 bytes
Ejecutar como tubería con
-nR
.01112233
en base-4 está5551
en decimal ...fuente
7030
es uno de mis favoritos personales.Java 8,
5344 bytesSe trata de una
Function<char[], Character>
.Pruébalo en línea! (este programa de prueba se ejecuta la función anterior de 1.000.000 veces y da salida a las probabilidades experimentales de la elección
A
,B
,C
, yD
).La idea general es que encontrar alguna manera de hacer corresponder
0-7
a0-3
, de manera que0
figure el1/8
momento,1
parece3/8
veces,2
aparece2/8
veces, y3
aparece2/8
veces.round(abs(k - 6) / 2.0))
funciona para esto, dondek
es un entero aleatorio en el rango[0,8)
. Esto da como resultado la siguiente asignación:Lo cual, como se puede ver, los resultados en los índices
0 111 22 33
, que produce las probabilidades deseadas de1/8
,3/8
,2/8
y2/8
.¡Pero espera! ¿Cómo en el mundo
-~Math.abs(k-6)/2
logra el mismo resultado (de nuevo, ¿dóndek
está un número entero aleatorio en el rango[0,8]
)? Es bastante simple en realidad ...(x+1)/2
(división entera) es lo mismo queround(x/2)
, yx + 1
es lo mismo que-~x
. Aunquex+1
y-~x
son de la misma longitud, en la función anterior es mejor usar-~x
ya que-~
tiene prioridad y, por lo tanto, no requiere paréntesis.fuente
Math.abs
también acepta dobles como parámetro):s->s[-~(int)Math.abs(Math.random()*8-6)/2]
( 42 bytes ).APL, 14 bytes
Entrada como una cadena.
¿Cómo?
1 3 2 2\⊢
- repite cada letra x veces ('ABCD'
→'ABBBCCDD'
)⊃
- tome el elemento en el índice ..(?8)
- aleatorio 1-8fuente
⎕U2378
.Carbón , 11 bytes
Pruébalo en línea! El enlace es a una versión detallada del código, aunque apenas lo necesita;
‽
elige un elemento aleatorio,⟦⟧
crea una lista, y las variables son las que obtienen las letras de entrada apropiadas (en orden inverso porque me dio la gana).fuente
Pyth ,
87 bytesUtiliza exactamente el mismo algoritmo que en mi respuesta de Python.
Pruébalo aquí!
Pyth ,
108 bytesUtiliza exactamente el mismo algoritmo que la respuesta de Python de Jonathan Allan.
Pruébalo aquí!
Explicación
O
- Toma un elemento aleatorio de la cadena hecha al agregar (con+
):<Q2
- Los dos primeros caracteres de la cadena.*2t
Duplique la cadena completa (*2
) excepto el primer carácter (t
).Aplicando este algoritmo para
ABCD
:<Q2
tomaAB
.*2t
tomaBCD
y lo dobla:BCDBCD
.+
une las dos cadenas:ABBCDBCD
.O
toma un caracter aleatorio.-2 gracias a Leaky Nun (segunda solución)
-1 gracias a mnemonic (primera solución)
fuente
>Q1
se conviertetQ
, lo que se conviertet
.*2
con+
y utilizando la entrada implícita dos veces.y
cambio, lo que no funciona para las cadenas ...Jalea , 8 bytes
Pruébalo en línea!
Eliminar el
X
para ver"ABBBCCDD"
. ElX
elige un elemento aleatorio.fuente
C # (.NET Core) ,
7655 bytesPruébalo en línea!
Mi primera respuesta escrita directamente en TIO usando mi teléfono móvil. ¡Elevar a mismo nivel!
Explicación: si la cadena original es "ABCD", la función crea la cadena "ABCDBBCD" y le quita un elemento aleatorio.
fuente
Javascript 35 bytes
Toma una cadena
ABCD
como entrada, salida aA
1 / octava parte del tiempo,B
3 / 8ths de la época,C
1 / cuarta parte del tiempo, yD
1 / cuarta parte del tiempo.Explicación
fuente
05AB1E , 5 bytes
Pruébalo en línea!
Explicación
fuente
> <> ,
252219 bytesPruébalo en línea! o míralo en el parque de peces !
Una breve descripción de> <>: es un lenguaje 2D con un pez que nada a través del código, ejecutando instrucciones a medida que avanza. Si llega al borde del código, se ajusta al otro lado. El pez comienza en la esquina superior izquierda, moviéndose a la derecha. La aleatoriedad es complicada en> <>: la única instrucción aleatoria es
x
, que establece la dirección del pez aleatoriamente hacia arriba, abajo, izquierda y derecha (con la misma probabilidad).Al comienzo del programa, el pez lee en dos caracteres de entrada con
i_i
(cada unoi
lee un carácter de STDIN a la pila, y_
es un espejo horizontal, que el pez ignora ahora). Entonces alcanza unx
.Si
x
envía el pez hacia la derecha, lee un carácter más (el tercero), lo imprime cono
y se detiene con;
. La dirección hacia la izquierda es similar: el pez lee dos caracteres más (así que estamos hasta el cuarto), se enrolla hacia la derecha, imprime el cuarto carácter y se detiene. Si el pez nada hacia arriba, envuelve e imprime el segundo personaje, antes de reflejarse/
y detenerse. Si nada hacia abajo, se refleja a la izquierda/
y golpea a otrox
.Esta vez, dos direcciones simplemente envían al pez de regreso a la
x
(derecha con una flecha<
, y arriba con un espejo_
). Por lo tanto, el pez tiene 1/2 probabilidad de escapar de estox
en cada una de las otras dos direcciones. Hacia la izquierda imprime el carácter superior en la pila, que es el segundo, pero hacia abajo primero intercambia los dos elementos en la pila$
, por lo que esta dirección imprime el primer carácter.En resumen, los caracteres tercero y cuarto se imprimen con probabilidad de 1/4 cada uno; el primer caracter tiene probabilidad 1/2 x 1/4 = 1/8; y el segundo personaje tiene probabilidad 1/4 + 1/2 x 1/4 = 3/8.
fuente
05AB1E , 8 bytes
Pruébalo en línea!
fuente
MATL ,
1210 bytesPruébalo en línea! O ejecútelo 1000 veces (código ligeramente modificado) y verifique el número de veces que aparece cada carácter.
Explicación
Cambios en el código modificado:
1000:"Gl3HH4$vY"1Zr]vSY'
1000:"...]
es un ciclo para repetir1000
tiempos.G
se asegura de que la entrada se empuje al comienzo de cada iteración.v
, debe reemplazarse4$v
para concatenar solo la parte superior4
números .v
concatena los1000
resultados en un vector, loS
ordena y loY'
codifica la longitud de ejecución. Esto da las cuatro letras y la cantidad de veces que han aparecido.fuente
05AB1E , 6 bytes
Pruébalo en línea!
Explicación
Funciona tanto para listas como para cadenas.
fuente
C (gcc) ,
5049 bytesPruébalo en línea!
fuente
ABCD
es entrada de ejemplo, su código debe tomar 4 caracteres (o una cadena de longitud 4) como entradaRuby,
34332927 bytesGuardado 2 bytes gracias a @Value Inc
Ingrese como cuatro caracteres
construir una matriz
[B,B,C,D,A,B,C,D]
y probarla.Pruébalo en línea!
pruébalo
n
veces! (Lo convertí en una función para repetirlo más fácilmente, pero el algoritmo es el mismo)fuente
$*
es un alias paraARGV
.Pyth, 7 bytes
Banco de pruebas
O8
genera un número aleatorio de 0 a 7.| ... 1
aplica un lógico o con 1, convirtiendo el 0 en 1 y dejando todo lo demás igual. El número en esta etapa es 1 2/8 del tiempo, y 2, 3, 4, 5, 6, 7 u 8 1/8 del tiempo.@z
indexa en la cadena de entrada en esa posición. La indexación se realiza módulo a lo largo de la cadena, entonces 4 índices en la posición 0, 5 en la posición 1, y así sucesivamente.Las probabilidades son:
Posición 0: número aleatorio 4. 1/8 de las veces.
Posición 1: número aleatorio 0, 1 o 5. 3/8 de las veces.
Posición 2: número aleatorio 2 o 6. 2/8 de las veces.
Posición 3: número aleatorio 3 o 7. 2/8 de las veces.
fuente
Javascript,
3130 bytes / 23 bytesAl ver la respuesta anterior de Javascript del asgallant me puse a pensar en JS. Como él dijo:
El mio es:
Explicación:
A partir de
Math.random()*8&7
él se desglosa de la siguiente manera:Versión 2, 23 bytes
Pero luego, gracias a Arnauld, quien publicó después de mí, cuando dijo:
lo cual, si de hecho está permitido, me llevó a:
en el que
new Date%8
usa la misma tabla de desglose que la anterior.Y
%8
también podría ser&7
; elige tu opción. Gracias de nuevo, Arnauld.fuente
ngn / apl, 10 bytes
?2 4
elige aleatoriamente un par de números: el primero entre 0 1 y el segundo entre 0 1 2 3⌈/
es "max reduce" - encuentra el número más grande⎕a
es el alfabeto en mayúscula[ ]
indexaciónobserve la tabla para max (a, b) cuando a∊ {0,1} y b∊ {0,1,2,3}:
Si a y b se eligen al azar e independientemente, podemos sustituir 0123 = ABCD para obtener la distribución de probabilidad deseada
fuente
Python 3 ,
64 5551 bytes-9 bytes gracias a @ovs
Pruébalo en línea!
Explicación
random.choice()
obtiene un carácter aleatorio de la cadena, mientras(s*2)[1:]+s[1]
creaBCDABCDB
para una entrada deABCD
, que tiene 1/8A
s, 2/8C
s, 2/8D
sy 3/8B
s.fuente
random.choice
para 55 bytes:lambda s:choice((s[0]+s[1:]*3)[:8])
choice()
sin embargo.QBIC , 27 bytes
Explicación
fuente
> <>, 56 bytes
Pruébalo en línea!
fuente
Chip , 60 bytes
Pruébalo en línea!
?
Cada uno de los tres produce un bit aleatorio. En el primer ciclo, estos bits se ejecutan a través de los interruptores anteriores (/
'sy\
' s) para determinar qué valor vamos a generar de esta tabla:(donde
_
puede ser cualquiera0
o1
). Luego caminamos a lo largo de la entrada según sea necesario, imprimiendo y terminando cuando se alcanza el valor correcto.La gran burbuja alfabética al final se copia al por mayor del programa cat, esta solución simplemente suprime la salida y termina para obtener el efecto deseado.
fuente
Ruby, 32 bytes
Muy claro..?
Pruébalo en línea!
fuente
Applesoft,
29oops, 32 bytesUn pequeño ejemplo de "retrocomputación". Ten paciencia conmigo, soy nuevo en esto. Entiendo que lo que se designa como "entrada" no necesita ser contado en bytes. Como se indica en el OP, la entrada se daría como "ABCD". (Inicialmente no me di cuenta de que necesitaba especificar la entrada que se estaba obteniendo, lo que agregó 4 bytes, mientras que el resto del golf se redujo en un byte).
Los términos INPUT, RND, PRINT y MID $ están codificados internamente como tokens de un solo byte.
Primero, a X se le asigna un valor aleatorio en el rango 0 <X <4. Esto se usa para elegir uno de los caracteres de I $, de acuerdo con (X <.5) + X + 1. El valor de la posición del personaje se toma como evaluación truncada de la expresión. X <.5 agrega 1 si X era menor que .5, de lo contrario, agrega 0. Los resultados de X se desglosan de la siguiente manera:
fuente
Lisp común , 198 bytes
Pruébalo en línea!
Legible:
fuente