Leniwy fizyk ma za zadanie przeprowadzić eksperyment podwójnej szczeliny. Są jednak leniwi i nie można sobie pozwolić na samodzielne konfigurowanie całego sprzętu, dlatego też będą symulować efekty. Nie mogą jednak programować, więc będą potrzebować pomocy. Ponieważ są leniwi, twój program powinien być jak najkrótszy.
Biorąc pod uwagę nieparzystą liczbę całkowitą dodatnią n
( n >= 1
i n % 2 == 1
), wykonaj symulację.
Jak to działa
Zaczniesz od pustego płótna, a każda klatka pojedynczej cząsteczki światła przejdzie przez szczeliny i wyląduje na płótnie. Cząstka wyląduje na maksimach z szansą:
n = 1
:
+-----+
| |
| 1/2 |
| |
+-----+
n = 3
:
+-----+ +-----+ +-----+
| | | | | |
| 1/4 | | 1/2 | | 1/4 |
| | | | | |
+-----+ +-----+ +-----+
n = 5
:
+-----+ +-----+ +-----+ +-----+ +-----+
| | | | | | | | | |
| 1/8 | | 1/4 | | 1/2 | | 1/4 | | 1/8 |
| | | | | | | | | |
+-----+ +-----+ +-----+ +-----+ +-----+
itp.
Na przykład, ponieważ n=5
zaznaczamy środkowe pole, istnieje 50% szansy na upadek. Jeśli spadnie na koniec kadru, jeśli nie przejdzie do następnych dwóch, istnieje 25% szansy na upadek. Jeśli spadnie na koniec kadru, jeśli nie przejdzie do następnych dwóch, istnieje 12,5% szansy na upadek. Jeśli nie spadnie, nie ma znaczenia, to wciąż koniec kadru.
Pojawiło się pewne zamieszanie dotyczące sposobu obliczania szans, większość z nich wynika z tego, że ludzie myślą o nich jako o prawdopodobieństwach, które powinny się sumować do 1. Usuń ten pomysł z twojego umysłu i powinien on trochę ci wyjaśnić.
- Co najwyżej jedna cząstka będzie ładować na ramkę, co oznacza, że cząstka może wcale nie wylądować na tej ramce.
- Cząstka może być reprezentowana przez dowolny znak do wydrukowania.
- Cząstka wyląduje w dowolnym miejscu pudełka z losową szansą.
- Szerokość skrzynek powinna być
2n-1
wielkością płótna. Dlategon=5
powinny być one1/9
szerokości płótna. - Wysokość skrzynek powinna odpowiadać wysokości płótna.
- Cząstka nie powinna w ogóle wylądować poza pudełkami.
- Jeśli cząstka już wylądowała w wybranym miejscu, co nie ma znaczenia, może tam ponownie wylądować.
- Powyższe pola ascii służą przejrzystości, nie należy ich rysować.
- Możesz wybrać własny rozmiar płótna, o ile jest to uzasadnione. Na przykład nie może mieć tylko kilku pikseli wysokości. Powinien też być w stanie zmieścić wszystkie znajdujące się na nim pudełka.
- Jeśli twój kod śpi między ramkami, nie musisz dodawać go do swojej liczby bajtów.
Pomiędzy każdą z maksimów powinny być luki, minima. Powinna mieć taką samą szerokość jak pudełko, ale żadne cząstki tam nie wylądują. Zobacz poniższy schemat:
+---+---+---+---+---+
| | | | | |
|max|min|max|min|max|
| | | | | |
+---+---+---+---+---+
Program powinien działać, dopóki nie zostanie zatrzymany ręcznie.
Zasady
- Generator liczb pseudolosowych (pRNG) jest w porządku.
- Standardowe luki są zabronione.
- Dane wejściowe mogą być pobierane w dowolnym rozsądnym formacie.
- Powinieneś wyprowadzać dane do STDOUT.
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź.
Przykład
Poniższy plik GIF jest przykładem uruchomienia dla n = 5
. Podrzuciłem go tylko szybko, więc szanse mogą być nieznaczne.
Odpowiedzi:
Python 2,
207200 bajtówObiecuję, że istnieje metoda na to szaleństwo. Podąża za interpretacją prawdopodobieństwa, którą skomentowałem w PO.
Edycja: -7 bajtów poprzez sprytną leniwą ocenę (i usunięcie niektórych znaków)
źródło
BASH, 396–11 = 385 bajtów
Niestety nie mogę tego zademonstrować na TryItOnline z powodu niekończących się sekwencji ucieczki pętli i ANSI, które poruszają kursorem, ale nadal możesz skopiować i wkleić go do swojego terminalu!
Wersja nieuprawniona:
źródło
$[ ]
Zamiast$(( ))
. Zamiast tegofor i in `seq $((($1+1)/2)) -1 1`;do ...;done
spróbujfor((i=($1+1)/2;i>0;i--));{ ...;}
. Zamiast tego[ $(($RANDOM%2)) -eq 1 ]
spróbuj((RANDOM%2))
.sector
,SS
itp. należy zastąpić 1 nazwą zmiennej char.Mathematica, 231 bajtów
Wejście
wynik
źródło
C # (.NET 4.5),
319254 bajtówZaoszczędź 65 bajtów dzięki TheLethalCoder!
Uff, to było dużo pracy, ale jakoś działa.
Ponieważ wykorzystuje to
Console
określone funkcje i tryb uśpienia wątku, niestety nie będzie działać na TIO.źródło
Action<int>
aby zapisać bajty,while(true)
-> (while(1>0)
->for(;;)
.using C=Console;
Lubusing 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
błędów.Clojure + Quil, 394 bajty
Cóż, na pewno nie wygrałem, ale to był dobry trening mózgu! Być może wybrałem zbyt rondo, ale to działa! Zasadniczo, jak to działa:
Wartości x każdej kolumny są obliczane na podstawie
n
. Następnie „aktywne kolumny”, które będą zawierać kropki, są odfiltrowywane. Kolumny są następnie spakowane z możliwością wybrania.Rozpocznie się animacja i do każdej klatki zostanie wprowadzona pętla. Zaczynając od środka, wypróbowywana jest każda para kolumn. Po wybraniu jednej pary kolumn losowo wybierana jest jedna kolumna z pary.
Kropka jest rysowana w losowej pozycji w wybranej kolumnie, wewnętrzna pętla wychodzi i rozpoczyna się nowa klatka.
Korzysta z biblioteki graficznej Quil, która jest zasadniczo opakowaniem przetwarzania dla Clojure.
Uwaga: kod w golfa nie generuje takiej samej animacji, jak pokazano w pliku GIF. W kodzie golfowym tło jest szare, a okno i kropki są mniejsze. Ma ten sam efekt, po prostu nie jest tak ładny.
Zobacz objaśniony kod, aby uzyskać szczegółowe wyjaśnienie:
źródło
C #, 238 bajtów
Wypróbuj online!(To nie zadziała, ale wiesz).
Wersja pełna / sformatowana:
źródło