ludy 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +26 -0
- data/Manifest.txt +28 -15
- data/NOTICE +9 -1
- data/README +7 -4
- data/Rakefile +11 -7
- data/lib/ludy.rb +3 -4
- data/lib/ludy/array/choice.rb +14 -0
- data/lib/ludy/array/combine.rb +1 -1
- data/lib/ludy/array/combos.rb +28 -19
- data/lib/ludy/array/count.rb +7 -0
- data/lib/ludy/array/head.rb +4 -0
- data/lib/ludy/array/pad.rb +13 -0
- data/lib/ludy/array/product.rb +14 -0
- data/lib/ludy/array/rotate.rb +3 -4
- data/lib/ludy/array/tail.rb +1 -0
- data/lib/ludy/hash.rb +3 -0
- data/lib/ludy/hash/reverse_merge.rb +11 -0
- data/lib/ludy/kernel/deep_copy.rb +6 -0
- data/lib/ludy/kernel/maybe.rb +6 -0
- data/lib/ludy/paginator.rb +1 -1
- data/lib/ludy/timer.rb +29 -0
- data/lib/puzzle_generator.rb +7 -5
- data/lib/puzzle_generator/chain.rb +5 -3
- data/lib/puzzle_generator/chained_map.rb +11 -11
- data/lib/puzzle_generator/map.rb +7 -7
- data/lib/puzzle_generator/misc.rb +7 -6
- data/lib/puzzle_generator/puzzle.rb +1 -4
- data/spec/ludy_spec.rb +8 -0
- data/spec/spec_helper.rb +17 -0
- data/tasks/doc.rake +1 -3
- data/tasks/gem.rake +2 -2
- data/tasks/manifest.rake +16 -2
- data/tasks/post_load.rake +18 -0
- data/tasks/setup.rb +47 -9
- data/tasks/spec.rake +3 -0
- data/test/example_puzzle.rb +7 -7
- data/test/helper.rb +3 -0
- data/test/{test_array.rb → ludy/test_array.rb} +12 -2
- data/test/{test_class.rb → ludy/test_class.rb} +1 -1
- data/test/{test_defun.rb → ludy/test_defun.rb} +1 -1
- data/test/{test_dices.rb → ludy/test_dices.rb} +1 -1
- data/test/ludy/test_hash.rb +13 -0
- data/test/{test_kernel.rb → ludy/test_kernel.rb} +1 -1
- data/test/{test_lazy.rb → ludy/test_lazy.rb} +1 -1
- data/test/{test_paginator.rb → ludy/test_paginator.rb} +2 -2
- data/test/{test_proc.rb → ludy/test_proc.rb} +2 -1
- data/test/{test_require_all.rb → ludy/test_require_all.rb} +1 -1
- data/test/{test_symbol.rb → ludy/test_symbol.rb} +1 -1
- data/test/{test_variable.rb → ludy/test_variable.rb} +1 -1
- data/test/{test_y_combinator.rb → ludy/test_y_combinator.rb} +1 -1
- data/test/{test_z_combinator.rb → ludy/test_z_combinator.rb} +1 -1
- data/test/multiruby.sh +2 -0
- metadata +54 -41
- data/lib/ludy/array/reverse_map.rb +0 -7
- data/lib/ludy/test/helper.rb +0 -3
data/lib/puzzle_generator.rb
CHANGED
@@ -3,9 +3,11 @@
|
|
3
3
|
|
4
4
|
require 'puzzle_generator/puzzle'
|
5
5
|
|
6
|
-
require '
|
7
|
-
|
8
|
-
require '
|
6
|
+
require 'ludy/hash/reverse_merge'
|
7
|
+
|
8
|
+
# require 'rubygems' if RUBY_VERSION < '1.9.0'
|
9
|
+
# require 'facets/timer'
|
10
|
+
require 'ludy/timer' # simple and stupid timer....
|
9
11
|
|
10
12
|
module PuzzleGenerator
|
11
13
|
|
@@ -17,7 +19,7 @@ module PuzzleGenerator
|
|
17
19
|
|
18
20
|
LastTriedInfo = {}
|
19
21
|
def self.generate timeout = 5, &generator
|
20
|
-
timer = Timer.new(timeout).start
|
22
|
+
timer = Ludy::Timer.new(timeout).start
|
21
23
|
tried_times = 1
|
22
24
|
begin
|
23
25
|
result = generator.call
|
@@ -26,7 +28,7 @@ module PuzzleGenerator
|
|
26
28
|
result = generator.call
|
27
29
|
end
|
28
30
|
ensure
|
29
|
-
timer.stop
|
31
|
+
# timer.stop
|
30
32
|
LastTriedInfo.merge! :tried_times => tried_times, :tried_duration => timer.total_time
|
31
33
|
end
|
32
34
|
result
|
@@ -9,13 +9,15 @@ module PuzzleGenerator
|
|
9
9
|
@direct = direct
|
10
10
|
x, y = position
|
11
11
|
@data = case @direct
|
12
|
-
when Up
|
13
|
-
when Right
|
14
|
-
when Left
|
12
|
+
when Up ; ([x]*invoke).zip((y...y+invoke).to_a)
|
13
|
+
when Right; (x...x+invoke).to_a.zip([y]*invoke)
|
14
|
+
when Left ; (x-invoke+1..x).to_a.zip([y]*invoke)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
def <=> rhs; @data <=> rhs.instance_variable_get('@data'); end
|
18
18
|
def == rhs; (self <=> rhs) == 0; end
|
19
|
+
alias_method :eql?, :==
|
20
|
+
def hash; @data.hash; end
|
19
21
|
def each █ @data.each █ self end
|
20
22
|
def [] index; @data[index]; end
|
21
23
|
def to_a; @data.clone; end
|
@@ -3,12 +3,11 @@ require 'puzzle_generator/misc'
|
|
3
3
|
require 'puzzle_generator/chain'
|
4
4
|
require 'puzzle_generator/map'
|
5
5
|
|
6
|
+
require 'ludy/kernel/deep_copy'
|
6
7
|
require 'ludy/array/combine'
|
7
|
-
|
8
|
-
require '
|
9
|
-
|
10
|
-
require 'facets/enumerable/combos'
|
11
|
-
require 'facets/random' # for Array#pick
|
8
|
+
require 'ludy/array/rotate'
|
9
|
+
require 'ludy/array/choice' # for Array#choice!
|
10
|
+
require 'ludy/array/product' if RUBY_VERSION < '1.9.0'
|
12
11
|
|
13
12
|
module PuzzleGenerator
|
14
13
|
|
@@ -40,7 +39,8 @@ module PuzzleGenerator
|
|
40
39
|
def init_map
|
41
40
|
@maps = [make_map]
|
42
41
|
@result_map = make_map_array
|
43
|
-
@picked_chain = make_init_chains([(0..@option[:width]-@option[:invoke]), [0]].combos).pick
|
42
|
+
# @picked_chain = make_init_chains([(0..@option[:width]-@option[:invoke]), [0]].combos).pick
|
43
|
+
@picked_chain = make_init_chains((0..@option[:width]-@option[:invoke]).to_a.product([0])).choice
|
44
44
|
put_picked_chain_on @maps
|
45
45
|
resolve_map
|
46
46
|
end
|
@@ -51,7 +51,7 @@ module PuzzleGenerator
|
|
51
51
|
|
52
52
|
def chain_ok?
|
53
53
|
raise GenerationFailed.new("ChainedMap: last result_map: #{@result_map.inspect}") if @picked_chain.nil?
|
54
|
-
@maps_preview = @maps.
|
54
|
+
@maps_preview = @maps.deep_copy
|
55
55
|
put_picked_chain_on @maps_preview
|
56
56
|
|
57
57
|
result = check_overlap_and_resolve_it &&
|
@@ -66,8 +66,8 @@ module PuzzleGenerator
|
|
66
66
|
@maps << (new_map || make_map)
|
67
67
|
chains = @maps[-1].break_chains @maps[-2], @result_map
|
68
68
|
|
69
|
-
@picked_chain = chains.
|
70
|
-
@picked_chain = chains.
|
69
|
+
@picked_chain = chains.choice!
|
70
|
+
@picked_chain = chains.choice! until chain_ok?
|
71
71
|
|
72
72
|
put_picked_chain_on @maps
|
73
73
|
@picked_chain = nil
|
@@ -86,7 +86,7 @@ module PuzzleGenerator
|
|
86
86
|
}
|
87
87
|
end
|
88
88
|
def check_overlap_and_resolve_it
|
89
|
-
@result_map_preview = @maps_preview.
|
89
|
+
@result_map_preview = @maps_preview[0...-1].inject(make_map_array){ |result, map|
|
90
90
|
result.each_with_index{ |column, x|
|
91
91
|
column.each_with_index{ |value, y|
|
92
92
|
# assert one of them is zero or they are all zero
|
@@ -97,7 +97,7 @@ module PuzzleGenerator
|
|
97
97
|
}
|
98
98
|
end
|
99
99
|
def check_broken_except_last
|
100
|
-
@maps_preview.
|
100
|
+
@maps_preview[0...-1].all?{ |map|
|
101
101
|
result = true
|
102
102
|
map.each_with_index_2d{ |i, x, y|
|
103
103
|
result &&= !check_left_chain( map, x, y) &&
|
data/lib/puzzle_generator/map.rb
CHANGED
@@ -2,11 +2,9 @@
|
|
2
2
|
require 'puzzle_generator/misc'
|
3
3
|
require 'puzzle_generator/chain'
|
4
4
|
|
5
|
-
require '
|
6
|
-
|
7
|
-
require '
|
8
|
-
require 'facets/enumerable/uniq_by'
|
9
|
-
require 'facets/random' # for Kernel#maybe
|
5
|
+
require 'ludy/kernel/maybe'
|
6
|
+
require 'ludy/array/count' if RUBY_VERSION < '1.9.0'
|
7
|
+
require 'ludy/array/product' if RUBY_VERSION < '1.9.0'
|
10
8
|
|
11
9
|
# a = [[1,2],[3,4],[5,6]]
|
12
10
|
# [a, [1,2,3]].combos
|
@@ -88,7 +86,8 @@ module PuzzleGenerator
|
|
88
86
|
end
|
89
87
|
def with_directs target
|
90
88
|
# [target, [Up] + [Right, Left]*10].combos
|
91
|
-
[target, [Up, Right, Left]].combos
|
89
|
+
# [target, [Up, Right, Left]].combos
|
90
|
+
target.product [Up, Right, Left]
|
92
91
|
# e.g., [[[0, 0], Up], [[0, 0], Right], [[0, 0], Left], [[1, 0], Up], ...]
|
93
92
|
end
|
94
93
|
def to_chains target
|
@@ -101,7 +100,8 @@ module PuzzleGenerator
|
|
101
100
|
def strip_duplicated_chain target
|
102
101
|
# target.uniq never works for non-num nor non-string :(
|
103
102
|
# target.sort.inject([]){ |r, i| r.last == i ? r : r<<i }
|
104
|
-
target.uniq_by{|i|i}
|
103
|
+
# target.uniq_by{|i|i}
|
104
|
+
target.uniq # it works when hash and eql? take effect...
|
105
105
|
end
|
106
106
|
def strip_out_bounded_chain target
|
107
107
|
target.select{ |chain| chain.bound_ok? @option[:width], @option[:height] }
|
@@ -1,8 +1,6 @@
|
|
1
1
|
|
2
|
-
require '
|
3
|
-
|
4
|
-
require 'facets/kernel/deep_clone'
|
5
|
-
require 'facets/array/pad'
|
2
|
+
require 'ludy/kernel/deep_copy'
|
3
|
+
require 'ludy/array/pad'
|
6
4
|
|
7
5
|
module PuzzleGenerator
|
8
6
|
Up, Right, Left = (0..2).to_a
|
@@ -36,7 +34,7 @@ module PuzzleGenerator
|
|
36
34
|
}
|
37
35
|
end
|
38
36
|
def check_answer_correctness result_map = @result_map
|
39
|
-
map = Map.new @option.merge(:data => result_map.
|
37
|
+
map = Map.new @option.merge(:data => result_map.deep_copy)
|
40
38
|
drop_blocks map # because of answer is stripped
|
41
39
|
|
42
40
|
@chained = true
|
@@ -81,7 +79,10 @@ module PuzzleGenerator
|
|
81
79
|
}
|
82
80
|
end
|
83
81
|
def drop_blocks map
|
84
|
-
map.each_column{ |column|
|
82
|
+
map.each_column{ |column|
|
83
|
+
column.map!{ |i| i==0 ? nil : i }.compact!
|
84
|
+
column.pad!(@option[:height], 0)
|
85
|
+
}
|
85
86
|
end
|
86
87
|
def check_left_chain map, x, y
|
87
88
|
# this should be rewrited
|
@@ -3,10 +3,7 @@ require 'puzzle_generator/misc'
|
|
3
3
|
require 'puzzle_generator/chained_map'
|
4
4
|
require 'puzzle_generator/colored_map'
|
5
5
|
|
6
|
-
require '
|
7
|
-
gem 'facets', '>=2.0.0'
|
8
|
-
require 'facets/array/rotate'
|
9
|
-
require 'facets/timer'
|
6
|
+
require 'ludy/array/rotate'
|
10
7
|
|
11
8
|
module PuzzleGenerator
|
12
9
|
|
data/spec/ludy_spec.rb
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
require File.expand_path(
|
4
|
+
File.join(File.dirname(__FILE__), %w[.. lib tmp]))
|
5
|
+
|
6
|
+
Spec::Runner.configure do |config|
|
7
|
+
# == Mock Framework
|
8
|
+
#
|
9
|
+
# RSpec uses it's own mocking framework by default. If you prefer to
|
10
|
+
# use mocha, flexmock or RR, uncomment the appropriate line:
|
11
|
+
#
|
12
|
+
# config.mock_with :mocha
|
13
|
+
# config.mock_with :flexmock
|
14
|
+
# config.mock_with :rr
|
15
|
+
end
|
16
|
+
|
17
|
+
# EOF
|
data/tasks/doc.rake
CHANGED
@@ -7,7 +7,6 @@ namespace :doc do
|
|
7
7
|
desc 'Generate RDoc documentation'
|
8
8
|
Rake::RDocTask.new do |rd|
|
9
9
|
rd.main = PROJ.rdoc_main
|
10
|
-
rd.options << '-d' if !WIN32 and `which dot` =~ %r/\/dot/
|
11
10
|
rd.rdoc_dir = PROJ.rdoc_dir
|
12
11
|
|
13
12
|
incl = Regexp.new(PROJ.rdoc_include.join('|'))
|
@@ -24,8 +23,7 @@ namespace :doc do
|
|
24
23
|
title = "#{PROJ.rubyforge_name}'s " + title if PROJ.rubyforge_name != title
|
25
24
|
|
26
25
|
rd.options << "-t #{title}"
|
27
|
-
|
28
|
-
rd.options << '--charset=utf-8' << '--inline-source' << '--line-numbers'
|
26
|
+
rd.options.concat(PROJ.rdoc_opts)
|
29
27
|
end
|
30
28
|
|
31
29
|
desc 'Generate ri locally for testing'
|
data/tasks/gem.rake
CHANGED
@@ -69,12 +69,12 @@ namespace :gem do
|
|
69
69
|
|
70
70
|
desc 'Install the gem'
|
71
71
|
task :install => [:clobber, :package] do
|
72
|
-
sh "#{SUDO} #{GEM} install pkg/#{PROJ.spec.
|
72
|
+
sh "#{SUDO} #{GEM} install pkg/#{PROJ.spec.full_name}"
|
73
73
|
end
|
74
74
|
|
75
75
|
desc 'Uninstall the gem'
|
76
76
|
task :uninstall do
|
77
|
-
sh "#{SUDO} #{GEM} uninstall -v '#{PROJ.version}' #{PROJ.name}"
|
77
|
+
sh "#{SUDO} #{GEM} uninstall -v '#{PROJ.version}' -x #{PROJ.name}"
|
78
78
|
end
|
79
79
|
|
80
80
|
end # namespace :gem
|
data/tasks/manifest.rake
CHANGED
@@ -17,7 +17,18 @@ namespace :manifest do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
File.open(fn, 'w') {|fp| fp.puts files.sort}
|
20
|
-
|
20
|
+
lines = %x(#{DIFF} -du Manifest.txt #{fn}).split("\n")
|
21
|
+
if HAVE_FACETS_ANSICODE and ENV.has_key?('TERM')
|
22
|
+
lines.map! do |line|
|
23
|
+
case line
|
24
|
+
when %r/^(-{3}|\+{3})/; nil
|
25
|
+
when %r/^@/; Console::ANSICode.blue line
|
26
|
+
when %r/^\+/; Console::ANSICode.green line
|
27
|
+
when %r/^\-/; Console::ANSICode.red line
|
28
|
+
else line end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
puts lines.compact
|
21
32
|
rm fn rescue nil
|
22
33
|
end
|
23
34
|
|
@@ -36,6 +47,9 @@ namespace :manifest do
|
|
36
47
|
files << fn unless test ?f, fn
|
37
48
|
File.open(fn, 'w') {|fp| fp.puts files.sort}
|
38
49
|
end
|
39
|
-
end
|
50
|
+
end # namespace :manifest
|
51
|
+
|
52
|
+
desc 'Alias to manifest:check'
|
53
|
+
task :manifest => 'manifest:check'
|
40
54
|
|
41
55
|
# EOF
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
# This file does not define any rake tasks. It is used to load some project
|
4
|
+
# settings if they are not defined by the user.
|
5
|
+
|
6
|
+
unless PROJ.changes
|
7
|
+
PROJ.changes = paragraphs_of('History.txt', 0..1).join("\n\n")
|
8
|
+
end
|
9
|
+
|
10
|
+
unless PROJ.description
|
11
|
+
PROJ.description = paragraphs_of('README.txt', 'description').join("\n\n")
|
12
|
+
end
|
13
|
+
|
14
|
+
unless PROJ.summary
|
15
|
+
PROJ.summary = PROJ.description.split('.').first
|
16
|
+
end
|
17
|
+
|
18
|
+
# EOF
|
data/tasks/setup.rb
CHANGED
@@ -68,10 +68,12 @@ PROJ.svn_tags = 'tags'
|
|
68
68
|
PROJ.svn_branches = 'branches'
|
69
69
|
|
70
70
|
# Load the other rake files in the tasks folder
|
71
|
-
Dir.glob('tasks/*.rake').sort
|
71
|
+
rakefiles = Dir.glob('tasks/*.rake').sort
|
72
|
+
rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
|
73
|
+
import(*rakefiles)
|
72
74
|
|
73
75
|
# Setup some constants
|
74
|
-
WIN32 = %r/
|
76
|
+
WIN32 = %r/djgpp|(cyg|ms|bcc)win|mingw/ =~ RUBY_PLATFORM unless defined? WIN32
|
75
77
|
|
76
78
|
DEV_NULL = WIN32 ? 'NUL:' : '/dev/null'
|
77
79
|
|
@@ -100,7 +102,7 @@ SUDO = if WIN32 then ''
|
|
100
102
|
RCOV = WIN32 ? 'rcov.cmd' : 'rcov'
|
101
103
|
GEM = WIN32 ? 'gem.cmd' : 'gem'
|
102
104
|
|
103
|
-
%w(rcov spec/rake/spectask rubyforge bones).each do |lib|
|
105
|
+
%w(rcov spec/rake/spectask rubyforge bones facets/ansicode).each do |lib|
|
104
106
|
begin
|
105
107
|
require lib
|
106
108
|
Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", true}
|
@@ -115,8 +117,28 @@ end
|
|
115
117
|
# changes = paragraphs_of('History.txt', 0..1).join("\n\n")
|
116
118
|
# summary, *description = paragraphs_of('README.txt', 3, 3..8)
|
117
119
|
#
|
118
|
-
def paragraphs_of(path, *paragraphs)
|
119
|
-
|
120
|
+
def paragraphs_of( path, *paragraphs )
|
121
|
+
title = String === paragraphs.first ? paragraphs.shift : nil
|
122
|
+
ary = File.read(path).delete("\r").split(/\n\n+/)
|
123
|
+
|
124
|
+
result = if title
|
125
|
+
tmp, matching = [], false
|
126
|
+
rgxp = %r/^=+\s*#{Regexp.escape(title)}/i
|
127
|
+
paragraphs << (0..-1) if paragraphs.empty?
|
128
|
+
|
129
|
+
ary.each do |val|
|
130
|
+
if val =~ rgxp
|
131
|
+
break if matching
|
132
|
+
matching = true
|
133
|
+
rgxp = %r/^=+/i
|
134
|
+
elsif matching
|
135
|
+
tmp << val
|
136
|
+
end
|
137
|
+
end
|
138
|
+
tmp
|
139
|
+
else ary end
|
140
|
+
|
141
|
+
result.values_at(*paragraphs)
|
120
142
|
end
|
121
143
|
|
122
144
|
# Adds the given gem _name_ to the current project's dependency list. An
|
@@ -130,11 +152,13 @@ def depend_on( name, version = nil )
|
|
130
152
|
PROJ.dependencies << (version.nil? ? [name] : [name, ">= #{version}"])
|
131
153
|
end
|
132
154
|
|
133
|
-
# Adds the given
|
155
|
+
# Adds the given arguments to the include path if they are not already there
|
134
156
|
#
|
135
|
-
def ensure_in_path(
|
136
|
-
|
137
|
-
|
157
|
+
def ensure_in_path( *args )
|
158
|
+
args.each do |path|
|
159
|
+
path = File.expand_path(path)
|
160
|
+
$:.unshift(path) if test(?d, path) and not $:.include?(path)
|
161
|
+
end
|
138
162
|
end
|
139
163
|
|
140
164
|
# Find a rake task using the task name and remove any description text. This
|
@@ -148,4 +172,18 @@ def remove_desc_for_task( names )
|
|
148
172
|
end
|
149
173
|
end
|
150
174
|
|
175
|
+
# Change working directories to _dir_, call the _block_ of code, and then
|
176
|
+
# change back to the original working directory (the current directory when
|
177
|
+
# this method was called).
|
178
|
+
#
|
179
|
+
def in_directory( dir, &block )
|
180
|
+
curdir = pwd
|
181
|
+
begin
|
182
|
+
cd dir
|
183
|
+
return block.call
|
184
|
+
ensure
|
185
|
+
cd curdir
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
151
189
|
# EOF
|
data/tasks/spec.rake
CHANGED
@@ -8,12 +8,14 @@ namespace :spec do
|
|
8
8
|
Spec::Rake::SpecTask.new(:run) do |t|
|
9
9
|
t.spec_opts = PROJ.spec_opts
|
10
10
|
t.spec_files = PROJ.specs
|
11
|
+
t.libs += PROJ.libs
|
11
12
|
end
|
12
13
|
|
13
14
|
desc 'Run all specs with text output'
|
14
15
|
Spec::Rake::SpecTask.new(:specdoc) do |t|
|
15
16
|
t.spec_opts = PROJ.spec_opts + ['--format', 'specdoc']
|
16
17
|
t.spec_files = PROJ.specs
|
18
|
+
t.libs += PROJ.libs
|
17
19
|
end
|
18
20
|
|
19
21
|
if HAVE_RCOV
|
@@ -21,6 +23,7 @@ namespace :spec do
|
|
21
23
|
Spec::Rake::SpecTask.new(:rcov) do |t|
|
22
24
|
t.spec_opts = PROJ.spec_opts
|
23
25
|
t.spec_files = PROJ.specs
|
26
|
+
t.libs += PROJ.libs
|
24
27
|
t.rcov = true
|
25
28
|
t.rcov_opts = PROJ.rcov_opts + ['--exclude', 'spec']
|
26
29
|
end
|
data/test/example_puzzle.rb
CHANGED
@@ -3,15 +3,15 @@ require File.join(File.dirname(__FILE__), '..', 'lib', 'ludy')
|
|
3
3
|
require 'puzzle_generator'
|
4
4
|
|
5
5
|
PuzzleGenerator.debug = true
|
6
|
-
|
6
|
+
pg = PuzzleGenerator::Puzzle.new :level => 4, :timeout => 2, :invoke_max => 5
|
7
7
|
begin
|
8
|
-
|
9
|
-
|
10
|
-
rescue Timeout
|
11
|
-
puts
|
8
|
+
pg.generate
|
9
|
+
pg.display_map
|
10
|
+
rescue Ludy::Timeout => e
|
11
|
+
puts e
|
12
12
|
ensure
|
13
|
-
p
|
14
|
-
p
|
13
|
+
p pg.tried_times
|
14
|
+
p pg.tried_duration
|
15
15
|
end
|
16
16
|
|
17
17
|
# level => 7
|