Основа сестіни


19

Сестрини це формат вірші , який слід цікавий зразок , який ми можемо генерувати. Він має шість строф по шість рядків у кожному, де останні слова кожного рядка в першій строфі складають закінчення рядків у кожній послідовній строфі, обертаються за заданим малюнком. (В кінці є також трирядкова строфа, але ми не будемо хвилюватися з цього приводу.) Погляньте на перші три строфи творчо названої Шестіною Єлизавети Єпископ :

Вересневий дощ падає на будинок.
У невдалому світлі старенька бабуся
сидить на кухні з дитиною
біля Малої печі Марвел,
читаючи анекдоти з альманаху,
сміючись і розмовляючи, щоб приховати сльози.

Вона думає, що її рівнозначні сльози
та дощ, який б'ється по даху будинку,
були передбачені альманахом,
але відомі лише бабусі.
Залізний чайник співає на плиті.
Вона ріже хліб і каже дитині:

Настав час чаю; але дитина
спостерігає, як маленькі важкі сльози текету
танцюють, як божевільні на гарячій чорній плиті,
як дощ повинен танцювати на будинок.
Прибираючи, стара бабуся
вішає розумний альманах

...

Зверніть увагу, як кожен рядок закінчується одним із шести слів "будинок", "бабуся", "дитина", "плита", "альманах" або "сльози". Мало того, але слова впорядковані за шаблоном 6–1–5–2–4–3, відносно попередньої строфи. Це закінчується схожим на спіраль:

введіть тут опис зображення

Ми ще кілька років від того, щоб програматично створити повну сестіну, але ми можемо створити шаблон із зображенням кінцевих слів кожної строфи в належному порядку. Напишіть програму або функцію, яка, з огляду на шість рядків, що закінчуються, виводить креслення для сестина, дотримуючись цих правил. Ось очікуваний результат для введення даних 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

Перша строфа - це слова в початковому порядку, друга строфа - в порядку 6-1-5-2-4-3 від першої. Третя строфа - це порядок відносно другого тощо, аж до строфи 6.

Припустимо, що вхідними словами завжди будуть лише літери, великі або малі літери. Ви можете прийняти їх як масив рядків або окремий рядок, розмежований символом без літери (пробіл, новий рядок тощо). У висновку рядки розділені новими рядками ( 0x0A), а строфи розділені двома новими рядками. Прийнятний новий рядок прийнятний.

Це , тому найкоротший код у байтах виграє. Це, можливо, буде коротше стиснути всю структуру поеми, але я хотів би побачити деякі рішення, які базують кожну строфу на попередній.


Прийняті останні рядки?
Луїс Мендо

Також, чи може роздільна лінія містити пробіл?
Луїс Мендо

@LuisMendo Звичайно, обидва добре.
NinjaBearMonkey

Чи може висновок бути упорядкованим списком упорядкованих списків рядків?
Грег Мартін

6
+1 для sestinas, але я не впевнений, що це заслуговує на natural-languageтег. Алгоритм той самий, навіть якщо вхід становить шість рядків химерності.
DLosc

Відповіді:


1

Желе , 15 14 байт

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

СпробуйтеItOnline!

Як?

Так, використання одного з моїх доповнень до 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

Пітон, 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>)). Знову ж таки, я не впевнений, чи правильно це робити, тому я додаю це як додаткову, окрему, неконкурентну відповідь, поки хтось (можливо, навіть ОП) може сподіватися уточнити, добре це чи ні, що я б дуже цінував .


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

Математика, 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

Рубі, 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,""}*$/}

З кожною ітерацією mapперестановки z. Оригінальна версія плюс a ""для подання перерви між строфами стає результатом 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)))

Безголівки:

(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"))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.