Pancake numbers: Difference between revisions
Line 43: | Line 43: | ||
end function |
end function |
||
sequence t = tagset(20), |
sequence t = tagset(20), |
||
r = apply(t,pancake), |
r = columnize({t,apply(t,pancake)}), |
||
p = apply(true,sprintf,{{"p(%2d) = %2d"},r}) |
|||
p = apply(true,sprintf,{{"p(%2d) = %2d"},tr}) |
|||
printf(1,"%s\n",join_by(p,1,5))</lang> |
printf(1,"%s\n",join_by(p,1,5))</lang> |
||
{{out}} |
{{out}} |
Revision as of 21:18, 28 October 2020
Adrian Monk has problems and an assistant, Sharona Fleming. Sharona can deal with most of Adrian's problems except his lack of punctuality paying her rumination. 2 pay checks down and she prepares him pancakes for breakfast. Knowing that he will be unable to eat them unless they are stacked in ascending order of size she leaves him only a skillet which he can insert at any point in the pile and flip all the above pancakes, repeating until the pile is sorted. Sharona has left the pile of n pancakes such that the maximum number of flips is required. Adrian is determined to do this in as few flips as possible. This sequence n->p(n) is known as the Pancake numbers.
The task is to determine p(n) for n = 1 to 9.
Sorting_algorithms/Pancake_sort actually performs the sort some giving the number of flips used. How do these compare with p(n)?
Few people know p(20), generously I shall award an extra credit for anyone doing more than p(16).
- References
F#
<lang fsharp> // Pancake numbers. Nigel Galloway: Octber 28th., 2020 let pKake z=let n=[for n in 1..z-1->Array.ofList([n.. -1..0]@[n+1..z-1])]
let e=let rec fG n g=match g with 0->n |_->fG (n*g) (g-1) in fG 1 z let rec fN i g l=match (Set.count g)-e with 0->i |_->let l=l|>List.collect(fun g->[for n in n->List.permute(fun g->n.[g]) g])|>Set.ofList fN (i+1) (Set.union g l) (Set.difference l g|>Set.toList) fN 0 (set1..z) 1..z
[1..9]|>List.iter(fun n->printf "%d->%d " n (pKake n)); printfn "" </lang>
- Output:
1->0 2->1 3->3 4->4 5->5 6->7 7->8 8->9 9->10
Phix
Extra credit to anyone who can prove that this is in any way wrong?
(The algorithm is freshly made up today, from scratch, by yours truly. p(20)=23 is obviously a bit of a guess.)
<lang Phix>function pancake(integer n)
integer gap = 2, sum_gaps = gap, adj = -1 while sum_gaps<n do adj += 1 gap = gap*2-1 sum_gaps += gap end while n += adj return n
end function sequence t = tagset(20),
r = columnize({t,apply(t,pancake)}), p = apply(true,sprintf,{{"p(%2d) = %2d"},r})
printf(1,"%s\n",join_by(p,1,5))</lang>
- Output:
p( 1) = 0 p( 2) = 1 p( 3) = 3 p( 4) = 4 p( 5) = 5 p( 6) = 7 p( 7) = 8 p( 8) = 9 p( 9) = 10 p(10) = 11 p(11) = 13 p(12) = 14 p(13) = 15 p(14) = 16 p(15) = 17 p(16) = 18 p(17) = 19 p(18) = 20 p(19) = 21 p(20) = 23