summaryrefslogtreecommitdiff
path: root/benchmark/so_binary_trees.yml
blob: 9e943d50ff9d9d98758684699ddeb99e32405c6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
prelude: |
  # The Computer Language Shootout Benchmarks
  # http://shootout.alioth.debian.org
benchmark:
  so_binary_trees: |
    #
    # contributed by Jesse Millikan

    # disable output
    alias puts_orig puts
    def puts str
      # disable puts
    end

    def item_check(tree)
     if tree[0] == nil
      tree[1]
     else
      tree[1] + item_check(tree[0]) - item_check(tree[2])
     end
    end

    def bottom_up_tree(item, depth)
     if depth > 0
      item_item = 2 * item
      depth -= 1
      [bottom_up_tree(item_item - 1, depth), item, bottom_up_tree(item_item, depth)]
     else
      [nil, item, nil]
     end
    end

    max_depth = 16 # ARGV[0].to_i
    min_depth = 4

    max_depth = min_depth + 2 if min_depth + 2 > max_depth

    stretch_depth = max_depth + 1
    stretch_tree = bottom_up_tree(0, stretch_depth)

    puts "stretch tree of depth #{stretch_depth}\t check: #{item_check(stretch_tree)}"
    stretch_tree = nil

    long_lived_tree = bottom_up_tree(0, max_depth)

    min_depth.step(max_depth + 1, 2) do |depth|
     iterations = 2**(max_depth - depth + min_depth)

     check = 0

     for i in 1..iterations
      temp_tree = bottom_up_tree(i, depth)
      check += item_check(temp_tree)

      temp_tree = bottom_up_tree(-i, depth)
      check += item_check(temp_tree)
     end

     puts "#{iterations * 2}\t trees of depth #{depth}\t check: #{check}"
    end

    puts "long lived tree of depth #{max_depth}\t check: #{item_check(long_lived_tree)}"

    undef puts
    alias puts puts_orig
loop_count: 1