Š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:
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 golf golfowy , 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.
natural-language
tag. Algorytm jest taki sam, nawet jeśli na wejściu jest sześć ciągów bełkotu.Odpowiedzi:
Galaretka ,
1514 bajtówTryItOnline!
W jaki sposób?
Tak, zastosowanie jednego z moich dodatków do Galaretki! (
œ?
)źródło
Python,
7264 bajtyPobiera 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:
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ódło
pop
podstęp!MATL ,
1817 bajtówDane wejściowe to tablica komórek ciągów znaków w formacie
Wypróbuj online!
Wyjaśnienie
źródło
Mathematica, 59 bajtów
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;Flatten
zamienia 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.źródło
Partia, 99 bajtów
Objaśnienie: Pobiera dane wejściowe jako parametry wiersza polecenia.
%0
Powoduje go do pętli wokół, gromadząc.
s w pierwotnie opróżnienia 7 parametru. Dodatkową korzyścią.
jest to, żeif
nie działa na pustych ciągach.źródło
Rubinowy, 51 bajtów
Zamiast iterować liczby
0..5
jak poniżej, powtarzamy 6 razy, iterując elementyz
. 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 elementachz
bez ingerencji w permutacje.Rubinowy, 56 bajtów
Bierze tablicę 6-elementową jako parametr
alternatywna wersja z 6 parametrami
Z każdą iteracją
map
permutujemyz
. Oryginalna wersja plus a""
reprezentująca przerwę między zwrotkami staje się wyjściemmap
(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.źródło
Rakieta 115 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło