Ters Boustrophedon Metni


19

Boustrophedon , birbirini izleyen satırların soldan sağa ve sağdan sola okuma arasında değiştiği iki yönlü bir metin türüdür. Karakter yönü okuma yönüne göre de yansıtılmıştır. Ters boustrophedon yazı sistemlerinde, karakterler aynalı yerine 180 döndürülmüştür.

Meydan okuma

Bir metin dizisini ve birkaç sütunu kabul eden bir program / işlev yazın ve dizeyi, dönüşümlü satırlar ters çevrilmiş olarak belirtilen sayıda sütuna biçimlendirin.

Giriş

Programınız iki argümanı kabul etmelidir:

  • S, biçimlendirilecek metin dizesi
  • N, sütun sayısı

Çıktı

Programınız, N sütunlarına sarılmış S'yi, alternatif satırlar 180 derece çevrilmiş olarak vermelidir.

  • İlk satırın okuma yönü daima soldan sağa doğrudur.
  • Satır sonlarını nereye yerleştireceğiniz konusunda endişelenmeyin, satırlar herhangi bir karaktere bölünebilir, kelimelerin hiperleştirilmesi gerekmez.
  • Giriş dizesinin satır sonu içermeyeceğini varsayabilirsiniz.

Programınızın çevrilmiş meslektaşlarıyla desteklemesi gereken karakterler şunlardır:

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

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

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

Test Durumları

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

Yanıtlar:


5

Bash + GNU yardımcı programları, 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⅋‾¿¡„,˙'/
}"

Komut satırında N, S STDIN ile verilir:

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

açıklama

  • fold -N girişi N uzunluğuna ayırır.
  • İşlemin geri kalanı sed tarafından satır satır yapılır:
    • 2~2 2. satırdan başlayarak diğer tüm satırlarla eşleşir
    • s/.+/printf %'N's "`echo "&"|rev`"/e çizgiyi tersine çevirmek ve N boşluğa kadar sola doldurmak için bir kabuk çağırmak için GNU Sed'in exec özelliğini kullanır
    • y/ABC.../∀qƆ.../ karakterleri dönüştür

Not ABC...bir bash genişletme ve printf kullanılarak oluşturulur. Ayrıca tüm farklı karakterler için bazı fantezi alıntı.


Teşekkürler @isaacg - Ben çift backticks denedim düşündüm, ama sanırım bunu özledim.
Dijital Travma

3

Japt , 182 179 bayt

Japt kısaltılmış versiyonudur Ja vaScri nk . yorumlayıcı

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

Nasıl çalışı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

Birkaç sorun var, ancak programın geçerliliğini etkilememelidir:

  1. User @ Vɪʜᴀɴ kısa süre önce Unicode Kısayollarını veya yaygın olarak kullanılan birkaç karakter dizileri için kullanılan 00A1-00FF aralığındaki tek karakterleri uygulamama yardımcı oldu. Buradaki sorun şu anda dizelerin içinde yer almasıdır, bu yüzden şimdilik doğrudan dizede ¡kullanamayız. Güvenli alternatif, \xA1üç bayt daha uzun.
  2. Şu anda çift tırnak karakteri girmek imkansız. Bu kısa süre içinde çözülecek.

Belki de ipi kısaltmanın bir yolu var. Öneriler bekliyoruz!


Güzel! Çözümümü daha sonra Japt'e dönüştürmek istedim, ama bu pastayı alıyor.
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*

Burada test edin.

Sanırım bu Unicode dizesini biraz sıkıştırmaya bakmalıyım ...


Unicode dizesinin zor olduğunu zorlamak - kod noktaları her yerdedir. Bir deneme olarak, tüm girişimi (sed bitleri dahil) 'zopfli''yi denedim ve daha da büyüdüm. Nasıl başa çıkacağınızı görmek için ilgiyle izleyeceğim :)
Digital Trauma

2

JavaScript (ES6), 407 , 400 366 360 353 bayt

Geri kalanı çalıştırmak için kod olduğu gibi, bu snippet'te sadece ilk iki "satır" sayıyorum.

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

açıklama

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 baytlık Dendrobium'a teşekkürler!
  • -34 baytlık kapanış derleyicisi sayesinde!
  • -7 bayt için ן nɟuɐɯɹɐ ן oɯ teşekkürler!

1
Hepiniz senin azaltabilir .split("")'ler ve .join("")' s .split``ve .join``birkaç bayt kapatmak için traş. .join("\n")Ayrıca yerine bir hazır yeni satır yukarıda gibi tekrar yazılabilir \n.
Dendrobium

Harika ipuçları, çok teşekkür ederim!
Scott

1
Normal ifade için yeni anahtar kelimeyi çıkarabilirsiniz. Ayrıca eşleşme yerine exec kullanın. Oh evet, c.split yerine [... c] kullanın.
Mama Fun Roll

@ ן nɟuɐɯɹɐ ן oɯ Güzel, teşekkürler! Nasıl kullanılacağını execve kısa tutacağımı anlayamadım , çünkü exectüm maçları elde etmek için döngüye girmesi gerekiyor.
Scott

Oh, nevermind hakkında exec ...
Mama Fun Roll

1

Pyth, 141 bayt

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

Çevrimiçi bir Pyth Derleyici ile test edildi.

Nasıl çalışır

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

harita

Normal

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

Ters Çevrildi (Fantezi bir şey yok)

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

Bu 108 karakter uzunluğunda; ancak, kod-golf programlarının uzunluğunu ölçmenin varsayılan yolu bayt cinsindendir . Bu sayfaya göre , bu cevabın uzunluğu 141 bayt .
ETHproductions

@ETHproductions Teşekkürler. Değiştirildi.
Helix Quar

0

Python, 453 363 bayt

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.