Last active
October 19, 2017 08:48
-
-
Save Heimdell/1d699bb734f0f5fddb24b597368304c9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'set' | |
def contents(filename) | |
acc = [] | |
File.open(filename, 'r') do |fin| | |
while (line = fin.gets) | |
acc << line | |
end | |
end | |
acc | |
end | |
class String | |
def nonempty? | |
!empty? | |
end | |
end | |
class Array | |
def feed | |
if block_given? | |
while any? | |
yield shift | |
end | |
else | |
raise Error('feed: must give block') | |
end | |
end | |
end | |
""" | |
Block looks like this: | |
> ; This is the block | |
> ; Some comments there | |
> #BLOCK_NAME | |
> foo, bar, 1, 2 ; maybe some comments here | |
> bar, quix, 1, *, lol | |
> <empty line> | |
""" | |
def get_next_block (lines) | |
lines.feed do |line| | |
next if line.match /^;/ | |
header = line.match /(^#(?<name>\w*))/ | |
if header then | |
name = header[:name] | |
acc = [] | |
lines.feed do |line| | |
next if line.match /^;/ | |
break if line.lstrip.empty? | |
commented = line.match /^(?<value>.*);/ | |
value = commented ? commented[:value] : line | |
items = value.split(",").map(&:strip).select(&:nonempty?).map do |item| | |
case | |
when (digits = item.match /^\d+/) | |
Integer(digits[0], 10) | |
when item == '*' | |
nil | |
else | |
item | |
end | |
end | |
acc << items | |
end | |
return [name, acc] | |
end | |
end | |
end | |
def parse_res(lines) | |
acc = {} | |
while (block = get_next_block lines) | |
(name, val) = block | |
acc[name] = val | |
end | |
acc | |
end | |
def show_res(dict) | |
dict.each do |k, v| | |
puts k | |
v.each { |row| puts " #{row.to_s}" } | |
end | |
end | |
def extract_techs(dict) | |
dict["TECHNOLOGY"].map do |name, key, power, tech, wealth, growth, dep1, dep2, flags| | |
key_sym = key.to_sym | |
{ key_sym => { | |
key: key_sym, | |
name: name, | |
affinities: { | |
power: power, | |
tech: tech, | |
wealth: wealth, | |
growth: growth, | |
}, | |
deps: [dep1, dep2].map(&:to_sym), | |
flags: flags | |
} } | |
end.inject({}, &:merge) | |
end | |
def find_all_deps(tech, tech_dict) | |
res = Set[] | |
stack = [tech] | |
stack.feed do |key| | |
next if key == :None | |
tech = tech_dict[key] | |
res << tech[:name] | |
stack << tech[:deps][0] | |
stack << tech[:deps][1] | |
end | |
res.to_a | |
end | |
lines = contents('../alphax.txt') | |
res = parse_res lines | |
techs = extract_techs res | |
puts find_all_deps :WillPow, techs |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Это релизация вот этого
Не понятно зачем нужна реализация feed ведь делает он обычный map
Это тоже map
9 параметров с списке параметров это явный перебор
Хэши обычно форматируются вот так