Зворотний текст бустрофедона


19

Бустрофедон - це тип двонаправленого тексту, де послідовні рядки чергуються між читанням зліва направо та справа наліво. Напрямок символів також відображався щодо напрямку читання. У системах запису зворотного бустрофедону символи поверталися на 180 замість дзеркальних.

Виклик

Напишіть програму / функцію, яка приймає рядок тексту та ряд стовпців і виводить рядок, відформатований у вказану кількість стовпців із чергуванням рядків, перевернутими догори дном.

Вхідні дані

Ваша програма повинна прийняти два аргументи:

  • S, рядок тексту для форматування
  • N, кількість стовпців

Вихідні дані

Ваша програма повинна виводити S, загорнуті в N стовпців, з чергуванням ліній, перевернутих на 180 градусів.

  • Напрямок читання першого рядка завжди зліва направо.
  • Не турбуйтеся про те, де розмістити розриви рядків, рядки можна розділити на будь-який символ, не потрібно вмикати слова.
  • Ви можете припустити, що рядок вводу не буде містити жодних розривів рядків.

Ось символи, які ваша програма повинна підтримувати своїми перевернутими аналогами:

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

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

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

Випробування

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

Відповіді:


5

Утиліти 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, а S - через STDIN:

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

Пояснення

  • fold -N розбиває введення на рядки довжиною N.
  • Решта обробки виконується sed, рядок:
    • 2~2 відповідає кожному другому рядку, починаючи з другого рядка
    • s/.+/printf %'N's "`echo "&"|rev`"/e використовує функцію exec GNU Sed для виклику оболонки, щоб повернути лінію та ліву панель - до N пробілів
    • y/ABC.../∀qƆ.../ перетворення символів

Примітка ABC...генерується за допомогою розширення bash та printf. Також кілька фантазійних цитувань для всіх різних персонажів.


Дякую @isaacg - я подумав, що спробував подвійні підставки, але, мабуть, пропустив це.
Цифрова травма

3

Japt , 182 179 байт

Japt - скорочена версія Ja vaScri pt . Перекладач

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

Як це працює

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

Є кілька проблем, але вони не повинні впливати на термін дії програми:

  1. Користувач @ Vɪʜᴀɴ нещодавно допоміг мені реалізувати ярлики Unicode або окремі символи в діапазоні 00A1-00FF, які є загальноприйнятими декількома послідовними послідовностями. Проблема в цьому полягає в тому, що він наразі замінює всередині рядків, тому ми не можемо використовувати ¡безпосередньо в рядку. Безпечна альтернатива, \xA1- на три байти довше.
  2. Наразі неможливо ввести символ подвійної цитати. Це буде виправлено незабаром.

Можливо, є спосіб скоротити рядок. Пропозиції вітаються!


Приємно! Я хотів спробувати перетворити своє рішення на Japt пізніше, але це вимагає пирога.
Скотт

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*

Перевірте це тут.

Я думаю, я повинен трохи розглянути стискання рядка Unicode ...


Стискаючи, що рядок Unicode важкий - кодові точки всюди. Як експеримент, я спробував 'zopfli'ing весь мій запис (включаючи sed біт) і в кінцевому підсумку більше. Я з цікавістю переглядаю, як ви вирішуєте це :)
Digital Trauma

2

Javascript (ES6), 407 400 366 360 353 байт

Я рахую лише перші два "рядки" у цьому фрагменті як загальний підрахунок, оскільки решта - це код для його запуску.

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

Пояснення

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

  • Завдяки Дендробію за -6 байт!
  • Завдяки компілятору закриття на -34 байти!
  • Завдяки ן nɟuɐɯɹɐ ן oɯ за -7 байт!

1
Ви можете зменшити всі ваші .split("").join("")" до .split``і " .join``голити" кілька байтів. .join("\n")Також може бути переписано як вище з буквальним перекладом рядка замість \n.
Дендробіум

Чудові поради, дуже дякую!
Скотт

1
Ви можете вийняти нове ключове слово для регулярного виразу. Також використовуйте exec замість відповідності. О так, використовуйте [... c] замість c.split``.
Mama Fun Roll

@ ן nɟuɐɯɹɐ ן oɯ Приємно, дякую! Я не міг розібратися, як користуватися execі тримати його коротким, оскільки його execпотрібно перекинути, щоб отримати всі збіги.
Скотт

О, ніколи не маю на увазі виконувати ...
Mama Fun Roll

1

Pyth, 141 байт

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

Тестовано з онлайн-компілятором Pyth.

Як це працює

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

Карта

Нормальний

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

Перевернутий (нічого фантазійного)

"ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz∀qƆpƎℲפHIſʞ˥WNOԀQɹS┴∩ΛMX⅄Z⅋‾¿¡„,˙'"

Це 108 символів ; однак за замовчуванням спосіб вимірювання тривалості програм з кодовим гольфом - у байтах . Відповідно до цієї сторінки , довжина цієї відповіді становить 141 байт .
ETHproductions

@ETHproductions Спасибі Змінено.
Helix Quar

0

Python, 453 363 байт

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.