View difference between Paste ID: TD3w1eRq and Jp6Y9xX1
SHOW: | | - or go back to the newest paste.
1
open Printf
2
3
type exp =
4
| Impossible
5
| Eight
6
| Add of exp * exp
7
| Sub of exp * exp
8
| Div of exp * exp
9
| Mul of exp * exp
10
| Sqrt of exp
11
12
let rec print out = function
13
| Impossible -> ()
14
| Eight -> fprintf out "8"
15
| Add (a,b) -> fprintf out "(%a + %a)" print a print b
16
| Sub (a,b) -> fprintf out "(%a - %a)" print a print b
17
| Div (a,b) -> fprintf out "(%a / %a)" print a print b
18
| Mul (a,b) -> fprintf out "(%a * %a)" print a print b
19
| Sqrt (a) -> fprintf out "sqrt(%a)" print a
20
21
let n = 256
22
let c = 4
23
24
let mem = Array.init c (fun _ -> Array.make n Impossible)
25
26
let rec enum exp count value =
27
  if value > 0 && value <= n &&
28
     count > 0 && count <= c &&
29
     mem.(count-1).(value-1) = Impossible then
30
  begin
31-
    printf "%a = %d (%d)\n" print exp value count ;
31+
32
33
    if count < c then
34
    begin
35
      for i = 0 to c-1 do
36
        for j = 0 to n-1 do
37
          let exp' = mem.(i).(j)
38
          and count' = i+1
39
          and value' = j+1 in
40
          if exp' <> Impossible then
41
          begin
42
            enum (Add (exp, exp')) (count + count') (value + value') ;
43
            enum (Sub (exp, exp')) (count + count') (value - value') ;
44
            enum (Sub (exp', exp)) (count + count') (value' - value) ;
45
            enum (Mul (exp, exp')) (count + count') (value * value') ;
46
            if value mod value' = 0 then
47
              enum (Div (exp, exp')) (count + count') (value / value') ;
48
            if value' mod value = 0 then
49
              enum (Div (exp', exp)) (count + count') (value' / value) ;            
50
          end
51
        done
52
      done
53
    end ;
54
55
    let froot = sqrt (float_of_int value) in
56
    let iroot = int_of_float froot in
57
    if float_of_int iroot = froot then
58
      enum (Sqrt exp) count iroot ;
59
  end
60
61
let _ =
62
  enum Eight 1 8 ;
63
  for j = 0 to 29 do
64
    printf "%d: %a\n" (j+1) print mem.(c-1).(j) ;
65
  done