Dada uma matriz retangular de elevações, desenhe seus contornos.
Tarefa
Dois elementos x
e y
estão no mesmo nível de contorno se floor(x/10) == floor(y/10)
. Por exemplo, 52
e 58
estão no mesmo nível de contorno, mas 58
e 64
não são.
O ato de desenhar contornos é definido da seguinte maneira: Para cada elemento e
, substitua-o por uma sequência de dois caracteres escolhida da seguinte maneira:
- o primeiro caractere é
" "
se o elemento abaixoe
estiver no mesmo nível de contornoe
ou se não houver elemento no abaixoe
e,"_"
caso contrário, - o segundo caractere é
" "
se o elemento à direita dee
estiver no mesmo nível de contornoe
ou se não houver nenhum elemento à direitae
e de"|"
outra forma
Os elementos nas linhas são unidos e, em seguida, as linhas são unidas com novas linhas.
Exemplo
Digamos que a entrada seja [[5,20],[3,6]]
visualizada como
5 20
3 6
Primeiro olhamos 5
. Como 3
está no mesmo nível de contorno que 5
, o primeiro caractere está " "
. Como 20
não está no mesmo nível de contorno que 5
, o segundo caractere está "|"
.
Agora nós olhamos 20
. Como 6
não está no mesmo nível de contorno que 20
, o primeiro caractere está "_"
. Como não há elemento à direita de 20
, o segundo caractere é " "
.
Agora nós olhamos 3
. Como não há elemento abaixo 3
, o primeiro caractere é " "
. Como 6
está no mesmo nível de contorno que 3
, o segundo caractere está " "
.
Agora nós olhamos 6
. Como não há elemento abaixo 6
, o primeiro caractere é " "
. Como não há elemento à direita de 6
, o segundo caractere é " "
.
Com base nessas seqüências de dois caracteres, fazemos substituições para obter [[" |","_ "],[" "," "]]
. Juntando isso, obtemos uma saída de
|_
Regras
- A matriz de entrada sempre será retangular e composta por números inteiros positivos.
- Os espaços à direita ou novas linhas podem ter qualquer valor (incluindo 0) e não precisam ser consistentes de forma alguma.
- Você não precisa seguir o mesmo algoritmo desde que produza os mesmos resultados.
- Seu programa ou função pode gerar uma sequência separada por nova linha, lista de sequências ou equivalente.
- Isso é código-golfe , então o código mais curto em bytes vence.
Casos de teste
input
output
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
_ _
| |
|_ _|
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
|_|_|_|_|_|_|_|_|_
|_ |_ _|_ _|_ _
|_ |_ _ |_
|_ |_ _
|_
|_
|_
|_
|_
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
_ _ _ _ _ _ _ _ _
| |
| _ _ _ _ _ |
| | | |
| | _ | |
| | |_| | |
| | | |
| |_ _ _ _ _| |
| |
|_ _ _ _ _ _ _ _ _|
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
_| |_
_| _ _ _ _ _ |_
_| |_
| _ _ _ |
| | | |
| | | |
| |_ _ _| |
|_ _|
_ |_ _ _ _ _| _
|_ _|
| |
Respostas:
Perl 6 , 135 bytes (131 caracteres)
Experimente online!
Ligeiramente não destruído:
Explicação : Primeiro, definimos uma variável
$n
(linha 2) e uma funçãow
(linha 3). Essa função retorna um espaço se seus dois argumentos estiverem na mesma "elevação" e o conteúdo da variável,$n
caso contrário. Em vez de dividir por 10 e por piso, abusamos do fato de que ints sãoCool
(podem ser tratadas como seqüências de caracteres) e usadaschop
para remover o último caractere (= dígito). Em seguida, subtraímos calmamente, forçando-os a numerar novamente: --).Depois disso (linha 4), criamos uma função
q
que pega uma lista e retorna essa lista com o primeiro elemento removido e o último elemento duplicado.Nas próximas 3 linhas, criaremos mais 2 matrizes a partir da matriz de entrada: a primeira tem a primeira linha ausente e a última linha duplicada (isso é apenas
.&q
- usando.&
, você pode chamar uma função em qualquer coisa como se fosse um método - a coisa na frente do ponto é o primeiro argumento), o outro tem a primeira coluna ausente e a última coluna duplicada (isso é.map(*.&q)
).Primeiro (linha 4), pegamos a matriz original
$_
, "sobrepomos" com a matriz "linhas deslocadas" e usamos a funçãow
como um operador binário (é isso[&w]
) nos elementos correspondentes. Aquele coloca um_
onde quer que os elementos correspondentes estejam nas diferentes elevações eoutro. Portanto, obtemos ½ do resultado (apenas os "primeiros caracteres").
Na linha 6, fazemos o mesmo, mas primeiro mudamos
$n
para|
e agora "sobrepomos" a matriz original com a matriz com colunas deslocadas. O resultado tem um|
em diferentes enas mesmas elevações. Estes são os "segundos caracteres".
Agora nós apenas os combinamos. Fechamos as matrizes com um zip com uma concat (sim ...), o que resulta em uma matriz da forma original, cujos elementos são os 2 elementos correspondentes das "meias soluções" concatenadas. Finalmente, apenas mapeamos essa matriz (que é realmente uma lista de listas). Cada uma dessas listas é achatada e, em seguida,
say
edificada (impressa com uma nova linha). Comosay
pode receber qualquer número de argumentos e os imprime sem separadores, criando a nova linha apenas no final, obtemos a imagem desejada no stdout. (E o bloco retorna uma lista deTrue
s (cadasay
um retorna umTrue
), mas quem se importa.)fonte
but who cares
Geléia ,
25 2322 bytes-1 byte graças a milhas (
I
vetoriza)Um programa completo imprimindo o resultado. Como um link monádico, ele pega uma lista de listas de números, as elevações e retorna uma lista de listas; no entanto, essas "linhas" consistem em listas de "pares" de dois caracteres - se isso estiver correto, é possível salvar 1 byte removendo
Y
.Experimente online!
Quão?
fonte
⁵
poupa-lhe um fora em linha reta ...:⁵I;€0ao⁶
vez de no link principalZç”_Zż"ç”|$Y
I
que não iria vectorizar assim.I
vetoriza na profundidade 1, e ambosa
eo
vetoriza na profundidade 0Python 2 ,
199186157155 bytesExperimente online!
fonte
Gelatina , 24 bytes
Experimente online!
Explicação
-2 bytes graças a Jonathan Allan
fonte
Y
- ele retornará uma lista de listas de caracteres, que eu acredito que esteja OK (enquanto a minha possui pares dentro das "linhas").Python 2 , 226 bytes
Experimente online!
Uau, isso foi um delírio para descobrir a lógica. Agora vejo o Hyper Neutrino me ninja com uma resposta mais curta, mas gastei muito trabalho nisso para não publicá-la. : P
Além disso, posso apenas dizer, esta é uma maneira incrível de criar arte ASCII. Com licença enquanto eu faço um barco carregar mais desses.
fonte
enumerate
vez de usar o nome completo duas vezes.enumerate
(obs, eu tinha que remover algumas entradas para ser capaz de vinculá-lo aqui)J, 58 bytes
Experimente online!
Uma função anônima que pega uma matriz e gera os contornos.
Muito espaço para melhorias aqui. Como não tive tempo de experimentar todos os casos de teste, informe-me se houver algum problema. Vai tentar jogar mais e explicar mais tarde.
(Rápido) Explicação
Função auxiliar: indexa em uma cadeia de comprimento 2 com base em se o primeiro elemento de uma matriz de 2 comprimentos é igual ao segundo. Se for igual, indexa no elemento zeroth; se for desigual, indexa no primeiro. Uma matriz de 1 comprimento sempre indexa o elemento zeroth da string.
Função principal
1:+<.@%&10
coloca cada elemento dividido por 10 e adiciona 1 (portanto, nunca obteremos 0 - isso é importante para a função auxiliar).2 2((' _'f{."1),' |'f{.);.3
corta a matriz em 2 x 2 segmentos, se puder (caso contrário, fornecerá um segmento 2 x 1, 1 x 2 ou 1 x 1 próximo às bordas) e aplica a função usadaf
para comparar o elemento superior esquerdo ao topo direito e o elemento superior esquerdo no canto inferior esquerdo.(,/"2)
nivela o resultado na forma desejada. Eu realmente sinto que devo evitar usar isso (e muitas outras coisas, mas discordo).fonte
J ,
4645 bytesExperimente online!
fonte
JavaScript (ES6),
120118 bytesOnde
\n
representa o caractere literal de nova linha. Editar: salvou 2 bytes graças a @ Bálint.fonte
(a[i] || [])[j]
construções em(a[i] || 0)[j]
join`\n`
você pode remover a\n
peça e substituí-la por uma nova linha reala=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`
\n
parte; Eu testo em um REPL para que novas linhas literais atrapalhem.Próton , 202 bytes
Experimente online!
-2 bytes graças a Jonathan Frech
-15 bytes mudando para Proton em vez de Python 2
fonte
len
comL
e definirL=len;
.Java 8,
200170169 bytesExplicação:
Experimente aqui.
Observe que a divisão inteira no Java é automaticamente pavimentada.
fonte
R, 159 bytes
Com novas linhas e recuos:
Faz a divisão de número inteiro da matriz, mede as diferenças de linha por linha e coluna-sábio, e quando não nula substitua por
|
e_
respectivamente, cola as duas (indolor, graças à vetorização de R) e as saídas.Casos de teste:
fonte
Perl 5 ,
130126 bytes124 bytes de código + 2 para
-ap
sinalizadoresExperimente online!
O formato de entrada é a grade 2-D de números separados por espaço.
Explicação
Isso é de uma iteração anterior do código.
fonte