セスティナの青写真


19

セスティーナは、我々が生成できることは興味深いパターンを次の詩の形式です。それぞれ6行の6つのスタンザがあり、最初のスタンザの各行の最後の単語が、連続した各スタンザの行末を設定パターンで回転させます。(3行のスタンザは終わりでもありますが、我々はその心配はありません。)エリザベス・ビショップ創造という名前の最初の3つのスタンザをご覧くださいセスティーナを

9月の雨が家に降ります。
失敗した光の中で、おばあさん
は台所で
リトルマーベルストーブのそばに座って
、年鑑の冗談を読んで、
笑って話をして涙を隠します。

彼女は、彼の彼岸の涙
と家の屋根に降りかかる雨の
両方が年鑑によって予告されて
いたが、祖母にしか知られていないと考えている。
ストーブの上で鉄瓶が歌います。
彼女はパンを切って子供に言います

今はお茶の時間です。しかし、子供
は湯沸かし器の小さな激しい涙
が熱い黒いストーブの上で狂ったように踊るのを見て
、雨が家で踊らなければならない方法です。
片付けて、おばあさん
は賢い年鑑を切る

...

各行が「家」、「祖母」、「子供」、「ストーブ」、「年鑑」、または「涙」の6つの単語のいずれかで終わることに注意してください。それだけでなく、単語は前のスタンザと比較してパターン6–1–5–2–4–3で順序付けられます。最終的にはスパイラルのように見えます。

ここに画像の説明を入力してください

プログラムで完全なsestinaを生成するのにはまだ数年かかりますが、各スタンザの終了ワードを適切な順序でフィーチャーしたテンプレートを作成できます。これらのルールに従って、6行で終わる単語が与えられた場合に、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

最初のスタンザは元の順序の単語で、2番目のスタンザは最初の順序から6-1-5-2-4-3の順序です。3番目のスタンザは2番目のスタンザに対する相対的な順序で、以下同様に、スタンザ6まで続きます。

入力語は常に文字のみ、大文字または小文字であると仮定します。文字列の配列または非文字文字(スペース、改行など)で区切られた単一の文字列として使用できます。出力では、行は改行(0x0A)で区切られ、スタンザは2つの改行で区切られます。末尾の改行は許容されます。

これはであるため、バイト単位の最短コードが優先されます。そうは言っても、詩の構造全体を圧縮する方が短いかもしれませんが、各スタンザを前のものに基づいたソリューションをいくつか見たいと思います。


末尾の改行は受け入れられますか?
ルイスメンドー

また、区切り線にスペースを含めることはできますか?
ルイスメンドー

@LuisMendo確かに、両方とも大丈夫です。
NinjaBearMonkey

出力は、文字列の順序付きリストの順序付きリストにできますか?
グレッグマーティン

6
sestinasの場合は+1ですが、これがnatural-languageタグに値するかどうかはわかりません。アルゴリズムは、入力が6つの文字列である場合でも同じです。
DLosc

回答:


1

ゼリー15 14 バイト

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

TryItOnline!

どうやって?

うん、ゼリーへの私の追加の1つの使用!(œ?

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

Python、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

MATL18 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

Mathematica、59バイト

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

この名前のない関数のコアはNestList[RotateRight,#,5]、長さ6の入力リストを取り、6つのリストのリストを作成し、それぞれがsestinaの方法で回転します。実際、list-of-stringsのリストが許容可能な出力であれば、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番目のパラメーターにsが累積されてループします。余分なの.if空の文字列では機能しないためです。


2

Ruby、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,""}*$/}

反復するたびに、mappermuteしzます。元のバージョンに加えて、""スタンザ間の区切りを表す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.