— Day 8: Seven Segment Search —
# Adbent Calendar Day8
# Seven Segment Search
class Sign
def initialize(signal,target)
@signal = signal
@target = target
@target.delete(0)
end
def check_one
@signal.each_with_index do |item, index|
if item.length == 2
# puts item
return item
end
end
end
def check_four
@signal.each_with_index do |item, index|
if item.length == 4
# puts item
return item
end
end
end
def check_seven
@signal.each_with_index do |item, index|
if item.length == 3
# puts item
return item
end
end
end
def check_eight
@signal.each_with_index do |item, index|
if item.length == 7
# puts item
return item
end
end
end
def check_two(eight, four)
s = eight.delete(four).chars.sort(&:casecmp).join
@signal.each_with_index do |item, index|
if item.length == 5
flag = true
s.each_char do |c|
if !item.include?(c)
flag = false
end
end
if flag
return item
end
end
end
end
def check_three(one)
s = one.chars.sort(&:casecmp).join
@signal.each_with_index do |item, index|
if item.length == 5
flag = true
s.each_char do |c|
if !item.include?(c)
flag = false
end
end
if flag
return item
end
end
end
end
def check_five(four, one)
s = four.delete(one).chars.sort(&:casecmp).join
@signal.each_with_index do |item, index|
if item.length == 5
flag = true
s.each_char do |c|
if !item.include?(c)
flag = false
end
end
if flag
return item
end
end
end
end
def check_nine(four)
s = four.chars.sort(&:casecmp).join
@signal.each_with_index do |item, index|
if item.length == 6
flag = true
s.each_char do |c|
if !item.include?(c)
flag = false
end
end
if flag
return item
end
end
end
end
def check_zero(eight, nine, one)
s = eight.delete(nine).concat(one).chars.sort(&:casecmp).join
@signal.each_with_index do |item, index|
if item.length == 6
flag = true
s.each_char do |c|
if !item.include?(c)
flag = false
end
end
if flag
return item
end
end
end
end
def check_six(eight,seven)
s = eight.delete(seven).chars.sort(&:casecmp).join
@signal.each_with_index do |item, index|
if item.length == 6
flag = true
s.each_char do |c|
if !item.include?(c)
flag = false
end
end
if flag
return item
end
end
end
end
def return_result
one = self.check_one
four = self.check_four
seven = self.check_seven
eight = self.check_eight
two = self.check_two(eight,four)
three = self.check_three(one)
five = self.check_five(four,one)
six = self.check_six(eight,seven)
nine = self.check_nine(four)
zero = self.check_zero(eight,nine,one)
num = ""
@target.each do |n|
case n.chars.sort(&:casecmp).join
when zero.chars.sort(&:casecmp).join
num = num.concat("0")
when one.chars.sort(&:casecmp).join
num = num.concat("1")
when two.chars.sort(&:casecmp).join
num = num.concat("2")
when three.chars.sort(&:casecmp).join
num = num.concat("3")
when four.chars.sort(&:casecmp).join
num = num.concat("4")
when five.chars.sort(&:casecmp).join
num = num.concat("5")
when six.chars.sort(&:casecmp).join
num = num.concat("6")
when seven.chars.sort(&:casecmp).join
num = num.concat("7")
when eight.chars.sort(&:casecmp).join
num = num.concat("8")
when nine.chars.sort(&:casecmp).join
num = num.concat("9")
else
end
end
return num.to_i
end
def check_output
num = 0
@target.each do |n|
if n.size == 2 || n.size == 3 || n.size == 4 || n.size == 7 then
num = num + 1
end
end
return num
end
end
array = [];
File.foreach("8_input.dat").with_index do |line, line_num|
sign = Sign.new(line.split('|')[0].split(' '),line.split('|')[1].split(' '))
array.push(sign)
end
q1_ans = 0
array.each do |obj|
q1_ans = q1_ans + obj.check_output
end
puts "Q1:#{q1_ans}"
q2_ans = 0
array.each do |obj|
q2_ans = q2_ans + obj.return_result
end
puts "Q2:#{q2_ans}"メモ
問題が長いし解読するのが難しい。問1から初見で何を言っているかよくわからず、何度もメモを取りながら読み返した。僕の英語力のなさか…と思っていたら社内のスラックチャネルでも同じような意見言っている人がいたので、やはり多少難解だったみたい。
①問題理解
↓
②情報整理
↓
③回答の思案
↓
④コードに落とし込む
どのステップも等しく大事で、これってコーディング特にしていない普段の仕事でもきっとそうだ。最後の何でアウトプットするかは違えどそこに至るまでのプロセスには共通項がたくさんある。
問題さえわかってしまえば問1はただ数え上げるだけ。問2は{2,3,5}{0,6,9}をどう区別していくかを見極める所がキーポイントだった。力技でやってしまったけど、きっと綺麗な回答があるんだろうなあ。後でRedditを覗いてみる。