Bir sestina planı


19

Bir sestina , üretebileceğimiz ilginç bir modeli takip eden bir şiir biçimidir. Her biri altı satırdan oluşan altı stanza sahiptir, burada ilk stanzadaki her satırın son sözcükleri, belirli bir desende döndürülen birbirini izleyen her stanzada satır sonlarını oluşturur. (Sonunda üç satırlık bir stanza var, ama bunun için endişelenmeyiz.) Elizabeth Bishop'un yaratıcı Sestina adlı ilk üç stanzına bir göz atın :

Eylül yağmuru eve düşer.
Başarısız ışıkta, yaşlı büyükanne
mutfakta
küçük Marvel Sobası'nın yanındaki çocukla oturuyor
, almanaktan şakaları okuyor,
gülüyor ve gözyaşlarını gizlemek için konuşuyor.

Dengesiz gözyaşlarının
ve evin çatısında atılan yağmurun
hem almanak tarafından önceden verildiğini,
ancak sadece bir büyükanne tarafından bilindiğini düşünüyor.
Demir su ısıtıcısı ocakta şarkı söylüyor.
Biraz ekmek kesip çocuğa,

Şimdi çay zamanı; ama çocuk sıcak siyah ocakta deli gibi dans eden
küçük gözyaşlarının , yağmurun evde dans etmesi gerektiği şekilde izliyor . Toplanan yaşlı büyükanne zeki almanakı kapatıyor



...

Her satırın "ev", "büyükanne", "çocuk", "soba", "almanak" veya "gözyaşı" sözcüklerinden biriyle nasıl sona erdiğine dikkat edin. Sadece bu değil, kelimeler önceki stanza göre 6–1—5–2—4–3 deseninde sıralanmıştır. Sonunda bir spiral gibi görünüyor:

resim açıklamasını buraya girin

Programlı olarak tam bir sestina üretmekten hala birkaç yıl uzaktayız, ancak her stanzanın son kelimelerini uygun sırayla içeren bir şablon oluşturabiliriz. Altı satır biten kelimeler göz önüne alındığında, bu kurallara uyarak bir sestina için plan çıktısı veren bir program veya işlev yazın. Girdi için beklenen sonuç şudur 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

İlk stanza orijinal sırayla kelimeler, ikinci stanza ise ilkinden 6-1-5-2-4-3 düzenindedir. Üçüncü stanza, stanza 6'ya kadar olan ikinciye göre olan düzendir.

Giriş kelimelerinin her zaman yalnızca harf, büyük veya küçük harf olacağını varsayalım. Bunları bir dize dizisi veya harf olmayan bir karakterle (boşluk, yeni satır vb.) Sınırlandırılmış tek bir dize olarak alabilirsiniz. Çıktıda, satırlar satırsonu ( 0x0A) ile ayrılır ve stanzlar iki satır satırla ayrılır . Sondaki satırsonu kabul edilebilir.

Bu , bayt en kısa kod kazanır. Bununla birlikte, tüm şiirin yapısını sıkıştırmak daha kısa olabilir, ancak her stanza'yı bir öncekine dayandıran bazı çözümler görmek istiyorum.


Sondaki yeni satırlar kabul edildi mi?
Luis Mendo

Ayrıca, ayırıcı çizgi boşluk içerebilir mi?
Luis Mendo

@LuisMendo Elbette, ikisi de iyi.
NinjaBearMonkey

Çıktı, sıralı dize listelerinin sıralı bir listesi olabilir mi?
Greg Martin

6
Sestinas için +1, ancak bunun natural-languageetiketi hak ettiğinden emin değilim . Giriş altı anlamsız dizgi olsa bile algoritma aynıdır.
DLosc

Yanıtlar:


1

Jöle , 15 14 bayt

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

TryItOnline!

Nasıl?

Yey, Jelly'e eklemelerimden biri! ( œ?)

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 bayt

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

Girdiyi STDIN aracılığıyla 6 dizeden oluşan virgülle ayrılmış bir dizi olarak alır ve ek bir son satırsonu ile gönderide açıklanan biçimde STDOUT'a çıktılar.

Çevrimiçi Deneyin! (Ideone)

Ayrıca, bunun yapmanın uygun olup olmadığından emin değilim, ancak yukarıdaki cevapla aynı formatta girdi alan ve üretmek için gerekli programı çıktılayan 59 baytta anonim bir lambda işlevi şeklinde daha kısa bir cevap. doğru çıktı:

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

Bu nedenle formatta çağrılmalıdır exec(<Function Name>(<Array>)). Yine, bunun yapmak için uygun olup olmadığından emin değilim, bu yüzden birisi (belki de OP) umarım bu iyi olup olmadığını netleştirene kadar ekstra, ayrı, rakip olmayan bir cevap olarak ekliyorum, ki gerçekten takdir edeceğim .


2
popHile hoşuma gitti !
xnor

3

MATL , 18 17 bayt

0ch5:"t[6l5H4I7])

Girdi, biçimdeki hücre dizelerinden oluşan bir dizidir

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

Bu isimsiz fonksiyonun özü, NestList[RotateRight,#,5]uzunluğu 6 olan bir giriş listesi alan ve her biri sestina yolunda döndürülen 6 listenin bir listesini oluşturan. Gerçekten de, dizeler listesinin bir listesi kabul edilebilir çıktıysa, NestList[RotateRight,#,5]&işi 26 bayt olarak yapar .

Ardından, r[...,""]6 listenin her birine boş bir dize ekler; Flattenher şeyi tek bir dize listesine dönüştürür; ~r~"\n"daha sonra bu dizelerin her birine yeni bir satır ekler; ve ""<>her şeyi tek bir dizede birleştirir. Böylece diğer 33 bayt sadece yapılandırılmış çıkışı tek bir dizgeye dönüştürmektir.


2

Toplu, 99 bayt

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

Açıklama: Girişi komut satırı parametreleri olarak alır. %0Biriken etrafında döngü için neden .başlangıçta boş 7. parametre s. Ekstra ., ifboş dizelerde çalışmadığı için.


2

Ruby, 51 bayt

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

0..5Aşağıdaki gibi sayılar üzerinde yineleme yapmak yerine, öğelerinin üzerinde yineleyerek 6 kez tekrarlıyoruz z. Normal kullanımda (0..5).map{|i|puts i}kod gibi {}yinelenen öğeleri okur. Bu durumda, içindeki kod tarafından yapılan permütasyonlar {}yinelenen öğeleri okumaz, bu yüzden zpermütasyonlara müdahale etmeden elementleri tekrarlayabiliriz .

Yakut, 56 bayt

6 elemanlı bir diziyi parametre olarak alır

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

6 parametre alan alternatif versiyon

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

Her yinelemede izin mapveriyoruz z. Özgün sürüm artı ""stanzas arasındaki bir kopuşu temsil eden a değeri map(bu yedinci dizi öğesine atama gerekli değildir, bu nedenle yok sayılır). *$/dizileri bir dizeye dönüştürür ve her şeyi yeni satırlarla birleştirir.


2

Raket 115 bayt

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

Ungolfed:

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

Test yapmak:

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

Çıktı:

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