A sestina é um formato de poema que segue um padrão interessante que podemos gerar. Ele tem seis estrofes de seis linhas cada, onde as últimas palavras de cada linha na primeira estrofe compõem as terminações de cada estrofe sucessiva, giradas em um padrão definido. (Há também uma estrofe de três linhas no final, mas não vamos nos preocupar com isso.) Dê uma olhada nas três primeiras estrofes da criativamente chamada Sestina, de Elizabeth Bishop :
A chuva de setembro cai sobre a casa.
À luz fraca, a velha avó
senta-se na cozinha com a criança
ao lado do Fogão da Pequena Marvel,
lendo as piadas do almanaque,
rindo e conversando para esconder as lágrimas.Ela acha que suas lágrimas equinociais
e a chuva que bate no telhado da casa
foram preditas pelo almanaque,
mas são conhecidas apenas por uma avó.
A chaleira de ferro canta no fogão.
Ela corta um pouco de pão e diz à criança:Está na hora do chá agora; mas a criança
está assistindo as pequenas lágrimas duras da chaleira
dançarem como loucas no fogão quente e preto,
do jeito que a chuva deve dançar na casa.
Arrumando, a velha avó
desliga o almanaque inteligente...
Observe como cada linha termina com uma das seis palavras "casa", "avó", "criança", "fogão", "almanaque" ou "lágrimas". Não apenas isso, mas as palavras são ordenadas no padrão 6–1—5–2–4–3, em relação à estrofe anterior. Acaba parecendo uma espiral:
Ainda estamos a alguns anos de gerar programaticamente uma sestina completa, mas podemos criar um modelo com as palavras finais de cada estrofe na ordem correta. Escreva um programa ou função que, dadas as seis palavras finais de linha, produza o plano para uma sestina, seguindo estas regras. Aqui está o resultado esperado para a entrada 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
A primeira estrofe são as palavras na ordem original, a segunda estrofe está na ordem 6-1-5-2-4-3 da primeira. A terceira estrofe é a ordem em relação à segunda e assim por diante, até a estrofe 6.
Suponha que as palavras de entrada sempre sejam apenas letras, maiúsculas ou minúsculas. Você pode tomá-los como uma matriz de cadeias ou uma única cadeia delimitada por um caractere não-letra (espaço, nova linha etc.). Na saída, as linhas são separadas por novas linhas ( 0x0A
) e as estrofes separadas por duas novas linhas. Uma nova linha à direita é aceitável.
Isso é código-golfe , então o código mais curto em bytes vence. Dito isto, pode ser mais curto compactar toda a estrutura do poema, mas eu gostaria de ver algumas soluções que baseiam cada estrofe na anterior.
natural-language
tag. O algoritmo é o mesmo, mesmo que a entrada tenha seis strings de rabiscos.Respostas:
Geléia ,
1514 bytesTryItOnline!
Quão?
Sim, uso de uma das minhas adições ao Jelly! (
œ?
)fonte
Python,
7264 bytesLeva a entrada através de STDIN como uma matriz de 6 seqüências de caracteres separada por vírgula e sai para STDOUT no formato descrito na postagem com uma nova linha à direita adicional.
Experimente Online! (Ideona)
Além disso, não tenho certeza se isso é adequado, mas aqui está uma resposta mais curta na forma de uma função lambda anônima de 59 bytes que recebe entrada no mesmo formato da resposta acima e gera o programa necessário para gerar a saída correta:
Portanto, ele deve ser chamado no formato
exec(<Function Name>(<Array>))
. Novamente, não tenho certeza se isso é bom, então estou adicionando isso como uma resposta extra, separada e não competitiva até que alguém (talvez até OP) possa esclarecer se isso está bem ou não, o que eu realmente aprecio .fonte
pop
truque!MATL ,
1817 bytesEntrada é uma matriz de células de cadeias, no formato
Experimente online!
Explicação
fonte
Mathematica, 59 bytes
O núcleo desta função sem nome é
NestList[RotateRight,#,5]
, que pega uma lista de entrada com o comprimento 6 e cria uma lista com 6 listas, cada uma rotacionada da maneira sestina. De fato, se uma lista de listas de seqüências de caracteres for uma saída aceitável,NestList[RotateRight,#,5]&
o trabalho será executado em 26 bytes .Em seguida,
r[...,""]
insere uma string vazia entre cada uma das 6 listas;Flatten
transforma a coisa toda em uma única lista de strings;~r~"\n"
depois insere uma nova linha entre cada uma dessas cadeias; e""<>
concatena a coisa toda em uma única sequência. Assim, os outros 33 bytes são apenas para converter a saída estruturada em uma única sequência.fonte
Lote, 99 bytes
Explicação: Recebe a entrada como parâmetros da linha de comandos. A
%0
faz com que ele laço em torno, acumulando.
s no parâmetro originalmente esvaziar 7. O extra.
é porqueif
não funciona em cadeias vazias.fonte
Ruby, 51 bytes
Em vez de iterar sobre os números
0..5
como abaixo, repetimos 6 vezes iterando sobre os elementos dez
. Em uso normal, como(0..5).map{|i|puts i}
o código,{}
lê os elementos repetidos. Nesse caso, as permutações feitas pelo código dentro{}
do não leem os elementos iterados, para que possamos iterar sobre os elementosz
sem que isso interfira nas permutações.Ruby, 56 bytes
Toma uma matriz de 6 elementos como parâmetro
versão alternativa com 6 parâmetros
Com cada iteração de
map
permutamosz
. A versão original mais a""
para representar uma quebra entre sub-rotinas torna-se a saída domap
(este sétimo elemento da matriz não é necessário pela atribuição, por isso é ignorado).*$/
converte as matrizes em uma string, unindo tudo com novas linhas.fonte
Raquete 115 bytes
Ungolfed:
Teste:
Resultado:
fonte