Temporary variables
Ralph E. Johnson
johnson at cs.uiuc.edu
Fri Jun 18 03:52:43 UTC 1999
This is far from perfect, but it shows how you can get rid of the temporary variables.
The code is untested, which means it is almost certainly wrong. But the refactoring
to eliminate temporaries should work.
I assume there is an at: method on BTFixedHeadCollection and an instantiateVariable:
method on this class. Other interfaces are the same.
multiplicationLaurierePhD
| letters pbm |
letters := BTFixedHeadCollection new: 30.
#(a d g j m p) do: [:label | letters add: (V label: label from: 1 to: 9)].
#(b c e f h i k l n o q r s t) do: [:label | letters add: (V label: label from: 0 to: 9)].
#(0 1 2 3 4 5 6 7 8 9) do: [:ind | (BTCardinality on: letters value: ind) @= 2].
self makeConstraintsFor: letters.
pbm := self new: 'Magic multiplication'.
pbm
print: (letters at: #a);
print: (letters at: #b);
print: (letters at: #c); cr;
print: (letters at: #d);
print: (letters at: #e);
print: (letters at: #f).
#(a b c d e f) do: [:each | pbm instantiateVariable: (letters at: each)].
pbm minSize.
^pbm
makeConstraintsFor: letters
| op1 op2 inter1 inter2 result inter3 |
op1 := ((letters at: #a) * 100 + ((letters at: #b) * 10) + (letters at: #c)) asVariable: 'abc'.
op2 := ((letters at: #d) * 100 + ((letters at: #e) * 10) + (letters at: #f)) asVariable: 'def'.
inter1 := ((letters at: #g) * 100 + ((letters at: #h) * 10) + (letters at: #i)).
inter2 := ((letters at: #j) * 100 + ((letters at: #k) * 10) + (letters at: #l)).
inter3 := ((letters at: #m) * 100 + ((letters at: #n) * 10) + (letters at: #o)).
result := ((letters at: #p) * 10000 + ((letters at: #q) * 1000) + ((letters at: #r) * 100) + ((letters at: #s) * 10) + (letters at: #t)).
op1 * (letters at: #f) - inter1 @= 0.
op1 * (letters at: #e) - inter2 @= 0.
op1 * (letters at: #d) - inter3 @= 0.
inter1 + (10 * inter2) + (100 * inter3) - result @= 0.
op1 * op2 - result @= 0.
> multiplicationLaurierePhD
> | letters a b c d e f g h i j k l m op1 op2 inter1 inter2 result n o p q r s t
> inter3 pbm |
> pbm := self new: 'Magic multiplication'.
> (letters := BTFixedHeadCollection new: 30)
> add: (a := V label: 'a' from: 1 to: 9); add: (b := V label: 'b' from: 0 to: 9);
> add: (c := V label: 'c' from: 0 to: 9);
> add: (d := V label: 'd' from: 1 to: 9); add: (e := V label: 'e' from: 0 to: 9);
> add: (f := V label: 'f' from: 0 to: 9);
> add: (g := V label: 'g' from: 1 to: 9); add: (h := V label: 'h' from: 0 to: 9);
> add: (i := V label: 'i' from: 0 to: 9);
> add: (j := V label: 'j' from: 1 to: 9); add: (k := V label: 'k' from: 0 to: 9);
> add: (l := V label: 'l' from: 0 to: 9);
> add: (m := V label: 'm' from: 1 to: 9); add: (n := V label: 'n' from: 0 to: 9);
> add: (o := V label: 'o' from: 0 to: 9);
> add: (p := V label: 'p' from: 1 to: 9); add: (q := V label: 'q' from: 0 to: 9);
> add: (r := V label: 'r' from: 0 to: 9);
> add: (s := V label: 's' from: 0 to: 9); add: (t := V label: 't' from: 0 to: 9).
> op1 := (a * 100 + (b * 10) + c) asVariable: 'abc'.
> op2 := (d * 100 + (e * 10) + f) asVariable: 'def'.
> inter1 := (g * 100 + (h * 10) + i).
> inter2 := (j * 100 + (k * 10) + l).
> inter3 := (m * 100 + (n * 10) + o).
> result := (p * 10000 + (q * 1000) + (r * 100) + (s * 10) + t).
> op1 * f - inter1 @= 0.
> op1 * e - inter2 @= 0.
> op1 * d - inter3 @= 0.
> inter1 + (10 * inter2) + (100 * inter3) - result @= 0.
> op1 * op2 - result @= 0.
> #(0 1 2 3 4 5 6 7 8 9) do: [:ind | (BTCardinality on: letters value: ind) @= 2].
> pbm print: a; print: b; print: c; cr; print: d; print: e; print: f.
> pbm variablesToInstantiate: ((BTCollection with: a with: b with: c with: d) add: e;
> add: f; yourself).
> pbm minSize.
> ^pbm
More information about the Squeak-dev
mailing list
|