Ein eifriger "Quick Brown Fox" "sprang" entlang der groovigen Spirale

12

Einführung

Schreiben Sie ein Programm, um die Ausgangsspirale des berühmten Pangrams nach vorgegebenen Regeln auszugeben.

Herausforderung

Ein Pangram ist ein Satz, der jeden Buchstaben eines bestimmten Alphabets mindestens einmal verwendet. Einer der bekanntesten Pangrams ist der, der in der Windows-Schriftartenanzeige ausgiebig verwendet wird, nämlich " Der schnelle braune Fuchs springt über den faulen Hund ". Die Herausforderung besteht darin, eine Spirale basierend auf diesem Text auszugeben.

Ihre Aufgabe gibt genau diesen Text aus:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

Hier ist, wie es erzeugt wird,

  • Es gab einen eifrigen Fuchs, der den Pangram "Der schnelle braune Fuchs springt über den faulen Hund" genoss. Eines Tages befand er sich in der Mitte einer äußeren Spirale und beschloss, hineinzuspringen und mitzumalen.
  • Er möchte den Pangram von Anfang bis Ende durchgehen, und wenn ein Buchstabe der n-te Buchstabe im Alphabet ist, möchte er ihn n-mal malen.
  • Der Fuchs war jedoch nicht sehr gut darin, Kurven zu fahren, so dass er beim Erreichen jeder Kurve auch anhalten und zum nächsten Buchstaben wechseln musste.
  • Er beschloss auch, den Pangram dreimal zu wiederholen, um zu betonen, dass er der schnelle braune Fuchs ist.
  • Ihre Aufgabe ist es, zu zeigen, wie die Spirale aussehen würde, nachdem der Fuchs all diese Buchstaben gemalt hat.

(Einfache Version ohne Geschichtenerzählen)

  • Der berühmte Pangram "Der schnelle braune Fuchs springt über den faulen Hund" wird dreimal wiederholt, wobei die Leerzeichen entfernt und alle Buchstaben in Kleinbuchstaben geschrieben werden

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Die Spirale beginnt in der Mitte und beginnt mit dem Buchstaben "t". Sie beginnt nach rechts und geht im Uhrzeigersinn nach außen. Wenn das aktuelle Zeichen der n-te Buchstabe im Alphabet ist, wird immer zum nächsten Zeichen gewechselt

    • die Spirale erreicht eine Ecke oder
    • Die aktuellen Buchstaben werden genau n-mal gedruckt.

Um es besser zu veranschaulichen, werde ich erklären, wie die Spirale in Bezug auf die ersten drei Wörter "thequickbrown" erzeugt wird.

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

Der Fuchs beginnt bei "t", geht nach rechts, erreicht die erste Ecke, malt sie mit "t" und wechselt dann zu "h" und geht nach unten, erreicht die zweite Ecke, wechselt zu "e" und geht nach links, erreicht die 3. Ecke, wechselt zu "q" und geht nach oben, erreicht die 4. Ecke, wechselt zu "u" und geht nach rechts, erreicht eine Ecke und wechselt zu "i", geht nach unten, erreicht eine Ecke und wechselt zu "c", geht links, malt erfolgreich 3 "c" s vor Erreichen der nächsten Ecke , wechselt zu "k" und geht nach links , erreicht eine Ecke sofort, wechselt zu "b" und steigt auf, malt 2 "b" s vor Erreichen die nächste Ecke wechselt zu "r"und geht weiter nach oben , erreicht eine Ecke und wechselt zu "o", geht rechts, dann "w", runter, "n", links.

Technische Daten

  • Sie können eine optionale Eingabe vornehmen, die eine beliebige Standardform der Zeichenfolge enthält

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Ihre Ausgabe muss als Zeichenfolge formatiert sein und muss mit korrekt platzierten Zeilenumbrüchen zu STDOUT anstelle von Dateien oder STDERR gehen. Leerzeilen überschreiben und abschließen spielt keine Rolle. Überschriften und abschließende Leerzeichen in jeder Zeile sind zulässig, müssen jedoch konsistent sein. Wenn Sie also 5 Leerzeichen vor einer Zeile des angegebenen Texts einfügen, müssen Sie genau 5 Leerzeichen vor jeder Zeile einfügen, damit die Spirale gleich aussieht.

  • Dies ist , die niedrigste Anzahl von Bytes gewinnt.

  • Wie üblich gelten hier Standardlücken .


Erklärungen sind willkommen, aber nicht notwendig.

Titel bearbeitet, um es zu einem Pangram pro Kommentar von Caird Coinheringaahing zu machen.

Der faule Hund ist zu faul, um in der Geschichte zu erscheinen.

Ich möchte eine Zeichenfolge-Abfrage erstellen, bei der der auszugebende Buchstabe nicht durch einfache Funktionen der Koordinaten berechnet werden kann.

Weijun Zhou
quelle
2
Es ist eine Schande, dass der Titel kein
Pangram
@cairdcoinheringaahing Guter Punkt, ich werde versuchen, einen zu finden. Irgendwelche Vorschläge?
Weijun Zhou
4
@cairdcoinheringaahing Aktualisiert
Weijun Zhou
Minor point: Sollte das 'h' im ersten 'the' nicht zweimal wiederholt werden, nicht das 't'?
mudkip201
@ mudkip201 Die Ecke wird mit dem Originalbuchstaben gezeichnet, bevor zum nächsten Zeichen gewechselt wird. Vielleicht sollte ich das klarstellen.
Weijun Zhou

Antworten:

5

Stax , 35 34 33 32 Bytes

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Führen Sie es online aus und debuggen Sie es

Stax ist eine Sprache, an der ich seit ungefähr 6 Monaten arbeite. Dies ist das erste öffentliche Golfen damit. Kommen wir zur Sache.

Stax wird normalerweise in den druckbaren ASCII-Zeichensatz geschrieben. Diese 34-Byte-Übermittlung ist in eine Variante des CP437-Zeichensatzes gepackt . Die entsprechende ASCII-Darstellung lautet

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax ist eine stapelbasierte Sprache, hat jedoch zwei Datenstapel, "main" und "input". Die meisten Operationen verwenden den Hauptstapel, aber die Eingabe beginnt auf dem Eingabestapel. Stax-Anweisungen sind meistens ASCII-Sequenzen mit einem oder zwei Zeichen. Die meisten von ihnen sind überlastet, was bedeutet, dass ihr Verhalten von den wenigen obersten Werten auf dem Stapel bestimmt wird.

Auf einer hohen Ebene erstellt dieses Programm ein Raster, indem wiederholt Zeichenfolgen an die letzte Zeile angehängt werden. Wenn die letzte Zeile voll ist, wird das Raster im Uhrzeigersinn gedreht. Am Ende wird das Raster horizontal gespiegelt. Im Detail funktioniert das Programm so.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row
rekursiv
quelle
Wow, ich bin wirklich erstaunt, dass die Herausforderung den ersten öffentlichen Auftritt im Golf für eine Golfsprache bedeuten würde. Vielen Dank für deine Unterstützung! Interessiert an der Sprache des Monats? Ich hoffe, dass bald mehr Benutzer es verwenden und es auf der Kandidatenliste erscheint!
Weijun Zhou
@ WeijunZhou: Du meinst das ? Ich wusste bis jetzt nicht, dass es eine Sache ist. Ich hätte nichts gegen eine Nominierung. Es scheint, als wäre es besser für etabliertere Sprachen geeignet, aber ich habe keine Einwände.
rekursive
Ja. Ich kann es vorschlagen, wenn es, wie Sie sagen, besser etabliert ist. Ich hoffe es wird nicht mehr lange dauern.
Weijun Zhou
Da "Überschriftenabstand in jeder Zeile keine Rolle spielt, solange sie konsistent sind", können Sie auf Wunsch ein weiteres Byte speichern.
Weijun Zhou
1
Ich habe gerade einen Beitrag mit Stax eingereicht . Sie können diesbezüglich Ratschläge geben, wenn Sie dies wünschen. Edit: Was für ein Zufall. Ich werde versuchen, aus Ihrem Beitrag zu lernen.
Weijun Zhou
11

Charcoal , 66 40 36 Bytes

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: Speichert 16 Bytes, indem der Text als Eingabe verwendet wird. Erläuterung:

≔²η

Beginnen Sie mit 2 ts aus irgendeinem Grund.

FS«

Überfliege alle Buchstaben im Pangram.

F¬η«

Haben wir schon eine Ecke erreicht?

Bewegen Sie sich eine Zeile nach unten (oder in die nächste Richtung).

Drehen Sie die Druckrichtung um 90 ° im Uhrzeigersinn.

⊞υη≔⊕÷Lυ²η

Berechnen Sie die Länge der nächsten Seite.

¶»

Beenden Sie die Korrektur der Cursorposition. (Holzkohle hätte es vorgezogen, wenn die Seite kurz vor der Ecke endete, sodass Sie sich an der Ecke selbst drehten.)

F⊕⌕βι

Schleife so oft wie der aktuelle Buchstabe im Alphabet.

¿η«

Wenn wir die Ecke nicht erreicht haben,

≦⊖ηι

Verringern Sie die Anzahl und drucken Sie den aktuellen Buchstaben.

Neil
quelle
Vielen Dank. Tolle Arbeit und gut erklärt. Ein kleiner Tippfehler: da mal -> dreimal.
Weijun Zhou
Diese 43-Byte-Version ist laut Spezifikation ebenfalls akzeptabel. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Weijun Zhou
1
@WeijunZhou Danke, ich habe diese Klausel in der Frage vorher nicht bemerkt.
Neil
2

Ruby , 217 212 209 208 Bytes

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

Probieren Sie es online!

Verbringen Sie viel Zeit mit dem Verwalten von Zeigern, sodass möglicherweise Platz für mehr Golf vorhanden ist.

-5 Bytes: Verdreifachen Sie den Pangram vor der Eingabe. Dank Weijun Zhou .

-3 Bytes: Füllen Sie die Eingabezeichenfolge auf und kürzen Sie das letzte Bein, anstatt das letzte Bein von Grund auf neu zu generieren.

-1 Byte: Verwenden Sie &&anstelle eines ternären Operators einen Wegwerfwert.

Erläuterung:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}
benj2240
quelle
1
Nizza Vorlage und klar erklärt. Ich schätze die Verwendung von rund lLambdas. Basierend auf den aktuellen Antworten scheint das letzte Bein ein Problem zu sein, obwohl es nicht war, als ich mein C-Snippet schrieb, um die Beispielausgabe zu generieren ...
Weijun Zhou
1
Anscheinend können Sie das s*=3Ganze speichern und auch 0im ?:Operator weglassen . tio.run/…
Weijun Zhou
1
@ WeijunZhou Ahh, danke für den Tipp. Ich brauche das 0allerdings, oder Ruby ruft das c+=1aus der nächsten Zeile auf und führt es nur die meiste Zeit aus. Und schöne Herausforderung!
benj2240
Du hast recht. Ich habe nicht vorsichtig genug ausgesehen. Vielen Dank für Ihre Wertschätzung. Ich bin froh, dass es Ihnen gefallen hat.
Weijun Zhou