Schreiben Sie ein quadratisches Programm, das ausgibt, wie oft es "abgewickelt" wurde.

22

Betrachten Sie einen quadratischen Textblock mit einer Breite von N Zeichen und einer Höhe von N für eine ungerade Ganzzahl N, die größer als 1 ist.

Als Beispiel sei N = 5 und der Text:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Beachten Sie, dass dies das Alphabet (neben Z) ist, das von der unteren linken Ecke aus gegen den Uhrzeigersinn gedreht wurde. Es ist wie ein aufgerollter Teppich.

Spiral-Alphabet

"Abrollen" des Textes um eine Vierteldrehung im Uhrzeigersinn, also FGHIauf der gleichen Ebene wie das ABCDEErgebnis:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

Dieses Abrollen kann noch sieben Mal durchgeführt werden, bis der Text eine einzige Zeile ist:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Herausforderung

Die Herausforderung besteht darin, ein Programm zu schreiben, das ein N × N-Textblock ist, der die Häufigkeit ausgibt, mit der er um eine viertel Umdrehung "abgewickelt" wurde, wenn er in die Abwicklungsmuster umgeordnet und ausgeführt wird.

Hier gibt es wirklich zwei Wettbewerbe: (Hoffentlich wird es nicht zu chaotisch)

  1. Tun Sie dies mit dem kleinsten N. (bis zu einer Grenze von N = 3)
  2. Tun Sie dies mit dem größten N. (keine Begrenzung)

Es wird keine akzeptierte Antwort geben, aber der Gewinner in jeder dieser Kategorien erhält mindestens 50 Kopfgeldreplikationen von mir. Bei Gleichstand gewinnt die älteste Antwort.

Beispiel

Wenn Ihr Codeblock ist

MyP
rog
ram

Läuft es so, wie es ist, sollte es 0 ausgeben.

Laufen

   rM
   oy
ramgP

sollte 1 ausgeben.

Laufen

     or
ramgPyM

sollte 2 ausgeben.

Laufen

       o
ramgPyMr

sollte 3 ausgeben.

Zum Schluss sollte running ramgPyMro4 ausgeben.

Einzelheiten

  • Die Ausgabe sollte von selbst auf stdout (oder die nächstgelegene Alternative) gedruckt werden. Es erfolgt keine Eingabe.
  • Sie dürfen in Ihrem Code nur druckbare ASCII-Zeichen (Hex-Codes 20 bis 7E, einschließlich Leerzeichen) verwenden.
  • Leerzeichen füllen den leeren Raum in den Abrollvorrichtungen. (Es sei denn, Sie rollen nach links ab.)
  • Nur die Anordnungen von vollständig quadratisch bis vollständig flach müssen eine gültige Ausgabe haben. Es werden keine anderen Vereinbarungen getroffen.
  • Sie können Ihre eigene Quelle nicht lesen.
  • Sie können Kommentare verwenden.
  • N = 1 ist ausgeschlossen, da das Programm in vielen Sprachen 0funktionieren würde.
  • Falls gewünscht, können Sie sich eher nach links als nach rechts abrollen. Also zB

    MyP
    rog
    ram
    

    wird

    Pg
    yo
    Mrram
    

    und so weiter. Beim Rollen auf diese Weise werden keine zusätzlichen Leerzeichen hinzugefügt. Die Zeilen enden einfach

(Siehe auch: Schreiben eines rechteckigen Programms, das ausgibt, wie oft gedreht wurde. )

Calvins Hobbys
quelle
Bevor ich den Abschnitt "Herausforderung" las, erwartete ich, dass eine Herausforderung ein Programm schreibt, das sich selbst entrollt ausgibt
John Dvorak,
1
warum muss N ungerade sein?
John Dvorak
1
@ JanDvorak Ich nehme an, N musste nicht ungerade sein, aber es macht die Spiralen standardisierter. Es bleibt so, aber Sie können auch N = 2 als Kommentar posten, wenn Sie einen finden.
Calvins Hobbys
8
Nur eine Idee: Wenn Sie den "Teppich" nach rechts ausrollen, entstehen viele Zeilen, die mit Leerzeichen beginnen und Sprachen wie Python eliminieren. Wenn Sie das Abrollen nach links zulassen würden, wäre kein zusätzliches Leerzeichen erforderlich, und Python ist (theoretisch) möglich.
Falko
5
Hast du ein Zauberbuch mit unendlich tollen Herausforderungsideen? Wie kommen Sie sonst immer wieder auf so interessante Herausforderungen?
Justin

Antworten:

27

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

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

Vollständig ausgerollt:

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

Erläuterung:

  • . (mehrmals) - duplizieren Sie die Eingabe
  • ] - Sammeln Sie den Stapel in einem einzigen Array
  • , - Nimm seine Länge
  • 9\- - subtrahiere es von 9
  • # - Zeilenkommentar

Whitespace ist ein NOP, aber jeder andere NOP hätte genauso gut funktioniert.

Vollständig aufgerollt werden neun Kopien der Eingabe (Inhalt ignoriert) als Stapel verwendet. 9 - 9 = 0; es wurde nicht abgerollt.

Bei jedem Abrollen wird ein weiterer Punkt (Duplikat) hinter dem Kommentar ausgeblendet, wodurch der Stapel einmal verkleinert und die Ausgabe erhöht wird.

Vollständig entrollt, verwendet es nur die Eingabe (Inhalte ignoriert) als Stapel; 9-1 = 8; es wurde 8 mal abgerollt.

Der gleiche Ansatz gilt für alle N> 4: Ändern Sie 9den Wert auf 2 * N + 1 und erweitern Sie dann das Punktmuster (Duplikat) mit demselben Spiralmuster, das sicherstellt, dass genau ein Punkt beim Abrollen abgewickelt wird.

John Dvorak
quelle
Nun, es sei denn, jemand findet N = 3, ist dies die beste Antwort in beiden Kategorien.
Calvins Hobbys
3
@ Calvin'sHobbies soll ich ein totaler Schwanz sein und auch eine links abrollende Lösung posten? :-)
John Dvorak
Warum nicht. Eine andere Antwort erscheint unwahrscheinlich: P
Calvins Hobbys
1
Warum nicht einen nehmen, der sich in beide Richtungen abwickeln kann? :)
Beta Decay
@BetaDecay hmm ... :-)
John Dvorak
13

GolfScript, N = 4

Dieses eine Recht rollt als ursprüngliche Spezifikation.

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

Hier sind die Abwicklungen:

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

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

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

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

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

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

Probieren Sie es hier aus

Optimierer
quelle
Wie haben Sie dieses Arrangement erlebt?
stolzer Haskeller
3
@ proudhaskeller Es ist besser, wenn Sie nicht wissen ...
Optimierer
8
Haben Sie nach einer Lösung gesucht?
stolzer Haskeller
Besondere Herausforderung: Können Sie aus .s und #s eins machen ?
John Dvorak
Ich mag das Schleppen ~. Vielleicht kann ich es für N = 3 stehlen?
John Dvorak
9

APL, N = 3

201
340
5|0

Abgerollt:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Probieren Sie es online aus.

Der Rest dieser Zahl wird durch 5 geteilt. Es wird nur das Ergebnis der letzten Zeile gedruckt.

APL, N = 2

⍬∞
≡0

Abgerollt:

  ⍬
≡0∞

≡0∞⍬

Probieren Sie es online aus.

Gibt die Tiefe (nicht zu verwechseln mit der Dimension oder Länge) eines Arrays zurück:

  • 0ist kein Array. Die Tiefe ist also 0.
  • 0∞ist ein Array mit zwei Elementen 0und (unendlich). Es hat Tiefe 1.
  • 0∞⍬hat ein weiteres Element , das ein leeres Array mit der Tiefe 1 0∞⍬ist. Hat also die Tiefe 2.

Diese beiden Programme funktionieren auch im Online-Interpreter. Ich bin mir nicht sicher, ob der spätere syntaktisch korrekt ist.

⍬0
≡∞


⍬¯
≡0

APL, für ein beliebiges N> = 4

Für N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Vollständig ausgerollt:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Für N = 5:

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

Vollständig ausgerollt:

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

1↓Entfernt ein Element im Array. Es gibt auch das leere Array zurück, wenn das Argument skalar ist. Ruft die Array-Länge ab.

jimmy23013
quelle
Irgendwelche Erklärungen?
stolzer Haskeller
@proudhaskeller Bearbeitet.
Jimmy23013
Sie können im Idealfall die gleiche Tiefe Logik für jede N. Dank APL verwenden
Optimizer
@Optimizer So einfach ist das nicht. Dinge vor der letzten Zeile müssen noch syntaktisch korrekt sein. Daher kann ich die meisten Funktionen oder andere Interpunktionszeichen nicht so verwenden, wie ()[]sie an einer unerwünschten Stelle erscheinen.
Jimmy23013
Ich meinte wie: `⍬ \ n⍬⍬0 \ n≡ ≡` (Nicht genau das, aber Sie bekommen die Idee)
Optimierer