Quando escrevo documentação, comentários, etc. Adoro fazer tabelas ASCII. Eles geralmente acabam parecendo muito bons, mas eu sempre sinto que eles podem parecer ainda melhores - especialmente porque o UTF-8 / Unicode inclui os caracteres de desenho da caixa . No entanto, esses caracteres são muito onerosos para usar, exigindo várias pressionamentos de tecla para serem inseridos. Sua tarefa? Escreva um programa ou uma função que possa converter automaticamente tabelas ASCII para o equivalente UTF-8 / Unicode.
Esse desafio foi marcado na caixa de areia .
Desafio
Escreva um programa que, dada uma tabela ASCII como uma sequência de entrada, produza a tabela redesenhada com os caracteres de desenho da caixa Unicode / UTF-8. Especificamente, os caracteres que fazem parte da tabela devem ser traduzidos da seguinte maneira:
(Unicode, 3 bytes each in UTF-8)
- to ─ (\u2500)
| to │ (\u2502)
= to ═ (\u2550)
and + to one of:
┌ (\u250C), ┐ (\u2510), └ (\u2514), ┘ (\u2518),
├ (\u251C), ┤ (\u2524), ┬ (\u252C), ┴ (\u2534),
┼ (\u253C)
or, if '=' on either side:
╒ (\u2552), ╕ (\u2555), ╘ (\u2558), ╛ (\u255D),
╞ (\u255E), ╡ (\u2561), ╤ (\u2564), ╧ (\u2567),
╪ (\u256A)
Detalhes
E / S:
- E / S padrão é permitida
- Você pode receber entradas em qualquer formato razoável, incluindo a tabela como uma sequência ou um caminho para um arquivo que contém a tabela.
- Você pode enviar para um arquivo e usar o nome do arquivo como argumento adicional.
- No entanto, você não pode modificar o arquivo de entrada . (Ele deve ser mantido para facilitar a edição futura)
Entrada:
- Você pode assumir que todas as linhas de entrada foram preenchidas com o mesmo comprimento
.
- Você não pode presumir que o primeiro caractere após uma nova linha faça parte das bordas da tabela (pois pode ser um espaço em branco).
- A entrada é considerada uma tabela válida se todos os caracteres (que fazem parte da tabela)
-=|
estiverem conectados a exatamente dois caracteres e+
a pelo menos um caracter horizontal e verticalmente. - Seu programa não pode produzir erros com entradas válidas.
- Se a entrada não for válida, o comportamento será indefinido e você poderá produzir qualquer saída.
- A entrada pode conter caracteres UTF-8, incluindo os caracteres de desenho da caixa.
Resultado:
- Qualquer um dos caracteres
-=|+
que não fazem parte da tabela deve ser deixado como está. - Da mesma forma, quaisquer outros caracteres devem ser deixados como estão.
- É permitida uma única nova linha inicial e / ou posterior.
De outros:
- As brechas padrão são proibidas, como de costume.
- Se o seu idioma preferido tiver um built-in que resolva esse problema, você não poderá usá-lo.
- Isso significa programas, funções, sub-rotinas ou instruções que seriam envios válidos para esse desafio sem acréscimos.
- Cada um dos caracteres necessários neste desafio tem três bytes quando codificados em UTF-8.
Caracteres conectados :
Um personagem está conectado a outro, se:
- É
|
e é diretamente acima ou abaixo+
ou|
; - É
-
e é diretamente antes ou depois+
ou-
; - É
=
e é diretamente antes ou depois+
ou=
; - É
+
e é diretamente acima ou abaixo|
ou+
, ou é diretamente antes ou depois-
,=
ou+
.
Um caractere é considerado parte da tabela, se estiver conectado a qualquer caractere que faça parte da tabela. Por definição, o primeiro +
da entrada faz parte da tabela.
Exemplos
Exemplos disponíveis aqui como uma versão passível de cópia.
Input: Output:
+------------------+ ┌──────────────────┐
| Hello+World! | │ Hello+World! │
+==================+ ╞══════════════════╡
| This is+my first | -> │ This is+my first │
|+-+ code|golf +-+| │+-+ code|golf +-+│
|+-+chall|enge! +-+| │+-+chall|enge! +-+│
+------------------+ └──────────────────┘
+===+===+===+ ╒═══╤═══╤═══╕
| 1 | 2 | 3 | │ 1 │ 2 │ 3 │
+---+===+===+===+ ┌───╪═══╪═══╪═══╡
| 1 | 1 | 2 | 3 | │ 1 │ 1 │ 2 │ 3 │
+---+---+---+---+ -> ├───┼───┼───┼───┤
| 2 | 2 | 4 | 6 | │ 2 │ 2 │ 4 │ 6 │
+---+---+---+---+ ├───┼───┼───┼───┤
|-3 |-3 |-6 |-9 | │-3 │-3 │-6 │-9 │
+===+---+---+---+ ╘═══╧───┴───┴───┘
+-----+ -> <Undefined>
+-----+ -> ┌─────┐
+-----+ └─────┘
+-----------------+
| Hello, World! |
| This is invalid | -> <Undefined>
| input |
-----------------+
++++ ┌┬┬┐
++++ -> ├┼┼┤
++++ └┴┴┘
+--+
++++ -> <Undefined>
+--+
Finalmente...
Isso é código-golfe , então a menor quantidade de bytes vence. Feliz golfe!
+-+
trechos consecutivos não são considerados para formar uma tabela conectada?Hello World
tabela, as tabelas internas não são consideradas para formar uma tabela porque o texto dentro da tabela deve permanecer inalterado e elas não são consideradas parte das bordas da tabela externa, pois não estão conectadas a elas corretamente.+----+
exemplo, seria porque a direção dos cantos seria ambígua.Respostas:
Python 3,
392281 bytesJogou um pouco mais e converteu-se em uma solução recursiva em vez de uma solução iterativa:
Pega uma sequência de linhas de comprimento igual, separada por novas linhas e retorna uma sequência no mesmo formato. Pode lançar uma exceção na entrada inválida.
Solução anterior:
Versão não destruída:
fonte
Python 3 ,
914898827823594587569540469 bytesEdit: estratégia significativamente alterada, agora criando um campo de bits de vizinhos (semelhante à resposta do dead-gambá). Deixei a versão anterior abaixo.
Experimente online!
A entrada está na forma de uma lista de listas de caracteres, que é modificada no local. Recorre do primeiro + que encontra.
Experimente online!
Aqui está a coisa mais próxima que tenho de uma versão não destruída:
fonte
JavaScript,
311307 bytesMostrar snippet de código
Explicação
Começando na primeira
+
junção encontrada , o programa tenta encontrar caminhos para outras junções em todas as direções, executando substituições à medida que avança. Ele armazena as direções encontradas e o estado "com borda dupla" em um bitmap, que determina o caractere de junção apropriado.fonte
Python 3 , 599 bytes
Não sou muito bom em jogar golfe no Python 3, mas (para minha vergonha) não consegui obter uma saída normal de caracteres UTF-8 no Python 2. Então, aqui estamos.
Eu acho que o único truque interessante aqui é decidir a
+
transformação.Eu codifiquei todas as variantes possíveis com endereços de 4 bits. Cada bit de endereço se assemelha à conexão à célula do vizinho. Então 0 - sem conexão e 1 - conexão.
1111
is┼
0011
is┐
etc
Algumas configurações de conexões são inválidas e substituídas por valores fictícios:
'012┐45┌┬8┘0┤└┴├┼'
Se qualquer célula do vizinho contiver
=
, a segunda lista será usada com linhas dobradas.O endereço é combinado aqui.
r
contém o comprimento da string 8, em que cada dois caracteres são 1/0 e caracteres reais do vizinho.Por exemplo:
1+0y1-1|
.Isso é usado para escolher a lista de substituições, como mostrado anteriormente. E depois contratou para abordar:
int(r[0::2],2)
Este lambda usado para verificar se as coordenadas da célula são válidas e o char da célula é um dos '+ - | ='
Este lambda costumava receber char da célula. Retorna
' '
se as coordenadas forem inválidas. (definitivamente pode ser jogado fora)Condições para recursão. Também pode ser jogável.
Experimente online!
fonte