Essa pergunta é inspirada na pergunta de Kevin Cruijssen .
Agora que o tapete está arrumado, queremos enrolá-lo. Sua tarefa é escrever um programa que use uma string e retorne uma espiral feita com essa string (representando um tapete enrolado visto de lado).
O procedimento para uma etapa de rolar o tapete é o seguinte. Há um exemplo para ilustrar o que quero dizer. Observe que o exemplo começa com um tapete parcialmente enrolado para melhor entendimento:
ac
rpet
- Separe a "cabeça" da "cauda" do tapete: a cabeça é o que foi rolado até agora, a cauda é o que resta a ser rolado.
Head: ac Tail:
rp et
- Gire a cabeça 90 °, no sentido horário.
Rotated head: ra Tail (unchanged):
pc et
- se a largura da nova cabeça (aqui
2
) for menor ou igual ao comprimento da cauda (aqui2
)- então, coloque em cima da cauda
- caso contrário, o tapete (como estava no início da etapa) foi enrolado
New carpet: ra
pc
et
Repita o procedimento quantas vezes for necessário.
Dois exemplos mostrando todas as etapas do tapete rolando:
carpet
c
arpet
ac
rpet
ra
pc
et
0123456789
0
123456789
10
23456789
21
30
456789
432
501
6789
Algumas precisões:
- Você não precisa mostrar todas as etapas intermediárias, apenas o tapete enrolado (por exemplo, se você encontrar uma maneira não iterativa de calcular o resultado, é perfeito). Além disso, você não precisa imprimir nenhum espaço em branco à esquerda; nos exemplos acima, mostro apenas para alinhar as coisas.
- Input é uma String, uma lista / matriz de caracteres
- A saída é impressa em stdout ou em um arquivo.
- A entrada é boa: o comprimento é de pelo menos 1 caractere e, no máximo, uma constante suficientemente pequena para que não cause problemas, mas você não pode usar essa constante em seu programa; o conteúdo da string é apenas caracteres legais ([a-zA-Z0-9]), codificando de acordo com sua preferência.
- 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 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 para sua resposta, se achar necessário.
ProgrammingPuzzlesAndCodeGolf
- o comprimento final da cauda maior que 1 me tropeçou.print
dentro de alambda
.Respostas:
Carvão , 15 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Laço sobre o tapete.
Verifique se há algo acima do cursor.
Caso contrário, role o tapete.
Mova para a direita e emita o caractere atual.
Exemplo: Para a entrada
0123456789
, ocorrem as seguintes ações:0
é impresso.O cursor se move para a direita e
1
é impresso.Como não há nada acima do
1
, a tela é girada.O cursor se move para a direita e o
2
é impresso.Como não há nada acima do
2
, a tela é girada.O cursor se move para a direita e o
3
é impresso.O cursor se move para a direita e o
4
é impresso.Como não há nada acima do
4
, a tela é girada.O cursor se move para a direita e o
5
é impresso.O cursor se move para a direita e o
6
é impresso.Como não há nada acima do
6
, a tela é girada.O cursor se move para a direita e o
7
é impresso.O cursor se move para a direita e o
8
é impresso.O cursor se move para a direita e o
9
é impresso.fonte
⟲
?Pitão, 37 bytes
Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .
fonte
Casca , 24 bytes
Experimente online!
Explicação
fonte
J , 69 bytes
-3 bytes graças ao FrownyFrog
Experimente online!
explicação
O algoritmo é direto, apesar de ser um pouco detalhado para J.
Estratégia geral: reduza a entrada para uma mesa quadrada, com uma peça restante (possivelmente vazia).
À medida que reduzimos, usaremos uma lista de 2 elementos. Nosso "resultado até agora" será a primeira caixa e "os itens restantes a serem processados" serão a segunda caixa. A primeira caixa será inicializada no cabeçalho da entrada (mas convertida em uma tabela):
e "itens restantes a serem processados" serão a cauda da entrada:
Agora temos:
onde o 'c' é na verdade uma tabela 1x1.
Reduzimos isso usando um loop J Do ... While:
Onde a parte entre parênteses é a condição "continue":
que diz "continue enquanto o comprimento da caixa direita é maior ou igual ao comprimento da caixa esquerda (ou seja, o comprimento lateral da matriz quadrada)
O que significa "continuar"? Isso é definido no verbo à esquerda do primeiro
^:
, que nos diz como obter o resultado atual e produzir a próxima iteração. Esse verbo é:Vamos dividir:
Ou seja, este é apenas um algoritmo descrito no OP traduzido literalmente em J.
Finalmente, lidamos com os (possivelmente 0) itens restantes, a cauda do nosso rolo de carpete:
Isso diz "pegue tudo, exceto o último olmo do resultado":
e anexá-lo aos
,
últimos itens do resultado{:@[
com os itens restantes anexados ao último item, ]
fonte
,.
pode fazer o que1 1$]
faz e$
pode ser usado como{.
.$ can be used as {.
- você pode esclarecer?R ,
146132 bytesExperimente online!
Implementa o procedimento de enrolar o tapete. Leva a entrada como uma lista de caracteres e imprime em stdout.
Salva 14 bytes, encontrando uma maneira de usar um
do-while
loop e inicializando usandoF
.fonte
Gelatina , 30 bytes
Parece excessivamente longo ...
Experimente online!
Quão?
fonte
05AB1E , 41 bytes
Muito tempo, mas eu queria usar o Canvas. O que provavelmente foi uma má escolha agora que eu terminei e acabou sendo esse tempo ..
Experimente online . (Não há suíte de testes, porque parece haver um problema estranho com o
.Λ
built-in ..)Explicação:
Deixe-me começar dando uma explicação geral do Canvas e o que eu queria que meu código realizasse. Informações mais detalhadas podem ser encontradas nesta dica relevante do 05AB1E , mas para esse desafio eu queria fazer o seguinte:
O Canvas integrado usa três parâmetros:
[2,2,3,3,4,4,5,5,...]
.carpet
é0123456789ABCDEFGHI
éQuanto ao código:
Veja este 05AB1E ponta do meu (seção Como comprimir grandes inteiros? ) Para entender por que
Ž8O
é2064
.fonte
Python 3 , 112 bytes
Nesse caso, a saída é o valor da função.
Experimente online!
Se preferir, aqui outra solução (mais longa, 129 bytes ) que imprime diretamente a entrada rolada:
Experimente online!
fonte
MATLAB / oitava , 154 bytes
Não é o mais curto, mas jogar golfe no MATLAB / Octave é sempre divertido :)
Experimente online!
fonte
disp
, eu diria que você deve remover adisp
deixar as pessoas que não sabem R que faz gravação para STDOUT por padrão