tło
Tak, fizyka bitstrów to prawdziwa rzecz . Chodzi o to, aby skonstruować nową teorię fizyki przy użyciu tylko ciągów bitów, które ewoluują zgodnie z regułą probabilistyczną ... Pomimo przeczytania kilku artykułów na ten temat, nadal jestem dość zdezorientowany. Jednak wszechświat bitstrowy tworzy fajny mały golf.
Program Universe
Fizyka bitów ma miejsce w tak zwanym wszechświecie programowym . Na każdym etapie ewolucji wszechświata istnieje skończona lista L
ciągów bitów o pewnej długości k
, zaczynająca się od dwuelementowej listy [10,11]
gdzie k = 2
. Jeden timepep jest przetwarzany w następujący sposób (w pseudokodzie podobnym do Pythona).
A := random element of L
B := random element of L
if A == B:
for each C in L:
append a random bit to C
else:
append the bitwise XOR of A and B to L
Wszystkie losowe wybory są jednakowo losowe i niezależne od siebie.
Przykład
Przykładowa ewolucja 4 kroków może wyglądać następująco. Zacznij od początkowej listy L
:
10
11
Losowo wybieramy A := 10
i B := 10
, które są tym samym rzędem, co oznacza, że musimy rozszerzyć każdy ciąg L
o losowy bit:
101
110
Następnie możemy wybrać A := 101
i B := 110
, a ponieważ nie są one równe, dodamy ich do XOR L
:
101
110
011
Następnie możemy wybrać A := 011
i B := 110
, i ponownie dołączyć ich XOR:
101
110
011
101
Na koniec wybieramy A := 101
(ostatni wiersz) i B := 101
(pierwszy wiersz), które są równe, dlatego rozszerzamy losowymi bitami:
1010
1100
0111
1010
Zadanie
Twoim zadaniem jest przyjęcie nieujemnej liczby całkowitej t
jako danych wejściowych, symulacja wszechświata programu pod kątem t
kroków czasowych i zwrócenie lub wydrukowanie wynikowej listy L
. Zauważ, że t = 0
wynikiem jest początkowa lista [10,11]
. Możesz wyprowadzać L
jako listę list liczb całkowitych, listę wartości boolowskich lub listę ciągów; jeśli wyjście przechodzi do STDOUT, możesz także wydrukować ciągi bitów po jednym w wierszu w rozsądnym formacie. Kolejność ciągów bitów jest znacząca; w szczególności, początkowa lista nie może być [11,10]
, [01,11]
lub coś podobnego. Zarówno funkcje, jak i pełne programy są dopuszczalne, standardowe luki są niedozwolone, a wygrywa najmniejsza liczba bajtów.
Odpowiedzi:
Pyth,
2726 bajtówWypróbuj online: demonstracja
Wyjaśnienie:
źródło
xVFK
jest równoważne zxMK
.xVFK
odpowiada tejxMCK
samej liczbie bajtów.CJam,
42403837 bajtów1 bajt zapisany przez Sp3000.
Wyjaśnienie
Utwórz stan początkowy jako liczbę podstawową 2:
Następnie wykonaj główną pętlę i wydrukuj wynik na końcu:
Sprawdź to tutaj.
źródło
Julia,
141129 bajtówNic sprytnego. Tworzy nienazwaną funkcję, która przyjmuje liczbę całkowitą jako dane wejściowe i zwraca tablicę tablic. Aby to nazwać, nadaj mu nazwę, np
f=t->...
.Niegolfowane + wyjaśnienie:
Przykłady:
Zaoszczędź 12 bajtów dzięki ML!
źródło
A=something;B=something else to A,B=something,something else
:t->(L=Any[[1,0],[1,1]];for i=1:t r=1:length(L);A,B=L[rand(r)],L[rand(r)];A==B?(for j=r L[j]=[L[j],rand(0:1)]end):(push!(L,A$B))end;L)
A
iB
osobno jest w rzeczywistości tej samej długości co przypisywanie ich razem, więc zostawiłem tę część taką, jaka jest. Jeszcze raz dziękuję za sugestię!Python 2, 141
Wypróbowałem kilka różnych metod, ale najlepsze, co mogłem uzyskać, było stosunkowo proste. Dzięki @ Sp3000 za około 15 znaków (i za nauczenie mnie o istnieniu
int.__xor__
).źródło
Python 2,
127122Zakładając, że ciągi bitów python formularza
'0b1'
itp. Są OK:Jedynym łagodnym niuansem jest wykorzystanie faktu, że XOR (A, B) = 0 iff A = B.
Dzięki @ Sp300 za skrócenie zamykającej
for
pętliźródło
Pyth, 34
Zastosowania zmniejszają, aby zastosować każdą iterację. Wyjaśnię, kiedy skończę grać w golfa.
Wypróbuj tutaj
źródło
K,
465346 bajtówSpora część tego rozmiaru (około 7 bajtów) ma związek z faktem, że K nie ma
xor
operatora, więc musiałem go zaimplementować. Początkowo użyłem listy ciągów, po czym zdałem sobie sprawę, że to było szalenie głupie. Więc teraz ponownie odciąłem 7 bajtów!Przed:
@JohnE zauważył w komentarzach, że stan początkowy miał być zakodowany na stałe, co kosztuje 7 dodatkowych bajtów. : /
źródło
(1 0;1 1)
- twój program przyjmuje to jako dane wejściowe.JavaScript ( ES6 ) 152
Funkcja wykorzystująca ciągi znaków (z liczbami powinna być krótsza, ale w bitach javascript operacje bitowe są ograniczone do 32-bitowych liczb całkowitych).
Przetestuj w Firefoksie za pomocą poniższego fragmentu.
źródło
K,
454138 bajtówStruktura mojej odpowiedzi jest dość podobna do @ kirbyfan64sos, ale zamiast łańcuchów użyłem wektorów 1/0 i unikam potrzeby warunkowej (
:[ ; ; ]
), zamiast indeksowania do listy.Kilka biegów:
Edytować:
Zaoszczędzono cztery bajty w bardziej kompaktowy sposób na zbudowanie początkowego wszechświata:
Edycja2:
Zapomniałem, że „wybierz” może przyjąć listę jako swój właściwy argument:
Mogę uprościć część tego. Kredyt tam, gdzie jest to należne, Kirby dostała tę sztuczkę, zanim to zrobiłem.
źródło
JavaScript,
241233 bajtówTo trochę długo.
źródło
for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{for(h=0,g=[];h<d.length;)g.push(d[h]^e[h++]);a.push(g)}}alert(a.join("\n"))
generuje pożądane wyjście 3/5 czasu.for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{g=[];for(h=0;h<d.length;h++)g.push(d[h]^e[h]);a.push(g)}}alert(a.join("\n"))
działa 90% czasu.T-SQL (2012+), 1019
Naprawdę przepraszam, że nie jest to zbyt konkurencyjne, ale szczerze mówiąc, nie sądziłem, że uda mi się to uruchomić i musiałem to opublikować. Próbowałem trochę zagrać w golfa :)
Aby obsłużyć konwersje binarne / całkowite musiałem stworzyć kilka funkcji skalarnych (513 bajtów).
A
przechodzi z liczby całkowitej na ciąg bitowy.B
robi odwrotnie.Następnie jest procedura.
@C
to liczba krokówDziesięć tysięcy iteracji zajęło około 2 minut i zwróciło 9991 wierszy
źródło
Pyth - 37 bajtów
Oczywiście, po prostu postępuje zgodnie z psuedocode. Prawdopodobnie dużo gra w golfa.
Wypróbuj tutaj online .
źródło
O2
zamiastO1
.O1
daje losową liczbę z zakresuU1 = [0]
.0
.Mathematica, 106 bajtów
źródło
Perl, 102
Spróbuj mnie .
źródło
R 186
Nic magicznego tutaj. Wprowadź wartość dla
t
w konsoli R. Uruchom skrypt. Kod R jest trudny do „golfa”, ale oto bardziej czytelna wersja:źródło
sample
do zmiennej. np.s=sample
następnie użyj s zamiast próbki. Niestety myślę, że twoja metoda dodawania losowego bitulapply
zakończy się dodaniem jednej losowej próbki do wszystkich pozycji na liście.lapply(L,function(x)append(x,sample(0:1,1)))
wydaje się działać, ale kosztuje. Można zastąpić cięas.numeric
z1*
co powinno trochę plecy.Ruby, 82
Niemal proste. W porównaniu z innymi językami nie golfowymi, ruby wydaje się dobrze sobie radzić z dużą standardową biblioteką.
Przykładowe dane wyjściowe dla t = 101010:
źródło