Considere um bloco quadrado de texto, N caracteres de largura por N de altura, para um número inteiro ímpar N maior que 1.
Como exemplo, seja N = 5 e o texto seja:
MLKJI
NWVUH
OXYTG
PQRSF
ABCDE
Observe que este é o alfabeto (além de Z) em espiral no sentido anti-horário a partir do canto inferior esquerdo. É como um tapete enrolado.
"Desenrolar" o texto um quarto de volta no sentido horário, para que fique no FGHI
mesmo nível dos ABCDE
resultados:
PONM
QXWL
RYVK
STUJ
ABCDEFGHI
Esse desenrolar pode ser feito mais 7 vezes até que o texto seja uma única linha:
SRQP
TYXO
UVWN
ABCDEFGHIJKLM
UTS
VYR
WXQ
ABCDEFGHIJKLMNOP
WVU
XYT
ABCDEFGHIJKLMNOPQRS
XW
YV
ABCDEFGHIJKLMNOPQRSTU
YX
ABCDEFGHIJKLMNOPQRSTUVW
Y
ABCDEFGHIJKLMNOPQRSTUVWX
ABCDEFGHIJKLMNOPQRSTUVWXY
Desafio
O desafio é escrever um programa que é um bloco de texto N × N que gera o número de vezes que "desenrolou" um quarto de volta quando é reorganizado nos padrões de desenrolamento e executado.
Realmente existem dois concursos aqui: (espero que não seja muito complicado)
- Faça isso com o menor N. (até um limite de N = 3)
- Faça isso com o maior N. (sem limite)
Não haverá uma resposta aceita, mas o vencedor em cada uma dessas categorias receberá pelo menos 50 representantes de recompensa de mim. Em caso de empate, as respostas mais antigas vencem.
Exemplo
Se o seu bloco de código for
MyP
rog
ram
executá-lo como deve produzir 0.
Corrida
rM
oy
ramgP
deve produzir 1.
Corrida
or
ramgPyM
deve produzir 2.
Corrida
o
ramgPyMr
deve produzir 3.
Por fim, a execução ramgPyMro
deve gerar 4.
Detalhes
- A saída deve ser impressa em stdout (ou a alternativa mais próxima) sozinha. Não há entrada.
- Você só pode usar ASCII imprimível (códigos hexadecimais 20 a 7E, que inclui espaço) no seu código.
- Os espaços preenchem o espaço vazio nos arranjos de desenrolamento. (A menos que você esteja desenrolando para a esquerda.)
- Somente os arranjos de completamente quadrado a completamente plano precisam ter saída válida. Nenhum outro acordo será executado.
- Você pode não ler sua própria fonte.
- Você pode usar comentários.
- N = 1 é excluído, pois em muitos idiomas o programa
0
funcionaria. Se desejar, você pode desenrolar para a esquerda e não para a direita. Então por exemplo
MyP rog ram
torna-se
Pg yo Mrram
e assim por diante. Nenhum espaço extra é adicionado ao rolar dessa maneira. As linhas acabam
(Relacionado: Escreva um programa retangular que produz o número de vezes que foi girado )
fonte
Respostas:
Golfscript, N <- [5,7 ..]
Totalmente desenrolado:
Explicação:
.
(várias vezes) - duplicar a entrada]
- colete a pilha em uma única matriz,
- tome o seu comprimento9\-
- subtraia de 9#
- comentário de linhaO espaço em branco é um NOP, mas qualquer outro NOP teria funcionado da mesma forma.
Totalmente enrolado, ele usa nove cópias da entrada (conteúdo ignorado) como pilha; 9 - 9 = 0; não foi desenrolado.
Cada desenrolar oculta mais um ponto (duplicado) atrás do comentário, diminuindo a pilha uma vez, aumentando a saída.
Totalmente desenrolado, ele usa apenas a entrada (conteúdo ignorado) como a pilha; 9-1 = 8; foi desenrolado 8 vezes.
A mesma abordagem funciona para qualquer N> 4: mude
9
para o valor apropriado de 2 * N + 1 e estenda o padrão de pontos (duplicado) usando o mesmo padrão em espiral que garante que exatamente um ponto seja desenrolado durante cada desenrolar.fonte
GolfScript, N = 4
Este direito rola como especificação original.
Aqui estão os desenrolamentos:
Experimente aqui
fonte
.
s e#
s?~
. Talvez eu possa roubá-lo por N = 3?APL, N = 3
Desenrolado:
Experimente online.
Ele calcula o restante desse número dividido por 5. Somente o resultado da última linha é impresso.
APL, N = 2
Desenrolado:
Experimente online.
≡
retorna a profundidade (não deve ser confundida com a dimensão ou o comprimento) de uma matriz:0
não é uma matriz. Portanto, a profundidade é 0.0∞
é uma matriz com dois itens0
e∞
(infinito). Tem profundidade 1.0∞⍬
tem outro item⍬
, que é uma matriz vazia com profundidade 1. Portanto,0∞⍬
tem profundidade 2.Esses dois programas também funcionam no intérprete online. Não tenho certeza se o último está sintaticamente correto.
APL, para qualquer N> = 4
Para N = 4:
Totalmente desenrolado:
Para N = 5:
Totalmente desenrolado:
1↓
remove um item na matriz. Ele também retorna a matriz vazia se o argumento for escalar.⍴
obtém o comprimento da matriz.fonte
()[]
eles aparecerão em algum lugar indesejado.