Entrada:
Uma linha
Resultado:
1) Primeiro, pegamos o caractere remove no final da string de entrada até ficarmos com um comprimento quadrado (ou seja, 1, 4, 9, 16, 25, 36 etc.).
Assim, o abcdefghijklmnopqrstuvwxyz
comprimento 26 se tornaabcdefghijklmnopqrstuvwxy
( comprimento 25).
2) Em seguida, colocamos isso em um quadrado, uma linha de cada vez, da esquerda para a direita:
abcde
fghij
klmno
pqrst
uvwxy
3) Dobramos em todas as quatro direções, assim (continuamos a desdobrar até que o 'bloco' dobrado externo não tenha mais caracteres internos a serem desdobramentos):
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Algumas coisas a serem observadas, quando dobramos para fora, basicamente refletimos assim (números adicionados como esclarecimento, que representam os 'índices' nesses exemplos):
Quando dobramos o lado esquerdo:
123 to: 321 123
fghij ihgf j
Quando dobramos o lado direito:
123 to: 123 321
fghij f jihg
Quando dobramos para cima:
3q
2l
1g
b to: b
1g 1
2l 2
3q 3
v v
Quando dobramos para baixo:
b b
1g 1
2l 2
3q 3
v to: v
3q
2l
1g
Regras do desafio:
- Você pode assumir que a entrada sempre terá pelo menos 1 caractere (que também será a saída).
- O formato de saída é flexível, para que você possa imprimir em STDOUT ou STDERR; retornar como string-array / list ou character 2D-array; cadeia única com novas linhas; etc.
- A entrada conterá apenas caracteres alfanuméricos (
a-zA-Z0-9
) - Você também pode usar um caractere não alfanumérico para preencher os espaços e / ou ao redor da saída da arte ASCII, como um ponto
.
. - Espaços à direita e uma única nova linha à direita são opcionais.
- Continuamos a desdobrar até que o 'bloco' dobrado externo não tenha mais centros para desdobrar.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
Input: abcdefghijklmnopqrstuvwxy
Output:
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Input: A
Ouput:
A
Input: ThisIsATest
Output:
I
Thi
Is sI
ATe
I
Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:
An
ch
xamp
i I
o E
quar
steadO
S e
s v
h s
E l
VeryLo
HowAbout
oLyreVA noLyreV
xampl Eg el Examp
hci Is hW As hi Ihc
nAo Ev sl ev so EnA
quare Sn Ie Squar
Odaetsn fOdaets
OddOneAn
steadO
S e
s v
h s
E l
VeryLo
xamp
i I
o E
quar
An
ch
Input: Lenght7
Output:
Le
ng
Input: abc
Output:
a
Respostas:
SOGL V0.12 , 75 bytes
Experimente aqui!
Isso espera a entrada na pilha, portanto, para facilitar o uso, adicionei
,
no início. Isso pode causar problemas se a entrada contiver apenas números, então aqui está um conjunto de testes para isso.70 bytes
√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚
também funcionam, mas como agora eu apenas implementei√
em strings e a documentação não mencionou que iria atingir o tamanho que eu não vou contar.Explicação:
fonte
√
só funcionava números. A razão pela qual eu não estou contando a versão de 75 byte é porque eu sinto que ele cai sob a brecha de adicionar um built-in apenas para um desafioCarvão ,
120109 bytesExperimente online! Observe que
A
desde então foi alterado para≔
e o link reflete isso. Explicação:Calcula
h = int(sqrt(len(q)))
. (Floor
ainda estava para ser implementado ...)Extrai as
h
fatias de comprimentoh
da entrada. (Na verdade, não me incomodo em truncar as fatias no comprimentoh
.) Uso umfor
loop em vez de umMap
porque precisoAssign
do resultado deMap
algum lugar e isso não é trivial ao lidar com aSlice
.O desdobramento acontece 4 vezes, uma vez para cada direção (para baixo, direita, cima, esquerda, conforme codificado). A variável de loop para esse loop é
i
.Tire uma cópia da corda fatiada.
Ir para trás à origem da tela de modo a que cada um se desdobrar começa com o
h
-by-h
quadrado no mesmo lugar.Repita os
(h+1)/2
tempos; uma vez para cada desdobramento, mais uma vez para o quadrado original. A variável de loop para esse loop ék
.Repita 4 vezes, uma vez para cada lado do quadrado desdobrado. (Eu não uso a variável loop
l
.)Imprima um lado do quadrado desdobrado. Como esse é o
k
décimo desdobramento, o lado do quadrado éh-2k
e tira os caracteresk
da borda do quadrado original.Pivô pronto para imprimir o próximo lado do quadrado.
Gire a corda fatiada. (Sim, é isso
ξ
. Eu não uso frequentemente!)Eη
Também funcionaria para o exteriorMap
. A rotação também tem o efeito colateral conveniente de truncar a largura da matriz parah
.Depois de imprimir o lado, o cursor se afasta da borda do quadrado. A impressão de um caractere a menos falha nos quadrados do lado 1 e, de qualquer maneira, é menos eficiente. Depois de girar anteriormente, a impressão de uma nova linha convenientemente move o cursor de volta para o canto.
Vire o quadrado na vertical ou na horizontal, conforme apropriado.
Calcule o deslocamento para o próximo desdobramento.
Mova horizontalmente ou verticalmente para o próximo desdobramento, conforme apropriado.
Aqui está um link para a versão de 97 bytes obtida utilizando todos os recursos mais recentes do carvão vegetal, incluindo
Floor
: Experimente online! Link é a versão detalhada do código.fonte