Entrada
- Uma matriz binária representando as paredes de uma masmorra.
- A posição do jogador dentro da masmorra.
- A direção que o jogador está enfrentando no momento (0 = Norte, 1 = Leste, 2 = Sul, 3 = Oeste)
Saída
Uma representação pseudo-3D das paredes que estão no campo de visão do jogador, como uma arte ASCII de caracteres.
Abaixo estão vários quadros de saída possíveis, juntamente com o mapa e a bússola correspondentes para ajudar a entender o problema (mas desenhar o mapa e a bússola não faz parte do desafio).
Especificação
Campo de visão
O jogador tem paredes no seu campo de vista, marcada a partir de para . Abaixo estão as posições das paredes em relação ao jogador (em amarelo), em todas as direções possíveis.
Desenhando as paredes
As paredes devem ser desenhadas de a nesta ordem exata, uma vez que qualquer peça desenhada anteriormente pode ser substituída por paredes mais próximas. Obviamente, você pode implementá-lo de maneira diferente, desde que o resultado final seja o mesmo.
Toda a saída é desenhada com 7 caracteres distintos: " "
, "'"
, "."
, "|"
, "-"
, "_"
e ":"
.
Como o detalhamento das formas das paredes no corpo desse desafio o tornaria muito longo, elas são fornecidas no seguinte link TIO:
Os caracteres que não fazem parte de uma parede são marcados com a "?"
nesses diagramas. Eles devem ser tratados como caracteres 'transparentes' que não são desenhados. Por outro lado, todos os espaços dentro de uma parede são 'sólidos' e devem substituir quaisquer outros caracteres que possam ter sido desenhados anteriormente lá.
Regras
Sobre a entrada
- Pode tomar , , e em qualquer formato razoável.
- Você pode usar coordenadas com índice 0 ou 1.
- Você pode usar quatro valores distintos de sua escolha para as instruções.
- A matriz é garantida como pelo menos .
- Você pode supor que sempre haverá paredes circundantes nas bordas.
- É garantido que o jogador esteja localizado em um quadrado vazio.
- A entrada é garantida como válida.
Sobre a saída
- As paredes devem ser desenhadas exatamente como descrito.
- No entanto, o formato de saída também é flexível: cadeia única, matriz de cadeias, matriz de caracteres, etc.
- Os espaços em branco à esquerda e à direita são aceitáveis desde que sejam consistentes.
Isso é código-golfe .
Casos de teste
Todos os casos de teste estão usando a seguinte matriz:
[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
[ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
[ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
[ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]
As seguintes entradas estão usando coordenadas indexadas em 0, com apontando para o canto superior esquerdo.
x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1
Resultados esperados:
------------------------------ ------------------------------
x=3, y=3, d=0: x=6, y=4, d=3:
------------------------------ ------------------------------
__ __ '. .'
|'. .'| | |
| '.--------------.' | |----. |
| | | | | | '.--------. |
| | | | | | | | |
| | | | | | | | |
| | | | | | .'--------' |
| .'--------------'. | |----' |
__|.' '.|__ | |
.' '.
------------------------------ ------------------------------
x=4, y=4, d=1: x=1, y=5, d=2:
------------------------------ ------------------------------
.' __ ________________________ .'
| | |
-------. .----| | |
| '.--------.' | | | |
| | | | | | |
| | | | | | |
| .'--------'. | | | |
-------' '----| | |
| __|________________________|
'. '.
------------------------------ ------------------------------
x=7, y=7, d=3: x=6, y=6, d=1:
------------------------------ ------------------------------
'. '.
|'. |'.
| '. | '.
| | '. .- | |--.--------.--------.-
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '- | |--'--------'--------'-
| .' | .'
|.' |.'
.' .'
------------------------------ ------------------------------
x=8, y=1, d=2: x=7, y=6, d=1:
------------------------------ ------------------------------
'. __ '.
|'. .'| |
| '. .' | |----.--------------.-------
| | '. .' | | | | |
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '. | | | | |
| .' '. | |----'--------------'-------
|.' '.|__ |
.' .'
Desafio relacionado:
Este desafio de 2013 está intimamente relacionado. Mas possui um critério de ganho diferente (desafio de código), uma especificação muito mais flexível da saída e requer E / S interativa.
fonte
Respostas:
Limpo (com Snappy ),
800785670644 bytes460402 bytes de código + literal da string360242 bytes(escapada aqui e no TIO porque não é UTF-8 válido)
Você pode verificar o comprimento do literal aqui.
Experimente online!
A compactação instantânea realmente se sai muito bem nesse caso, apesar de ser focada na velocidade, porque há muitas execuções de caracteres únicos na cadeia sendo compactada.
A sequência não compactada (
#
substituída por\n
para maior clareza) é:Isso codifica as versões do lado esquerdo dos diferentes componentes da tela com, em
!
vez de novas linhas, e em~
vez de?
, que são preenchidas com~
30 caracteres antes de serem adicionadas a eles e suas inversões de linha em uma lista de pesquisa.O restante do código simplesmente lida com a pesquisa de coordenadas com casos fora dos limites ignorados.
fonte
Python 2 ,
864854848826810 bytesExperimente online!
fonte
Carvão ,
500332 bytesExperimente online! Link é a versão detalhada do código. Uma abordagem um pouco chata, receio; muita impressão de literais de string compactada. Explicação:
Encha a matriz com dois
0
s extras de cada lado.Fatie uma
7x7
subseção da matriz centralizada nas coordenadas fornecidas.Gire a matriz conforme apropriado para a direção especificada.
(observe o espaço à direita) Desenhe uma
30×10
caixa vazia para que a saída tenha sempre um tamanho consistente.Desenhe cada metade separadamente, refletindo no meio.
Pegue uma matriz de descritores de parede, divida em pedaços de (string, coordenada y, coordenada x), filtre os pedaços que possuem uma parede na posição relevante na metade relevante da matriz e faça um loop sobre as paredes. A posição é calculada extraindo 12 paredes da matriz e indexando-as usando o índice de chunk, pois é mais golfista do que localizar a parede diretamente usando o índice de chunk.
Pule para as coordenadas da parede e imprima-a. Observe que refletir nega as coordenadas X de
[0, 30)
para(-30, 0]
para que, em uma passagem, a tela efetivamente desloque 29 caracteres para a esquerda.fonte
Rubi ,
412 391 385383 bytesExperimente online!
Recebe entrada como uma matriz de valores verdadeiros / falsos (a nota
0
é verdadeira em Ruby, masnil
é falsa).Produz uma matriz de caracteres.
Explicação
Os blocos são desenhados de frente para trás com a distância
n
diminuindo e a posição de um lado para o outrom
passando pela-1,1,0
esquerda, direita e meio. O bloco do meio E na fila mais distante é realmente desenhado duas vezes porque precisamos verificar os blocos A / B e C / D.n,m
ed
são usados para modificar os valoresx
ey
para pesquisar a matriza
. Sex
estiver fora do intervalo,nil
é retornado para uma célula fora do intervalo e nenhum erro é gerado, mas sey
estiver fora do intervalonil
, será retornado para a linha e Ruby lançará um erro de tipo ao tentar procurar a célula. Para evitar isso, o array é triplicado na direção vertical antes da pesquisa. Se um valor verdadeiro é encontrado, um bloco é desenhado.A saída é criada em uma matriz
b
de matrizes de 10 elementos representando as colunas da saída e é transposta para 10 linhas no final da função. A face frontal completa de todos os blocos é desenhada (aparecendo ou não na janela de exibição), portanto, é necessário espaço adicional na matriz para evitar erros fora do intervalo. O intervalo dej
valores na viewport é de-15
até+14
, isso é compensado em 15 ao salvar na matriz para fornecer um intervalo de0
até29
. Para cada bloco desenhado, três valores são calculados:p
eq
para os cantos esquerdo e direito da parede frontal, respectivamente, er
para o fundo da parede lateral.j
é iterado do mínimo para o máximo desses três valores, desenhando as colunas por sua vez.Existem 3 tipos de linhas: horizontal
-
ou_
vertical|
ou:
diagonal com um" .'"
padrão repetitivo . Ondep < j < q
colunas contendo espaços limitados com-
ou_
são desenhadas para formar a face frontal. Ondej
está fora desse intervalo, as colunas que contêm espaço|
ou:
são desenhadas com símbolos de tampast=" .'"
para formar as bordas e / ou a face lateral. Isso é gerenciado pela variávelk=j
ondej
é positivo ouk=-j-1
ondej
é negativo. O número de caracteres entre as letras maiúsculas e minúsculas ék/3*2
. A fim de processar correctamente as bordas exteriores dos blocos mais distantes onden=3
,k
devem ser tomadas módulo 9, mas isto não deve ser feito para os valores mais pequenos den
.k
é, portanto, tomado módulo36/-~n
, onde-~n
avalia paran+1
.Código ungolfed
fonte