tło
Losowe Domino Automat jest model zabawka dla trzęsień ziemi, zainspirowany automatów komórkowych. W tym wyzwaniu Twoim zadaniem jest symulacja uproszczonej wersji tego modelu i zbieranie z niego danych.
Automat jest zdefiniowana w tablicy A
z k
bitów, co stanowi linię podziału, w którym może występować trzęsienia ziemi. Tablica owija się wokół swoich granic. Warunek A[i] = 0
oznacza, że pozycja i
jest zrelaksowana i A[i] = 1
oznacza, że jest podekscytowana lub zawiera zmagazynowaną energię. Na każdym kroku czasowym jedna pozycja tablicy jest wybierana losowo równomiernie. Jeśli ta pozycja jest rozluźniona, staje się podekscytowana (energia potencjalna jest dodawana do systemu). Jeśli ta pozycja jest już podekscytowana, powoduje trzęsienie ziemi, a wybrana pozycja i wszystkie powiązane z nią podekscytowane pozycje są ponownie rozluźnione. Liczba podekscytowanych pozycji, które się rozluźniają, jest wielkością trzęsienia ziemi.
Przykład
Rozważ tablicę
100101110111
o długości 12. Jeśli losowy proces wybierze drugi bit od lewej, tablica zostanie zaktualizowana do
110101110111
^
ponieważ wybrany bit (oznaczony ^
) był 0
. Jeśli następnie wybierzemy czwarty bit od lewej, który jest izolowany 1
, nastąpi trzęsienie ziemi o sile 1 i bit zostanie 0
ponownie ustawiony :
110001110111
^
Następnie możemy wybrać drugi bit z prawej strony, co powoduje trzęsienie ziemi o sile 5:
000001110000
^
Zauważ, że wszystkie 1
s w tej samej „grupie” co wybrana były częścią trzęsienia, a tablica owija się wokół granicy.
Zadanie
Weźmiesz jako wejścia dwie liczby całkowite dodatnie k
a t
, a twoim zadaniem jest symulacja losowy domina automat do t
kroków czasowych, począwszy od początkowego wzdłużnych k
tablicy wszystkich 0
s. Jego wynik będzie lista L
z k
liczb całkowitych, gdzie L[i]
(z indeksowaniem 1-based) zawiera liczbę trzęsień ziemi wielkości i
, które wystąpiły w trakcie symulacji. Możesz usunąć końcowe zera z danych wyjściowych.
Dla danych wejściowych k = 15
i t = 1000
niektórych reprezentatywnych danych wyjściowych są
[117, 97, 45, 26, 10, 5, 3, 1, 3, 0, 0, 0, 0, 0, 0]
[135, 91, 58, 21, 8, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0]
[142, 63, 51, 31, 17, 4, 2, 1, 1, 0, 0, 0, 0, 0, 0]
[106, 75, 45, 30, 16, 8, 5, 2, 2, 0, 0, 0, 0, 0, 0]
[111, 96, 61, 22, 3, 8, 3, 2, 0, 0, 0, 1, 0, 0, 0]
Zasady
Dozwolone są zarówno pełne programy, jak i funkcje. Wygrywa najkrótsza liczba bajtów, a standardowe luki są niedozwolone.
Zauważ, że nie musisz symulować automatu przy użyciu żadnej konkretnej implementacji, liczy się tylko wynik.
Odpowiedzi:
Pyth, 48 bajtów
Trochę zainspirowało mnie wyjaśnienie @ Dennisa. Wczoraj miałem podobne myśli, ale tak naprawdę ich nie śledziłem.
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
CJam,
5755 bajtówJest to anonimowa funkcja, która wyrzuca k i t ze stosu ( k na górze t ) i pozostawia żądaną tablicę w zamian.
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Python 2, 153 bajty
Okazało się, że miałem prawie takie samo rozwiązanie jak Fry'ego , ale z nieco większą ilością majstrowania.
źródło
randrange
, ale nie zdawałem sobie sprawy, że zadziałało to z jednym argumentem. Dobra robota!Java,
278272 bajtówJava nie jest najlepszym językiem golfowym i nie jestem najlepszym golfistą, ale pisanie było fajne, więc oto jest! Daj mi znać o błędach i ulepszeniach! (Postanowiłem przesłać ponownie jako funkcję).
A plik ze spacjami i komentarzami:
źródło
Alt+09
lubd[q]+=1;
w ten sposóbd[q]++;
możesz zwiększać wartość bezpośrednio w tablicach zamiast używać + = wszędzie. To powinno uratować wiele postaci.for(;t>0;t--){
można zmienić nafor(;t-->0;){
: DPython 2,
174170Dzięki @Vioz za znalezienie krótszego sposobu na zrobienie
D
i ponowne udowodnienie, żenot
zwykle jest to gra w golfa. A także do napisania wyjaśnienia.Próbowałem stworzyć podobny program w Pyth, ale wydaje się, że jest problem z zakresem w tym, co próbowałem zrobić. To dość naiwnie implementuje domino, a funkcja
U
propaguje trzęsienia ziemi. Kierunek odejmowania wU
nie wymaga modyfikacji, ponieważ będzie się naturalnie owijał. Ostatni elementE
liczy, ile razy zero jest zamieniane na jeden, więc nie jest drukowane na końcu.Niegolfowany + Objaśnienie:
źródło
D[r]=not e
doD[r]=e<1
oszczędza 2 bajty, iE=[0]*-~k
abyE=D+[0]
zaoszczędzić kolejne 2, aby dostać się na dół do 170.ES6,
224196189179172Łatwe rzeczy zostały zagrane w golfa, ale wciąż jest trochę do zrobienia. Wyjaśnię to później. Ponadto, jeśli ktoś może mi powiedzieć, dlaczego ta krótka
new Date%k
rzecz nie działa już tak dobrze, byłoby to pęczniejące.Wykorzystanie jest
źródło
new
. Nie potrzebujesz tegot
w pętli for, nie potrzebujesz dwóch ostatnich;
a[r]^=1
będzie DEFS pracę, jeśli wartość początkowa jest albo1
albo0
Perl, 212
Poprzednia wersja, którą przygotowałem, nie była poprawnie opakowana, a jej wdrożenie zajęło trochę pracy.
Prawdopodobnie nie jest to odpowiedni algorytm do tego, ale nie mogę teraz myśleć. Wersja bez golfa znajduje się poniżej.
Nie golfowany:
źródło
CJam, 76 bajtów
To nie jest zbyt konkurencyjne. Ale ponieważ zajęło mi to wystarczająco dużo czasu, pomyślałem, że i tak to opublikuję.
Wypróbuj online
źródło