Folie bąbelkowe to rozrywka na najwyższym poziomie. Każdy może się na to zgodzić.
Teraz sprawisz, że nawet komputery będą cieszyć się bąbelkami.
Okular
Otrzymasz dwie liczby całkowite, w i h. (Każda ma odpowiednio szerokość i wysokość)
Twój program powinien wypisać wszystkie fazy w * h, czekając 1 sekundę między nimi i zakończyć.
Każde zawijanie bąbelków zaczyna się od wypełnienia wszystkich komórek.
Na przykład zawijanie bąbelków 4 * 6 zaczyna się tak:
O_O_
_O_O
O_O_
_O_O
O_O_
_O_O
I w każdej fazie wyskakuje losowa, niepopuszczona komórka. Na przykład:
O_O_
_O_O
O_X_
_O_O
O_O_
_O_O
Program powinien zakończyć się, gdy wszystkie komórki zostaną usunięte. znany jako.
X_X_
_X_X
X_X_
_X_X
X_X_
_X_X
Przykłady
(4,6)
(5,5)
(6,2)
(10,10)
(7,9)
1
i0
zamiastO
iX
?(1,1)
aby nie mieć bąbelków (np. Górna lewa „komórka” jest zawsze podkreśleniem)?Odpowiedzi:
C (Windows),
260248 bajtówźródło
system("cls")
jest również specyficzny dla systemu Windows, więc kod nie byłby bardziej przenośny z biblioteką wątków. A w C ++ musiałbym również dołączyćiostream
lubcstdio
.Python 3 ,
222220 bajtówTo moja pierwsza odpowiedź, więc proszę, bądź łagodny (i wskaż błędy, które popełniłem).
Wypróbuj online!
Jak to działa:
r*c+r%2*c%2
czasy:r*c
we wzorze są bąbelki, chyba że r i c są nieparzyste, w takim przypadku sąr*c+1
.źródło
f(c,r)
a wszystko będzie dobrze).MATL , 37 bajtów
Lewy górny róg jest zawsze znakiem podkreślenia (dozwolonym przez wyzwanie).
Ekran jest czyszczony między fazami. Mógłbym zapisać bajt, nie czyszcząc ekranu, ale w ten sposób wygląda lepiej.
Program kończy pracę z błędem ( domyślnie dozwolonym ) po wyświetleniu wszystkich faz.
Wypróbuj w MATL Online! (Jeśli nie działa po kilku sekundach, odśwież stronę i spróbuj ponownie).
źródło
Matematyka (145 bajtów)
Funkcja anonimowa, bierze wysokość i szerokość jako wejścia (w tej kolejności - jeśli to jest problem, wymień
{##}
się{#2,#}
w środku kodu za dodatkowe 2 bajty).Kod:
Wyjaśnienie:
""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"]
tworzy początkowe, nieopakowane zawijanie bąbelków, tworząc tablicę znaków „_” i „O”, a następnie łącząc je między znakami nowej linii.NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]
wielokrotnie wybiera jedno z „O”, aby zastąpić je „X”, tyle razy, ile jest „O” (czyli Floor [szerokość * wysokość / 2] - dzięki @JonathanAllan za pomysł wprowadzenia „_ „zamiast„ O ”w lewym górnym rogu, w przeciwnym razie byłoby toCeiling
zamiast tego i 2 bajty więcej).Monitor[Do[Pause@1,{i,...}],i]
powodujei
pobranie wartości z listy, którą właśnie obliczyliśmy, przez 1 sekundę i dynamicznie drukujei
.Przykładowe dane wyjściowe:
źródło
Galaretka ,
3029 bajtówWywołuje link jako diad z argumentami programu, a następnie kończy działanie z komunikatem (dla którego kodu jest
çṛ“\'=ṙMḋḌẓ(ėo»
)Niuans: „komórka” w prawym dolnym rogu zawsze będzie bąbelkiem (a nie w lewym górnym rogu, jak w przykładzie w pytaniu), aby zapewnić, że gdy wszystkie bąbelki zostaną wyskakujące, losowy wybór zwraca 0, która będzie
"X"
na koniec listy - zastąpienie tego nie powoduje zmiany wartości i przerywa pętlę.Uwaga: nie usuwa ekranu (nie określono i nie jestem pewien, jak to zrobić).
W jaki sposób?
źródło
Scala , 764 bajty
Jak to działa
Algorytm najpierw wypełnia sekwencję 2D fałszywymi wartościami. Określa liczbę iteracji (otwartych pól) na podstawie wprowadzonych argumentów wiersza poleceń. Tworzy fałd z tą wartością jako górną granicą. Wartość całkowita zwijania jest używana domyślnie tylko jako sposób na zliczenie liczby iteracji, dla których algorytm powinien działać. Wypełniona sekwencja, którą wcześniej utworzyliśmy, jest sekwencją początkową składania. Służy to do generowania nowej sekwencji 2D fałszywych wartości z ich współodpowiedzialnymi indecies.
Na przykład,
Zostanie zamieniony w
Zauważ, że wszystkie listy, które są całkowicie prawdziwe (mają długość 0) są pomijane na liście wyników. Algorytm następnie pobiera tę listę i wybiera losową listę z listy najbardziej oddalonych. Losowa lista jest wybrana jako losowy rząd, który wybieramy. Z tego losowego wiersza ponownie znajdujemy losową liczbę, indeks kolumny. Kiedy znajdziemy te dwa losowe wskaźniki, uśpimy wątek, w którym jesteśmy, przez 1000 milisekund.
Po snu wyczyścimy ekran i utworzymy nową tablicę z
true
wartością zaktualizowaną w losowych indeksach, które stworzyliśmy.Aby wydrukować to poprawnie, używamy
map
i kompresujemy ją wraz z indeksem mapy, abyśmy mieli to w swoim kontekście. Używamy prawdziwej wartości sekwencji, aby sprawdzić, czy powinniśmy wydrukowaćX
albo czyO
albo_
. Aby wybrać ten drugi, używamy wartości indeksu jako naszego przewodnika.Ciekawe rzeczy do odnotowania
Aby dowiedzieć się, czy należy wydrukować an,
O
czy an_
,((r._2 % 2) + c._2) % 2 == 0
używa się warunkowej .r._2
odnosi się do bieżącego indeksu wierszy, ac._2
odnosi się do bieżącej kolumny. Jeśli jeden jest w nieparzystym rzędzie,r._2 % 2
będzie wynosił 1, a zatem zostanie przesuniętyc._2
o jeden w warunkowym. Zapewnia to, że w nieparzystych wierszach kolumny są przesuwane o 1 zgodnie z przeznaczeniem.Wydrukowanie łańcucha
"\033[H\033[2J\n"
, zgodnie z przeczytaną odpowiedzią Stackoverflow, czyści ekran. Pisze bajty do terminala i robi fajne rzeczy, których tak naprawdę nie rozumiem. Ale uważam, że jest to najłatwiejszy sposób, aby to zrobić. Jednak nie działa na emulatorze konsoli Intellij IDEA. Będziesz musiał uruchomić go za pomocą zwykłego terminala.Innym równaniem, które może wydawać się dziwne, gdy patrzymy na ten kod po raz pierwszy, jest
(l * k) / 2 - (l * k + 1) % 2
. Najpierw odmytajmy nazwy zmiennych.l
odnosi się do pierwszych argumentów przekazanych do programu, podczas gdyk
odnosi się do drugiego. Aby przetłumaczyć go(first * second) / 2 - (first * second + 1) % 2
. Celem tego równania jest wymyślenie dokładnej liczby iteracji potrzebnych do uzyskania sekwencji wszystkich X-ów. Za pierwszym razem, gdy to zrobiłem, zrobiłem to, co miało(first * second) / 2
to sens. Dla każdegon
elementu w każdej podlistie sąn / 2
bąbelki, które możemy otworzyć. Jednak to się psuje, gdy mamy do czynienia z takimi danymi wejściowymi jak(11 13)
. Musimy obliczyć iloczyn dwóch liczb, uczynić go nieparzystym, jeśli jest parzysty, a nawet jeśli jest nieparzysty, a następnie przyjąć mod tego o 2. Działa to, ponieważ nieparzyste wiersze i kolumny będą wymagały jednej mniej iteracji aby dojść do końcowego wyniku.map
jest używany zamiast a,forEach
ponieważ ma mniej znaków.Rzeczy, które prawdopodobnie można poprawić
Jedną z rzeczy, które naprawdę mnie denerwują w tym rozwiązaniu, jest częste używanie
zipWithIndex
. Zajmuje tak wiele postaci. Próbowałem to zrobić, aby móc zdefiniować własną funkcję jednoznakową, która po prostu działałabyzipWithIndex
z przekazaną wartością. Okazuje się jednak, że Scala nie pozwala, aby funkcja anonimowa miała parametry typu. Jest prawdopodobnie inny sposób robienia tego, co robię bez użycia,zipWithIndex
ale nie myślałem zbyt wiele o sprytnym sposobie zrobienia tego.Obecnie kod działa w dwóch przebiegach. Pierwszy generuje nową planszę, podczas gdy drugie przejście drukuje ją. Myślę, że gdyby połączyć te dwa przejścia w jedno przejście, zaoszczędziłoby to kilka bajtów.
To pierwszy kod golfowy, jaki zrobiłem, więc jestem pewien, że jest wiele do zrobienia. Jeśli chcesz zobaczyć kod, zanim zoptymalizuję jak najwięcej bajtów, oto jest.
źródło
JavaScript (ES6),
246229 bajtówźródło
`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}
jakoś połączyć? Może logiczna-flag, aby najpierw ustalić,_O
czyO_
, a następnie wykonać.repeat(w).slice(w)
?Python - 290 bajtów
Nigdy wcześniej tego nie robiłem - więc każda konstruktywna krytyka byłaby mile widziana :)
Główną sztuczką jest po prostu irytujące zagnieżdżenie list. Mógłbym uratować kilka postaci, nie mając nowej linii między popami, ale to po prostu wygląda brzydko.
źródło
w
ih
jako danych wejściowych (poprzez STDIN, jako dane wejściowe funkcji lub coś podobnego) zamiast na stałeH=4 W=6
. Ponadto, chociaż nigdy nie programowałem w Pythonie, myślę, że możesz zagrać w golfa w niektórych miejscach w swoim obecnym kodzie. Wskazówki dotyczące gry w golfa w Pythonie mogą być również interesujące, aby dać ci pomysły na dalsze gry w golfa. Miłego pobytu! :)Węgiel drzewny ,
494639 bajtów (niekonkurencyjny)Gadatliwy
źródło
APL (Dyalog) ,
6159 bajtów⎕←
wyprowadzam←
m , gdzie m jest'O_'[
…]
te znaki indeksowane według…2|
dzielenia-reszty-kiedy-podzielonej-przez-dwóch-/¨
różnic między każdym z⍳
wszystkich współrzędnych (indeksów) w tablicy danych⎕
liczbowych kształtu (liczba wierszy i kolumn )(
...)[
...]←'X'
przypisać postać X do jednego z ...b/
odfiltrowanym ubocznego B (do określenia),m
raveled elementów m, szczególnie ...?
element losowy (numer Lit.) w jednym obszarze do+/
sumab←
b , gdzie b jest'O'=
logiczna gdzie litera jest równa,m
m, poszarpana⎕DL 1
re E L Ay jedna sekunda→2
Przejdź do wiersza 2,/⍨
jeśli (lit. Przefiltrowane przez),'O'∊
czy list jest członkiem⎕←m
wartości wyjściowej, gdzie wartość wyjściowa wynosi mWypróbuj online!
Od wersji 16.0 będzie on krótszy:
{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]
źródło
Python 3,
195188 bajtówUżywanie
bytearray
idecode
wydaje się być krótsze niż krojenie i ponowne składanie łańcucha a laa[:i]+'X'+a[i+1:]
.źródło
Java 7, 317 bajtów
Wyjaśnienie:
Test gif (4,6)
źródło
Perl, 148 bajtów
146 bajtów kodu +
-pl
flagi.Aby uruchomić:
źródło
MATLAB (R2016b), 172 bajty
Kod:
Zalecenia są zawsze mile widziane! Wypróbuj online!
Wyjście programu:
Wyjaśnienie:
źródło