Gravity Guy to gra, w której jedynym wkładem użytkownika jest pojedynczy klawisz, który zmienia kierunek grawitacji. Biorąc pod uwagę poziom sztuki ASCII, ustal, czy Gravity Guy może dojść do końca.
Zasady
- Początkowy kierunek grawitacji jest w dół .
- Pierwsza kolumna danych wejściowych zawsze będzie zawierać tylko jedną
#
, od której zaczyna się Gravity Guy . - W każdej iteracji przechodzi do postaci bezpośrednio po jego prawej stronie .
- Jeśli jego ścieżka jest zablokowana, a on porusza się do
#
, gracz przegrywa . - Po przeprowadzce gracz może opcjonalnie przełączać grawitację z dołu na górę lub z góry na dół.
- Gravity Guy następnie przechodzi do następnego
#
(w bieżącym kierunku grawitacji). - Jeśli nie ma
#
na co wpadać, a on spadnie z pola , gracz przegrywa . - Jeśli Gravity Guy zejdzie z prawej strony siatki wejściowej, gracz wygrywa .
Przykład
Jeśli to była siatka wejściowa:
###
# # #
###
Gravity Guy zaczynałby x
się w tych pozycjach po każdej iteracji. ^
= przełączyć grawitację w górę i v
= przełączyć grawitację w dół.
v ^ v
-------------------------------------------------------------
### | ### | ### | ### | ### | ###
x | | x | x | x |
# # | #x # | # # | # # | # # | # # x
### # | ### # | ### # | ### # | ### # | ### #
Jak widać, przełączając grawitację w tych czasach Gravity Guy osiąga koniec, więc to wejście zwróci prawdziwą wartość.
Dane techniczne
- Siatka wejściowa może być w dowolnym odpowiednim formacie „siatka” (ciąg wielowierszowy wypełniony spacjami, tablica ciągów linii, tablica znaków itp.).
- Jeśli jest to możliwe dla gracza, aby wygrać poziomie, wyjście na
truthy
wartość. Jeśli nie, wpiszfalsey
wartość. - Szerokość i wysokość siatki będą
50
najwyżej znakami. - To kod-golf , niech wygra najkrótszy kod w bajtach!
Przypadki testowe
(każdy przypadek oddzielony ----------
dowolnymi pustymi liniami należy również uzupełnić spacjami)
Prawdziwe
######### ######## ###### ######
# # # # # # #
### # # # # # # # # #
# ## # # ## # # # # # ##
# # # # # # # # # #######
# # # # # ### # #
# ## # ## # # # #
# # # # # #
# #################################### #
# #
#############################################
----------
###
----------
#####
####
----------
#####
# # #
# # #
#####
----------
############
###### ######
############
----------
### ###
# #
#### # ####
# #
# #
#
----------
######
#
##
#######
### #
# #
#####
----------
#####
# #
## #
#######
###
#
######
----------
###
# # #
###
----------
### ###
### ##
# #
#####
----------
#
# #
#
# # #
#
#
#
#
----------
##### ####
# # #
# # # ## #
# #
##### #### #
#
#########
----------
###########################
# # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
Fałszywe
###
#
####
----------
### ###
----------
#
### ###
#### ###
#
----------
### ###
# # #
#### # # ####
# #
# #
# #
#
----------
#######
# #
## #####
### ######
# #
#######
----------
###########################
# # # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
code-golf
ascii-art
decision-problem
użytkownik 81655
źródło
źródło
column
typ, to byłoby OK do użycia.#
pierwsza kolumna znajdowała się w pierwszym rzędzie?Odpowiedzi:
Ślimaki , 15 bajtów
Wypróbuj online?
0.
^
jest opcją, która wymaga, aby wzorzec zaczynał się w lewym górnym rogu.\
: dopasuj miejscen
: Obróć o 90 stopni w dowolnym kierunku\ ,
: dopasuj spację zero lub więcej razy=\#
sprawdź, czy jest#
przed namir
: ustaw kierunek w prawo}+
: wykonaj wszystkie poprzednie jeden lub więcej razy~
dopasuj komórkę, która jest poza granicami siatkiźródło
Perl,
93898177767574 bajtówObejmuje +2 za
-0p
Uruchom ze wzorcem wejściowym (ze wszystkimi wierszami wypełnionymi spacją na tej samej długości) na STDIN:
gravity.pl
:Ta wersja oparta na plikach wymaga ostatniego nowego wiersza, czyli tak naprawdę 75 bajtów. Ale wersja oparta na linii poleceń nie potrzebuje tej nowej linii, więc liczy się to jako 74 bajty:
Wyjaśnienie:
Spowoduje to skonstruowanie sznurka z
w
grawitacją w każdej pozycji, jaką facet może osiągnąć. Tak więc od drugiego do ostatniego zgodnego z prawdą przykładu zbuduje:Facet z grawitacją może to zrobić tylko wtedy, gdy jest
w
w ostatniej kolumnie. Sznurek zostanie zbudowany przez zastąpienie jednego dostępnego miejscaw
w każdej rundzie.Każda wymiana będzie miała formę
który będzie wymagał, aby spacja była poprzedzona prefiksem, a po niej postfiksem, ale zastąpi tylko spację
w
bez potrzeby dużej ilości zaawansowanego grupowania.Załóżmy, że
$n
zawiera wyrażenie regularne, które będzie się rozwijało na tyle, że lewa i prawa strona będą dokładnie pod sobą. Odpowiednie wyrażenia regularne to:Dzięki temu program jest prosty:
źródło
JavaScript (ES6), 174 bajty
Pobiera poziomy ciąg ciągów i zwraca liczbę punktów wyjścia. Transpozycja tablicy kosztuje mnie 29 bajtów. Nie golfowany:
źródło
Pip ,
85686259 + 1 = 60 bajtówUżywa
-r
flagi do odczytu wszystkich linii standardowego wejścia.Wypróbuj online!
Krótkie wyjaśnienie
Strategia jest zasadniczo szerokim wyszukiwaniem. Transponujemy dane wejściowe i pętlę nad liniami (kolumnami), zachowując listę pozycji Y, które gracz może osiągnąć w tej kolumnie. Wyjście po ostatniej kolumnie jest niepustą listą, jeśli gracz może wygrać, lub pustą listą (która drukuje się jako końcowa nowa linia), jeśli gracz przegra.
Pełne wyjaśnienie
Wbudowany w zmiennych wykorzystywanych w tym programie:
i == 0
,l == []
,s == " "
.-r
Flag umieszcza listę linii wejścia językg
.FcZg{...}
zamkig
i pętle nad każdą kolumnąc
. (UnaryZ
, po zastosowaniu do listy iterowalnych, działa jak Pythonzip(*g)
, porządnie transponując tablicę 2D.) Zauważ, żec
będzie to lista, a nie ciąg znaków.Wewnątrz pętli kolumny resetujemy
y
się do pustej listy przezY
ankingl
.Fxi
zapętla sięi
. W późniejszych iteracjachi
pojawi się lista współrzędnych y, do których gracz był w stanie dotrzeć w poprzedniej kolumnie. Za pierwszym razem chcemy zacząć od0
(lewy górny róg). Zmienna jest wstępnie zainicjalizowana na Skalar0
, a nie na Listę[0]
, ale Pip iteruje po niej w porządku.Dla każdej prawidłowej pozycji w ostatniej kolumnie
Ic@xQs
sprawdza, czy w tej pozycji jest spacja w bieżącej kolumnie. Jeśli nie, gracz po prostu wpadł na ścianę i przechodzimy do następnej możliwości. Jeśli tak, to chcemy znaleźć pozycje, na które gracz spadnie w tej kolumnie dla każdego kierunku grawitacji, i dodać je do listyy
za pomocą operatoraP
ushB
ack.Grawitacja w górę (w lewo, w wersji transponowanej):
Grawitacja spada (w prawo, w wersji transponowanej):
Jeśli gracz spadnie z siatki w określonym kierunku, odpowiednia
@?
operacja nie znajdzie znaku#
i da zero. To nie jest poprawny indeks i wygeneruje ostrzeżenia w następnej iteracji - które jednak nie są widoczne bez-w
flagi. Dla naszych celów przypadki te są zasadniczo wykluczone z rozpatrzenia.Po wewnętrznej pętli
i:UQy
bierze listęy
zbudowanych przez nas pozycji, eliminuje duplikaty i przypisuje jąi
. (Eliminowanie duplikatów jest konieczne, ponieważ w przeciwnym razie lista będzie się wykładniczo wykładniczo.) Następnie przechodzimy do następnej kolumny. Gdy przejdziemy przez wszystkie kolumny, jeśli istnieje prawidłowa ścieżka,i
pojawi się niepusta lista pozycji (prawda); jeśli nie, będzie to pusta lista (falsey).źródło