Cetak biru sestina

19

Sebuah sestina adalah format puisi yang mengikuti pola yang menarik yang bisa kita hasilkan. Ini memiliki enam bait dari enam baris masing-masing, di mana kata-kata terakhir dari setiap baris dalam bait pertama membentuk akhir baris di setiap bait berturut-turut, diputar dalam pola yang ditetapkan. (Ada juga bait tiga baris di akhir, tetapi kita tidak akan khawatir tentang itu.) Lihatlah tiga bait pertama dari Sestina bernama Elizabeth Bishop yang kreatif bernama :

September hujan turun di rumah.
Dalam cahaya yang hilang, nenek tua itu
duduk di dapur bersama anak
di samping Kompor Marvel Kecil,
membaca lelucon dari almanak,
tertawa dan berbicara untuk menyembunyikan air matanya.

Dia berpikir bahwa air mata yang sama
dan hujan yang berdetak di atap rumah
keduanya dinubuatkan oleh almanak,
tetapi hanya diketahui oleh seorang nenek.
Ketel besi bernyanyi di atas kompor.
Dia memotong roti dan berkata kepada anak itu,

Sekarang waktunya minum teh; tetapi anak
itu menyaksikan air mata kecil teko itu
menari-nari seperti orang gila di atas tungku hitam panas,
seperti hujan yang harus menari di rumah.
Merapikan, nenek tua
menutup almanak pintar

...

Perhatikan bagaimana setiap baris diakhiri dengan salah satu dari enam kata "rumah," "nenek," "anak," "kompor," "almanak," atau "air mata." Bukan hanya itu, tetapi kata-kata tersebut diurutkan dalam pola 6–1—5–2—4–3, relatif terhadap bait sebelumnya. Itu akhirnya tampak seperti spiral:

masukkan deskripsi gambar di sini

Kami masih beberapa tahun lagi dari pemrograman menghasilkan sestina penuh, tetapi kami dapat membuat template yang menampilkan kata-kata akhir dari setiap bait dalam urutan yang tepat. Tulis sebuah program atau fungsi yang, mengingat kata-kata yang berakhir enam baris, mengeluarkan cetak biru untuk sestina, mengikuti aturan-aturan ini. Inilah hasil yang diharapkan untuk input 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

Bait pertama adalah kata-kata dalam urutan asli, bait kedua dalam urutan 6-1-5-2-4-3 dari yang pertama. Bait ketiga adalah urutan itu relatif terhadap bait kedua, dan seterusnya, sampai bait 6.

Asumsikan bahwa kata-kata input akan selalu hanya berupa huruf, huruf besar atau kecil. Anda bisa menganggapnya sebagai larik string atau string tunggal yang dibatasi oleh karakter non-huruf (spasi, baris baru, dll.). Dalam output, baris dipisahkan oleh baris baru ( 0x0A), dan bait dipisahkan oleh dua baris baru. Newline tambahan dapat diterima.

Ini adalah , jadi kode terpendek dalam byte menang. Yang sedang berkata, mungkin lebih pendek untuk mengompresi seluruh struktur puisi, tetapi saya ingin melihat beberapa solusi yang mendasari setiap bait pada sebelumnya.

NinjaBearMonkey
sumber
Mengikuti baris baru yang diterima?
Luis Mendo
Juga, dapatkah garis pemisah berisi spasi?
Luis Mendo
@LuisMendo Tentu, keduanya baik-baik saja.
NinjaBearMonkey
Bisakah output menjadi daftar urutan daftar string?
Greg Martin
6
+1 untuk sestinas, tapi saya tidak yakin ini pantas untuk natural-languagetag. Algoritmanya sama walaupun inputnya enam string omong kosong.
DLosc

Jawaban:

1

Jelly , 15 14 byte

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

TryItOnline!

Bagaimana?

Yey, penggunaan salah satu tambahan saya untuk Jelly! ( œ?)

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)
Jonathan Allan
sumber
7

Python, 72 64 byte

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

Mengambil input melalui STDIN sebagai array yang dipisahkan koma dari 6 string dan output ke STDOUT dalam format yang dijelaskan dalam posting dengan tambahan baris baru.

Cobalah secara Online! (Ideone)

Juga, saya tidak yakin apakah ini boleh dilakukan, tetapi di sini ada jawaban yang lebih pendek dalam bentuk fungsi lambda anonim pada 59 byte yang mengambil input dalam format yang sama dengan jawaban di atas, dan mengeluarkan program yang diperlukan untuk menghasilkan output yang benar:

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

Karena itu harus dipanggil dalam format exec(<Function Name>(<Array>)). Sekali lagi, saya tidak yakin apakah ini boleh dilakukan, jadi saya menambahkan ini sebagai jawaban ekstra, terpisah, dan tidak bersaing sampai seseorang (mungkin bahkan OP) mudah-mudahan dapat mengklarifikasi apakah ini boleh atau tidak, yang saya akan sangat menghargai .

R. Kap
sumber
2
Saya suka poptriknya!
xnor
3

MATL , 18 17 byte

0ch5:"t[6l5H4I7])

Input adalah array sel string, dalam format

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

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
3

Mathematica, 59 byte

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

Inti dari fungsi tanpa nama ini adalah NestList[RotateRight,#,5], yang mengambil daftar input dengan panjang 6 dan membuat daftar 6 daftar, masing-masing diputar dengan cara sestina. Memang, jika daftar list-of-string adalah output yang dapat diterima, maka NestList[RotateRight,#,5]&melakukan pekerjaan dalam 26 byte .

Kemudian, r[...,""]masukkan string kosong di antara masing-masing 6 daftar; Flattenmengubah semuanya menjadi satu daftar string; ~r~"\n"kemudian menyisipkan baris baru di antara masing-masing string; dan ""<>menyatukan semuanya menjadi satu string. Jadi 33 byte lainnya hanya untuk mengubah output terstruktur menjadi string tunggal.

Greg Martin
sumber
2

Batch, 99 byte

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

Penjelasan: Mengambil input sebagai parameter baris perintah. The %0menyebabkan ia lingkaran di sekitar, mengumpulkan .s di awalnya mengosongkan parameter-7. Ekstra .ini karena iftidak berfungsi pada string kosong.

Neil
sumber
2

Ruby, 51 byte

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

Alih-alih mengulangi angka-angka 0..5seperti di bawah ini, kami mengulangi 6 kali dengan mengulangi elemen z. Dalam penggunaan normal seperti (0..5).map{|i|puts i}kode {}membaca elemen berulang. Dalam hal ini permutasi yang dilakukan oleh kode di dalam {}tidak membaca elemen yang diulangi, sehingga kita dapat mengulangi elemen-elemen ztanpa mengganggu permutasi.

Ruby, 56 byte

Mengambil 6 elemen array sebagai parameter

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

versi alternatif mengambil 6 parameter

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

Dengan setiap iterasi mapkami permutasi z. Versi asli ditambah a ""untuk mewakili jeda antara bait menjadi output dari map(elemen array ketujuh ini tidak diperlukan oleh penugasan jadi diabaikan). *$/mengubah array menjadi string, menggabungkan semuanya bersama dengan baris baru.

Level River St
sumber
2

Racket 115 byte

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

'(("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"))
juga
sumber