Skip to content

Instantly share code, notes, and snippets.

@Heimdell
Last active October 19, 2017 08:48
Show Gist options
  • Save Heimdell/1d699bb734f0f5fddb24b597368304c9 to your computer and use it in GitHub Desktop.
Save Heimdell/1d699bb734f0f5fddb24b597368304c9 to your computer and use it in GitHub Desktop.
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
@ILoGM
Copy link

ILoGM commented Oct 19, 2017

  • Это релизация вот этого

  • Не понятно зачем нужна реализация feed ведь делает он обычный map

  • Это тоже map

  • 9 параметров с списке параметров это явный перебор

Хэши обычно форматируются вот так

{ 
  key_sym => {
    key: key_sym,
    name: name,
    affinities: {
      power: power,
      tech: tech,
      wealth: wealth,
      growth: growth,
    },
    deps: [dep1, dep2].map(&:to_sym),
    flags: flags
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment