SHOW:
|
|
- or go back to the newest paste.
1 | #!/usr/bin/tclsh | |
2 | namespace path {::tcl::mathop ::tcl::mathfunc} | |
3 | ||
4 | proc lsum L {expr [join $L +]+0} | |
5 | proc random range {expr int(rand()*$range)} | |
6 | ||
7 | proc genAnsList {n_max lPair lAns} { | |
8 | upvar $lPair lPair1 | |
9 | upvar $lAns lAns1 | |
10 | set lPair {{0 0}} | |
11 | set lPair1 {{0 0}} | |
12 | ||
13 | for {set i 1} {[<= $i $n_max]} {incr i} { | |
14 | set q [/ [+ [sqrt 5] 1 ] 2] | |
15 | set a [int [* $q $i]] | |
16 | set b [+ $a $i] | |
17 | lappend lPair1 "$a $b" | |
18 | lappend lPair "$a $b" | |
19 | lappend lPair "$b $a" | |
20 | } | |
21 | ||
22 | set lPairSorted [lsort -integer -index 0 $lPair] | |
23 | for {set i 0} {[<= $i $n_max]} {incr i} { | |
24 | lappend lAns1 [lindex [lindex $lPairSorted $i] 1] | |
25 | } | |
26 | } | |
27 | ||
28 | proc turn {st lAns lPair} { | |
29 | set st_cur_sum [lsum $st] | |
30 | - | if {[== 0 st_cur_sum]} {return {you win}} |
30 | + | if {[== 0 $st_cur_sum]} {return {you win}} |
31 | ||
32 | set a [lindex $st 0] | |
33 | set b [lindex $st 1] | |
34 | set c [abs [- $a $b]] | |
35 | ||
36 | set a1 [min $a [lindex $lAns $b]] | |
37 | set b1 [min $b [lindex $lAns $a]] | |
38 | set cPair1 [lindex $lPair $c] | |
39 | ||
40 | set a2 [random $a] | |
41 | set b2 [random $b] | |
42 | set c2 [random [+ 1 [min $a $b]]] | |
43 | set cPair2 [list [- $a $c2] [- $b $c2]] | |
44 | ||
45 | set st_next1 [list "$a $b1" [+ $a $b1]] | |
46 | set st_next2 [list "$a1 $b" [+ $a1 $b]] | |
47 | set st_next3 [list "$cPair1" [lsum $cPair1]] | |
48 | set lst_next [list $st_next1 $st_next2 $st_next3] | |
49 | set st_next [lindex [lsort -integer -index 1 $lst_next] 0] | |
50 | set st_next_sum [lindex $st_next 1] | |
51 | ||
52 | if {[== 0 $st_next_sum]} {return {i won}} | |
53 | ||
54 | if {[> $st_cur_sum $st_next_sum]} { | |
55 | return [lindex $st_next 0] | |
56 | } else { | |
57 | switch [random 3] { | |
58 | 0 {return "$a $b2"} | |
59 | 1 {return "$a2 $b"} | |
60 | 2 {return "$cPair2"} | |
61 | } | |
62 | } | |
63 | } | |
64 | ||
65 | puts {Enter heap sizes:} | |
66 | if {[< 0 [gets stdin state]]} { | |
67 | set n_max [lindex [lsort -integer $state] end] | |
68 | genAnsList $n_max lPair lAns | |
69 | set state [turn $state $lAns $lPair] | |
70 | puts $state | |
71 | ||
72 | while {[< 0 [gets stdin state]]} { | |
73 | set state [turn $state $lAns $lPair] | |
74 | puts $state | |
75 | } | |
76 | } |