Gravity Guy é um jogo em que a única entrada do usuário é uma única tecla que muda a direção da gravidade. Dado um nível artístico ASCII, determine se é possível que o Gravity Guy chegue ao fim.
Regras
- A direção inicial da gravidade está baixa .
- A primeira coluna da entrada sempre conterá apenas uma
#
, na qual o Gravity Guy inicia . - Cada iteração, ele se move para o personagem diretamente à sua direita .
- Se o caminho dele estiver bloqueado e ele entrar em um
#
, o jogador perde . - Depois de se mover, o jogador pode opcionalmente mudar a gravidade de baixo para cima ou de cima para baixo.
- O Gravity Guy então cai para o próximo
#
(na direção atual da gravidade). - Se não houver
#
alguém para cair e ele cair fora da grade , o jogador perde . - Se o Gravity Guy se mover do lado direito da grade de entrada, o jogador vence .
Exemplo
Se essa era a grade de entrada:
###
# # #
###
O Gravity Guy começaria nas x
posições e estar nessas posições após cada iteração. ^
= alternar a gravidade para cima e v
= alternar a gravidade para baixo.
v ^ v
-------------------------------------------------------------
### | ### | ### | ### | ### | ###
x | | x | x | x |
# # | #x # | # # | # # | # # | # # x
### # | ### # | ### # | ### # | ### # | ### #
Como você pode ver, alternando a gravidade nesses momentos, o Gravity Guy chega ao fim, para que essa entrada retorne um valor verdadeiro.
Especificações
- A grade de entrada pode estar em qualquer formato de "grade" apropriado (cadeia de linhas múltiplas preenchida com espaços, matriz de cadeias de linhas, matriz de matriz de caracteres, etc.).
- Se for possível ao jogador vencer o nível, produza um
truthy
valor. Caso contrário, imprima umfalsey
valor. - A largura e a altura da grade terão
50
no máximo caracteres. - Este é o código-golfe , que o código mais curto em bytes vença!
Casos de teste
(cada caso separado por ----------
, qualquer linha em branco também deve ser preenchida com espaços)
Verdade
######### ######## ###### ######
# # # # # # #
### # # # # # # # # #
# ## # # ## # # # # # ##
# # # # # # # # # #######
# # # # # ### # #
# ## # ## # # # #
# # # # # #
# #################################### #
# #
#############################################
----------
###
----------
#####
####
----------
#####
# # #
# # #
#####
----------
############
###### ######
############
----------
### ###
# #
#### # ####
# #
# #
#
----------
######
#
##
#######
### #
# #
#####
----------
#####
# #
## #
#######
###
#
######
----------
###
# # #
###
----------
### ###
### ##
# #
#####
----------
#
# #
#
# # #
#
#
#
#
----------
##### ####
# # #
# # # ## #
# #
##### #### #
#
#########
----------
###########################
# # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
Falso
###
#
####
----------
### ###
----------
#
### ###
#### ###
#
----------
### ###
# # #
#### # # ####
# #
# #
# #
#
----------
#######
# #
## #####
### ######
# #
#######
----------
###########################
# # # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
code-golf
ascii-art
decision-problem
user81655
fonte
fonte
column
tipo especial , seria bom usá-lo, eu acho.#
primeira coluna esteja na primeira linha?Respostas:
Caracóis , 15 bytes
Experimente online?
0
^
é uma opção que requer que o padrão inicie no canto superior esquerdo.\
: corresponder espaçon
: Gire 90 graus em qualquer direção\ ,
: corresponde ao espaço zero ou mais vezes=\#
verifique se há um#
na nossa frenter
: defina a direção para a direita}+
: faça todas as uma ou mais vezes anteriores~
corresponde a uma célula que está fora dos limites da gradefonte
Perl,
93898177767574 bytesInclui +2 para
-0p
Execute com o padrão de entrada (com todas as linhas de espaço preenchidas no mesmo comprimento) em STDIN:
gravity.pl
:Esta versão baseada em arquivo precisa da nova linha final, ou seja, é de 75 bytes. Mas a versão baseada em linha de comando não precisa dessa nova linha extra, portanto conta como 74 bytes:
Explicação:
Isso construirá uma string com um
w
em cada posição que a gravidade pode alcançar. Portanto, para o penúltimo exemplo de verdade, ele construirá:Então, o cara da gravidade pode fazê-lo se e somente se houver um
w
na última coluna. A sequência será construída substituindo um espaço acessível porw
cada rodada.Cada substituição terá o formato
que exigirá que o espaço seja precedido por prefixo e seguido pelo postfix, mas substitua apenas o espaço por
w
sem a necessidade de muitos agrupamentos avançados.Suponha que
$n
contenha uma regex que progredirá apenas o suficiente para que os lados esquerdo e direito estejam exatamente abaixo um do outro. As regexes relevantes são:Com isso fora do caminho, o programa é fácil:
fonte
JavaScript (ES6), 174 bytes
Toma uma matriz horizontal de seqüências de caracteres e retorna o número de pontos de saída. Transpor a matriz custa 29 bytes. Ungolfed:
fonte
Pip ,
85686259 + 1 = 60 bytesUsa a
-r
bandeira para ler todas as linhas de stdin.Experimente online!
Breve explicação
A estratégia é essencialmente uma busca pela primeira vez. Transpomos a entrada e fazemos um loop pelas linhas (colunas), mantendo uma lista das posições em y que o jogador pode alcançar nessa coluna. A saída após a última coluna é uma lista não-vazia, se o jogador puder vencer, ou uma lista vazia (que imprime apenas como uma nova linha à direita), se o jogador perder.
Explicação completa
Built-in variáveis utilizadas neste programa:
i == 0
,l == []
,s == " "
.A
-r
bandeira coloca uma lista das linhas de entradag
.FcZg{...}
fechag
e fecha sobre cada colunac
. (UnárioZ
, quando aplicado a uma lista de iteráveis, age como Pythonzip(*g)
, transpondo ordenadamente uma matriz 2D.) Observe quec
será uma lista, não uma string.Dentro do loop da coluna, redefinimos
y
a lista vazia porY
ankingl
.Fxi
dá uma voltai
. Nas iterações posteriores,i
haverá uma lista das coordenadas y que o jogador conseguiu alcançar na coluna anterior. Na primeira vez, queremos começar com apenas0
(canto superior esquerdo). A variável é pré-inicializada para um escalar0
, não para uma lista[0]
, mas o Pip faz uma iteração muito boa de qualquer maneira.Para cada uma das posições válidas na última coluna,
Ic@xQs
verifica se há um espaço nessa posição na coluna atual. Caso contrário, o jogador simplesmente colidiu contra uma parede e tentamos a próxima possibilidade. Nesse caso, queremos encontrar as posições nas quais o jogador cairá nesta coluna para cada direção da gravidade e adicioná-las à listay
usando oP
ushB
operador ack.Gravidade subindo (esquerda, na versão transposta):
Gravidade diminuindo (à direita, na versão transposta):
Se o jogador cair da grade em uma direção específica, a
@?
operação respectiva não encontrará#
ae dará zero. Este não é um índice válido e irá gerar alguns avisos na próxima iteração - que, no entanto, não são visíveis sem o-w
sinalizador. Para nossos propósitos, esses casos são essencialmente eliminados de consideração.Após o loop interno,
i:UQy
pega a listay
de posições que construímos, elimina duplicatas e as atribuii
. (A eliminação de duplicatas é necessária porque, caso contrário, a lista aumenta exponencialmente.) Em seguida, vamos para a próxima coluna. Quando percorrermos todas as colunas, se houver um caminho válido,i
haverá uma lista não vazia de posições (verdade); caso contrário, será uma lista vazia (falsey).fonte