Un físico perezoso tiene el trabajo de realizar el experimento de doble rendija. Sin embargo, son flojos y no pueden molestarse en configurar todo el equipo ellos mismos, por lo que simularán los efectos. Sin embargo, no pueden programar, por lo que necesitarán ayuda. Como son flojos, su programa debe ser lo más corto posible.
Dado un entero positivo impar n
( n >= 1
y n % 2 == 1
), realice la simulación.
Cómo funciona
Comenzará con un lienzo vacío y cada cuadro, una sola partícula de luz pasará por las rendijas y aterrizará en el lienzo. La partícula aterrizará en un máximo con una posibilidad de:
n = 1
:
+-----+
| |
| 1/2 |
| |
+-----+
n = 3
:
+-----+ +-----+ +-----+
| | | | | |
| 1/4 | | 1/2 | | 1/4 |
| | | | | |
+-----+ +-----+ +-----+
n = 5
:
+-----+ +-----+ +-----+ +-----+ +-----+
| | | | | | | | | |
| 1/8 | | 1/4 | | 1/2 | | 1/4 | | 1/8 |
| | | | | | | | | |
+-----+ +-----+ +-----+ +-----+ +-----+
etc.
Por ejemplo, para n=5
marcar el cuadro del medio, hay un 50% de posibilidades de caer en él. Si cae al final del cuadro, si no se mueve a los siguientes dos, hay un 25% de posibilidades de caer en esos. Si cae al final del cuadro, si no se mueve a los siguientes dos, hay un 12.5% de posibilidades de caer en esos. Si no cae, no importa, sigue siendo el final del marco.
Ha habido cierta confusión sobre cómo calcular las posibilidades, la mayor parte de esto se debe a que las personas piensan en ellas como probabilidades que deberían sumar 1. Elimina esa idea de tu mente y debería aclararte un poco.
- Como máximo, una partícula saldrá por cuadro, esto significa que una partícula puede no aterrizar en absoluto en ese cuadro.
- Una partícula puede ser representada por cualquier carácter imprimible.
- La partícula aterrizará en cualquier lugar de la caja con una probabilidad aleatoria.
- El ancho de las cajas debe ser
2n-1
del tamaño del lienzo. Entoncesn=5
, deben ser1/9
del ancho del lienzo. - La altura de las cajas debe ser la altura del lienzo.
- La partícula no debe aterrizar fuera de las cajas en absoluto.
- Si una partícula ya ha aterrizado en un lugar elegido que no importa, puede aterrizar allí nuevamente.
- Los cuadros ascii anteriores son para mayor claridad, no se deben dibujar.
- Puede elegir su propio tamaño de lienzo siempre que sea razonable. Por ejemplo, no debe tener solo unos pocos píxeles de altura. También debería poder encajar todas las cajas en él.
- Si su código duerme entre cuadros, no necesita agregarlo en su conteo de bytes.
Debe haber espacios entre cada uno de los máximos, un mínimo. Debe tener el mismo ancho que una caja, pero no caerán partículas allí. Ver el siguiente diagrama:
+---+---+---+---+---+
| | | | | |
|max|min|max|min|max|
| | | | | |
+---+---+---+---+---+
El programa debe ejecutarse hasta que se detenga manualmente.
Reglas
- Un generador de números pseudoaleatorios (pRNG) está bien.
- Las lagunas estándar están prohibidas.
- La entrada puede ser tomada por cualquier formato razonable.
- Debe enviar a STDOUT.
- Este es el código de golf, por lo que gana la respuesta más corta.
Ejemplo
El siguiente GIF es un ejemplo de ejecución n = 5
. Solo lo hice rápidamente, por lo que las posibilidades pueden ser un poco bajas.
Respuestas:
Python 2,
207200 bytesHay un método para esta locura, lo prometo. Sigue la interpretación de probabilidad que comenté en el OP.
Editar: -7 bytes a través de una evaluación perezosa inteligente (y eliminar algunos signos)
fuente
GOLPETAZO, 396-11 = 385 bytes
Desafortunadamente, no puedo demostrar esto en TryItOnline debido al bucle sin fin y las secuencias de escape ANSI que mueven el cursor, ¡pero aún puede copiarlo y pegarlo en su terminal!
Versión no minificada:
fuente
$[ ]
lugar de$(( ))
. En lugar defor i in `seq $((($1+1)/2)) -1 1`;do ...;done
intentarlofor((i=($1+1)/2;i>0;i--));{ ...;}
. En lugar de[ $(($RANDOM%2)) -eq 1 ]
intentarlo((RANDOM%2))
.sector
,SS
, Etc debe ser reemplazado con nombres de variables 1 carbonilla.Mathematica, 231 bytes
entrada
salida
fuente
C # (.NET 4.5),
319254bytes¡Ahorró 65 bytes gracias a TheLethalCoder!
Uf, eso fue mucho trabajo, pero funciona de alguna manera.
Dado que esto utiliza
Console
funciones específicas y Thread sleeping, lamentablemente no funcionará en TIO.fuente
Action<int>
para salvar bytes,while(true)
-> (while(1>0)
->for(;;)
.using C=Console;
Ousing static Console;
.namespace System{using static Console;n=>{for(var r=new Random();;)for(int w=WindowWidth/(2*n-1),i=(n-1)/2,c=0,m=2,l;i>-1;i--,c+=2)if((l =r.Next(0,(m*=2+1)*2))<2){SetCursorPosition((i+(l<1?c:0))*2*w+r.Next(0,w),r.Next(0,WindowHeight));Write('*');break;}}}
Variable is not existing in the current context
errores.Clojure + Quil, 394 bytes
Bueno, ciertamente no gané, ¡pero este fue un buen ejercicio mental! Puede que haya elegido una forma demasiado indirecta de hacer esto, ¡pero funciona! Básicamente, cómo funciona es:
Los valores de x de cada columna se calculan en función de
n
. Luego, las "columnas activas" que contendrán los puntos se filtran. Las columnas se comprimen con las posibilidades de que se elijan.La animación comienza, y cada cuadro, se ingresa un bucle. Comenzando desde el medio, se prueba cada par de columnas. Una vez que se elige un par de columnas, se elige al azar una columna del par.
Se dibuja un punto en una posición aleatoria dentro de la columna elegida, el bucle interno sale y comienza un nuevo marco.
Utiliza la biblioteca de gráficos Quil, que es esencialmente un contenedor de procesamiento para Clojure.
Tenga en cuenta que el código de golf no produce la misma animación que se muestra en el GIF. En el código de golf, el fondo es gris y la ventana y los puntos son más pequeños. Tiene el mismo efecto, simplemente no es tan bonito.
Consulte el código no oculto para obtener una explicación detallada:
fuente
C #, 238 bytes
Pruébalo en línea!(No funcionará, pero ya sabes).
Versión completa / formateada:
fuente