Blueprint a sestina

19

Šestina jest formatem poematu, który następuje ciekawy wzór, który możemy wygenerować. Ma sześć zwrotek po sześć wierszy każda, przy czym ostatnie słowa każdego wiersza w pierwszej zwrotce tworzą zakończenia linii w każdej kolejnej zwrotce, obrócone w ustalonym wzorze. (Na końcu jest też trzywierszowa zwrotka, ale nie będziemy się tym przejmować.) Spójrz na pierwsze trzy zwrotki twórczo nazwanej Sestina Elizabeth Bishop :

Wrześniowy deszcz pada na dom.
W słabnącym świetle stara babcia
siedzi w kuchni z dzieckiem
obok Małego Pieca Marvela,
czytając dowcipy z almanachu,
śmiejąc się i rozmawiając, by ukryć łzy.

Sądzi, że jej równonocne łzy
i deszcz bijący na dach domu
zostały przepowiedziane przez almanach,
ale znane tylko babci.
Żelazny czajnik śpiewa na kuchence.
Kroi chleb i mówi dziecku:

Czas na herbatę; ale dziecko
patrzy, jak małe, twarde łzy czajnika
tańczą jak szalone na gorącym czarnym piecu,
tak jak deszcz musi tańczyć w domu.
Stara babcia
sprząta sprytnego almanachu

...

Zwróć uwagę, jak każda linia kończy się jednym z sześciu słów: „dom”, „babcia”, „dziecko”, „piec”, „almanach” lub „łzy”. Nie tylko to, ale słowa są uporządkowane według wzoru 6–1–5–2–4–3 w stosunku do poprzedniej zwrotki. Wygląda to jak spirala:

wprowadź opis zdjęcia tutaj

Jeszcze kilka lat dzieli nas od programowego wygenerowania pełnej sestiny, ale możemy stworzyć szablon zawierający słowa końcowe każdej zwrotki w odpowiedniej kolejności. Napisz program lub funkcję, która biorąc pod uwagę sześć końcowych słów, generuje plan sestiny, zgodnie z tymi zasadami. Oto oczekiwany wynik dla danych wejściowych 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

Pierwsza zwrotka to słowa w oryginalnej kolejności, druga zwrotka jest w kolejności 6-1-5-2-4-3 od pierwszej. Trzecia zwrotka to kolejność względem drugiej itd., Aż do zwrotki 6.

Załóżmy, że wprowadzane słowa zawsze będą składały się wyłącznie z liter, wielkich lub małych liter. Możesz wziąć je jako tablicę ciągów lub pojedynczy ciąg rozdzielony znakiem innym niż litera (spacja, znak nowej linii itp.). W wyniku wiersze są oddzielone znakami nowej linii ( 0x0A), a zwrotki oddzielone dwoma znakami nowej linii. Końcowy znak nowej linii jest dopuszczalny.

To jest , więc wygrywa najkrótszy kod w bajtach. To powiedziawszy, może być krótsze, aby skompresować całą strukturę wiersza, ale chciałbym zobaczyć niektóre rozwiązania, które opierają każdą zwrotkę na poprzednim.

NinjaBearMonkey
źródło
Czy końcowe linie są akceptowane?
Luis Mendo,
Czy linia separatora może również zawierać spację?
Luis Mendo,
@LuisMendo Pewnie, oba są w porządku.
NinjaBearMonkey
Czy wyjściem może być uporządkowana lista uporządkowanych list ciągów?
Greg Martin,
6
+1 dla sestyn, ale nie jestem pewien, czy to zasługuje na natural-languagetag. Algorytm jest taki sam, nawet jeśli na wejściu jest sześć ciągów bełkotu.
DLosc

Odpowiedzi:

1

Galaretka , 15 14 bajtów

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

TryItOnline!

W jaki sposób?

Tak, zastosowanie jednego z moich dodatków do Galaretki! ( œ?)

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
źródło
7

Python, 72 64 bajty

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

Pobiera dane wejściowe przez STDIN jako rozdzieloną przecinkami tablicę 6 łańcuchów i danych wyjściowych do STDOUT w formacie opisanym w poście z dodatkową końcową nową linią.

Wypróbuj online! (Ideone)

Ponadto nie jestem pewien, czy jest to w porządku, ale tutaj jest krótsza odpowiedź w postaci anonimowej funkcji lambda o 59 bajtach, która pobiera dane wejściowe w tym samym formacie, co powyższa odpowiedź, i wysyła program potrzebny do wygenerowania poprawne wyjście:

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

Dlatego należy go wywołać w formacie exec(<Function Name>(<Array>)). Ponownie nie jestem pewien, czy jest to w porządku, dlatego dodam to jako dodatkową, osobną, niekonkurującą odpowiedź, dopóki ktoś (może nawet OP) nie będzie w stanie wyjaśnić, czy jest to w porządku, czy nie, co bardzo doceniam .

R. Kap
źródło
2
Lubię poppodstęp!
xnor
3

MATL , 18 17 bajtów

0ch5:"t[6l5H4I7])

Dane wejściowe to tablica komórek ciągów znaków w formacie

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

Wypróbuj online!

Wyjaśnienie

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
źródło
3

Mathematica, 59 bajtów

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

Rdzeniem tej nienazwanej funkcji jest NestList[RotateRight,#,5]pobieranie listy wejściowej o długości 6 i tworzenie listy 6 list, z których każda jest obrócona w sestina. Rzeczywiście, jeśli lista list ciągów znaków jest akceptowalnym wynikiem, toNestList[RotateRight,#,5]& wykonuje zadanie w 26 bajtach .

Następnie r[...,""]wstawia pusty ciąg między każdą z 6 list; Flattenzamienia całość w jedną listę ciągów; ~r~"\n"następnie wstawia nową linię między każdym z tych ciągów; i ""<>łączy całość w jeden ciąg. Zatem pozostałe 33 bajty służą tylko do konwersji uporządkowanego wyjścia na pojedynczy ciąg.

Greg Martin
źródło
2

Partia, 99 bajtów

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

Objaśnienie: Pobiera dane wejściowe jako parametry wiersza polecenia. %0Powoduje go do pętli wokół, gromadząc .s w pierwotnie opróżnienia 7 parametru. Dodatkową korzyścią .jest to, że ifnie działa na pustych ciągach.

Neil
źródło
2

Rubinowy, 51 bajtów

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

Zamiast iterować liczby 0..5jak poniżej, powtarzamy 6 razy, iterując elementy z. W normalnym użyciu, takim jak (0..5).map{|i|puts i}kod, {}odczytuje iterowane elementy. W tym przypadku permutacje wykonane przez kod wewnątrz {}nie odczytują iterowanych elementów, więc możemy iterować po elementach zbez ingerencji w permutacje.

Rubinowy, 56 bajtów

Bierze tablicę 6-elementową jako parametr

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

alternatywna wersja z 6 parametrami

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

Z każdą iteracją mappermutujemy z. Oryginalna wersja plus a ""reprezentująca przerwę między zwrotkami staje się wyjściem map(ten siódmy element tablicy nie jest potrzebny przez przypisanie, więc jest ignorowany). *$/konwertuje tablice na ciąg, łącząc wszystko razem z znakami nowej linii.

Level River St
źródło
2

Rakieta 115 bajtów

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

Nie golfowany:

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

Testowanie:

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

Wynik:

'(("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"))
rnso
źródło