Dada uma sequência quadrada, produza toda a saída da sequência em todas as etapas do desenrolamento.
A corda deve desenrolar no sentido horário um quarto de volta de cada vez.
Exemplos
Entrada :
A
Saída :
A
Nota : Também aceitarei a entrada duplicada para este caso de teste específico apenas se isso ajudar a reduzir sua contagem de bytes.
Entrada :
DC
AB
Saída :
DC
AB
D
ABC
ABCD
Entrada :
GFE
HID
ABC
Saída :
GFE
HID
ABC
HG
IF
ABCDE
IH
ABCDEFG
I
ABCDEFGH
ABCDEFGHI
Entrada :
JIHG
KPOF
LMNE
ABCD
Saída :
JIHG
KPOF
LMNE
ABCD
LKJ
MPI
NOH
ABCDEFG
NML
OPK
ABCDEFGHIJ
ON
PM
ABCDEFGHIJKL
PO
ABCDEFGHIJKLMN
P
ABCDEFGHIJKLMNO
ABCDEFGHIJKLMNOP
Regras
Isso é código-golfe, portanto o código mais curto em bytes vence.
- Qualquer formato razoável pode ser usado para E / S, assumindo que seja consistente.
- Os espaços devem ser usados para preencher as linhas superiores da saída.
- Deve ser capaz de lidar com a entrada de todos os caracteres imprimíveis (incluindo espaço:
\x20
-\x7e
):
! "# $% & '() * +, -. / 0123456789:;? @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [\] ^ _` abcdefghijklmnopqrstuvwxyz {|} ~
- O espaço em branco à esquerda / à direita é permitido.
- Você pode assumir que a string sempre será um quadrado.
- Todas as brechas padrão são proibidas.
Inspiração: escreva um programa quadrado que produz o número de vezes que foi "desenrolado" .
["A","A"]
para"A"
, como o meu programa faz (em vez de["A"]
)? Parece-me razoável, uma vez que são apenas as posições inicial e final, e você apenas tenta desdobrar uma vez.Respostas:
SOGL V0.12 ,
2120191817 bytesExperimente aqui! (
→
adicionado porque isso espera entrada na pilha)Explicação:
fonte
Python 2 ,
209 207 205 203 202 201 200196 bytes-4 bytes graças a @Quelklef !
Experimente online!
Python 2 ,
219 217 215 213 212 211207 bytesExperimente online!
O primeiro gera como uma lista de Strings, o segundo gera como ASCII-art.
fonte
[::-1][1:]
pode ser[-2::-1]
, como na resposta de Lynn.Carvão ,
4235 bytesExperimente online! Link é a versão detalhada do código. Editar: salvou 7 bytes principalmente alternando de matrizes de caracteres para seqüências de caracteres. Explicação:
Leia o quadrado de entrada como uma matriz de cadeias na variável
q
.Enquanto a última string da matriz não estiver vazia, remova-a.
Imprima o restante da matriz.
Gire o restante da matriz fazendo um loop por cada caractere da última string e juntando o
l
caractere de cada string restante na matriz invertida.Anexe a última sequência removida anteriormente a
u
, que contém o valor não distribuído e imprima-a.Produza o resultado e limpe a tela pronta para a próxima iteração.
Observe que esta versão gera o desdobramento final em uma linha separada, se isso for indesejável para 38 bytes:
Experimente online! Link é a versão detalhada do código. Explicação:
←E⁺⟦⪫υω⟧⮌θ⮌κ
inverte a matriz atual, acrescenta a linha não enrolada, inverte os caracteres em cada linha e imprime tudo de cabeça para baixo, produzindo o resultado desejado.fonte
Rotate
eTrim
comandos deixar o cursor ...Haskell ,
127120 bytesExperimente online!
Entrada é uma lista de linhas, por exemplo,
["DC","AB"]
para o segundo caso de teste, a saída é uma lista de listas de linhas:[["DC","AB"],[" D","ABC"],["ABCD"]]
. UsemapM (putStrLn . unlines)
para imprimir bem o resultado.Edit: Salvo 7 bytes, percebendo que quanto menor
transpose
eu encontrei um pouco vem a calhar, porque pode ser modificado para reverter cada transposta diretamente.fonte
05AB1E , 18 bytes
Experimente online!
Explicação
fonte
J, 62 bytes
Experimente online!
Tenho certeza que isso pode ser muito praticado. Isso imprime espaço em branco extra, mas apenas devido à maneira como J formata as matrizes contidas na matriz de saída para ter a mesma forma.
Acho que quando eu comentar e comentar exatamente o que estou fazendo, talvez eu tenha uma idéia melhor de como jogar isso (depois de fazer isso agora, eu realmente não sei ...). Para fins de golfe, vale a pena notar que
Explicação
Ao desfazer isso, dividirei a função principal em três.
Trabalharemos com o segundo caso de teste.
unfurl_reversed
Isso dá uma seqüência de caracteres desenrolada uma vez, mas ao contrário. Tudo isso está sendo feito no sentido inverso e em uma ordem específica, de forma que o modo como J preencha automaticamente as seqüências de caracteres com espaços para corresponder à forma da matriz em que estão, forneça o espaçamento correto.
|:@}:
é a transposição do corte da entrada|.@{:
é o reverso da cauda da entradaAcho que você pode ver o que queremos fazer: queremos acrescentar o reverso da cauda à última parte da transposição do corte (isso é um bocado, mas basicamente anexa
CBA
ao final deED
). Isso nos dará um passo de desenrolar, invertido.(}:@],{:@],[)
faz exatamente isso.Ele anexa
CBA
a eED
, em seguida, associa isso ao restante da matriz. Nossa produção, portanto, éwhitespace_filter
Basicamente, isso testa para ver se alguma linha é completamente espaços e a remove, se for. Não faz nada para a primeira iteração do caso de teste.
Isso é necessário (pelo menos até que eu encontre uma alternativa), pois caso contrário, eventualmente estaremos desenrolando espaço em branco em nossa string de saída.
desenrolar
O desenrolar basicamente une as outras funções e casos especiais de entrada de caracteres únicos.
Quando o poder do verbo (
^:
) recebe a caixa vazia (a:
), ele aplica uma função em uma entrada até convergir e coletar os resultados em uma matriz.(1 < #)
verifica se as linhas são sempre maiores que 1 (para o caso especial de 1 entrada de linhas).|."1
inverte cada linha e inverte os resultados dewhitespace_filter @: unfurl
.fonte
Python 2 ,
143132 bytesExperimente online!
Em cada iteração,
b
é a “cabeça” da string (primeiras n-1 linhas), girada 90 graus: sea
for,[" NML", " OPK", "ABCDEFGHIJ"]
entãob
é["ON", "PM", "KL"]
.Para desenrolar uma string uma vez, anexamos a linha final de
b
toa[-1]
(giving"ABCDEFGHIJKL"
) e, em seguida, recalculamosa[:-1]
adicionando espaços ao restante das stringsb
.Terminamos tentando sair
b
quando está vazio.Python 2 , 132 bytes
Experimente online!
Mesma ideia, escrita de forma diferente. Terminamos tentando
a.pop(-2)
quandoa
possui apenas um elemento.fonte
Perl 5 , 155 bytes
Experimente online!
Economizou alguns bytes sem realmente modificar a lógica. O fluxo abaixo ainda está basicamente correto.
# Perl 5 , 163 bytesExperimente online!
Quão?
fonte