Dada uma string, primeiro coloque-a da seguinte maneira:
Primeiro, escreva a string.
abcde
Em seguida, escreva a sequência girada uma para a esquerda.
abcde
bcdea
Continue fazendo isso até escrever linhas len (string) .
abcde
bcdea
cdeab
deabc
eabcd
Agora, leia a partir da string assim:
----+
+--+|
|+>||
|+-+|
+---+
Que dá:
abcdeabcdcbaedcbcdeabaede
Imprima esta sequência.
Casos de teste
abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
->
Por favor, comente se um caso de teste está incorreto.
Lembre-se de que isso é código-golfe , portanto o código com o menor número de bytes vence.
cena!
está errado. Deve corresponder ao seu exemplo,abcde
pois ambas são 5 letras:cena!cenanec!anena!cec!a!
Respostas:
JavaScript (ES7),
83807877 bytesPrograma bônus compatível com ES3:
Explicação
Isso tira vantagem do fato de que a saída para, por exemplo, uma cadeia de comprimento 5 pode ser representada como:
onde cada dígito representa um índice na sequência (começando em 0), module o comprimento da sequência. Em outras palavras, se n é o comprimento da string, incrementamos o índice 2n - 1 vezes, depois o diminuímos 2 (n - 1) - 1 vezes, depois aumentamos 2 (n - 2) - 1 vezes, etc. Isso pode ser simplificado para o seguinte algoritmo:
Isso funciona porque floor (sqrt (x)) alterna paridades após 2n - 1 iterações, depois 2 (n - 1) - 1 iterações, etc.
fonte
Pitão , 15 bytes
Um programa que recebe a entrada
"quoted string"
e imprime o resultado.Experimente online! ou verifique todos os casos de teste (modificados para várias entradas).
Como funciona
fonte
Python 2.7 (em CMD.EXE), 91 bytes
Isso requer um terminal com um backspace em funcionamento (
\b
) e não funcionará em repl.it ou ideone.com . Uma declaração de impressão que termina em vírgula separa a saída adicional com espaço, em vez de uma nova linha ou retorno. O backspace nos permite substituir o espaço de separação.Python 2.7, 96 bytes
Experimente em ideone.com ou repl.it (graças a Oliver). A entrada deve ser uma string python, por exemplo
'cena!'
.Os quatro fatias anexas pelo circuito (
s[i:]
,s[:n-i]
,r[i+2:]
,r[:n-i]
) são tomadas a partir de quatro bordas da espiral. Por exemplo, com01234
o quadrado é:Assim que nós tomamos
01234
,0123
,210
,4321
. A variáveli
é o índice do valor superior esquerdo em cada etapa do processo. Na espiral final, várias fatias podem estar vazias.fonte
S=''
,print S
eS+=
, e empacotamento tudo antes doi+=2
em umaprint()
declaração comsep=''
, você pode salvar 2 bytes.i<=n
paran>i
"a string of odd length."
Gelatina ,
1110 bytesTryItOnline! ou todos os testes
Quão?
O quadrado não inspirado é uma série de execuções "borda superior mais borda direita" e "borda inferior mais borda esquerda", cada uma das quais é o inverso da execução anterior sem a primeira e a última letra e a primeira das quais é a entrada mais a entrada sem a última letra (por exemplo, a entrada
"abcde"
tem uma saída de"abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e"
).fonte
05AB1E, 12 bytes
Experimente online!
Explicação:
fonte
MATL , 27 bytes
A entrada vazia sai com um erro (produzindo a saída correta).
Experimente online! Ou verifique todos os casos de teste .
fonte
C,
9594 bytesInspirado pela resposta @ETHproductions.
fonte
Perl, 99 bytes
O espaço em branco não faz parte do programa e é fornecido para facilitar a leitura.
Código não extremamente eficiente. Eu deveria ser capaz de encurtar as três primeiras linhas de alguma forma, mas tudo o que tentei fazer falhou. Esse operador ternário também precisa ser corrigido de alguma forma, mas, dessa maneira, foi possível reduzir meu código em 10 bytes, porque eu poderia cortar muito.
O código funciona compilando uma lista de palíndromos, separados por números pares, que representam os valores de lugar da sequência a ser puxada.
fonte
-F
que substituirá as linhas 1 e 3. Forneça a entrada comecho -n
para remover ochop
. (que deverá fazê-lo cerca de 81 bytes)Na verdade ,
2113 bytesEsse algoritmo é amplamente baseado na resposta de Jonathan Allan Jelly . Há duas maneiras de imprimir o resultado como uma sequência. A abordagem usada aqui duplica uma etapa intermediária e a adiciona a um total em execução no registro 1 (uma sequência vazia por padrão);
;╕
na função, depois╛
no final. A outra abordagem é duplicar uma etapa intermediária, deixar essas etapas duplicadas na pilha e somar em uma sequência no final;;
na função, depoiskΣ
no final.Sugestões de golfe são bem-vindas. Experimente online!
Ungolfing
fonte
Python 3, 59 bytes
repl.it
Uma porta direta da minha resposta Jelly ; apenas um programa completo recebendo entrada (em vez de uma função).
A
print(x,end='')
é uma declaração de impressão que não irá imprimir a nova linha padrão.fonte
Python 3, 93 bytes
Experimente online!
fonte
print(...,end='')
, façaprint(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
abcde
, está faltando umae
no final.i<=n
vez den-i
para a sua condição.