cancel
Showing results for 
Search instead for 
Did you mean: 

Five easy pieces #4: Little Six

SJT
Contributor III
Contributor III

“Golden age” or not, England under Elizabeth I was a very minor European power. Keen to be part of the cultural mainstream, its poets imitated Italian forms such as the sonnet. And a tricky French form Italians called the sestina – the ‘little six’. Philip Sidney wrote a clever but vapid double sestina – what a show-off. 

Not heard of it? Me neither, until I stumbled across Marilyn Hacker’s arresting “Untoward Occurrence at Embassy Poetry Reading”.

Took me a while to see its structure – or even that it had one. You will be quicker. Here’s the challenge. Given a list of six words, return a template for a sestina.

 

q)sest string`pleased`read`poetry`death`seasons`subjects
"pleased"
"read"
"poetry"
"death"
"seasons"
"subjects"
""
"subjects"
..
..
"pleased"
""
"pleased read"
"poetry death"
"seasons subjects"

 

Single expression, please. Usual rules – no control words. Hint: iterate with the Scan form of Converge.

 

2 ACCEPTED SOLUTIONS

Cathan
New Contributor II

Hmm, perhaps this is more what you had in mind...

 

sest:{(raze @[;5 0 4 1 3 2]\[x],\:" ")," "sv' 2 cut x}

 

 

Edit: Whoops, meant to reply to above.

 

View solution in original post

Rolf
New Contributor III

i think this is what you are after 

q)f:{abs(til[x]div 2)-x#(x-1),0}
q)f each 2*1+til 5
1 0
3 0 2 1
5 0 4 1 3 2
7 0 6 1 5 2 4 3
9 0 8 1 7 2 6 3 5 4

i cannot claim authorship

View solution in original post

5 REPLIES 5

Cathan
New Contributor II

How about:

sest:{[i] stanza:raze ,\:[;" "]{x[5 0 4 1 3 2]}\[5;i]; envoi:" "sv' (i[0 1]; i[2 3]; i[4 5]); stanza,envoi}

SJT
Contributor III
Contributor III

Nice!

Interesting that you have used bracket notation for the Do iteration; that is, {x[5 0 4 1 3 2]}\[5;i] rather than 5 {x[5 0 4 1 3 2]}\i. I don’t think it does anything for you here, but it means you could get a unary {x[5 0 4 1 3 2]}\[5;] to use in a composition. 

Now –

  1. Can you do the shuffle without a lambda?
  2. Try using cut for the envoi 😉

Cathan
New Contributor II

Hmm, perhaps this is more what you had in mind...

 

sest:{(raze @[;5 0 4 1 3 2]\[x],\:" ")," "sv' 2 cut x}

 

 

Edit: Whoops, meant to reply to above.

 

SJT
Contributor III
Contributor III

Very nice! Especially the use of Converge. Your expression makes it clear that the permutation returns to the original order and that the envoi has the order of the original.

Further thoughts: if you use Do with a left argument of 6, you can then use Apply At @ to apply " "sv'2 cut to the last item. This expression emphasises that the permutation returns the envoi to the original order. 

 

sest1:{1_raze" ",/:@[;6;" "sv'2 cut]6 @[;5 0 4 1 3 2]\x}

 

Getting down to a single reference to the argument introduces the possibility of writing the function as a composition, which eliminates the tiny overhead of a lambda. Here we can use the bracket notation you introduced earlier for Do.

 

sest2:1_ raze " ",/: @[;6;" "sv'2 cut] @[;5 0 4 1 3 2]\[6;] @

 

Above spaces clarify the structure – a composition of five unaries:

  1. 1_
  2. raze
  3. " ",/:
  4. @[;6;" "sv'2 cut]
  5. @[;5 0 4 1 3 2]\[6;]

If you’ve read this far, test your understanding!

When projecting a binary function f onto its first argument (e.g. 6) we can elide the semicolon and write either f[6;] or f[6]. Why can we not do that here – why does @[;5 0 4 1 3 2]\[6] not work?

Lastly, can 5 0 4 1 3 2 become a function of the stanza length – assuming an even number of lines? That would support new forms, such as an octrina (I just made that word up) or a quatrina.

Rolf
New Contributor III

i think this is what you are after 

q)f:{abs(til[x]div 2)-x#(x-1),0}
q)f each 2*1+til 5
1 0
3 0 2 1
5 0 4 1 3 2
7 0 6 1 5 2 4 3
9 0 8 1 7 2 6 3 5 4

i cannot claim authorship