Escriba un programa cuadrado que muestre la cantidad de veces que se ha "desenrollado"

22

Considere un bloque de texto cuadrado, N caracteres de ancho por N de alto, para algún número entero impar N mayor que 1.

Como ejemplo, dejemos que N = 5 y el texto sea:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Observe que este es el alfabeto (además de Z) en espiral en sentido antihorario desde la esquina inferior izquierda. Es como una alfombra enrollada.

Alfabeto espiral

"Desenrollando" el texto un cuarto de vuelta en el sentido de las agujas del reloj para que FGHIestén al mismo nivel que los ABCDEresultados

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

Este desenrollado se puede hacer 7 veces más hasta que el texto sea una sola línea:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Reto

El desafío es escribir un programa que sea un bloque de texto N × N que genere el número de veces que se ha "desenrollado" un cuarto de vuelta cuando se reorganiza en los patrones de desenrollado y se ejecuta.

Realmente hay dos concursos aquí: (con suerte no será demasiado complicado)

  1. Haga esto con el N. más pequeño (hasta un límite de N = 3)
  2. Haga esto con el N. más grande (sin límite)

No habrá una respuesta aceptada, pero el ganador en cada una de estas categorías recibirá al menos 50 representantes de recompensas de mi parte. En caso de empate, las respuestas más antiguas ganan.

Ejemplo

Si su bloque de código es

MyP
rog
ram

ejecutarlo como está debería generar 0.

Corriendo

   rM
   oy
ramgP

debería dar salida 1.

Corriendo

     or
ramgPyM

debería dar salida 2.

Corriendo

       o
ramgPyMr

debería dar salida 3.

Finalmente, la ejecución ramgPyMrodebería generar 4.

Detalles

  • El resultado debe imprimirse en stdout (o la alternativa más cercana) por sí mismo. No hay entrada
  • Solo puede usar ASCII imprimible (códigos hexadecimales 20 a 7E, que incluye espacio) en su código.
  • Los espacios llenan el espacio vacío en los arreglos de desenrollado. (A menos que te estés desenrollando a la izquierda).
  • Solo los arreglos de completamente cuadrado a completamente plano deben tener una salida válida. No se ejecutarán otros arreglos.
  • No puede leer su propia fuente.
  • Puedes usar comentarios.
  • N = 1 está excluido ya que en muchos idiomas el programa 0funcionaría.
  • Si lo desea, puede desenrollar a la izquierda en lugar de a la derecha. Entonces eg

    MyP
    rog
    ram
    

    se convierte

    Pg
    yo
    Mrram
    

    y así. No se agregan espacios adicionales al rodar de esta manera. Las lineas acaban de terminar

(Relacionado: escriba un programa rectangular que genere la cantidad de veces que se giró )

Pasatiempos de Calvin
fuente
Antes de leer el párrafo "desafío", esperaba un desafío para escribir un programa que saliera desenrollado
John Dvorak
1
¿Por qué N tiene que ser extraño?
John Dvorak
1
@ JanDvorak Supongo que N no tiene que ser extraño, pero hace que las espirales sean más estandarizadas. Se mantiene así, pero siéntase libre de publicar un N = 2 como comentario si encuentra uno.
Pasatiempos de Calvin
8
Solo una idea: desenrollar la "alfombra" a la derecha crea muchas líneas que comienzan con espacios en blanco, eliminando lenguajes como Python. Si permitiera desenrollar a la izquierda, no habría necesidad de espacios en blanco adicionales y Python es (en teoría) posible.
Falko
55
¿Tienes un libro de magia con infinitas ideas de grandes desafíos? ¿De qué otra forma te encuentras con desafíos tan interesantes?
Justin

Respuestas:

27

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

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

Completamente desenrollado:

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

Explicación:

  • . (varias veces) - duplica la entrada
  • ] - recoger la pila en una sola matriz
  • , - tomar su longitud
  • 9\- - restarlo de 9
  • # - comentario de línea

El espacio en blanco es un NOP, pero cualquier otro NOP habría funcionado igual de bien.

Completamente enrollado, utiliza nueve copias de la entrada (contenido ignorado) como pila; 9 - 9 = 0; No se ha desenrollado.

Cada desenrollado oculta un punto más (duplicado) detrás del comentario, reduciendo la pila una vez e incrementando la salida.

Completamente desenrollado, usa solo la entrada (contenido ignorado) como la pila; 9 - 1 = 8; Se ha desenrollado 8 veces.

El mismo enfoque funciona para cualquier N> 4: cambie 9al valor apropiado de 2 * N + 1, luego extienda el patrón de puntos (duplicado) usando el mismo patrón en espiral que garantiza que se desenrolle exactamente un punto durante cada desenrollado.

John Dvorak
fuente
Bueno, a menos que alguien encuentre N = 3, esta será la respuesta ganadora en ambas categorías.
Pasatiempos de Calvin
3
@ Calvin'sHobbies ¿Debería ser un completo imbécil y publicar una solución para desenrollar también? :-)
John Dvorak
Por qué no. Otra respuesta parece poco probable: P
Calvin's Hobbies
1
¿Por qué no elegir uno que pueda desenrollarse en ambas direcciones? :)
Beta Decay
@BetaDecay hmm ... :-)
John Dvorak
13

GolfScript, N = 4

Este derecho rueda como especificaciones originales.

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

Aquí están los desenrollamientos:

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

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

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

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

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

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

Pruébalo aquí

Optimizador
fuente
¿Cómo te pareció este arreglo?
orgulloso Haskeller
3
@proudhaskeller Es mejor si no lo sabes ...
Optimizer
8
¿Buscaste una solución por bruto?
orgulloso Haskeller
Desafío especial: ¿puedes hacer uno de .s y #s?
John Dvorak
Me gusta el rastro ~. ¿Tal vez pueda robarlo por N = 3?
John Dvorak
9

APL, N = 3

201
340
5|0

Desenrollado:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Pruébalo en línea.

Calcula el resto de ese número dividido entre 5. Solo se imprime el resultado de la última línea.

APL, N = 2

⍬∞
≡0

Desenrollado:

  ⍬
≡0∞

≡0∞⍬

Pruébalo en línea.

devuelve la profundidad (que no debe confundirse con la dimensión o la longitud) de una matriz:

  • 0No es una matriz. Entonces la profundidad es 0.
  • 0∞es una matriz con dos elementos 0y (infinito). Tiene profundidad 1.
  • 0∞⍬tiene otro elemento , que es una matriz vacía con profundidad 1. También 0∞⍬tiene profundidad 2.

Estos dos programas también funcionan en el intérprete en línea. No estoy seguro si el último es sintácticamente correcto.

⍬0
≡∞


⍬¯
≡0

APL, para cualquier N> = 4

Para N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Completamente desenrollado:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Para N = 5:

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

Completamente desenrollado:

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

1↓elimina un elemento en la matriz. También devuelve la matriz vacía si el argumento es escalar. obtiene la longitud de la matriz.

jimmy23013
fuente
¿Alguna explicación?
orgulloso Haskeller
@proudhaskeller Editado.
jimmy23013
Idealmente puede usar la misma lógica de profundidad para cualquier N. Gracias a APL
Optimizer
@Optimizer No es tan fácil. Las cosas antes de la última línea todavía tienen que ser sintácticamente correctas. Por lo tanto, no puedo usar la mayoría de las funciones u otros caracteres de puntuación, ()[]ya que aparecerán en algún lugar no deseado.
jimmy23013
Me refería a: `⍬ \ n⍬⍬0 \ n≡ ∞` (No es exactamente eso, pero se entiende la idea)
Optimizador