Um físico preguiçoso tem o trabalho de realizar o experimento de fenda dupla. No entanto, eles são preguiçosos e não podem se incomodar em montar todo o equipamento e simular os efeitos. Eles não podem programar, portanto, precisarão de ajuda. Como eles são preguiçosos, seu programa deve ser o mais curto possível.
Dado um número inteiro positivo ímpar n
( n >= 1
e n % 2 == 1
), execute a simulação.
Como funciona
Você começará com uma tela vazia e em cada quadro uma única partícula de luz atravessará as fendas e pousará na tela. A partícula aterrará no máximo com uma chance 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 exemplo, para n=5
marcar a caixa do meio, há 50% de chance de cair nela. Se cair no final do quadro, se não passar para os próximos dois, há 25% de chance de cair neles. Se cair no final do quadro, se não passar para os próximos dois, há uma chance de 12,5% de cair nesses. Se não cair, não importa, ainda é o fim do quadro.
Houve alguma confusão sobre como calcular as chances, a maior parte disso se deve ao fato de as pessoas pensarem nelas como probabilidades que devem somar 1. Retire essa ideia da sua mente e ela deve esclarecer um pouco para você.
- No máximo, uma partícula será concedida por quadro, isso significa que uma partícula pode não pousar nesse quadro.
- Uma partícula pode ser representada por qualquer caractere imprimível.
- A partícula pousará em qualquer lugar da caixa com uma chance aleatória.
- A largura das caixas deve ser
2n-1
do tamanho da tela. Portanto,n=5
eles devem ter1/9
a largura da tela. - A altura das caixas deve ser a altura da tela.
- A partícula não deve pousar fora das caixas.
- Se uma partícula já pousou em um local escolhido, não importa, ela pode pousar lá novamente.
- As caixas ascii acima são para maior clareza, não devem ser desenhadas.
- Você pode escolher seu próprio tamanho de tela, desde que seja razoável. Por exemplo, não deve ter apenas alguns pixels de altura. Ele também deve ser capaz de encaixar todas as caixas nele.
- Se o seu código dorme entre os quadros, você não precisa adicioná-lo à sua contagem de bytes.
Deve haver espaços entre cada um dos máximos, um mínimo. Essa deve ter a mesma largura de uma caixa, mas nenhuma partícula cairá lá. Veja o seguinte diagrama:
+---+---+---+---+---+
| | | | | |
|max|min|max|min|max|
| | | | | |
+---+---+---+---+---+
O programa deve ser executado até que seja parado manualmente.
Regras
- Um gerador de números pseudo-aleatórios (pRNG) é bom.
- As brechas padrão são proibidas.
- A entrada pode ser obtida por qualquer formato razoável.
- Você deve enviar para STDOUT.
- Isso é código-golfe, então a resposta mais curta vence.
Exemplo
O GIF a seguir é um exemplo de execução n = 5
. Eu só bati rápido, então as chances podem ser um pouco menores.
Respostas:
Python 2,
207200 bytesExiste um método para essa loucura, prometo. Segue a interpretação de probabilidade que comentei no OP.
Editar: -7 bytes através de uma avaliação preguiçosa inteligente (e remover alguns sinais)
fonte
BASH, 396 - 11 = 385 bytes
Infelizmente, não posso demonstrar isso no TryItOnline devido às seqüências intermináveis de escape de loop e ANSI que movem o cursor, mas você ainda pode copiar e colar no seu terminal!
Versão não minificada:
fonte
$[ ]
vez de$(( ))
. Em vez defor i in `seq $((($1+1)/2)) -1 1`;do ...;done
, tentefor((i=($1+1)/2;i>0;i--));{ ...;}
. Em vez de[ $(($RANDOM%2)) -eq 1 ]
, tente((RANDOM%2))
.sector
,SS
etc deve ser substituído por 1 nome de variável de caractere.Mathematica, 231 bytes
entrada
resultado
fonte
C # (.NET 4.5),
319254bytesEconomizou 65 bytes graças ao TheLethalCoder!
Ufa, isso foi muito trabalhoso, mas funciona de alguma forma.
Como isso usa
Console
funções específicas e o thread em suspensão, infelizmente não funcionará no TIO.fonte
Action<int>
para salvar bytes,while(true)
-> (while(1>0)
->for(;;)
.using C=Console;
Ouusing 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
erros.Clojure + Quil, 394 bytes
Bem, eu certamente não ganhei, mas este foi um bom treino para o cérebro! Eu posso ter escolhido uma maneira excessivamente indireta de fazer isso, mas funciona! Basicamente, como funciona é:
Os valores x de cada coluna são calculados com base em
n
. Em seguida, as "colunas ativas" que conterão os pontos são filtradas. As colunas são compactadas com as possibilidades de serem escolhidas.A animação é iniciada e, a cada quadro, um loop é inserido. A partir do meio, cada par de colunas é tentado. Depois que um par de colunas é escolhido, uma coluna do par é escolhida aleatoriamente.
Um ponto é desenhado em uma posição aleatória dentro da coluna escolhida, o loop interno sai e um novo quadro é iniciado.
Usa a biblioteca de gráficos Quil, que é essencialmente um wrapper de Processamento para Clojure.
Observe que o código golfado não produz a mesma animação mostrada no GIF. No código do golfe, o fundo é cinza e a janela e os pontos são menores. Tem o mesmo efeito, não é tão bonito.
Veja o código não destruído para uma explicação detalhada:
fonte
C #, 238 bytes
Experimente online!(Não vai funcionar, mas você sabe).
Versão completa / formatada:
fonte