Kế hoạch chi tiết


19

Một sestina là một định dạng của bài thơ mà sau một mô hình thú vị mà chúng ta có thể tạo ra. Nó có sáu khổ thơ sáu dòng mỗi dòng, trong đó các từ cuối cùng của mỗi dòng trong khổ thơ đầu tiên tạo thành các kết thúc dòng trong mỗi khổ liên tiếp, được xoay theo một mẫu thiết lập. (Cuối cùng cũng có một khổ ba dòng, nhưng chúng tôi sẽ không lo lắng về điều đó.) Hãy xem ba khổ thơ đầu tiên của Elizabeth Giám mục có tên Sestina sáng tạo :

Mưa tháng chín rơi trên nhà.
Trong ánh sáng thất bại, bà cụ
ngồi trong bếp cùng đứa trẻ
bên cạnh Little Marvel Stove,
đọc những câu chuyện cười từ niên giám,
cười và nói chuyện để giấu nước mắt.

Cô ấy nghĩ rằng những giọt nước mắt bình đẳng của cô ấy
và cơn mưa đập trên mái nhà
đều được báo trước bởi niên giám,
nhưng chỉ được biết đến với một người bà.
Các ấm đun nước sắt hát trên bếp.
Cô cắt một ít bánh mì và nói với đứa trẻ,

Bây giờ là thời gian cho trà; nhưng đứa trẻ
đang nhìn những giọt nước mắt nhỏ cứng của tếch
nhảy như điên trên bếp đen nóng bỏng,
cách mưa phải nhảy trên nhà.
Dọn dẹp, bà cụ
treo lên cuốn niên giám thông minh

...

Lưu ý cách mỗi dòng kết thúc bằng một trong sáu từ "nhà", "bà", "con", "bếp", "niên giám" hoặc "nước mắt". Không chỉ vậy, mà các từ được sắp xếp theo mẫu 6 trừ1 Nó kết thúc giống như một hình xoắn ốc:

nhập mô tả hình ảnh ở đây

Chúng tôi vẫn còn vài năm nữa mới có thể tạo ra một sestina đầy đủ, nhưng chúng tôi có thể tạo một mẫu có các từ kết thúc của mỗi khổ theo thứ tự thích hợp. Viết chương trình hoặc hàm, với sáu từ kết thúc dòng, xuất ra bản thiết kế cho một sestina, theo các quy tắc này. Đây là kết quả mong đợi cho đầu vào 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

Các khổ thơ đầu tiên là các từ theo thứ tự ban đầu, khổ thơ thứ hai theo thứ tự 6-1-5-2-4-3 từ đầu tiên. Khổ thơ thứ ba là thứ tự đó liên quan đến khổ thứ hai, v.v., tất cả các cách để khổ thơ 6.

Giả sử rằng các từ đầu vào sẽ luôn chỉ là chữ cái, chữ hoa hoặc chữ thường. Bạn có thể lấy chúng dưới dạng một chuỗi các chuỗi hoặc một chuỗi được phân tách bằng ký tự không phải chữ cái (dấu cách, dòng mới, v.v.). Trong đầu ra, các dòng được phân tách bằng dòng mới ( 0x0A) và khổ thơ cách nhau bởi hai dòng mới. Một dòng mới có thể được chấp nhận.

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng. Điều đó đang được nói, có thể ngắn hơn để nén toàn bộ cấu trúc của bài thơ, nhưng tôi muốn xem một số giải pháp dựa trên từng khổ thơ trước đó.


Trailing newlines chấp nhận?
Luis Mendo

Ngoài ra, dòng phân cách có thể chứa một không gian?
Luis Mendo

@LuisMendo Chắc chắn, cả hai đều ổn.
NinjaBearMonkey

Đầu ra có thể là một danh sách được sắp xếp của danh sách các chuỗi được sắp xếp không?
Greg Martin

6
+1 cho sestina, nhưng tôi không chắc điều này xứng đáng với natural-languagethẻ. Thuật toán là như nhau ngay cả khi đầu vào là sáu chuỗi vô nghĩa.
DLosc

Câu trả lời:


1

Thạch , 15 14 byte

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

Dùng thử trực tuyến!

Làm sao?

Yey, việc sử dụng một trong những bổ sung của tôi cho 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 byte

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

Đưa đầu vào qua STDIN dưới dạng một mảng gồm 6 chuỗi được phân tách bằng dấu phẩy và xuất ra STDOUT theo định dạng được mô tả trong bài đăng với một dòng mới bổ sung.

Dùng thử trực tuyến! (Ý)

Ngoài ra, tôi không chắc liệu điều này có ổn không, nhưng đây là câu trả lời ngắn hơn dưới dạng hàm lambda ẩn danh ở 59 byte có đầu vào ở cùng định dạng như câu trả lời ở trên và xuất ra chương trình cần thiết để tạo đầu ra chính xác:

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

Do đó, nó phải được gọi theo định dạng exec(<Function Name>(<Array>)). Một lần nữa, tôi không chắc liệu điều này có ổn không, vì vậy tôi bổ sung nó như một câu trả lời bổ sung, riêng biệt, không cạnh tranh cho đến khi ai đó (thậm chí OP) có thể hy vọng làm rõ liệu điều này có ổn hay không, điều mà tôi thực sự đánh giá cao .


2
Tôi thích popmánh khóe!
xnor

3

MATL , 18 17 byte

0ch5:"t[6l5H4I7])

Đầu vào là một mảng ô của chuỗi, ở định dạng

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

Hãy thử trực tuyến!

Giải trình

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

Toán học, 59 byte

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

Cốt lõi của chức năng chưa được đặt tên này là NestList[RotateRight,#,5], lấy một danh sách đầu vào có độ dài 6 và tạo một danh sách gồm 6 danh sách, mỗi danh sách được xoay theo cách sestina. Thật vậy, nếu một danh sách các danh sách các chuỗi là đầu ra có thể chấp nhận được, thì NestList[RotateRight,#,5]&công việc đó sẽ có 26 byte .

Sau đó, r[...,""]chèn một chuỗi trống giữa mỗi 6 danh sách; Flattenbiến toàn bộ thành một danh sách các chuỗi; ~r~"\n"sau đó chèn một dòng mới giữa mỗi chuỗi đó; và ""<>nối toàn bộ mọi thứ thành một chuỗi. Do đó, 33 byte khác chỉ để chuyển đổi đầu ra có cấu trúc thành một chuỗi.


2

Mẻ, 99 byte

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

Giải thích: Lấy đầu vào làm tham số dòng lệnh. Các %0nguyên nhân khiến nó lặp lại, tích lũy .s trong tham số thứ 7 trống ban đầu. Thêm .là vì ifkhông hoạt động trên các chuỗi trống.


2

Ruby, 51 byte

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

Thay vì lặp qua các số 0..5như dưới đây, chúng tôi lặp lại 6 lần bằng cách lặp qua các phần tử của z. Trong sử dụng bình thường như (0..5).map{|i|puts i}{}đọc các phần tử được lặp lại. Trong trường hợp này, các hoán vị được thực hiện bởi mã bên trong {}không đọc các phần tử được lặp đi lặp lại, vì vậy chúng ta có thể lặp lại các phần tử zmà không can thiệp vào các hoán vị này.

Ruby, 56 byte

Lấy một mảng 6 phần tử làm tham số

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

phiên bản thay thế lấy 6 tham số

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

Với mỗi lần lặp của mapchúng ta hoán vị z. Phiên bản gốc cộng với a ""để thể hiện sự ngắt quãng giữa các khổ thơ trở thành đầu ra của map(phần tử mảng thứ bảy này không cần thiết bởi phép gán nên bị bỏ qua). *$/chuyển đổi các mảng thành một chuỗi, nối mọi thứ lại với nhau bằng các dòng mới.


2

Vợt 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)))

Ung dung:

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

Kiểm tra:

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

Đầu ra:

'(("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"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.