Odwróć tekst Boustrophedon

19

Boustrophedon jest rodzajem tekstu dwukierunkowego, w którym kolejne wiersze występują naprzemiennie między czytaniem od lewej do prawej i od prawej do lewej. Kierunek postaci został również odzwierciedlony w odniesieniu do kierunku czytania. W systemach pisma z odwróconymi liniami znaki zostały obrócone o 180 zamiast lustrzanych.

Wyzwanie

Napisz program / funkcję, która akceptuje ciąg tekstowy i liczbę kolumn i wysyła ciąg sformatowany do określonej liczby kolumn z naprzemiennymi liniami odwróconymi do góry nogami.

Wejście

Twój program powinien zaakceptować dwa argumenty:

  • S, ciąg tekstu do sformatowania
  • N, liczba kolumn

Wynik

Twój program powinien wypisać literę S zawiniętą w N kolumn z naprzemiennymi liniami odwróconymi o 180 stopni.

  • Kierunek czytania pierwszego wiersza jest zawsze od lewej do prawej.
  • Nie martw się o to, gdzie umieścić podział linii, linie mogą być dzielone na dowolny znak, bez wymaganego dzielenia wyrazów.
  • Możesz założyć, że ciąg wejściowy nie będzie zawierał żadnych podziałów linii.

Oto znaki, które Twój program powinien obsługiwać za pomocą odwróconych odpowiedników:

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

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

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

Przypadki testowe

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
źródło

Odpowiedzi:

5

Narzędzia Bash + GNU, 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 podano w wierszu poleceń, a S podano przez STDIN:

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

Wyjaśnienie

  • fold -N dzieli dane wejściowe na linie o długości N.
  • Reszta przetwarzania jest wykonywana przez sed, linia po linii:
    • 2~2 dopasowuje co drugą linię, zaczynając od linii 2
    • s/.+/printf %'N's "`echo "&"|rev`"/e używa funkcji exec GNU Sed do wywołania powłoki w celu odwrócenia linii i wciśnięcia jej do lewej strony z maksymalnie N spacjami
    • y/ABC.../∀qƆ.../ przekształcać postacie

Notatka ABC...jest generowana przy użyciu rozszerzenia bash i printf. Również wymyślne cytaty dla wszystkich różnych postaci.

Cyfrowa trauma
źródło
Dzięki @isaacg - Myślałem, że spróbowałem podwójnego uderzenia wstecznego, ale chyba mi tego brakowało.
Digital Trauma
3

Japt , 182 179 bajtów

Japt to skrócona wersja Ja vaScri pt . Interpretator

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

Jak to działa

             // 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

Istnieje kilka problemów, ale nie powinny one wpływać na ważność programu:

  1. Użytkownik @ Vɪʜᴀɴ ostatnio pomógł mi zaimplementować Skróty Unicode lub pojedyncze znaki z zakresu 00A1-00FF, które oznaczają powszechnie używane sekwencje kilku znaków. Problem polega na tym, że obecnie zastępuje on wewnątrz ciągów, więc na razie nie możemy użyć ¡bezpośrednio w ciągu. Bezpieczna alternatywa \xA1to trzy bajty dłużej.
  2. Obecnie niemożliwe jest wprowadzenie znaku podwójnego cudzysłowu. Zostanie to wkrótce naprawione.

Być może istnieje sposób na skrócenie łańcucha. Sugestie są mile widziane!

ETHprodukcje
źródło
Ładny! Chciałem później spróbować przekonwertować swoje rozwiązanie na Japt, ale to wymaga ciasta.
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*

Sprawdź to tutaj.

Wydaje mi się, że powinienem trochę skompresować ten ciąg Unicode ...

Martin Ender
źródło
Kompresowanie tego ciągu Unicode jest trudne - punkty kodowe są wszędzie. W ramach eksperymentu próbowałem „zopfli” przez cały mój wpis (w tym sed bity) i skończyłem na większym. Z zainteresowaniem będę oglądać, jak sobie z tym poradzisz :)
Digital Trauma
2

JavaScript (ES6), 407 400 366 360 353 bajtów

Liczę tylko dwa pierwsze „wiersze” w tym fragmencie jako całkowitą liczbę, ponieważ reszta to kod do uruchomienia.

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));

Wyjaśnienie

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

  • Dzięki Dendrobium za -6 bajtów!
  • Dzięki kompilatorowi zamknięcia dla -34 bajtów!
  • Dzięki ן nɟuɐɯɹɐ ן oɯ za -7 bajtów!
Scott
źródło
1
Można zmniejszyć wszystkie swoje .split("")„s i .join("")” s do .split``i .join``ogolił kilka bajtów. .join("\n")Może być również przepisany jak wyżej z dosłownym nowej linii zamiast \n.
Dendrobium,
Świetne wskazówki, dziękuję bardzo!
Scott,
1
Możesz wyjąć nowe słowo kluczowe dla wyrażenia regularnego. Użyj także exec zamiast dopasowania. O tak, użyj [... c] zamiast c.split``.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ Fajnie, dziękuję! Nie mogłem wymyślić, jak używać execi krótko mówiąc, ponieważ exectrzeba zapętlić, aby uzyskać wszystkie dopasowania.
Scott,
Och, nieważne o egzekucji ...
Mama Fun Roll
1

Pyth, 141 bajtów

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

Testowane z internetowym kompilatorem Pyth.

Jak to działa

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

Mapa

Normalna

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

Odwrócony (Nic szczególnego)

"ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Z⅋‾¿¡„,˙'"
Helix Quar
źródło
Ma 108 znaków ; jednak domyślnym sposobem pomiaru długości programów do gry w golfa jest bajt . Według tej strony długość tej odpowiedzi wynosi 141 bajtów .
ETHprodukcje
@ETHproductions Thanks. Zmieniono
Helix Quar,
0

Python, 453 363 bajtów

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
źródło