Skip to content

Instantly share code, notes, and snippets.

@odaillyjp
Last active August 29, 2015 13:57
Show Gist options
  • Save odaillyjp/9492325 to your computer and use it in GitHub Desktop.
Save odaillyjp/9492325 to your computer and use it in GitHub Desktop.
オフラインリアルタイムどう書く #14 の問題を解いた http://nabetani.sakura.ne.jp/hena/ord14linedung/
require 'rspec'
module HuntingMonsters
class Player
attr_reader :weapons
def initialize
@weapons = []
end
def add_weapon weapon
@weapons << weapon
end
def has_weapon? weapon
@weapons.include? weapon
end
end
class Monster
attr_reader :symbol, :weak_weapon, :dropping_weapon
def initialize symbol, weak_weapon, dropping_weapon
@symbol = symbol
@weak_weapon = weak_weapon
@dropping_weapon = dropping_weapon
@live = true
end
def live?
@live
end
def die
@live = false
end
end
class Exercise
# [シンボル, 倒せる武器, 落とす武器]
MONSTERS_DATA = [
["B", "a", "c"],
["D", "c", "e"],
["F", "e", "g"],
["H", "g", "i"],
["J", "i", "k"],
["L", "k", "a"]
]
def initialize input_value
@player = Player.new
@monsters = nil
@input_value = input_value
end
def solve
setting_weapons
setting_monsters
loop do
target_monsters = @monsters.select { |monster| monster.live? && @player.has_weapon?(monster.weak_weapon) }
break if target_monsters.size == 0
target_monsters.each do |monster|
monster.die
@player.add_weapon(monster.dropping_weapon)
end
end
@monsters.count { |monster| !monster.live? }
end
private
def setting_weapons
extract_weapons.uniq.each { |weapon| @player.add_weapon(weapon) }
end
def setting_monsters
monsters_data = []
MONSTERS_DATA.each do |monster_data|
monsters_data << Monster.new(*monster_data)
end
@monsters = extract_monsters.map do |monster_symbol|
monsters_data.find { |monster_data| monster_data.symbol == monster_symbol }
end
end
def extract_weapons
@input_value.chars.select { |char| char =~ %r{[a-z]} }
end
def extract_monsters
@input_value.chars.select { |char| char =~ %r{[A-Z]} }
end
end
# ------------
# Test cases
# ------------
describe Player do
let(:player) { Player.new }
describe "#add_weapon" do
context "with \'a\'" do
it "player has weapon \'a\'" do
expect(player.has_weapon?('a')).to be_falsy
player.add_weapon('a')
expect(player.has_weapon?('a')).to be_truthy
end
end
end
end
describe Exercise do
context 'with \'gLDLBgBgHDaD\'' do
let(:exercise) { Exercise.new('gLDLBgBgHDaD') }
describe '#setting_weapons' do
it 'player has weapons \'g\' and \'a\'' do
exercise.send(:setting_weapons)
player = exercise.instance_variable_get(:@player)
expect(player.has_weapon?('g')).to be_truthy
expect(player.has_weapon?('a')).to be_truthy
end
end
describe '#setting_monsters' do
it 'set monsters that has L, D, L, B, B, H, D, D' do
exercise.send(:setting_monsters)
monsters = exercise.instance_variable_get(:@monsters)
expect(monsters[0].symbol).to eq 'L'
expect(monsters[1].symbol).to eq 'D'
expect(monsters[2].symbol).to eq 'L'
expect(monsters[3].symbol).to eq 'B'
expect(monsters[4].symbol).to eq 'B'
expect(monsters[5].symbol).to eq 'H'
expect(monsters[6].symbol).to eq 'D'
expect(monsters[7].symbol).to eq 'D'
end
end
describe '#extract_weapons' do
it { expect(exercise.send(:extract_weapons)).to eq %w{g g g a} }
end
describe '#exctract_monsters' do
it { expect(exercise.send(:extract_monsters)).to eq %w{L D L B B H D D} }
end
describe '#solve' do
it { expect(exercise.solve).to eq 6 }
end
end
context 'with \'DBcDLaLgDBH\'' do
let(:exercise) { Exercise.new('DBcDLaLgDBH') }
describe '#solve' do
it { expect(exercise.solve).to eq 6 }
end
end
context 'with \'JJca\'' do
let(:exercise) { Exercise.new('JJca') }
describe '#solve' do
it { expect(exercise.solve).to eq 0 }
end
end
context 'with \'FJDLBH\'' do
let(:exercise) { Exercise.new('FJDLBH') }
describe '#solve' do
it { expect(exercise.solve).to eq 0 }
end
end
context 'with \'HJBLFDg\'' do
let(:exercise) { Exercise.new('HJBLFDg') }
describe '#solve' do
it { expect(exercise.solve).to eq 6 }
end
end
context 'with \'HBaDLFJ\'' do
let(:exercise) { Exercise.new('HBaDLFJ') }
describe '#solve' do
it { expect(exercise.solve).to eq 6 }
end
end
context 'with \'DJaHLB\'' do
let(:exercise) { Exercise.new('DJaHLB') }
describe '#solve' do
it { expect(exercise.solve).to eq 2 }
end
end
context 'with \'gDLHJF\'' do
let(:exercise) { Exercise.new('gDLHJF') }
describe '#solve' do
it { expect(exercise.solve).to eq 3 }
end
end
context 'with \'cJFgLHD\'' do
let(:exercise) { Exercise.new('cJFgLHD') }
describe '#solve' do
it { expect(exercise.solve).to eq 5 }
end
end
context 'with \'FFBJaJJ\'' do
let(:exercise) { Exercise.new('FFBJaJJ') }
describe '#solve' do
it { expect(exercise.solve).to eq 1 }
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment