Văn bản Boustrophedon ngược


19

Boustrophedon là một loại văn bản hai chiều trong đó các dòng liên tiếp xen kẽ giữa việc đọc từ trái sang phải và phải sang trái. Hướng nhân vật cũng được nhân đôi đối với hướng đọc. Trong các hệ thống viết boustrophedon ngược, các ký tự được xoay 180 thay vì nhân đôi.

Thử thách

Viết chương trình / hàm chấp nhận một chuỗi văn bản và một số cột và xuất ra chuỗi được định dạng vào số cột được chỉ định với các dòng xen kẽ lộn ngược.

Đầu vào

Chương trình của bạn nên chấp nhận hai đối số:

  • S, chuỗi văn bản cần định dạng
  • N, số lượng cột

Đầu ra

Chương trình của bạn sẽ xuất S được bọc trong N cột với các dòng xen kẽ lật 180 độ.

  • Hướng đọc của dòng đầu tiên luôn luôn từ trái sang phải.
  • Đừng lo lắng về nơi đặt ngắt dòng, các dòng có thể được phân chia ở bất kỳ ký tự nào, không cần phải có các từ được yêu cầu.
  • Bạn có thể cho rằng chuỗi đầu vào sẽ không chứa bất kỳ ngắt dòng nào.

Dưới đây là các nhân vật mà chương trình của bạn sẽ hỗ trợ với các đối tác lật của họ:

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

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

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

Các trường hợp thử nghiệm

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

Câu trả lời:


5

Tiện ích 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 được đưa ra trên dòng lệnh và S được đưa ra thông qua STDIN:

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

Giải trình

  • fold -N chia đầu vào thành các dòng có độ dài N.
  • Phần còn lại của quá trình xử lý được thực hiện bởi sed, từng dòng một:
    • 2~2 phù hợp với mọi dòng khác, bắt đầu từ dòng 2
    • s/.+/printf %'N's "`echo "&"|rev`"/e sử dụng tính năng exec của GNU Sed để gọi shell để đảo ngược dòng và pad trái với tối đa N khoảng trắng
    • y/ABC.../∀qƆ.../ biến đổi nhân vật

Lưu ý ABC...được tạo bằng cách sử dụng mở rộng bash và printf. Ngoài ra một số trích dẫn ưa thích cho tất cả các nhân vật khác nhau.


Cảm ơn @isaacg - Tôi nghĩ rằng tôi đã thử gấp đôi backticks, nhưng tôi đoán rằng tôi đã bỏ lỡ điều đó.
Chấn thương kỹ thuật số

3

Japt , 182 179 byte

Japt là phiên bản rút gọn của Ja vaScri pt . Thông dịch viên

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

Làm thế nào nó hoạt động

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

Có một vài vấn đề, nhưng chúng không nên ảnh hưởng đến tính hợp lệ của chương trình:

  1. Người dùng @ Vɪʜᴀɴ gần đây đã giúp tôi triển khai Phím tắt Unicode hoặc các ký tự đơn trong phạm vi 00A1-00FF thay thế cho các chuỗi nhiều char thường được sử dụng. Vấn đề với điều này là nó hiện đang thay thế bên trong các chuỗi, vì vậy hiện tại chúng ta không thể sử dụng trong chuỗi. Sự thay thế an toàn \xA1, là ba byte dài hơn.
  2. Hiện tại không thể nhập một ký tự trích dẫn kép. Điều này sẽ được khắc phục trong thời gian ngắn.

Có lẽ có một cách để rút ngắn chuỗi. Đề nghị được chào đón!


Đẹp! Tôi muốn thử chuyển đổi giải pháp của mình sang Japt sau đó, nhưng điều này cần có bánh.
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*

Kiểm tra nó ở đây.

Tôi đoán tôi nên xem xét việc nén chuỗi Unicode đó một chút ...


Nén chuỗi Unicode đó là khó khăn - các điểm mã ở khắp mọi nơi. Như một thử nghiệm, tôi đã thử 'zopfli'ing toàn bộ mục nhập của tôi (bao gồm cả các bit sed) và kết thúc lớn hơn. Tôi sẽ quan tâm để xem bạn giải quyết nó như thế nào :)
Chấn thương kỹ thuật số

2

Javascript (ES6), 407 400 366 360 353 byte

Tôi chỉ đếm hai "dòng" đầu tiên trong đoạn trích này là tổng số, vì phần còn lại của nó là mã để chạy nó.

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

Giải trình

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

  • Cảm ơn Dendrobium cho -6 byte!
  • Nhờ Trình biên dịch đóng cho -34 byte!
  • Cảm ơn ן nɟuɐɯɹɐ oɯ cho -7 byte!

1
Bạn có thể giảm tất cả các bạn .split("")'s và .join("")' s .split``.join``để cạo ra một vài byte. Cũng .join("\n")có thể được viết lại như trên với một dòng mới thay vì \n.
Dendrobium

Lời khuyên tuyệt vời, cảm ơn bạn rất nhiều!
Scott

1
Bạn có thể lấy từ khóa mới cho regex. Cũng sử dụng exec thay vì khớp. Ồ vâng, sử dụng [... c] thay vì c.split``.
Mama Fun Roll

@ Nɟuɐɯɹɐ ן oɯ Rất vui, cảm ơn bạn! execMặc dù vậy, tôi không thể tìm ra cách sử dụng và giữ cho nó ngắn, vì execcần phải lặp đi lặp lại để có được tất cả các trận đấu.
Scott

Ồ, đừng bận tâm về người thực hiện ...
Mama Fun Roll

1

Bình thường, 141 byte

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

Đã thử nghiệm với Trình biên dịch Pyth trực tuyến.

Làm thế nào nó hoạt động

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

Bản đồ

Bình thường

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

Lật (Không có gì lạ mắt)

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

Nó dài 108 ký tự ; tuy nhiên, cách mặc định để đo thời lượng của các chương trình golf-code là theo byte . Theo trang này , độ dài của câu trả lời này là 141 byte .
Sản xuất ETH

@ETHproductions Cảm ơn. Thay đổi.
Helix Quar

0

Python, 453 363 byte

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.