Écrire un programme carré qui affiche le nombre de fois qu'il a été «déroulé»

22

Considérons un bloc de texte carré, N caractères de large par N de haut, pour un entier impair N supérieur à 1.

À titre d'exemple, soit N = 5 et le texte soit:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Notez que c'est l'alphabet (en plus de Z) en spirale dans le sens antihoraire à partir du coin inférieur gauche. C'est un peu comme un tapis enroulé.

Alphabet en spirale

"Dérouler" le texte d'un quart de tour dans le sens des aiguilles d'une montre est donc FGHIau même niveau que les ABCDErésultats dans:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

Ce déroulement peut être effectué 7 fois de plus jusqu'à ce que le texte soit sur une seule ligne:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Défi

Le défi consiste à écrire un programme qui est un bloc de texte N × N qui génère le nombre de fois qu'il s'est "déroulé" d'un quart de tour lorsqu'il est réorganisé dans les modèles de déroulement et exécuté.

Il y a vraiment deux concours ici: (j'espère que ce ne sera pas trop compliqué)

  1. Pour ce faire, avec le plus petit N. (jusqu'à une limite de N = 3)
  2. Faites-le avec le plus grand N. (pas de limite)

Il n'y aura pas de réponse acceptée, mais le gagnant dans chacune de ces catégories recevra au moins 50 représentants de primes de ma part. En cas d'égalité, les réponses les plus anciennes l'emportent.

Exemple

Si votre bloc de code est

MyP
rog
ram

l'exécuter tel quel devrait produire 0.

Fonctionnement

   rM
   oy
ramgP

devrait produire 1.

Fonctionnement

     or
ramgPyM

devrait sortir 2.

Fonctionnement

       o
ramgPyMr

devrait produire 3.

Enfin, l'exécution ramgPyMrodevrait produire 4.

Détails

  • La sortie doit être imprimée sur stdout (ou l'alternative la plus proche) par elle-même. Il n'y a aucune entrée.
  • Vous ne pouvez utiliser que de l' ASCII imprimable (codes hexadécimaux 20 à 7E, y compris l'espace) dans votre code.
  • Des espaces remplissent l'espace vide dans les dispositions de déroulement. (Sauf si vous vous déroulez vers la gauche.)
  • Seuls les arrangements de complètement carré à complètement plat doivent avoir une sortie valide. Aucun autre arrangement ne sera exécuté.
  • Vous ne pouvez pas lire votre propre source.
  • Vous pouvez utiliser des commentaires.
  • N = 1 est exclu car dans de nombreuses langues, le programme 0fonctionnerait.
  • Si vous le souhaitez, vous pouvez dérouler vers la gauche plutôt que vers la droite. Donc par exemple

    MyP
    rog
    ram
    

    devient

    Pg
    yo
    Mrram
    

    etc. Aucun espace supplémentaire n'est ajouté lors du roulement de cette façon. Les lignes se terminent

(Connexes: écrire un programme rectangulaire qui génère le nombre de fois qu'il a été tourné )

Loisirs de Calvin
la source
Avant de lire le paragraphe "challenge", je m'attendais à un défi pour écrire un programme qui sort lui-même déroulé
John Dvorak
1
pourquoi N doit-il être impair?
John Dvorak
1
@JanDvorak Je suppose que N n'a pas dû être étrange, mais cela rend les spirales plus standardisées. Cela reste ainsi mais n'hésitez pas à poster un N = 2 en commentaire si vous en trouvez un.
Calvin's Hobbies
8
Juste une idée: dérouler le "tapis" à droite crée de nombreuses lignes commençant par des espaces, éliminant les langages comme Python. Si vous autorisez le déroulement à gauche, il n'y aurait pas besoin d'espace supplémentaire et Python est (théoriquement) possible.
Falko
5
Avez-vous un livre magique avec d'infinies grandes idées de défis? Sinon, comment pouvez-vous continuer à relever des défis aussi intéressants?
Justin

Réponses:

27

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

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

Entièrement déroulé:

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

Explication:

  • . (plusieurs fois) - dupliquer l'entrée
  • ] - collecter la pile dans un seul tableau
  • , - prendre sa longueur
  • 9\- - le soustraire de 9
  • # - commentaire de ligne

L'espace est un NOP, mais tout autre NOP aurait tout aussi bien fonctionné.

Complètement enroulé, il utilise neuf copies de l'entrée (contenu ignoré) comme pile; 9 - 9 = 0; il n'a pas été déroulé.

Chaque déroulement déroule un point de plus (doublon) derrière le commentaire, réduisant la pile une fois, incrémentant la sortie.

Entièrement déroulé, il utilise uniquement l'entrée (contenu ignoré) comme pile; 9 - 1 = 8; il a été déroulé 8 fois.

La même approche fonctionne pour tout N> 4: passez 9à la valeur appropriée de 2 * N + 1, puis étendez le motif de points (en double) en utilisant le même motif en spirale qui garantit qu'un seul point se déroule à chaque déroulement.

John Dvorak
la source
Eh bien, à moins que quelqu'un trouve N = 3, ce sera la réponse gagnante dans les deux catégories.
Calvin's Hobbies
3
@ Calvin'sHobbies devrais-je être une bite totale et publier également une solution de gauche? :-)
John Dvorak
Pourquoi pas. Une autre réponse semble peu probable autrement: P
Hobbies de Calvin le
1
Pourquoi ne pas opter pour celui qui peut se dérouler dans les deux sens? :)
Beta Decay
@BetaDecay hmm ... :-)
John Dvorak
13

GolfScript, N = 4

Celui-ci roule à droite comme spécifications d'origine.

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

Voici les déroulements:

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

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

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

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

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

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

Essayez-le ici

Optimiseur
la source
Comment avez-vous pensé à cet arrangement?
fier haskeller
3
@proudhaskeller C'est mieux si vous ne savez pas ...
Optimizer
8
Avez-vous recherché brutalement une solution?
fier haskeller
Défi spécial: pouvez-vous en faire un à partir de .s et #s?
John Dvorak
J'aime la fuite ~. Peut-être que je peux le voler pour N = 3?
John Dvorak
9

APL, N = 3

201
340
5|0

Déroulé:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Essayez-le en ligne.

Il calcule le reste de ce nombre divisé par 5. Seul le résultat de la dernière ligne est imprimé.

APL, N = 2

⍬∞
≡0

Déroulé:

  ⍬
≡0∞

≡0∞⍬

Essayez-le en ligne.

renvoie la profondeur (à ne pas confondre avec la dimension ou la longueur) d'un tableau:

  • 0n'est pas un tableau. La profondeur est donc 0.
  • 0∞est un tableau avec deux éléments 0et (infini). Il a la profondeur 1.
  • 0∞⍬a un autre élément , qui est un tableau vide de profondeur 1. Il en 0∞⍬est de même pour la profondeur 2.

Ces deux programmes fonctionnent également dans l'interpréteur en ligne. Je ne sais pas si la dernière est syntaxiquement correcte.

⍬0
≡∞


⍬¯
≡0

APL, pour tout N> = 4

Pour N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Entièrement déroulé:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Pour N = 5:

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

Entièrement déroulé:

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

1↓supprime un élément du tableau. Il renvoie également le tableau vide si l'argument est scalaire. obtient la longueur du tableau.

jimmy23013
la source
Des explications?
fier haskeller
@proudhaskeller Edited.
jimmy23013
Vous pouvez idéalement utiliser la même logique de profondeur pour n'importe quel N. Merci à APL
Optimizer
@Optimizer Ce n'est pas si simple. Les choses avant la dernière ligne doivent toujours être syntaxiquement correctes. Je ne peux donc pas utiliser la plupart des fonctions ou autres caractères de ponctuation comme ()[]ils apparaîtront à un endroit indésirable.
jimmy23013
Je voulais dire: `⍬ \ n⍬⍬0 \ n≡ ∞` (Pas exactement ça, mais vous avez l'idée)
Optimizer