พิมพ์เขียว sestina


19

sestinaเป็นรูปแบบของบทกวีที่เป็นไปตามรูปแบบที่น่าสนใจที่เราสามารถสร้าง มันมีหกบทหกบรรทัดแต่ละบรรทัดซึ่งคำสุดท้ายของแต่ละบรรทัดในบทแรกจะประกอบเป็นจุดสิ้นสุดบรรทัดในแต่ละบทต่อเนื่องซึ่งหมุนในรูปแบบชุด (นอกจากนี้ยังมีบทสามบรรทัดในตอนท้าย แต่เราไม่ต้องกังวลเกี่ยวกับเรื่องนี้) ดูบทสามบทแรกของ Elizabeth Bishop ที่ชื่อSestinaอย่างสร้างสรรค์:

ฝนกันยายนตกบนบ้าน
ในความล้มเหลวของแสงยายเก่า
นั่งอยู่ในครัวพร้อมกับเด็ก
ข้างเตามหัศจรรย์น้อย
อ่านเรื่องตลกจากปูมการ
หัวเราะและพูดคุยเพื่อซ่อนน้ำตาของเธอ

เธอคิดว่าน้ำตา
ที่เกี่ยวกับการนอนหลับของเธอและสายฝนที่เต้นอยู่บนหลังคาของบ้าน
นั้นถูกปูมไว้ด้วยปูมทั้งสอง
ข้าง
กาต้มน้ำเหล็กร้องเพลงบนเตา
เธอตัดขนมปังและพูดกับเด็กว่า

ได้เวลาดื่มชาแล้ว แต่เด็ก
กำลังดูน้ำตาเล็ก ๆ ของกาน้ำชา
เต้นอย่างบ้าคลั่งบนเตาร้อนสีดำ
วิธีที่ฝนจะต้องเต้นบนบ้าน
เมื่อคุณยายแก่ชรานอน
อยู่บนปูมอันชาญฉลาด

...

โปรดสังเกตว่าแต่ละบรรทัดลงท้ายด้วยคำใดคำหนึ่งในหกคำว่า "บ้าน" "ยาย" "เด็ก" "เตา" "ปูมปูม" หรือ "น้ำตา" ไม่เพียงแค่นั้น แต่มีการจัดเรียงคำในรูปแบบ 6–1–5–2–4–3 เทียบกับบทก่อนหน้า มันดูเหมือนเป็นเกลียว:

ป้อนคำอธิบายรูปภาพที่นี่

เรายังห่างจากการสร้างเซสทิน่าเต็มรูปแบบโดยทางโปรแกรม แต่เราสามารถสร้างเทมเพลตที่มีคำพูดสุดท้ายของแต่ละบทในลำดับที่เหมาะสม เขียนโปรแกรมหรือฟังก์ชั่นที่ให้คำลงท้ายด้วยคำหกบรรทัดออกผลลัพธ์พิมพ์เขียวสำหรับ 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

stanza แรกคือคำตามลำดับต้นฉบับ stanza ที่สองอยู่ในลำดับที่ 6-1-5-2-4-4-3 จากคำสั่งแรก บทที่สามคือลำดับที่สัมพันธ์กับอันดับที่สองเป็นต้นไปจนถึงบทที่ 6

สมมติว่าคำที่ป้อนจะเป็นตัวอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กเสมอ คุณสามารถใช้มันเป็นอาร์เรย์ของสตริงหรือสตริงเดียวที่คั่นด้วยอักขระที่ไม่ใช่ตัวอักษร (เว้นวรรคบรรทัดใหม่ ฯลฯ ) ในเอาต์พุตบรรทัดจะถูกคั่นด้วยบรรทัดใหม่ ( 0x0A) และ stanzas คั่นด้วยบรรทัดใหม่สองบรรทัด บรรทัดใหม่ต่อท้ายเป็นที่ยอมรับ

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ที่ถูกกล่าวว่ามันอาจจะสั้นกว่าในการบีบอัดโครงสร้างของบทกวีทั้งหมด แต่ฉันต้องการที่จะเห็นวิธีการแก้ปัญหาบางอย่างที่ฐานแต่ละบทก่อนหน้านี้


ยอมรับการขึ้นบรรทัดใหม่หรือไม่
Luis Mendo

นอกจากนี้บรรทัดตัวแยกสามารถมีช่องว่างได้หรือไม่?
Luis Mendo

@ LuisMendo แน่นอนว่าทั้งคู่ก็โอเค
NinjaBearMonkey

เอาต์พุตสามารถเป็นรายการที่เรียงลำดับแล้วของรายการสตริงที่เรียงลำดับหรือไม่?
เกร็กมาร์ติน

6
+1 สำหรับเซสทินัส แต่ฉันไม่แน่ใจว่านี่เป็นการทำnatural-languageแท็ก อัลกอริทึมจะเหมือนกันแม้ว่าอินพุตเป็นหกสายของการพูดพล่อยๆ
DLosc

คำตอบ:


1

เยลลี่ , 15 14 ไบต์

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

TryItOnline!

อย่างไร?

Yey การใช้หนึ่งในสิ่งที่ฉันเพิ่มลงใน 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)

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 ในรูปแบบที่อธิบายในโพสต์พร้อมกับการขึ้นบรรทัดใหม่ที่ต่อท้าย

ลองออนไลน์! (Ideone)

นอกจากนี้ฉันไม่แน่ใจว่าสิ่งนี้ถูกต้องหรือไม่ แต่นี่เป็นคำตอบที่สั้นกว่าในรูปแบบของฟังก์ชั่นแลมบ์ดานิรนามที่ขนาด 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

Mathematica, 59 ไบต์

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

แกนหลักของฟังก์ชั่นที่ไม่มีชื่อนี้คือNestList[RotateRight,#,5]ซึ่งรับรายการอินพุตของความยาว 6 และสร้างรายการจาก 6 รายการโดยแต่ละรายการจะหมุนในลักษณะเซสทีน่า อันที่จริงถ้ารายการของรายการของสตริงคือผลลัพธ์ที่ยอมรับแล้วNestList[RotateRight,#,5]&จะทำงานใน26 ไบต์

จากนั้น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

Ruby, 51 ไบต์

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

แทนการทำซ้ำมากกว่าตัวเลข0..5ดังต่อไปนี้เราทำซ้ำ 6 ครั้งโดย iterating zกว่าองค์ประกอบของ ในการใช้งานปกติเช่น (0..5).map{|i|puts i}รหัส{}อ่านองค์ประกอบซ้ำแล้วซ้ำอีก ในกรณีนี้การเรียงสับเปลี่ยนที่ทำโดยโค้ดด้านใน{}จะไม่อ่านอิลิเมนต์ที่วนซ้ำดังนั้นเราจึงสามารถวนซ้ำองค์ประกอบต่างๆได้zโดยไม่ต้องยุ่งเกี่ยวกับการเรียงสับเปลี่ยน

Ruby, 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 zเวอร์ชันดั้งเดิมบวก a ""เพื่อแทนตัวแบ่งระหว่าง stanzas กลายเป็นเอาต์พุตของmap(องค์ประกอบอาร์เรย์ลำดับที่เจ็ดนี้ไม่จำเป็นสำหรับการกำหนดดังนั้นจะถูกละเว้น) *$/แปลงอาร์เรย์เป็นสตริงรวมทุกอย่างเข้าด้วยกันด้วยการขึ้นบรรทัดใหม่


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

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

การทดสอบ:

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