Boustrophedon 텍스트 반전


19

Boustrophedon 은 연속적인 행이 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 읽는 것 사이에서 번갈아 나타나는 양방향 텍스트 유형입니다. 문자 방향은 읽기 방향과 관련하여 미러링되었습니다. 리버스 부스트로 피온 라이팅 시스템에서는 문자가 대칭이 아닌 180도 회전되었습니다.

도전

텍스트 문자열과 여러 열을 허용하는 프로그램 / 함수를 작성하고 문자열을 지정된 열 수로 서식이 지정된 문자열을 거꾸로 뒤집어 출력합니다.

입력

프로그램은 두 가지 주장을 받아 들여야합니다.

  • S, 서식을 지정할 텍스트 문자열
  • N, 열 수

산출

프로그램은 교대로 선을 180도 뒤집어 N 열로 싸인 S를 출력해야합니다.

  • 첫 번째 줄의 읽기 방향은 항상 왼쪽에서 오른쪽입니다.
  • 줄 바꿈을 배치 할 위치에 대해 걱정하지 마십시오. 모든 문자에서 줄을 나눌 수 있으며 단어를 뺄 필요가 없습니다.
  • 입력 문자열에 줄 바꿈이 포함되지 않는다고 가정 할 수 있습니다.

프로그램이 반전 된 문자로 지원해야하는 문자는 다음과 같습니다.

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

배쉬 + 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이 제공되고 STDIN을 통해 S가 제공됩니다.

$ 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 2 행부터 시작하여 다른 모든 행과 일치
    • s/.+/printf %'N's "`echo "&"|rev`"/e GNU Sed의 exec 기능을 사용하여 셸을 호출하여 줄을 바꾸고 최대 N 공백으로 왼쪽 채 웁니다.
    • y/ABC.../∀qƆ.../ 문자 변환

참고 ABC...는 bash 확장 및 printf를 사용하여 생성됩니다. 또한 모든 다른 캐릭터에 대한 멋진 인용문.


감사합니다 @isaacg-이중 백틱을 시도했다고 생각했지만 놓친 것 같습니다.
Digital Trauma

3

JAPT , 182 179 바이트

JaptJa 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ɪʜᴀɴ 사용자 는 최근 유니 코드 바로 가기 또는 일반적으로 사용되는 여러 문자 시퀀스를 나타내는 00A1-00FF 범위의 단일 문자를 구현하는 데 도움이되었습니다. 이것의 문제점은 현재 문자열 내부를 대체하므로 문자열에서 직접 ¡를 사용할 수 없다는 것입니다. 안전한 대안 \xA1은 3 바이트 더 깁니다.
  2. 큰 따옴표 문자를 입력하는 것은 현재 불가능합니다. 이것은 곧 수정 될 것입니다.

아마도 줄을 줄이는 방법이있을 것입니다. 제안은 환영합니다!


좋은! 나중에 솔루션을 Japt로 변환하려고했지만 케이크가 필요합니다.
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*

여기에서 테스트하십시오.

그 유니 코드 문자열을 조금 압축해야한다고 생각합니다 ...


유니 코드 문자열을 압축하는 것은 어렵습니다-코드 포인트가 도처에 있습니다. 실험으로, 전체 항목 (sed 비트 포함)을 'zopfli'로 시도하여 더 커졌습니다. 나는 당신이 그것을 다루는 방법을보고 관심을 가지고 지켜 볼 것입니다 :)
Digital Trauma

2

자바 (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 바이트의 Dendrobium에 감사합니다!
  • -34 바이트의 클로저 컴파일러 덕분에!
  • -7 바이트에 대한 ן nɟuɐɯɹɐ ן oɯ에 감사합니다!

1
당신은 모든 줄일 수 .split("")의와 .join("")의를 .split``하고 .join``몇 바이트 떨어져에 면도. 는 .join("\n")대신 리터럴 개행 문자로 위와 같이 다시 작성할 수도 있습니다 \n.
Dendrobium

좋은 팁, 대단히 감사합니다!
Scott

1
정규식에 대한 새 키워드를 가져올 수 있습니다. 또한 일치 대신 exec를 사용하십시오. 예, c.split 대신 [... c]를 사용하십시오.
Mama Fun Roll

@ ן nɟuɐɯɹɐ ן oɯ Nice, 감사합니다! 모든 경기를 얻으려면 반복해야하기 exec때문에 사용 방법을 알아 내고 짧게 유지할 수 없었 exec습니다.
Scott

아, 실행에 대해 신경 쓰지 마라
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 Compiler로 테스트했습니다.

작동 원리

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

파이썬, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.