sestina 청사진


19

sestina는 우리가 생성 할 수있는 흥미로운 패턴을 다음과시의 형식입니다. 여기에는 6 개의 6 줄로 된 6 개의 스탠자가 있으며, 첫 번째 스탠자의 각 줄의 마지막 단어는 각 연속 된 스탠자의 줄 끝을 설정 패턴으로 회전시킵니다. (마지막에는 3 줄 스탠자가 있지만 걱정하지 않아도됩니다.) 엘리자베스 비숍 (Elizabeth Bishop)의 창조적 인 이름 인 Sestina 의 첫 세 스탠자를 살펴 보십시오 .

9 월 비가 집에 떨어진다.
실패하는 빛에서, 늙은 할머니

Little Marvel Stove 옆에있는 아이와 함께 부엌에 앉아
, 연금술에서 농담을 읽고
웃으며 눈물을 숨기려고 이야기합니다.

그녀는 자신의 전형적인 눈물
과 집 지붕에서 치는 비가
둘 다 예언에 의해 예언
되었지만 할머니에게만 알려 졌다고 생각합니다 .
철 주전자가 난로에서 노래합니다.
빵을 자르고 아이에게 말합니다.

차를 마실 시간입니다. 그러나 그 아이

뜨거운 검은 난로에서 미친 것처럼 티케 틀의 작은 눈물이 춤을 추는 것을 지켜보고 있습니다
. 비는 집에서 춤을 추어 야합니다.
정리할 때 할머니
는 영리한 연감을 끊습니다

...

각 줄이 "집", "할머니", "자식", "스토브", "연감"또는 "눈물"이라는 6 개 단어 중 하나로 끝나는 점에 유의하십시오. 뿐만 아니라 단어는 이전 스탠자에 대해 패턴 6–1–5–2–4–3으로 정렬됩니다. 그것은 나선처럼 보입니다.

여기에 이미지 설명을 입력하십시오

프로그래밍 방식으로 전체 sestina를 생성하는 데 몇 년이 걸리지 만 각 스탠자의 끝 단어가 올바른 순서로 표시되는 템플릿을 만들 수 있습니다. 여섯 줄의 끝 단어가 주어지면 다음 규칙에 따라 sestina의 청사진을 출력하는 프로그램이나 함수를 작성하십시오. 입력에 대한 예상 결과는 다음과 같습니다 house grandmother child stove almanac tears.

house
grandmother
child
stove
almanac
tears

tears
house
almanac
grandmother
stove
child

child
tears
stove
house
grandmother
almanac

almanac
child
grandmother
tears
house
stove

stove
almanac
house
child
tears
grandmother

grandmother
stove
tears
almanac
child
house

첫 번째 스탠자는 원래 순서대로 단어이고, 두 번째 스탠자는 첫 번째에서 6-1-5-2-4-3 순서입니다. 세 번째 스탠자는 두 번째 스탠자, 스탠자 6까지의 순서입니다.

입력 단어는 항상 글자, 대문자 또는 소문자 일 것이라고 가정하십시오. 문자열 배열이나 문자가 아닌 문자 (공백, 줄 바꿈 등)로 구분 된 단일 문자열로 사용할 수 있습니다. 출력에서 행은 개행 ( 0x0A)으로 구분되고 스탠자는 두 개의 개행으로 구분됩니다. 후행 줄 바꿈이 허용됩니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 즉, 전체시의 구조를 압축하는 것이 더 짧을 수도 있지만 각 스탠자를 기반으로하는 몇 가지 솔루션을보고 싶습니다.


후행 줄 바꿈이 허용됩니까?
Luis Mendo

또한 구분선에 공백이 포함될 수 있습니까?
Luis Mendo

@LuisMendo 물론, 둘 다 괜찮습니다.
NinjaBearMonkey

출력이 정렬 된 문자열 목록의 정렬 된 목록 일 수 있습니까?
Greg Martin

6
sestinas의 경우 +1이지만 natural-language태그의 장점이 확실하지 않습니다 . 입력이 6 개의 횡설수설 인 경우에도 알고리즘은 동일합니다.
DLosc

답변:


1

젤리 , 15 14 바이트

620œ?$ÐĿY€j⁷Ḥ¤

TryItOnline!

어떻게?

예, 젤리에 추가 한 것 중 하나를 사용했습니다! ( œ?)

620œ?$ÐĿY€j⁷Ḥ¤ - Main link: list of words L
      ÐĿ       - loop until no longer unique, collecting intermediate results
     $         -     last two links as a monad
   œ?          -         permutation of right argument (initially L) at index
620            -         620
        Y€     - join with line feeds for €each (the words of each stanza)
          j    - join (the stanzas) with
             ¤ - nilad followed by link(s) as a nilad
           ⁷   -     a line feed
            Ḥ  -     double (two line feeds)

7

파이썬, 72 64 바이트

i,n=input(),'\n';exec"print n.join(i)+n;i=map(i.pop,[-1,0]*3);"*6

STDIN을 통해 쉼표로 구분 된 6 개의 문자열 배열로 입력을 가져오고 추가 후행 줄 바꿈과 함께 게시물에 설명 된 형식으로 STDOUT에 출력합니다.

온라인으로 사용해보십시오! (아이디어)

또한 이것이 올바른지 확실하지 않지만 여기 에 위의 답변과 동일한 형식으로 입력을 받아 59 바이트 의 익명 람다 함수 형태의 짧은 답변이 있으며 생성하는 데 필요한 프로그램을 출력합니다 올바른 출력 :

lambda i,n='\n':"print n.join(i)+n;i=map(i.pop,[-1,0]*3);"*6

따라서 형식으로 호출해야합니다 exec(<Function Name>(<Array>)). 다시 말하지만, 이것이 옳은지 확실하지 않으므로 누군가 (아마도 OP)가 이것이 괜 찮 아 요 아닌지를 분명히 밝힐 수있을 때까지 별도의 비 경쟁적 답변으로 추가하고 있습니다. 정말 감사합니다. .


2
나는 pop트릭을 좋아한다 !
xnor

3

MATL , 18 17 바이트

0ch5:"t[6l5H4I7])

입력은 문자열 형식의 셀형 배열입니다.

{'house' 'grandmother' 'child' 'stove' 'almanac' 'tears'}

온라인으로 사용해보십시오!

설명

0c          % Push string with a single space, to be used as separator
h           % Input array of 6 strings implicitly and append the above string
5:"         % Repeat 5 times
  t         %   Duplicate the array of strings (previous stanza plus separator)
  [6l5H4I7] %   Push array [6 1 5 2 4 3 7]. The 7th string is the separator, and stays
            %   at the end. The other strings are shuffled as required
  )         %   Index into the array of strings
            % End implicitly
            % Display implicitly

3

수학, 59 바이트

r=Riffle;""<>Flatten@r[NestList[RotateRight,#,5],""]~r~"\n"&

이 명명되지 않은 함수의 핵심은 NestList[RotateRight,#,5]길이 6의 입력 목록을 가져와 각각 sestina 방식으로 회전 된 6 개의 목록 목록을 만듭니다. 실제로 문자열 목록의 목록이 허용 가능한 출력이면 26 바이트 단위로NestList[RotateRight,#,5]& 작업을 수행 합니다 .

그런 다음 r[...,""]6 개의 각 목록 사이에 빈 문자열을 삽입합니다. Flatten모든 것을 단일 문자열 목록으로 바꿉니다. ~r~"\n"그런 다음 각 문자열 사이에 줄 바꿈을 삽입합니다. 그리고 ""<>하나의 문자열로 전체를 연결합니다. 따라서 다른 33 바이트는 구조화 된 출력을 단일 문자열로 변환하기위한 것입니다.


2

배치, 99 바이트

@for %%w in (%*)do @if not .%%w==.%7 echo %%w
@echo(
@if not .%7==...... %0 %6 %1 %5 %2 %4 %3 .%7

설명 : 입력을 명령 행 매개 변수로 사용합니다. 는 %0축적, 주위 루프로 인해 .원래 비어 7 매개 변수들. 빈 문자열에서는 작동하지 않기 .때문에 추가 if됩니다.


2

루비, 51 바이트

->z{z.map{z[1],z[3],z[5],z[4],z[2],z[0]=z+[""]}*$/}

0..5아래와 같이 숫자를 반복하는 대신의 요소를 반복하여 6 회 반복합니다 z. (0..5).map{|i|puts i}코드 와 같은 일반적인 사용법에서는 {}반복되는 요소를 읽습니다. 이 경우 내부 코드에서 수행 된 순열 {}은 반복되는 요소를 읽지 않으므로 z순열을 방해하지 않고 요소를 반복 할 수 있습니다 .

루비, 56 바이트

6 요소 배열을 매개 변수로 사용합니다

->z{(0..5).map{z[1],z[3],z[5],z[4],z[2],z[0]=z+[""]}*$/}

6 개의 매개 변수를 취하는 대체 버전

->a,b,c,d,e,f{(0..5).map{b,d,f,e,c,a=a,b,c,d,e,f,""}*$/}

map우리는 반복 할 때마다 permute z. ""스탠자 사이의 구분을 나타내는 원래 버전에 a 를 더한 a 의 출력이됩니다 map(이 7 번째 배열 요소는 지정에 필요하지 않으므로 무시됩니다). *$/배열을 문자열로 변환하여 줄 바꿈과 함께 모든 것을 결합합니다.


2

라켓 115 바이트

(let p((o(list l))(m 0))(if(> n m)(p(cons(map(λ(x)(list-ref(list-ref o 0)x))'(5 0 4 1 3 2))o)(+ 1 m))(reverse o)))

언 골프 드 :

(define(f l n)
 (let loop ((ol (list l))
             (m 0))
    (if (> n m) 
        (loop
         (cons (map
                (λ (x) (list-ref (list-ref ol 0) x))
                '(5 0 4 1 3 2))
               ol)
         (add1 m))
        (reverse ol))))

테스트 :

(f (list "house" "grandmother" "child" "stove" "almanac" "tears") 6)

산출:

'(("house" "grandmother" "child" "stove" "almanac" "tears")
  ("tears" "house" "almanac" "grandmother" "stove" "child")
  ("child" "tears" "stove" "house" "grandmother" "almanac")
  ("almanac" "child" "grandmother" "tears" "house" "stove")
  ("stove" "almanac" "house" "child" "tears" "grandmother")
  ("grandmother" "stove" "tears" "almanac" "child" "house")
  ("house" "grandmother" "child" "stove" "almanac" "tears"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.