As caixas ASCII ficam assim:
++ +---+ +------+ +---+ +---+
++ | | | | | | | |
| | | | | | | |
+-+ | | | | | | | |
+-+ | | | | | | +---+
+---+ | | | |
+--+ | | | | ++
| | | | | | ||
| | +------+ | | ||
+--+ | | ||
+---+ ||
||
+-----+ ||
+------------+ | | ++
| | | |
| | | |
+------------+ +-----+
Aqui estão alguns exemplos das mesmas caixas ASCII, implodidas:
++ +- -+ +- -+ +- -+ +- -+
++ | - | | - - | | - | | - |
| | | -- | | | | |
+-+ | | | | " | - |
+-+ | - | || | | +- -+
+- -+ | | | |
+--+ | -- | | | ++
| | | - - | " ||
| | +- -+ | | ||
+--+ | - | | |
+- -+ | |
-- ||
- - +- -+ ||
+- - - -+ | - - | ++
| -- -- | | = |
| -- -- | | - - |
+- - - -+ +- -+
- -
--
Aqui está um link para todas essas caixas de casos de teste em um formato mais fácil de copiar. A ordem é todas as entradas seguidas por todas as saídas na mesma ordem.
Seu objetivo é pegar uma caixa ASCII como entrada e retornar a caixa implodida. As regras de implosão são:
- "+" nunca muda; nem "-" ou "|" diretamente adjacente a "+"
- A partir dos cantos, os "-" e "|" mova-se para dentro em um espaço a mais do que o mesmo caractere mais perto da esquina. Se um "-" e "|" jamais se moveria para o mesmo local, nem se move.
- Se um "-" e "-" forem movidos para o mesmo local, coloque um "=" nesse local. Se um "|" e "|" mova para o mesmo local, coloque um "nesse local. Eles contam como dois de seus respectivos personagens no mesmo local, movendo-se em direções opostas.
- Dois "-" ou dois "|" podem passar um do outro, como pode ser visto no exemplo inferior esquerdo.
- Se a caixa for fina o suficiente, ela começará a se expandir para fora da mesma maneira, sempre se afastando do lado em que começou parte.
- O resultado deve ser simétrico na linha central nas direções x e y (ignorando novas linhas); isso inclui espaços; portanto, o resultado pode precisar ser preenchido com espaços para satisfazer isso.
Detalhes da regra:
- Isso é código-golfe, e o programa mais curto em bytes vence.
- Aplicam-se brechas padrão.
- Você pode assumir que cada linha termina em um caractere de nova linha.
- Os únicos caracteres na sequência de entrada serão "+", "-", "|", "" e "\ n" (nova linha), e a sequência de saída deverá seguir as mesmas regras, com a adição de "=" e "como possíveis caracteres.
- Opcionalmente, você pode ter uma nova linha final à direita no final da última linha.
- A menor caixa ASCII que você precisa manipular é o exemplo superior esquerdo. Cada caixa ASCII terá exatamente 4 "+" s, exatamente nos cantos.
- Você precisará manipular caixas de tamanho
m x n
para números inteiros,m,n
tais como2<=m,n<256
(o maior tamanho possível de string255*(255+1)
) - Você pode assumir que sempre receberá uma única caixa ASCII válida como entrada.
||
em que o exemplo necessidade de ser um"
ou algo assim ..."
? Eu acho que o"
único aparece em 3 de largura ou superior?"
? À esquerda ou à direita? Não pode ser os dois, mas também não pode ser porque o resultado é simétrico.Respostas:
Python 2 ,
591555545527525496436351334333303 bytesExperimente online!
EDIT : Meu método antigo primeiro implodiu a parte superior e inferior e, em seguida, a esquerda e direita. Em vez disso, podemos implodir o topo, girar 90 graus e fazer isso 4 vezes. Além disso, eu estava usando o código amigável, este requer que a entrada seja do tipo
[['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]
feio, mas mais curto para o programa: P (Obrigado a Phoenix por entender isso)Créditos à Leaky Nun pelo código do cabeçalho no link TIO usado para converter entradas legíveis por humanos em entradas legíveis por computador.
-85 bytes graças a Leaky Nun!
-17 bytes, alternando da implosão superior para a esquerda, o que permite que toda a linha seja armazenada em uma variável e modificada. Obrigado a Leaky Nun pela sugestão!
-1 byte alternando as coisas para remover um espaço.
-30 bytes graças a Leaky Nun!
fonte
s[0]
eS[0]
variáveis para economizar alguns bytesp=s[0]
eP=S[0]
comp=z(s[0])
eP=z(S[0])
, respectivamente, e depois substituir todas as ocorrências dez(p)
comp
e tudoz(P)
comP
para salvar 18 bytes.(z(s)-1)/2-p
porz(s)/2-.5-p
e(p-1)/2-z(s)
comp/2-.5-z(s)
para salvar mais 2 bytes.C (clang) , 693 bytes
Novas linhas adicionadas para facilitar a leitura. Os dois primeiros são obrigatórios, mas o restante não.
Obrigado pelo grande desafio! Foi bastante complicado, mas ainda me diverti muito.
Isso leva a entrada como argumentos da linha de comando e gera STDOUT uma seqüência de várias linhas da caixa implodida. Como sempre, as dicas de golfe são muito apreciadas.
Experimente online!
fonte