Data update
This commit is contained in:
parent
81fd053722
commit
52a6ef48dd
10248 changed files with 63654 additions and 6775 deletions
|
|
@ -1,4 +1,4 @@
|
|||
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 remuneration. 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.
|
||||
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 remuneration. Two 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, and for each show an example requiring p(n) flips.
|
||||
|
||||
|
|
@ -6,6 +6,8 @@ The task is to determine p(n) for n = 1 to 9, and for each show an example requi
|
|||
|
||||
Few people know p(20), generously I shall award an extra credit for anyone doing more than p(16).
|
||||
|
||||
; Warning: It is known that p(19) is 22 (see in particular the discussion at [https://oeis.org/A058986 A058986]); thus any algorithm that claims otherwise must be treated with caution.<br>
|
||||
: Note that the original "cheeky partial answer" of [[Pancake_numbers#Phix|Phix]] has since been updated (5/12/2020), and/but just that, with no examples as asked for, ''will'' get your entry marked as incomplete.
|
||||
|
||||
;References
|
||||
# [https://www.bbvaopenmind.com/en/science/mathematics/bill-gates-and-the-pancake-problem Bill Gates and the pancake problem]
|
||||
|
|
|
|||
|
|
@ -2,12 +2,11 @@
|
|||
110 FOR I = 0 TO 3
|
||||
120 FOR J = 1 TO 5
|
||||
130 LET N = (I * 5) + J
|
||||
140 LET C = C + 1
|
||||
150 GOSUB 200
|
||||
160 PRINT "p("; N; ") = "; P; " "
|
||||
170 NEXT J
|
||||
180 NEXT I
|
||||
190 END
|
||||
140 GOSUB 200
|
||||
150 PRINT "p("; N; ") = "; P; " "
|
||||
160 NEXT J
|
||||
170 NEXT I
|
||||
180 END
|
||||
200 REM pancake(n)
|
||||
210 LET G = 2 : LET S = 2 : LET A = -1
|
||||
220 IF S < N THEN LET A = A + 1 : LET G = (G * 2) - 1 : LET S = S + G
|
||||
|
|
|
|||
18
Task/Pancake-numbers/Asymptote/pancake-numbers.asymptote
Normal file
18
Task/Pancake-numbers/Asymptote/pancake-numbers.asymptote
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
int Pancake(int n) {
|
||||
int gap = 2;
|
||||
int sum = 2;
|
||||
int adj = -1;
|
||||
while (sum < n) {
|
||||
adj += 1;
|
||||
gap = (gap * 2) - 1;
|
||||
sum += gap;
|
||||
}
|
||||
return n + adj;
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 3; ++i) {
|
||||
for (int j = 1; j <= 5; ++j) {
|
||||
int n = (i * 5) + j;
|
||||
write("p(" + string(n) + ") = " + string(Pancake(n)));
|
||||
}
|
||||
}
|
||||
35
Task/Pancake-numbers/COBOL/pancake-numbers.cobol
Normal file
35
Task/Pancake-numbers/COBOL/pancake-numbers.cobol
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. Pancake.
|
||||
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 I PIC 9 VALUE 0.
|
||||
01 J PIC 9 VALUE 0.
|
||||
01 N PIC 99 VALUE 0.
|
||||
01 C PIC 99 VALUE 0.
|
||||
01 P PIC 99 VALUE 0.
|
||||
01 GAP PIC 99 VALUE 2.
|
||||
01 SUMA PIC 99 VALUE 2.
|
||||
01 ADJ PIC S99 VALUE -1.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
PERFORM VARYING I FROM 0 BY 1 UNTIL I > 3
|
||||
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 5
|
||||
COMPUTE N = (I * 5) + J
|
||||
ADD 1 TO C
|
||||
PERFORM PANCAKE-CALCULATION
|
||||
DISPLAY "P(" N ") = " P
|
||||
END-PERFORM
|
||||
END-PERFORM
|
||||
STOP RUN.
|
||||
|
||||
PANCAKE-CALCULATION.
|
||||
MOVE 2 TO GAP
|
||||
MOVE 2 TO SUMA
|
||||
MOVE -1 TO ADJ
|
||||
PERFORM UNTIL SUMA >= N
|
||||
ADD 1 TO ADJ
|
||||
COMPUTE GAP = (GAP * 2) - 1
|
||||
ADD GAP TO SUMA
|
||||
END-PERFORM
|
||||
COMPUTE P = N + ADJ.
|
||||
20
Task/Pancake-numbers/Dart/pancake-numbers.dart
Normal file
20
Task/Pancake-numbers/Dart/pancake-numbers.dart
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
void main() {
|
||||
for (int i = 0; i <= 3; i++) {
|
||||
for (int j = 1; j <= 5; j++) {
|
||||
int n = (i * 5) + j;
|
||||
print("p(${n.toString().padLeft(2, ' ')}) = ${pancake(n).toString().padLeft(2, ' ')}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int pancake(int n) {
|
||||
int gap = 2;
|
||||
int sum = 2;
|
||||
int adj = -1;
|
||||
while (sum < n) {
|
||||
adj++;
|
||||
gap = (gap * 2) - 1;
|
||||
sum += gap;
|
||||
}
|
||||
return n + adj;
|
||||
}
|
||||
46
Task/Pancake-numbers/Jq/pancake-numbers.jq
Normal file
46
Task/Pancake-numbers/Jq/pancake-numbers.jq
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
# Input: a JSON object
|
||||
# Output: the first key found (using keys_unsorted) with a maximal
|
||||
# associated value, or null
|
||||
def findMax:
|
||||
. as $in
|
||||
| reduce keys_unsorted[] as $key ( null;
|
||||
if . == null or $in[$key] > .max then {$key, max: $in[$key]}
|
||||
end )
|
||||
| .key;
|
||||
|
||||
# Input: a (small) positive integer
|
||||
# Output: its pancake number
|
||||
def pancake:
|
||||
. as $len
|
||||
| [range(1; $len + 1)] as $goalStack
|
||||
| { numStacks: 1,
|
||||
stacks: {($goalStack|tostring): 0}
|
||||
}
|
||||
| .newStacks = .stacks
|
||||
| first(
|
||||
foreach range(1;1001) as $i (.;
|
||||
.nextStacks = {}
|
||||
| reduce (.newStacks|keys_unsorted)[] as $key (.;
|
||||
($key|fromjson) as $arr
|
||||
| .pos = 2
|
||||
| until (.pos > $len;
|
||||
((($arr[:.pos] | reverse) + $arr[.pos:]) | tostring) as $newStack
|
||||
| if (.stacks | has($newStack) | not)
|
||||
then .nextStacks[$newStack] = $i
|
||||
end
|
||||
| .pos += 1 ) )
|
||||
| .newStacks = .nextStacks
|
||||
| .stacks = (.stacks + .newStacks)
|
||||
| (.stacks|length) as $perms
|
||||
| if $perms == .numStacks
|
||||
then .emit = [(.stacks|findMax), $i - 1]
|
||||
else .numStacks = $perms
|
||||
end )
|
||||
| select(.emit).emit );
|
||||
|
||||
"The maximum number of flips to sort a given number of elements is:",
|
||||
(range (1; 11)
|
||||
| . as $i
|
||||
| pancake as [$example, $steps]
|
||||
| "pancake(\($i)) = \($steps) example: \($example)"
|
||||
)
|
||||
22
Task/Pancake-numbers/Minimal-BASIC/pancake-numbers.basic
Normal file
22
Task/Pancake-numbers/Minimal-BASIC/pancake-numbers.basic
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
110 FOR I = 0 TO 3
|
||||
120 FOR J = 1 TO 5
|
||||
130 LET N = (I*5)+J
|
||||
150 GOSUB 200
|
||||
160 PRINT "P(";N;") =";P;" "
|
||||
170 NEXT J
|
||||
180 NEXT I
|
||||
190 GOTO 330
|
||||
200 REM PANCAKE(N)
|
||||
210 LET G = 2
|
||||
220 LET S = 2
|
||||
230 LET A = -1
|
||||
240 IF S < N THEN 270
|
||||
250 IF S >= N THEN 310
|
||||
260 GOTO 240
|
||||
270 LET A = A+1
|
||||
280 LET G = (G*2)-1
|
||||
290 LET S = S+G
|
||||
300 GOTO 250
|
||||
310 LET P = N+A
|
||||
320 RETURN
|
||||
330 END
|
||||
|
|
@ -1,17 +1,15 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">pancake</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">gap</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">sum_gaps</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">gap</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">adj</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">sum_gaps</span><span style="color: #0000FF;"><</span><span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">adj</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #000000;">gap</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">gap</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
|
||||
<span style="color: #000000;">sum_gaps</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">gap</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">adj</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">n</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">20</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pancake</span><span style="color: #0000FF;">)}),</span>
|
||||
<span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">,{{</span><span style="color: #008000;">"p(%2d) = %2d"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">r</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join_by</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">))</span>
|
||||
<!--
|
||||
with javascript_semantics
|
||||
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))
|
||||
|
|
|
|||
|
|
@ -1,17 +1,15 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">pancake</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">gap</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pg</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">sum_gaps</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">gap</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">adj</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">sum_gaps</span><span style="color: #0000FF;"><</span><span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">adj</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">pg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">gap</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">gap</span><span style="color: #0000FF;">,</span><span style="color: #000000;">gap</span><span style="color: #0000FF;">+</span><span style="color: #000000;">pg</span><span style="color: #0000FF;">}</span>
|
||||
<span style="color: #000000;">sum_gaps</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">gap</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">adj</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">n</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">20</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pancake</span><span style="color: #0000FF;">)}),</span>
|
||||
<span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">,{{</span><span style="color: #008000;">"p(%2d) = %2d"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">r</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join_by</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">))</span>
|
||||
<!--
|
||||
with javascript_semantics
|
||||
function pancake(integer n)
|
||||
integer gap = 2, pg = 1, sum_gaps = gap, adj = -1
|
||||
while sum_gaps<n do
|
||||
adj += 1
|
||||
{pg,gap} = {gap,gap+pg}
|
||||
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))
|
||||
|
|
|
|||
|
|
@ -1,38 +1,36 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">visitor</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">stack</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000080;font-style:italic;">/*unused*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">stacks</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">stack</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000080;font-style:italic;">-- for pos=0 to length(stack)-2 do</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">newstack</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">reverse</span><span style="color: #0000FF;">(</span><span style="color: #000000;">stack</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">pos</span><span style="color: #0000FF;">])&</span><span style="color: #000000;">stack</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pos</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$]</span>
|
||||
<span style="color: #000080;font-style:italic;">-- sequence newstack = stack[1..pos]&reverse(stack[pos+1..$])</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">getd_index</span><span style="color: #0000FF;">(</span><span style="color: #000000;">newstack</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])=</span><span style="color: #004600;">NULL</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">setd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">newstack</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">[$])</span> <span style="color: #000080;font-style:italic;">-- (next round)</span>
|
||||
<span style="color: #7060A8;">setd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">newstack</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span> <span style="color: #000080;font-style:italic;">-- (the master)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
with javascript_semantics
|
||||
function visitor(sequence stack, integer /*unused*/, sequence stacks)
|
||||
for pos=2 to length(stack) do
|
||||
-- for pos=0 to length(stack)-2 do
|
||||
sequence newstack = reverse(stack[1..pos])&stack[pos+1..$]
|
||||
-- sequence newstack = stack[1..pos]&reverse(stack[pos+1..$])
|
||||
if getd_index(newstack,stacks[1])=NULL then
|
||||
setd(newstack,0,stacks[$]) -- (next round)
|
||||
setd(newstack,0,stacks[1]) -- (the master)
|
||||
end if
|
||||
end for
|
||||
return 1
|
||||
end function
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">pancake</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">len</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">goalstack</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">len</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">stacks</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">new_dict</span><span style="color: #0000FF;">({{</span><span style="color: #000000;">goalstack</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}})}</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">stacks</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">new_dict</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000080;font-style:italic;">-- add any flips of stacks[$-1]
|
||||
-- not already in stacks[1]
|
||||
-- to stacks[$]</span>
|
||||
<span style="color: #7060A8;">traverse_dict</span><span style="color: #0000FF;">(</span><span style="color: #000000;">visitor</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">[$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">dict_size</span><span style="color: #0000FF;">(</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">[$])=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">eg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">getd_partial_key</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">[$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">sz</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">dict_size</span><span style="color: #0000FF;">(</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">[$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span>
|
||||
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">destroy_dict</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">stacks</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">eg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sz</span><span style="color: #0000FF;">}</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function pancake(integer len)
|
||||
sequence goalstack = tagset(len),
|
||||
stacks = {new_dict({{goalstack,0}})}
|
||||
while true do
|
||||
stacks &= new_dict()
|
||||
-- add any flips of stacks[$-1]
|
||||
-- not already in stacks[1]
|
||||
-- to stacks[$]
|
||||
traverse_dict(visitor,stacks,stacks[$-1])
|
||||
if dict_size(stacks[$])=0 then exit end if
|
||||
end while
|
||||
sequence eg = getd_partial_key(0,stacks[$-1],true)
|
||||
integer sz = dict_size(stacks[$-1])
|
||||
papply(stacks,destroy_dict)
|
||||
return {length(stacks)-2,eg,sz}
|
||||
end function
|
||||
|
||||
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">8</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (for <2s)</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #004080;">integer</span> <span style="color: #000000;">pn</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">eg</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">sz</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pancake</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"p(%d) = %d, example: %v (of %,d, %s)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">eg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sz</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">elapsed</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<!--
|
||||
atom t0 = time()
|
||||
for n=1 to 8 do -- (for <2s)
|
||||
{integer pn, sequence eg, integer sz} = pancake(n)
|
||||
printf(1,"p(%d) = %d, example: %v (of %,d, %s)\n",{n,pn,eg,sz,elapsed(time()-t0)})
|
||||
end for
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
# 20201110 Raku programming solution
|
||||
# Updated: 20240901 Raku programming solution
|
||||
|
||||
sub pancake(\n) {
|
||||
my ($gap,$sum,$adj) = 2, 2, -1;
|
||||
while ($sum < n) { $sum += $gap = $gap * 2 - 1 and $adj++ }
|
||||
return n + $adj;
|
||||
sub pancake(Int $n) {
|
||||
loop ( my ($gap, $pg, $sum_gaps, $adj) = <2 1 2 -1> ; ; $sum_gaps += $gap ) {
|
||||
$sum_gaps < $n ?? ( $adj += 1 ) !! return $n + $adj;
|
||||
($pg, $gap) = ($gap, $gap + $pg)
|
||||
}
|
||||
}
|
||||
|
||||
for (1..20).rotor(5) { say [~] @_».&{ sprintf "p(%2d) = %2d ",$_,pancake $_ } }
|
||||
for (1..20).rotor(5) { @_».&{printf "p(%2d) = %2d ",$_,pancake $_} and say() }
|
||||
|
|
|
|||
20
Task/Pancake-numbers/Run-BASIC/pancake-numbers.basic
Normal file
20
Task/Pancake-numbers/Run-BASIC/pancake-numbers.basic
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
for i = 0 to 3
|
||||
for j = 1 to 5
|
||||
n = (i * 5) + j
|
||||
c = c + 1
|
||||
print "p("; using("##", n); ") = "; using("##", Pancake(n)); " ";
|
||||
if c mod 5 = 0 then print
|
||||
next j
|
||||
next i
|
||||
|
||||
function Pancake(n)
|
||||
gap = 2
|
||||
sum = 2
|
||||
adj = -1
|
||||
while sum < n
|
||||
adj = adj + 1
|
||||
gap = (gap * 2) - 1
|
||||
sum = sum + gap
|
||||
wend
|
||||
Pancake = n + adj
|
||||
end function
|
||||
30
Task/Pancake-numbers/Verilog/pancake-numbers.v
Normal file
30
Task/Pancake-numbers/Verilog/pancake-numbers.v
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
module pancake;
|
||||
integer i, j, n;
|
||||
integer p;
|
||||
|
||||
initial begin
|
||||
for (i = 0; i <= 3; i = i + 1) begin
|
||||
for (j = 1; j <= 5; j = j + 1) begin
|
||||
n = (i * 5) + j;
|
||||
p = pancake(n);
|
||||
$display("p(%0d) = %0d", n, p);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function integer pancake;
|
||||
input integer n;
|
||||
integer gap, sum, adj;
|
||||
begin
|
||||
gap = 2;
|
||||
sum = 2;
|
||||
adj = -1;
|
||||
while (sum < n) begin
|
||||
adj = adj + 1;
|
||||
gap = (gap * 2) - 1;
|
||||
sum = sum + gap;
|
||||
end
|
||||
pancake = n + adj;
|
||||
end
|
||||
endfunction
|
||||
endmodule
|
||||
30
Task/Pancake-numbers/XBasic/pancake-numbers.basic
Normal file
30
Task/Pancake-numbers/XBasic/pancake-numbers.basic
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
PROGRAM "Pancake numbers"
|
||||
VERSION "0.0000"
|
||||
|
||||
DECLARE FUNCTION Entry ()
|
||||
DECLARE FUNCTION Pancake (n)
|
||||
|
||||
FUNCTION Entry ()
|
||||
FOR i = 0 TO 3
|
||||
FOR j = 1 TO 5
|
||||
n = (i * 5) + j
|
||||
INC c
|
||||
PRINT "p("; FORMAT$ ("##", n); ") = "; FORMAT$("##", Pancake(n)); " ";
|
||||
IF c MOD 5 = 0 THEN PRINT
|
||||
NEXT j
|
||||
NEXT i
|
||||
|
||||
END FUNCTION
|
||||
|
||||
FUNCTION Pancake (n)
|
||||
gap = 2
|
||||
sum = 2
|
||||
adj = -1
|
||||
DO WHILE sum < n
|
||||
adj = adj + 1
|
||||
gap = (gap * 2) - 1
|
||||
sum = sum + gap
|
||||
LOOP
|
||||
RETURN n + adj
|
||||
END FUNCTION
|
||||
END PROGRAM
|
||||
Loading…
Add table
Add a link
Reference in a new issue