Dado um texto como este:
# #### ## #
## # ## #
#### ##
Produza o mesmo texto, mas conectando os pixels aos caracteres ─│┌┐└┘├┤┬┴┼
. Se um pixel não tiver vizinhos, não o altere.
Portanto, a saída do último texto é:
│ ─┬── ┌─ │
└─ │ ┌┘ │
└──┘ ─┘
- Você pode receber a entrada como uma matriz booleana.
- A entrada sempre conterá pelo menos 1 pixel.
- Você pode contar caracteres de desenho de caixa como 1 byte.
- Você pode assumir que a entrada é preenchida com espaços.
Casos de teste
## #
=>
── #
###
#
=>
─┬─
│
##### ##
# # #
########
=>
─┬─┬─ ┌─
│ │ │
─┴─┴──┴─
# #
#####
# #
=>
│ │
─┼─┼─
│ │
# # # # #
# # # #
# # # # #
# # # #
# # # # #
=>
# # # # #
# # # #
# # # # #
# # # #
# # # # #
#####
#####
#####
#####
#####
=>
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘
Como esse é o código-golfe , o código mais curto vence.
-|r7LJE3TW+
é uma substituição de 1 byte-char adequada para os caracteres do bloco.Respostas:
Geléia ,
605251504948 bytesGuardou um byte graças a @ Dennis.
A entrada é uma matriz booleana de 1 e 0. Repete cada coluna e cada linha, convertendo a cabeça e a cauda de cada infixo do tamanho 3 de um par de dígitos binários para um decimal e multiplica isso pelo centro de cada infixo. Em seguida, soma-o para encontrar o índice
'#───│┌┐┬│└┘┴│├┤┼ '
.Experimente online! ( caso 2 ) ( caso 3 ) ( caso 4 )
Explicação
Isso se baseia na mesma idéia da minha resposta em J, mas em vez de processar em cada sub-matriz 3x3, eu processo sobre cada linha e cada coluna enquanto ainda obtenho a mesma tabela de índices.
Mais da metade dos bytes são gastos na geração da lista de caracteres da caixa
'#───│┌┐┬│└┘┴│├┤┼ '
. Os literais de string começam com“
Jelly e têm significados diferentes, dependendo do terminador. Aqui, o terminador’
significa que a cadeia será analisada como os pontos de código de cada caractere, de acordo com a página de código Jelly , e convertida de uma lista de 250 dígitos base para um decimal.Em seguida, converta esse decimal em uma lista de dígitos na base bijetiva 61 e aumente cada um em 9471 para movê-lo para o intervalo dos caracteres da caixa e converter cada um usando o Python
chr
. Em seguida,”#
acrescente um caractere literal e um espaço⁶
.fonte
J ,
827266 bytesA entrada é uma tabela booleana de 1 e 0. As regras afirmam que os caracteres da caixa contam como um byte, não como três, e que foram aplicados aqui.
Uso
Explicação
Primeiro, a entrada é preenchida com zeros em todos os lados.
Em seguida, cada sub-matriz de tamanho 3 é selecionada
Então, apenas 5 dos valores em cada sub-matriz são considerados
Os valores
ABCD
são selecionados achatando cada sub-matriz e selecionando os índices1 7 3 5
. Esses valores são multiplicados peloE
que está no índice 4. Em seguida, é convertido de uma lista de dígitos binários para um decimal e incrementado porE
. Osx
valores não são necessários.Isso é usado como um índice para selecionar qual caractere desenhar de acordo com a tabela abaixo (reordenada um pouco para jogar golfe). A última coluna corresponde ao valor de saída de cada sub-matriz com um caractere de caixa.
Além disso, em J, a cadeia de caracteres
' #───│┌┐┬│└┘┴│├┤┼'
usa caracteres de 8 bits, com um comprimento de 47 (para cada byte) para os 17 caracteres necessários. O comando oucp
converte em caracteres de 16 bits, o que permite o comprimento 17.fonte
JavaScript (ES6),
155121103102 caracteresEdit: salvou 18 bytes com a ajuda de ETHproductions
Edit: salvou 1 byte usando o 1º parâmetro de replace () como
'#'
Como funciona
Nós iteramos em todos os
#
caracteres encontrados na string de entrada. Para cada um deles, testamos se seus vizinhos também são#
caracteres usando at()
função:O parâmetro
x
dat()
função é o deslocamento do vizinho em relação à posição atualp
. Usamos -1 / + 1 para testar vizinhos esquerdo / direito e -w / + w para vizinhos superior / inferior (ondew
é a largura de uma linha, ou seja, a posição da primeira quebra de linha + 1).Cada vizinho recebe um peso diferente (1, 2, 4 ou 8) de acordo com a seguinte bússola:
Cada combinação de peso leva a um valor único em [0 .. 15]. Por exemplo, se o vizinho no topo e o vizinho à direita estiverem definidos, a soma será 1 + 4 = 5, que é traduzida para o
└
uso desta tabela:Portanto,
'#│─┘─└─┴││┐┤┌├┬┼'[weight_sum]
leva ao caractere esperado.fonte
s=>(w=s[0].length+1,s=s.join`\n`).replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)])
s=>s.replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)],w=s.indexOf`\n`+1)
Python 2.7,
318315 bytes (270267 caracteres)Tenho certeza de que isso pode ser ainda mais influenciado (especialmente eu adoraria me livrar desse comentário irritante de primeira linha), mas aqui está a minha entrada:
Aqui está uma explicação de como tudo funciona:
EDIT: Removido alguns espaços antes
for ... in ...
fonte
JavaScript (ES6),
150139133131 caracteresRecebe entrada como uma matriz de strings, por exemplo
f(["###", " # "])
.Snippet de teste
Mostrar snippet de código
fonte
ALPACA , 414 + 2 = 416 bytes
Requer as
-fI
bandeiras.Essa solução usa um número muito grande de bytes, mas é única na medida em que usa um autômato celular. O ALPACA é geralmente usado como uma metalinguagem, mas aqui estou usando-o como uma linguagem de programação.
Versão não destruída:
fonte
PHP, 203 bytes
Provavelmente isso pode ser feito de uma maneira mais curta.
lê a entrada de STDIN. corra com
-r
.fonte
Python 3, 149 bytes
Toma como entrada
##\n #\n
e retorna como saída['─', '┐', '\n', ' ', '│', '\n']
.fonte
R,
199212 bytesEDIT: Agora é uma função, em vez de um trecho de código.
A entrada é uma matriz
m
de 1s e 0s. Isso é muito feio e hacky.Alguns testes:
fonte
x = "┼"
funciona muito bem para mim.Perl,
8988 bytesInclui +2 para
-0p
. Os caracteres especiais são contados como 1 byte, mas para torná-los realmente exibidos como caracteres únicos, é melhor adicionar também a opção -C.Dê entrada no STDIN com o espaço de linhas preenchido para que todos tenham o mesmo comprimento:
connect.pl
:fonte
MATL, 102 caracteres
Atribuo um valor a um vizinho (1, 2, 4 ou 8); sua soma corresponderá a um caractere em uma sequência que contém os caracteres de desenho. Eu acho que ainda há muito espaço para melhorias, mas para um rascunho:
Melhorias a serem feitas:
Experimente Online! (pode não ter suporte para caracteres de desenho de caixa)
fonte