Wprowadzenie
W tym wyzwaniu przeprowadzimy symulację pewnego probabilistycznego automatu komórkowego przy użyciu bardzo złych liczb pseudolosowych. Automat komórkowy jest zdefiniowany na ciągach binarnych według następującej reguły lokalnej. Załóżmy, że lewy sąsiad komórki i sama komórka mają stany a
i b
.
- Jeśli
min(a,b) == 0
, to nowy stanb
tomax(a,b)
. - Jeśli
min(a,b) == 1
, to nowy stanb
jest wybierany losowo z{0,1}
.
Poniższy obrazek pokazuje jedną możliwą 10-etapową ewolucję jednego 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Zauważ, jak dwa sąsiednie 1
s czasami ewoluują do 1
, a czasami do 0
, a najbardziej graniczne bity są zawsze 1
s. Twoim zadaniem jest wytworzenie ewolucji automatów komórkowych tej formy.
Wejścia
Twoje dane wejściowe są dodatnią liczbą całkowitą n
, oznaczającą liczbę wierszy do wyświetlenia, oraz niepustą listę bitów L
, których używamy jako źródła losowości.
Wynik
Twój wynik to lista list lub dwuwymiarowy zestaw bitów, przedstawiający ewolucję pojedynczego 1
dla n
kroków czasowych, jak na powyższym rysunku. Możesz wypełnić dane wyjściowe za pomocą 0
s, aby uzyskać rzędy o równej długości, jeśli to pożądane, ale nie może być wiodących 0
s.
Losowe wybory w automacie komórkowym muszą być narysowane z listy L
, przeskakując z powrotem na początek, kiedy się wyczerpie. Mówiąc ściślej, jeśli dane wyjściowe są przesuwane po jednym wierszu od góry do dołu, od lewej do prawej, kolejne losowe wybory tworzą listęL
powtarzaną tyle razy, ile to konieczne.
Przykład
Załóżmy, że dane wejściowe to n = 7
i L = [0,1,0]
. Następnie automat komórkowy ewoluuje w następujący sposób podczas 7 kroków, gdzie postawiliśmy v
prawo nad każdym przypadkowym wyborem:
[1]
[1,1]
v
[1,0,1]
[1,1,1,1]
v v v
[1,1,0,0,1]
v
[1,1,1,0,1,1]
v v v
[1,0,0,1,1,1,1]
Jeśli odczytamy wszystkie bity oznaczone a v
, otrzymamy 01001001
, co L
powtarza się 2,66 razy. Kolejny losowy bit to0
.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone. Dokładny format danych wejściowych i wyjściowych jest nieistotny (z uzasadnionego powodu).
Przypadki testowe
Wersja deterministyczna, każdy losowy bit to 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Każdy losowy bit to 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Wersje pseudolosowe:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
źródło
min(a,b)
za+b>1
imax(a,b)
zea+b
? Zdaję sobie sprawę, że prawdopodobnie będziesz musiał zrobić coś, aby poradzić sobie z pierwszym przypadkiem1
->11
(myślę, że możeszL=[1]+f()...
, lub znaleźć sposób na wstawienie 1 z przodu,L
ponieważ to zawsze wyskakuje 1 dla drugiej linii)r[x-1]&r[x] else
:)MATLAB,
146143138(Działa również na Octave online, ale musisz się zalogować, aby zapisać funkcję w pliku).
Funkcja pobiera dane wejściowe
n
iL
zwraca tablicęo
zawierającą dane wyjściowe.Dla wartości wejściowych
n
jest skalarem iL
jest wektorem kolumny, który można określić w formacie[;;;]
. Nie do końca to, co pokazujesz, ale mówisz, że jest elastyczny w granicach rozsądku i wydaje się, że tak.Dane wyjściowe są sformatowane jako
n x n
tablica zawierająca zera i jedynki.I wyjaśnienie:
Aktualizacja: Udało mi się zoptymalizować instrukcję if-else, aby zaoszczędzić kilka bajtów. Format wejściowy ponownie zmienił się z powrotem na wektor kolumny.
źródło
Haskell,
153149 bajtów%
zwraca listę list bitów. Przykład użycia:O jej! Przenoszenie losowej listy
L
jest czystym bólem. Zobaczmy, czy może to być krótsze.źródło
C #, 152 bajty
Nie ma tu nic specjalnego. Funkcja zwraca tablicę 2D, w której pierwszy stopień jest linią, a drugi kolumną.
Wcięte i nowe linie dla przejrzystości:
źródło
TI-BASIC,
10694878687 bajtówTI-BASIC nie ma operatora przyrostowego, prawda? Cóż, tak się dzieje. Zmienna równania
u
, zwykle używana z sekwencjami, ma niejasną cechę: gdyu
jest wywoływana z argumentem, zmienna𝑛
jest ustawiana na wartość większą niż ten argument. Od tego zależy przyrost warunkowy. (Długo czekałem na jego użycie).Aby indeksowanie list działało poprawnie,
𝑛
jego domyślna wartość musi wynosić 0, a𝑛Min
domyślna wartość 1, więc wyczyść pamięć RAM kalkulatora lub ustaw te wartości ręcznie przed uruchomieniem.augment({0},Ans)+augment(Ans,{0
oblicza listę sum dwóch sąsiednich elementów, więc zwróci listę zer, 1 i 2. Zatem magia jest na tej linii:Wynikiem tego wiersza będzie to, że elementy listy mają wartość 0, jeśli były równe 0 lub były równe 2, a odczytany bit wynosił 0.
Przypadek testowy:
źródło