Escreva um programa quadrado que emita o número de vezes que foi “desenrolado”

22

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.

Alfabeto espiral

"Desenrolar" o texto um quarto de volta no sentido horário, para que fique no FGHImesmo nível dos ABCDEresultados:

     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)

  1. Faça isso com o menor N. (até um limite de N = 3)
  2. 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 ramgPyMrodeve 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 0funcionaria.
  • 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 )

Passatempos de Calvin
fonte
Antes de ler o parágrafo "desafio", eu estava esperando um desafio para escrever um programa que saídas-se desenrolou
John Dvorak
1
por que N tem que ser estranho?
John Dvorak
1
@JanDvorak Suponho que N não tenha que ser estranho, mas isso torna as espirais mais padronizadas. Continua assim, mas fique à vontade para postar um N = 2 como um comentário, se você encontrar um.
Passatempos de Calvin
8
Apenas uma idéia: desenrolar o "tapete" para a direita cria muitas linhas começando com espaço em branco, eliminando idiomas como o Python. Se você permitir desenrolar para a esquerda, não haverá necessidade de espaço em branco adicional e o Python (teoricamente) é possível.
Falko
5
Você tem um livro de magia com infinitas idéias para grandes desafios? De que outra forma você continua enfrentando desafios tão interessantes?
Justin

Respostas:

27

Golfscript, N <- [5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

Totalmente desenrolado:

],9\-#  .   .  .  . . ...

Explicação:

  • . (várias vezes) - duplicar a entrada
  • ] - colete a pilha em uma única matriz
  • , - tome o seu comprimento
  • 9\- - subtraia de 9
  • # - comentário de linha

O 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 9para 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.

John Dvorak
fonte
Bem, a menos que alguém encontre N = 3, esta será a resposta vencedora em ambas as categorias.
Passatempos de Calvin
3
@ Calvin'sHobbies Devo ser um idiota total e postar uma solução de esquerda também? :-)
John Dvorak
Por que não. Outra resposta parece improvável de outra maneira: P
Calvin's Hobbies
1
Por que não escolher um que possa se desenrolar nas duas direções? :)
Decay Beta
@BetaDecay hmm ... :-)
John Dvorak
13

GolfScript, N = 4

Este direito rola como especificação original.

.. . 
...# 
.#.~
],8-

Aqui estão os desenrolamentos:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

Experimente aqui

Optimizer
fonte
Como você achou desse arranjo?
haskeller orgulhoso
3
@proudhaskeller É melhor se você não souber ...
Optimizer
8
Você pesquisou brutalmente uma solução?
haskeller orgulhoso
Desafio especial: você pode criar um de .s e #s?
John Dvorak
Eu gosto da trilha ~. Talvez eu possa roubá-lo por N = 3?
John Dvorak
9

APL, N = 3

201
340
5|0

Desenrolado:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Experimente online.

Ele calcula o restante desse número dividido por 5. Somente o resultado da última linha é impresso.

APL, N = 2

⍬∞
≡0

Desenrolado:

  ⍬
≡0∞

≡0∞⍬

Experimente online.

retorna a profundidade (não deve ser confundida com a dimensão ou o comprimento) de uma matriz:

  • 0não é uma matriz. Portanto, a profundidade é 0.
  • 0∞é uma matriz com dois itens 0e (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.

⍬0
≡∞


⍬¯
≡0

APL, para qualquer N> = 4

Para N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Totalmente desenrolado:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Para N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

Totalmente desenrolado:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓remove um item na matriz. Ele também retorna a matriz vazia se o argumento for escalar. obtém o comprimento da matriz.

jimmy23013
fonte
Alguma explicação?
10255146Preço:
@proudhaskeller Editado.
jimmy23013
Você pode idealmente usar a mesma lógica profundidade para qualquer N. Graças a APL
Optimizer
@ Otimizador Não é assim tão fácil. Coisas antes da última linha ainda precisam estar sintaticamente corretas. Portanto, não posso usar a maioria das funções ou outros caracteres de pontuação, como ()[]eles aparecerão em algum lugar indesejado.
jimmy23013
Eu quis dizer como: `⍬ \ n⍬⍬0 \ n≡ ≡` (Não é exatamente isso, mas você entendeu a idéia) #
Optimizer