2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
|
|
@ -1,22 +1,37 @@
|
|||
Topswops is a card game created by John Conway in the 1970's.
|
||||
|
||||
Assume you have a particular permutation of a set of n cards numbered 1..n on both of their faces, for example the arrangement of four cards given by [2, 4, 1, 3] where the leftmost card is on top. A round is composed of reversing the first m cards where m is the value of the topmost card. rounds are repeated until the topmost card is the number 1 and the number of swaps is recorded. For our example the swaps produce:
|
||||
<pre> [2, 4, 1, 3] # Initial shuffle
|
||||
|
||||
Assume you have a particular permutation of a set of n cards numbered 1..n on both of their faces, for example the arrangement of four cards given by [2, 4, 1, 3] where the leftmost card is on top.
|
||||
|
||||
A round is composed of reversing the first m cards where m is the value of the topmost card.
|
||||
|
||||
Rounds are repeated until the topmost card is the number 1 and the number of swaps is recorded.
|
||||
|
||||
|
||||
For our example the swaps produce:
|
||||
<pre>
|
||||
[2, 4, 1, 3] # Initial shuffle
|
||||
[4, 2, 1, 3]
|
||||
[3, 1, 2, 4]
|
||||
[2, 1, 3, 4]
|
||||
[1, 2, 3, 4]</pre>
|
||||
For a total of four swaps from the initial ordering to produce the terminating case where 1 is on top.
|
||||
[1, 2, 3, 4]
|
||||
</pre>
|
||||
|
||||
For a total of four swaps from the initial ordering to produce the terminating case where 1 is on top.
|
||||
|
||||
|
||||
For a particular number <code>n</code> of cards, <code>topswops(n)</code> is the maximum swaps needed for any starting permutation of the n cards.
|
||||
For a particular number <code> n </code> of cards, <code> topswops(n) </code> is the maximum swaps needed for any starting permutation of the <code>n</code> cards.
|
||||
|
||||
|
||||
;Task:
|
||||
The task is to generate and show here a table of <code>n</code> vs <code>topswops(n)</code> for n in the range 1..10 inclusive.
|
||||
The task is to generate and show here a table of <code> n </code> vs <code> topswops(n) </code> for <code> n </code> in the range 1..10 inclusive.
|
||||
|
||||
|
||||
;Note:
|
||||
[[oeis:A000375|Topswops]] is also known as [http://www.haskell.org/haskellwiki/Shootout/Fannkuch Fannkuch] from the German Pfannkuchen meaning [http://youtu.be/3biN6nQYqZY pancake].
|
||||
[[oeis:A000375|Topswops]] is also known as [http://www.haskell.org/haskellwiki/Shootout/Fannkuch Fannkuch] from the German Pfannkuchen meaning [http://youtu.be/3biN6nQYqZY pancake].
|
||||
|
||||
;Cf.
|
||||
|
||||
;Related tasks:
|
||||
* [[Number reversal game]]
|
||||
* [[Sorting algorithms/Pancake sort]]
|
||||
<br><br>
|
||||
|
|
|
|||
121
Task/Topswops/360-Assembly/topswops.360
Normal file
121
Task/Topswops/360-Assembly/topswops.360
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
* Topswops optimized 12/07/2016
|
||||
TOPSWOPS CSECT
|
||||
USING TOPSWOPS,R13 base register
|
||||
B 72(R15) skip savearea
|
||||
DC 17F'0' savearea
|
||||
STM R14,R12,12(R13) prolog
|
||||
ST R13,4(R15) " <-
|
||||
ST R15,8(R13) " ->
|
||||
LR R13,R15 " addressability
|
||||
MVC N,=F'1' n=1
|
||||
LOOPN L R4,N n; do n=1 to 10 ===-------------==*
|
||||
C R4,=F'10' " *
|
||||
BH ELOOPN . *
|
||||
MVC P(40),PINIT p=pinit
|
||||
MVC COUNTM,=F'0' countm=0
|
||||
REPEAT MVC CARDS(40),P cards=p -------------------------+
|
||||
SR R11,R11 count=0 |
|
||||
WHILE CLC CARDS,=F'1' do while cards(1)^=1 ---------+
|
||||
BE EWHILE . |
|
||||
MVC M,CARDS m=cards(1)
|
||||
L R2,M m
|
||||
SRA R2,1 m/2
|
||||
ST R2,MD2 md2=m/2
|
||||
L R3,M @card(mm)=m
|
||||
SLA R3,2 *4
|
||||
LA R3,CARDS-4(R3) @card(mm)
|
||||
LA R2,CARDS @card(i)=0
|
||||
LA R6,1 i=1
|
||||
LOOPI C R6,MD2 do i=1 to m/2 -------------+
|
||||
BH ELOOPI . |
|
||||
L R0,0(R2) swap r0=cards(i)
|
||||
MVC 0(4,R2),0(R3) swap cards(i)=cards(mm)
|
||||
ST R0,0(R3) swap cards(mm)=r0
|
||||
AH R2,=H'4' @card(i)=@card(i)+4
|
||||
SH R3,=H'4' @card(mm)=@card(mm)-4
|
||||
LA R6,1(R6) i=i+1 |
|
||||
B LOOPI ----------------------------+
|
||||
ELOOPI LA R11,1(R11) count=count+1 |
|
||||
B WHILE -------------------------------+
|
||||
EWHILE C R11,COUNTM if count>countm
|
||||
BNH NOTGT then
|
||||
ST R11,COUNTM countm=count
|
||||
NOTGT BAL R14,NEXTPERM call nextperm
|
||||
LTR R0,R0 until nextperm=0 |
|
||||
BNZ REPEAT ---------------------------------+
|
||||
L R1,N n
|
||||
XDECO R1,XDEC edit n
|
||||
MVC PG(2),XDEC+10 output n
|
||||
MVI PG+2,C':' output ':'
|
||||
L R1,COUNTM countm
|
||||
XDECO R1,XDEC edit countm
|
||||
MVC PG+3(4),XDEC+8 output countm
|
||||
XPRNT PG,L'PG print buffer
|
||||
L R1,N n *
|
||||
LA R1,1(R1) +1 *
|
||||
ST R1,N n=n+1 *
|
||||
B LOOPN ===------------------------------==*
|
||||
ELOOPN L R13,4(0,R13) epilog
|
||||
LM R14,R12,12(R13) " restore
|
||||
XR R15,R15 " rc=0
|
||||
BR R14 exit
|
||||
PINIT DC F'1',F'2',F'3',F'4',F'5',F'6',F'7',F'8',F'9',F'10'
|
||||
CARDS DS 10F cards
|
||||
P DS 10F p
|
||||
COUNTM DS F countm
|
||||
M DS F m
|
||||
N DS F n
|
||||
MD2 DS F m/2
|
||||
PG DC CL20' ' buffer
|
||||
XDEC DS CL12 temp
|
||||
*------- ---- nextperm ----------{-----------------------------------
|
||||
NEXTPERM L R9,N nn=n
|
||||
SR R8,R8 jj=0
|
||||
LR R7,R9 nn
|
||||
BCTR R7,0 j=nn-1
|
||||
LTR R7,R7 if j=0
|
||||
BZ ELOOPJ1 then skip do loop
|
||||
LOOPJ1 LR R1,R7 do j=nn-1 to 1 by -1; j ----+
|
||||
SLA R1,2 . |
|
||||
L R2,P-4(R1) p(j)
|
||||
C R2,P(R1) if p(j)<p(j+1)
|
||||
BNL PJGEPJP then
|
||||
LR R8,R7 jj=j
|
||||
B ELOOPJ1 leave j |
|
||||
PJGEPJP BCT R7,LOOPJ1 j=j-1 ---------------------+
|
||||
ELOOPJ1 LA R7,1(R8) j=jj+1
|
||||
LOOPJ2 CR R7,R9 do j=jj+1 while j<nn ------+
|
||||
BNL ELOOPJ2 . |
|
||||
LR R2,R7 j
|
||||
SLA R2,2 .
|
||||
LR R3,R9 nn
|
||||
SLA R3,2 .
|
||||
L R0,P-4(R2) swap p(j),p(nn)
|
||||
L R1,P-4(R3) "
|
||||
ST R0,P-4(R3) "
|
||||
ST R1,P-4(R2) "
|
||||
BCTR R9,0 nn=nn-1
|
||||
LA R7,1(R7) j=j+1 |
|
||||
B LOOPJ2 ----------------------------+
|
||||
ELOOPJ2 LTR R8,R8 if jj=0
|
||||
BNZ JJNE0 then
|
||||
LA R0,0 return(0)
|
||||
BR R14 "
|
||||
JJNE0 LA R7,1(R8) j=jj+1
|
||||
LR R2,R7 j
|
||||
SLA R2,2 r@p(j)
|
||||
LR R3,R8 jj
|
||||
SLA R3,2 r@p(jj)
|
||||
LOOPJ3 L R0,P-4(R2) p(j) ----------------------+
|
||||
C R0,P-4(R3) do j=jj+1 while p(j)<p(jj) |
|
||||
BNL ELOOPJ3
|
||||
LA R2,4(R2) r@p(j)=r@p(j)+4
|
||||
LA R7,1(R7) j=j+1 |
|
||||
B LOOPJ3 ----------------------------+
|
||||
ELOOPJ3 L R1,P-4(R3) swap p(j),p(jj)
|
||||
ST R0,P-4(R3) "
|
||||
ST R1,P-4(R2) "
|
||||
LA R0,1 return(1)
|
||||
BR R14 ---------------}-----------------------------------
|
||||
YREGS
|
||||
END TOPSWOPS
|
||||
24
Task/Topswops/Elixir/topswops.elixir
Normal file
24
Task/Topswops/Elixir/topswops.elixir
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
defmodule Topswops do
|
||||
def get_1_first( [1 | _t] ), do: 0
|
||||
def get_1_first( list ), do: 1 + get_1_first( swap(list) )
|
||||
|
||||
defp swap( [n | _t]=list ) do
|
||||
{swaps, remains} = Enum.split( list, n )
|
||||
Enum.reverse( swaps, remains )
|
||||
end
|
||||
|
||||
def task do
|
||||
IO.puts "N\ttopswaps"
|
||||
Enum.map(1..10, fn n -> {n, permute(Enum.to_list(1..n))} end)
|
||||
|> Enum.map(fn {n, n_permutations} -> {n, get_1_first_many(n_permutations)} end)
|
||||
|> Enum.map(fn {n, n_swops} -> {n, Enum.max(n_swops)} end)
|
||||
|> Enum.each(fn {n, max} -> IO.puts "#{n}\t#{max}" end)
|
||||
end
|
||||
|
||||
def get_1_first_many( n_permutations ), do: (for x <- n_permutations, do: get_1_first(x))
|
||||
|
||||
defp permute([]), do: [[]]
|
||||
defp permute(list), do: for x <- list, y <- permute(list -- [x]), do: [x|y]
|
||||
end
|
||||
|
||||
Topswops.task
|
||||
43
Task/Topswops/Lua/topswops.lua
Normal file
43
Task/Topswops/Lua/topswops.lua
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
-- Return an iterator to produce every permutation of list
|
||||
function permute (list)
|
||||
local function perm (list, n)
|
||||
if n == 0 then coroutine.yield(list) end
|
||||
for i = 1, n do
|
||||
list[i], list[n] = list[n], list[i]
|
||||
perm(list, n - 1)
|
||||
list[i], list[n] = list[n], list[i]
|
||||
end
|
||||
end
|
||||
return coroutine.wrap(function() perm(list, #list) end)
|
||||
end
|
||||
|
||||
-- Perform one topswop round on table t
|
||||
function swap (t)
|
||||
local new, limit = {}, t[1]
|
||||
for i = 1, #t do
|
||||
if i <= limit then
|
||||
new[i] = t[limit - i + 1]
|
||||
else
|
||||
new[i] = t[i]
|
||||
end
|
||||
end
|
||||
return new
|
||||
end
|
||||
|
||||
-- Find the most swaps needed for any starting permutation of n cards
|
||||
function topswops (n)
|
||||
local numTab, highest, count = {}, 0
|
||||
for i = 1, n do numTab[i] = i end
|
||||
for numList in permute(numTab) do
|
||||
count = 0
|
||||
while numList[1] ~= 1 do
|
||||
numList = swap(numList)
|
||||
count = count + 1
|
||||
end
|
||||
if count > highest then highest = count end
|
||||
end
|
||||
return highest
|
||||
end
|
||||
|
||||
-- Main procedure
|
||||
for i = 1, 10 do print(i, topswops(i)) end
|
||||
14
Task/Topswops/PARI-GP/topswops.pari
Normal file
14
Task/Topswops/PARI-GP/topswops.pari
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
flip(v:vec)={
|
||||
my(t=v[1]+1);
|
||||
if (t==2, return(0));
|
||||
for(i=1,t\2, [v[t-i],v[i]]=[v[i],v[t-i]]);
|
||||
1+flip(v)
|
||||
}
|
||||
topswops(n)={
|
||||
my(mx);
|
||||
for(i=0,n!-1,
|
||||
mx=max(flip(Vecsmall(numtoperm(n,i))),mx)
|
||||
);
|
||||
mx;
|
||||
}
|
||||
vector(10,n,topswops(n))
|
||||
|
|
@ -1,11 +1,3 @@
|
|||
sub postfix:<!>(@a) {
|
||||
@a == 1
|
||||
?? [@a]
|
||||
!! do for @a -> $a {
|
||||
[ $a, @$_ ] for @a.grep(* != $a)!
|
||||
}
|
||||
}
|
||||
|
||||
sub swops(@a is copy) {
|
||||
my $count = 0;
|
||||
until @a[0] == 1 {
|
||||
|
|
@ -14,6 +6,7 @@ sub swops(@a is copy) {
|
|||
}
|
||||
return $count;
|
||||
}
|
||||
sub topswops($n) { [max] map &swops, (1 .. $n)! }
|
||||
|
||||
sub topswops($n) { (sort map &swops, (1..$n).permutations)[*-1] }
|
||||
|
||||
say "$_ {topswops $_}" for 1 .. 10;
|
||||
|
|
|
|||
15
Task/Topswops/PicoLisp/topswops.l
Normal file
15
Task/Topswops/PicoLisp/topswops.l
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
(de fannkuch (N)
|
||||
(let (Lst (range 1 N) L Lst Max)
|
||||
(recur (L) # Permute
|
||||
(if (cdr L)
|
||||
(do (length L)
|
||||
(recurse (cdr L))
|
||||
(rot L) )
|
||||
(zero N) # For each permutation
|
||||
(for (P (copy Lst) (> (car P) 1) (flip P (car P)))
|
||||
(inc 'N) )
|
||||
(setq Max (max N Max)) ) )
|
||||
Max ) )
|
||||
|
||||
(for I 10
|
||||
(println I (fannkuch I)) )
|
||||
Loading…
Add table
Add a link
Reference in a new issue