[REBOL] Re: Another coffee break problem?
From: tomc:darkwing:uoregon at: 12-Nov-2003 23:23
On Tue, 11 Nov 2003, Joel Neely wrote:
> Hi, Gregg,
>
> Gregg Irwin wrote:
> >
> > JN> The following 3-by-3 display is a simple magic square:
> >
> > JN> 0 8 4
> > JN> 5 1 6
> > JN> 7 3 2
> >
> > JN> because each row and each column sums to 12...
> >
> > No diagonals? I thought magic squares had to work on the diagonal as
> > well? (not to be nit-picky or anything :)
> >
>
> To be equally picky ;-)
>
> That's why I said "simple magic" square instead of "totally magic". I
> was going to post a follow-up problem to refine the first program so
> that it also checks diagonals.
>
> Also, not all sources I've looked at insist on diagonal operations. One
> interesting way to generalize the problem is to "magic" rectangles with
> different height and width. In that case, the definition of "diagonal"
> becomes more interesting...
>
> -jn-
ok here is my first pass, Im sure there is cleanup to do
have not done any benchmarking ... time for bed
Rebol[
title: "magic square generator"
author: "Tom Conlin"
date: 12-Nov-2003
file: %itsawrap.r
version: 0.0.2
purpose: { Post from Joel Neely
The following 3-by-3 display is a simple magic square:
0 8 4
5 1 6
7 3 2
because each row and each column sums to 12. Write a function
which uses the integers 0 thru 8 (once each!) to construct all
possible 3-by-3 simple magic squares.
Make it run as quickly as possible.
}
]
n: 3
ns: n * n
flip: func[b [series!] n[integer!]][ ; this one I like
forskip b n[reverse/part b n]
head b
]
; not so happy with this, I finaly brute forced it
reflect: func [b [series!] n[integer!] /local t ][
t: make block! n * n
forskip b n[insert tail t pick b 1]
repeat i n - 1[
b: skip head b i
forskip b n[insert tail t pick b 1]
]
b: copy t
]
pprint: func[b [series!] n[integer!]][
loop n[print copy/part b n b: skip b n]
b: head b print ""
]
;; to be general these should be made functions
;; but with non 0 array origin it makes messy modulo math
ur: [8 9 7 2 3 1 5 6 4]
dn: [4 5 6 7 8 9 1 2 3]
s: t: 0
for i 1 ns 1 [
ms: copy [0 0 0 0 0 0 0 0 0]
s: i
poke ms s 1
for j 2 ns 1[
either equal? 0 pick ms t: pick ur s
[poke ms s: t j]
[poke ms s: pick dn s j]
]
b: copy ms
pprint b 3 ; normal
pprint flip b 3 3 ; about vertical axis
pprint reflect b 3 3 ; rotate left
pprint flip b 3 3 ; about backslash
b: head reverse copy ms
pprint b 3 ; rotated 180 degrees
pprint flip b 3 3 ; about horizontal axis
pprint reflect b 3 3 ; rotate right
pprint flip b 3 3 ; about slash
print ""
]
halt