Rückwärts Boustrophedon Text

19

Boustrophedon ist eine Art bidirektionaler Text, bei dem aufeinanderfolgende Zeilen abwechselnd von links nach rechts und von rechts nach links gelesen werden. Die Zeichenrichtung wurde auch in Bezug auf die Leserichtung gespiegelt. In umgekehrten Boustrophedon-Schreibsystemen wurden die Zeichen statt gespiegelt um 180 gedreht.

Herausforderung

Schreiben Sie ein Programm / eine Funktion, die eine Textzeichenfolge und eine Anzahl von Spalten akzeptiert und die Zeichenfolge in der angegebenen Anzahl von Spalten mit abwechselnden Zeilen auf den Kopf stellt.

Eingang

Ihr Programm sollte zwei Argumente akzeptieren:

  • S, die zu formatierende Textzeichenfolge
  • N, die Anzahl der Spalten

Ausgabe

Ihr Programm sollte S in N Spalten mit jeweils um 180 Grad gedrehten Zeilen ausgeben.

  • Die Leserichtung der ersten Zeile ist immer von links nach rechts.
  • Machen Sie sich keine Gedanken darüber, wo Zeilenumbrüche platziert werden sollen. Zeilen können nach beliebigen Zeichen aufgeteilt werden, ohne dass eine Hypenierung der Wörter erforderlich ist.
  • Sie können davon ausgehen, dass die Eingabezeichenfolge keine Zeilenumbrüche enthält.

Hier sind die Zeichen, die Ihr Programm mit ihren gekippten Gegenstücken unterstützen sollte:

Uppercase:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Z

Lowercase:
abcdefghijklmnopqrstuvwxyz
ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz

Punctuation:
&_?!"'.,
⅋‾¿¡„,˙'

Testfälle

S: The quick brown fox jumps over the lazy dog.
N: 30
Output:
The quick brown fox jumps over
                ˙ƃop ʎzɐl ǝɥʇ 

S: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vel libero arcu. Nunc dictum elementum lectus nec aliquet. Donec dolor nunc, sodales at dolor rhoncus, hendrerit scelerisque purus. Pellentesque vel sagittis libero, et rutrum leo. Nullam vulputate enim et massa dictum, vitae venenatis augue lobortis. Fusce sollicitudin ultrices consequat. Vestibulum quis nunc non tortor eleifend facilisis. In at nunc elit. Aliquam pellentesque, lectus quis aliquam posuere, quam lectus sagittis metus, ut auctor sem quam a neque. Integer rhoncus lobortis nisl. Pellentesque mi dui, laoreet in metus quis, mollis accumsan est. Nunc dignissim tortor ac eleifend tempus. Ut ut tellus aliquam, luctus nulla quis, consectetur nunc. Suspendisse viverra molestie condimentum. Curabitur et hendrerit augue.
N: 50
Output:
Lorem ipsum dolor sit amet, consectetur adipiscing
uǝɯǝlǝ ɯnʇɔᴉp ɔunN ˙nɔɹɐ oɹǝqᴉl lǝʌ ǝnbsᴉnQ ˙ʇᴉlǝ 
tum lectus nec aliquet. Donec dolor nunc, sodales 
lǝԀ ˙snɹnd ǝnbsᴉɹǝlǝɔs ʇᴉɹǝɹpuǝɥ 'snɔuoɥɹ ɹolop ʇɐ
lentesque vel sagittis libero, et rutrum leo. Null
sᴉʇɐuǝuǝʌ ǝɐʇᴉʌ 'ɯnʇɔᴉp ɐssɐɯ ʇǝ ɯᴉuǝ ǝʇɐʇndlnʌ ɯɐ
 augue lobortis. Fusce sollicitudin ultrices conse
ɔɐɟ puǝɟᴉǝlǝ ɹoʇɹoʇ uou ɔunu sᴉnb ɯnlnqᴉʇsǝΛ ˙ʇɐnb
ilisis. In at nunc elit. Aliquam pellentesque, lec
ʇǝɯ sᴉʇʇᴉƃɐs snʇɔǝl ɯɐnb 'ǝɹǝnsod ɯɐnbᴉlɐ sᴉnb snʇ
us, ut auctor sem quam a neque. Integer rhoncus lo
snʇǝɯ uᴉ ʇǝǝɹoɐl 'ᴉnp ᴉɯ ǝnbsǝʇuǝllǝԀ ˙lsᴉu sᴉʇɹoq
 quis, mollis accumsan est. Nunc dignissim tortor 
u snʇɔnl 'ɯɐnbᴉlɐ snllǝʇ ʇn ʇ∩ ˙sndɯǝʇ puǝɟᴉǝlǝ ɔɐ
ulla quis, consectetur nunc. Suspendisse viverra m
˙ǝnƃnɐ ʇᴉɹǝɹpuǝɥ ʇǝ ɹnʇᴉqɐɹnƆ ˙ɯnʇuǝɯᴉpuoɔ ǝᴉʇsǝlo
Dendrobium
quelle

Antworten:

5

Bash + GNU-Dienstprogramme, 204

fold -$1|sed 2~2{s/.\\+/printf\ %$1's "`echo "&"|rev`"/e
y/'`printf %s {A..Z} {a..z}`"&_?!\"'.,/∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Zɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz⅋‾¿¡„,˙'/
}"

N wird in der Kommandozeile und S über STDIN angegeben:

$ echo "The quick brown fox jumps over the lazy dog." | ./boustrophedon.sh 30
The quick brown fox jumps over
                ˙ƃop ʎzɐl ǝɥʇ 
$ 

Erläuterung

  • fold -N teilt die Eingabe in Zeilen der Länge N.
  • Der Rest der Verarbeitung erfolgt Zeile für Zeile durch sed:
    • 2~2 Stimmt mit jeder anderen Zeile überein, beginnend mit Zeile 2
    • s/.+/printf %'N's "`echo "&"|rev`"/e ruft mit der exec-Funktion von GNU Sed eine Shell auf, um die Zeile umzukehren und mit bis zu N Leerzeichen nach links zu füllen
    • y/ABC.../∀qƆ.../ Zeichen transformieren

Hinweis ABC...wird mit einer Bash-Erweiterung und printf generiert. Auch einige schicke Zitate für die verschiedenen Charaktere.

Digitales Trauma
quelle
Danke @isaacg - Ich dachte, ich hätte es mit doppelten Backticks versucht, aber ich glaube, das habe ich verpasst.
Digitales Trauma
3

Japt , 182 179 Bytes

Japt ist eine verkürzte Version von Ja vaScri pt . Dolmetscher

Ur'.+".?"pV-1 ,@A++%2?SpV-Xl)+Xw m@"„\xA1⅋,'˙¿∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Z[\\]^‾`ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz"g(Q+"!&',.?"+65o124 m@Xd)a)bX)||X +R:X+R

Wie es funktioniert

             // Implicit: U = input string, V = input number, A = 10
Ur           // Take U and replace each group X of:
'.+".?"pV-1  //  at least one char, followed by up to V-1 other chars
             //   literally: RegExp("." + ".?".repeat(V-1))
@            // with: (@ is compiled to (X,Y,Z)=>)
A++%2?       //  If we're on an odd row:
SpV-Xl)+     //   Pad it with spaces, then concatenate it with
Xw m@        //   X reversed, with each character X mapped to:
"..."g       //   The character at position N in the string, where N is:
(Q+"!&',.?"  //    Build a string from a quote mark and these chars,
65o124 m@Xd)a) //   and all chars from A..z.
bX)          //    Return the index of X in this string.
||X          //   or if this number is outside the string, default to the original char.
+R           //   Either way, add a newline.
:X+R         //  Otherwise, return the original row text plus a newline.
             // Implicit: output last expression

Es gibt einige Probleme, die jedoch die Gültigkeit des Programms nicht beeinträchtigen sollten:

  1. User @ Vɪʜᴀɴ hat mir kürzlich dabei geholfen, Unicode-Shortcuts oder einzelne Zeichen im Bereich 00A1-00FF zu implementieren, die für häufig verwendete Sequenzen mit mehreren Zeichen stehen. Das Problem dabei ist, dass es derzeit innere Zeichenfolgen ersetzt, sodass wir ¡momentan nicht direkt in der Zeichenfolge verwenden können. Die sichere Alternative \xA1ist drei Bytes länger.
  2. Es ist derzeit nicht möglich, ein doppeltes Anführungszeichen einzugeben. Dies wird in Kürze behoben.

Vielleicht gibt es eine Möglichkeit, die Zeichenfolge zu verkürzen. Vorschläge sind willkommen!

ETHproductions
quelle
Nett! Ich wollte später versuchen, meine Lösung auf Japt zu konvertieren, aber das ist das A und O.
Scott
2

CJam, 152

l~_q/\f{Se]}2/{)26,'Af+_el+"&_?!'.,"`+"∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Zɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz„⅋‾¿¡,˙'"erW%}%N*

Teste es hier.

Ich denke, ich sollte mich etwas mit dem Komprimieren dieser Unicode-Zeichenfolge befassen ...

Martin Ender
quelle
Das Komprimieren dieser Unicode-Zeichenfolge ist schwierig - die Codepunkte sind überall. Aus Versuchsgründen habe ich versucht, meinen gesamten Eintrag (einschließlich der Sed-Bits) mit dem Reißverschluss zu versehen, und bin dann größer geworden. Ich werde mit Interesse zusehen, wie Sie es angehen :)
Digital Trauma
2

Javascript (ES6), 407 400 366 360 353 Bytes

Ich zähle nur die ersten beiden "Zeilen" in diesem Snippet als Gesamtanzahl, da der Rest Code zum Ausführen ist.

s=`ABCDEFGHIJKLMNOPQRSTUVWXYZqƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMXZabcdefghijklmnopqrstuvwxyzɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz&_?!"'.,⅋‾¿¡„,˙'`,f=(i,w)=>(i=i.match(RegExp(`.{1,${w}}`,"g")),i.map((c,x)=>x%2?" ".repeat(w-c.length)+[...c].reverse().map(b=>(d=s.indexOf(b),"A"<=b&&"z">=b?s[d+26]:" "==b?b:s[d+8])).join``:c).join`
`)

let input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vel libero arcu. Nunc dictum elementum lectus nec aliquet. Donec dolor nunc, sodales at dolor rhoncus, hendrerit scelerisque purus. Pellentesque vel sagittis libero, et rutrum leo. Nullam vulputate enim et massa dictum, vitae venenatis augue lobortis. Fusce sollicitudin ultrices consequat. Vestibulum quis nunc non tortor eleifend facilisis. In at nunc elit. Aliquam pellentesque, lectus quis aliquam posuere, quam lectus sagittis metus, ut auctor sem quam a neque. Integer rhoncus lobortis nisl. Pellentesque mi dui, laoreet in metus quis, mollis accumsan est. Nunc dignissim tortor ac eleifend tempus. Ut ut tellus aliquam, luctus nulla quis, consectetur nunc. Suspendisse viverra molestie condimentum. Curabitur et hendrerit augue.";
console.log(f(input, 50));

Erläuterung

s=`A∀ .. ZZaɐ .. &⅋ ..`,                            //Character translation "map"
f=(i,w)=>                                           //Create a function named "f" that takes an (i)nput string and (w)idth
    (                                               //Implicitly return
        i=i.match(RegExp(`.{1,${w}}`,"g")),         //Cut string into arrays every w-th match of anything
        i.map((c,x)=>                               //Loop through each element in array by (c)ut at inde(x)
            x%2                                     //If the index is odd
                ?" ".repeat(w-c.length)                 //Output spaces for padding
                    +[...c].reverse()                   //Split this cut into each character, and read it backwards
                    .map((b,d)=>(                       //Translate each character
                        d=s.indexOf(b),                 //Save where this character appears in the mapping
                        "A"<=b&&"z">=b                  //If the character is a-zA-Z
                        ?s[d+26]                            //Print the flipped character by looking 26 characters ahead of where this character is found
                        :" "==b                             //Else, if it's a space
                            ?b                              //Output the space
                            :s[d+8]))                   //Else, print the flipped punctuation character (only 8 of these)
                    .join``                         //Join everything back into a continuous string
                :c                                  //Else just output the whole cut
            ).join`                                 
`)                                                  //Finally join each cut by a newline

  • Danke an Dendrobium für -6 Bytes!
  • Danke an den Closure Compiler für -34 Bytes!
  • Danke an to nןuɟ ן oן für -7 Bytes!
Scott
quelle
1
Sie können alle Ihre reduzieren .split("")‚s und .join("")‘ s .split``und .join``abrasieren ein paar Bytes. Das .join("\n")kann auch wie oben beschrieben mit einem wörtlichen Zeilenumbruch anstelle von umgeschrieben werden \n.
Dendrobium
Tolle Tipps, vielen Dank!
Scott
1
Sie können das neue Schlüsselwort für den regulären Ausdruck herausnehmen. Verwenden Sie auch exec anstelle von match. Oh ja, benutze [...] c anstelle von c.split``.
Mama Fun Roll
@ ן nןuɟ ן oן Schön, danke! Ich konnte nicht herausfinden, wie man es benutzt execund es kurz hält, da execes eine Schleife braucht, um alle Übereinstimmungen zu erhalten.
Scott
Oh, egal, was Exec ...
Mama Fun Roll
1

Pyth, 141 Bytes

FNrZlKczQI%N2X.[" "Q_@KN++GrG1"&_?!\"'.,""ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Z⅋‾¿¡„,˙'")E@KN

Getestet mit einem Online-Pyth-Compiler.

Wie es funktioniert

FNrZlKczQI%N2X.[" "Q_@KN)E@KN    █
                                 █
FN                               █ For N in 
  r                              █  ├ Range
   Z                             █  |  ・Start: 0 
                                 █  |  ・End: 
    l                            █  |     Length of
     K                           █  |      └─K = 
      c                          █  |         Split
       z                         █  |           ・String z
        Q                        █  |           ・By input int Q
         I%N2                    █  └─If divisible by 2
             X                   █     └─Translate
                                 █         ├─Source:
              .[                 █         | ├─Pad left
                " "              █         | |   ・With spaces
                   Q             █         | |   ・Until input int Q
                    _            █         | └──Reverse
                     @KN         █         |     ・Nth line of K
                        ++GrG1...█         ├─From: Normal  (See below)
                        "ɐqɔpǝ...█         └─To:   Flipped (See below)
                        )E@KN    █     Else print Nth line of K

Karte

Normal

++                               █ Append:
  G                              █  1) a to z
   rG1                           █  2) A to Z
      "&_?!\"'.,"                █  3) Punctuation

Umgedreht (nichts Besonderes)

"ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Z⅋‾¿¡„,˙'"
Helix Quar
quelle
Dies ist 108 Zeichen lang; Die Standardmethode zum Messen der Länge von Code-Golf-Programmen ist jedoch Byte . Laut dieser Seite beträgt die Länge dieser Antwort 141 Bytes .
ETHproductions
@ETHproductions Danke. Geändert.
Helix Quar
0

Python, 453 363 Bytes

s,n=input()
o="""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&_?!"'.,"""
p="""∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Zɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz⅋‾¿¡„,˙'""".decode('utf8')
s=map(''.join,zip(*[iter(s+' '*(n-1))]*n))
for i in range(len(s)):
 if i%2:s[i]=''.join(p[o.find(c)].encode('utf8')for c in s[i][::-1])
for l in s:print l
TFeld
quelle