Considere os seguintes blocos 3x3 que o algoritmo dos quadrados de marchas identificaria para cada célula (com ID rotulado com base em 0):
0:
...
...
...
1:
...
...
\..
2:
...
...
../
3:
...
---
...
4:
..\
...
...
5:
/..
...
../
6:
.|.
.|.
.|.
7:
/..
...
...
8:
/..
...
...
9:
.|.
.|.
.|.
10:
..\
...
\..
11:
..\
...
...
12:
...
---
...
13:
...
...
../
14:
...
...
\..
15:
...
...
...
O objetivo deste desafio é fornecer uma matriz 2D de IDs de bloco, desenhar o gráfico de contorno completo, unindo essas células menores. Observe que existem alguns casos repetidos (por exemplo: 0 e 15 são visualmente iguais)
Entrada
Seu programa / função deve ter como entrada uma matriz retangular 2D de números inteiros no intervalo [0+a,15+a]
(onde a
é um deslocamento inteiro arbitrário de sua escolha; isso permite que você use indexação com base em zero ou indexação com base em 1 para os blocos). Pode ser de qualquer fonte desejada (stdin, parâmetro de função, etc.).
Resultado
Seu programa / função deve gerar uma única sequência representando o gráfico de contorno completo. Não deve haver espaço em branco inicial / final, mas uma nova linha final é permitida. Não deve haver separação entre os blocos adjacentes verticalmente ou horizontalmente.
Observe que você não precisa fazer nenhum tipo de tratamento especial para blocos mapeados para uma "sela"; basta desenhar o bloco com o ID fornecido como está.
A saída pode ser para qualquer coletor desejado (saída padrão, valor de retorno, etc.)
Exemplos
Todos os exemplos abaixo usam IDs de bloco baseados em 0.
case 1:
2 1
4 8
......
......
../\..
..\/..
......
......
case 2:
15 13 12 14 15
13 8 0 4 14
11 1 0 2 7
15 11 3 7 15
...............
......---......
...../...\.....
.../.......\...
...............
../.........\..
..\........./..
...............
...\......./...
.....\.../.....
......---......
...............
case 3:
12 12 12 8 4
0 0 0 0 2
0 0 0 2 7
0 2 3 7 15
........./....\
---------......
...............
...............
...............
............../
............/..
...............
.........../...
........./.....
......---......
...../.........
case 4:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
............
.........---
...\..../...
..\/...|./..
.......|....
...../.|....
/...|...\..\
....|.......
....|.\.....
............
---.........
...../\.....
case 5:
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 2 7 15 15
0 0 2 5 14 15 15
0 2 5 8 4 12 14
0 4 8 0 0 0 6
0 0 0 0 0 0 4
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
............/........
.....................
.........../.........
........./...........
.....................
......../../\........
....../../....\......
...............---...
...../../.........\..
.....\/............|.
...................|.
...................|.
....................\
.....................
.....................
Pontuação
Isso é código de golfe; o menor código em bytes vence. Aplicam-se brechas padrão.
Respostas:
Mathematica,
353326 bytesentrada
fonte
JavaScript (ES6), 195 bytes
Casos de teste
Mostrar snippet de código
fonte
Mathematica, 173 bytes
Experimente na sandbox Wolfram!
"
\n
" Deve ser substituído por uma nova linha real. A entrada é indexada em 1 - por exemplo, o terceiro caso de teste se torna{{13,13,13,9,5},{1,1,1,1,3},{1,1,1,3,8},{1,3,4,8,16}}
. A saída é uma sequência.A idéia é basicamente a mesma que a resposta de Jenny_mathy - faça os dezesseis quadrados pegando uma grade de 3x3 de
"."
s e substituindo alguns dos caracteres, depois junte os quadrados - mas usando funções um pouco mais curtas para fazer isso. (Obrigado a alephalpha por me lembrar queArrayFlatten
existe!)É possível que isso possa ser feito em menos bytes, tornando os quadrados habilmente, em vez de basicamente codificá-los, mas isso exigiria muito mais esforço ...
fonte
{{16,14,13,15,16},{14,9,1,5,15},{12,2,1,3,8},{16,12,4,8,16}}
. Se você tentou e ainda não está funcionando, poderia me dizer qual é o problema?Retina , 165 bytes
Experimente online! O link inclui o segundo exemplo. Explicação: Os dois primeiros estágios são convertidos de decimal em hexadecimal, permitindo que os espaços sejam excluídos. O terceiro estágio então triplica cada linha, dando a cada nova linha um marcador separado. Esses marcadores percorrem os dígitos hexadecimais, convertendo-os no gráfico de contorno à medida que avançam, até chegar ao final da linha, quando são excluídos.
fonte
Python 2 , 247 bytes
Experimente online!
-1 byte graças a LeakyNun
fonte
SOGL V0.12 ,
10689 bytesExperimente aqui! (que possui um byte extra
→
para facilitar a entrada. Caso contrário, seria de esperar que a matriz já estivesse na pilha)fonte
Python 2,
196191181176 bytesExperimente online!
Uma função que pega uma matriz de matrizes de ints e retorna uma string:
EDIT: salvou 5 bytes atribuindo J, N; outros 10 bytes porque esqueci que a entrada já é assumida como uma matriz de matrizes de entradas; e depois outros 5 bytes salvos por um corte mais inteligente ...
A sequência concatenada de todas as 16 células 3x3 (144 bytes, omitindo quebras de linha) é codificada em comprimento de execução para a sequência de 41 bytes:
o!j1cSe!f1g1aAbAbAa1h1iAbAbAc!c!d!iSk1f!k
onde cada elemento RLE
(cellType, length)
é codificado para o caracterechr(32+16*cellType+length)
(é útil que a execução máxima seja 15; e queord(' ')==32
seja divisível por 16). Ao decodificar, tomamos'\/|-.'[cellType]
como caractere imprimível.Nada particularmente inteligente depois disso ...
fonte
05AB1E , 61 bytes
Experimente online!
A primeira metade do padrão pode ser compactada como:
A segunda metade precisaria ser:
Podemos apenas espelhar verticalmente a primeira metade e inserir
binary 110 (1101110)
a2111111125
.Em seguida, pegamos esse padrão e dividimos em cinco, depois juntamos-o com os seguintes:
Agora temos nossos blocos de construção, as últimas partes substituem as entradas da matriz pelos blocos de construção apropriados, fecham as linhas e imprimem ao usuário com símbolos substituídos:
Pode postar uma explicação formal da operação, se alguém quiser, obrigado.
fonte
Geléia , 64 bytes
Experimente online!
Isso usa uma compactação ingênua e provavelmente poderia economizar muitos bytes com a codificação no comprimento da execução.
Como funciona
fonte