Veja! É um labirinto ASCII! Soo coolzors, amazeballs e outras coisas.
+-+-----+---+
| | | |
| | ++ | |
| | ++ +-+ |
| | |
+-------+ | |
| | |
+---------+-+
Mas, mas, mas ... é doloroso descobrir em que direção todas as partes do labirinto estão indo. Eu só quero desenhar o layout e o labirinto tornar-se mais suave sem muito tempo.
E se eu pudesse desenhar isso em ...
#############
# # # #
# # ## # #
# # ## ### #
# # #
######### # #
# # #
#############
Isso seria tão doce!
As regras (como as regras são resfriadas):
- Escreva um código para converter uma string em um labirinto ascii e produza o resultado.
- Qualquer caractere que não seja um espaço em branco será lido como uma parede.
- Cada caractere de parede decidirá qual personagem basear-se em seus vizinhos (apenas nas direções norte, sul, leste e oeste).
- Se um caractere não tiver vizinhos que não sejam espaços em branco, será um sinal de mais (+).
- Se um caractere tiver vizinhos nas direções vertical (Norte-Sul) e horizontal (Leste-Oeste), será um sinal de adição (+).
- Se um caractere tiver vizinhos apenas na direção vertical (Norte-Sul), será um símbolo de barra vertical (|).
- Se um caractere tiver vizinhos apenas na direção horizontal (Leste-Oeste), será um sinal de menos (-).
- A entrada pode ser uma única sequência (com linhas separadas por caracteres de nova linha ou uma matriz de sequências).
- Todos os caracteres de entrada serão caracteres ASCII imprimíveis; você não precisa lidar com conjuntos de caracteres estendidos.
- Use qualquer idioma antigo, por favor.
- Se houver espaço em branco antes de uma linha, deve ser a mesma quantidade em cada linha. Qualquer espaço em branco após cada linha de saída é bom.
- Tente resolvê-lo com o menor número de bytes.
Casos de teste:
1: Quadro
Entrada:
##########
# #
# #
# #
##########
Resultado:
+--------+
| |
| |
| |
+--------+
2: Labirinto clássico
Entrada:
#################
# #
# ##### # ##### #
# # # # # #
# # # # ##### # #
# # # # #
### # ####### # #
# # # # # #
# ### # ## # ##
# # ## #
#################
Resultado:
--------+-------+
| |
| --+-+ | ----+ |
| | | | | |
| + | | +---- | |
| | | | |
+-- | +----+- | |
| | | | | |
| --+ | ++ | -+
| | ++ |
+-----+-++----+--
3: Ovos verdes, cara.
Entrada:
I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!
Resultado:
| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++
4: Sincelos
Entrada:
Word Icicle!
Word Icicle
Word cicle
ord cicle
ord icle
ord i le
or i le
or i l
or l
or
r
Resultado:
++++ ++++++-
++++ ++++++
++++ +++++
+++ +++++
+++ ++++
+++ | ++
++ | ++
++ | |
++ |
++
|
---
?-
s ou por que o labirinto clássico não tem quatro+
s na linha inferior.smallest number of characters
, não bytes?+
no meio da 1ª linha 2) o!
dos sincelos deve ser substituído por um-
. Você poderia verificar esses dois?whitespace
, você simplesmente não significa apenas espaço? Eu não quero ter que guias de apoio e você provavelmente não quer me transformar novas linhas querRespostas:
APL (Dyalog Unicode) ,
5735 bytes SBCS–22 graças a uma nova solução da ngn .
Função tácita anônima tomando uma matriz de caracteres como argumento.
Experimente online!
{
…}⌺3 3
Em cada bairro 3 por 3, aplique a seguinte função:,⍵
ravel (achatar)' '≠
Booleano onde não espaço⍱∘⌽⍨
que NOR é inversa (incl. nem NOR superior inferior, nem esquerda NOR direita)5 4 2⊃¨⊂
escolha o 5º , 4º e 2º elemento da lista inteira,ou seja, eu vazio, sem vertical, sem horizontal
2⊥
avalie na base 2 (binária)ou seja, ≥4: eu vazio; 3: sem vizinhos; 2: sem vizinhos horizontais; 1: não vertical; 0: tem ambos
'+-|+'↓⍨
solte muitos elementos dessa stringou seja auto vazio:
; sozinho
+
:; vizinho vertical (s) de:|+
; horizontal-|+
:; ambos:+-|+
⊃
escolha o primeiro elemento (use espaço se não houver)ou seja auto vazio:
+
:; vizinho vertical (s) de:|
; horizontal-
:; ambos:+
Solução antiga
Função tácita anônima tomando uma matriz de caracteres como argumento.
Experimente online!
{
...}⌺3 3
Em cada bairro 3 por 3, aplique a seguinte função:,⍵
ravel (achatar)(
...)/
Filtre usando a seguinte máscara:9⍴0 1
remodelar ciclicamente[0,1]
para o comprimento 9 (seleciona N, W, E, S)' '≠
Booleano onde não espaço1⌽
gire um passo para a esquerda;[W,E,S,N]
2 2⍴
remodelar para matriz 2 por 2;[[W,E],[S,N]]
∨/
redução OR em linha:[horizontal,vertical]
(
...)
Aplique a seguinte função tácita:⊢
a identidade;[horizontal,vertical]
∧/,
precedido por sua redução AND;[both,horizontal,vertical]
(
…),
Acrescente o seguinte:,⍵
percorrer (achatar) o bairro5⊃
escolha o 5º elemento (ele mesmo)' '=
Booleano se espaço (ou seja, vazio)Agora temos
[empty,both,horizontal,vertical]
1⍳⍨
índice de 1 à esquerda (fornece 5 se não houver vizinhos)' +-|+'⊃⍨
use isso para escolher o símbolofonte
JavaScript (ES6), 110 bytes
Formato de E / S: matriz de cadeias.
Experimente online!
Ou 108 bytes usando uma matriz de caracteres.
fonte
Python 2 ,
181168 bytesgraças a Freira Furada por -13 bytes
Experimente online!
fonte
MATLAB,
113110101 bytesConverte a entrada em lógica, aplica convolução em horizontal e vertical e combina as saídas para criar os caracteres correspondentes.
3 bytes salvos pelo @Adriaan por me dizer que você pode obstruir a saída no PPCG: P
9 bytes salvos graças a inúmeros comentários @flawr!
fonte
J ,
4947 bytesAgradecimentos a FrownyFrog por -2 bytes!
Experimente online!
fonte
Retina 0.8.2 , 92 bytes
Experimente online! Requer entrada retangular. O link inclui casos de teste. Explicação:
Altere todos os não espaços para
0
s.Procure todos os
0
s com outro0
imediatamente acima ou abaixo na mesma coluna e altere-os para 1. Os1
s agora são os locais com vizinhos verticais, enquanto0
s não têm vizinhos verticais.Procure todos os dígitos sem vizinhos horizontais. Os
0
s também não têm vizinhos verticais, então eles se tornam+
s, enquanto os1
s têm vizinhos verticais, então eles se tornam|
s.Os dígitos restantes têm vizinhos horizontais. Os
1
s também têm vizinhos verticais, então eles se tornam+
s, enquanto os0
apenas têm vizinhos horizontais, então eles se tornam-
s.fonte
Python 3 , 336 bytes
Experimente online!
Eu tive que usar muito código para lidar com erros de maiúsculas e minúsculas.
fonte
C (gcc) , 143 bytes
Experimente online!
A função f modifica uma matriz de seqüências de caracteres no local. A área ao redor da matriz deve ser preenchida com espaços (um pouco restrito). Mesmo que isso não atenda exatamente aos requisitos que a maioria das soluções está usando, ele estará em conformidade com as regras se dissermos que representamos uma nova linha com dois espaços (e pegamos uma série de cadeias terminando em novas linhas).
Ungolfed
Este foi um desafio divertido da aritmética dos ponteiros. Usando a iteração do ponteiro no estilo C, é fácil obter os vizinhos horizontais, mas os verticais eram mais difíceis. Felizmente, o ponteiro y ainda está por aí (o que aponta para o valor inicial de z), para que eu possa deduzir meu índice e usá-lo para acessar o mesmo elemento em uma linha diferente. Parecia uma escrita muito errada
y[-1][z-*y]
, pois voava diante de qualquer estilo razoável!fonte