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を覗いてみる。