* 今週のお題:7セグメントコードの反転 @CodeIQ

最近CodeIQでちょこちょこ問題を解いています。

その中でこの問題を解いてみた。

今週のお題:7セグメントコードの反転

7セグメントディスプレイ

詳しくはこちら参照→Wikipedia: 7セグメントディスプレイ

7桁の2進数を使って0〜9の数字を表現することができるディスプレイのこと。

原理はこんな感じ↓(CodeIQ様より引用)

問題

肝心の課題は要約すると

「7セグメントディスプレイで1,0の切り替え回数を最も少なく0から9を表現するとき、切り替え回数は何回か」

というもの。

ここで言う切り替え回数とは、例えば以下の場合は1,3,4,5,7桁目を切り替えればいいので切り替え回数は5回。

1→2

1 → 0110000

2 → 1101101

0〜9の数字を並び替えて、切り替え回数が最も少なくなる時の回数を求めよとの問題。

解答

回答方法に指定はなかったので、Pythonで求めてみた。

              #!/usr/bin/python
              # -*- coding: utf-8 -*-
              
              # 切り替え回数を入れる
              tmp_ans = 0
              ans = 100
              
              # セグメントの順番
              order = []
              ans_order = []
              
              def check_change(before,after):
                  res = 0
                  for (b,a) in zip(before,after):
                      if b != a:
                          res += 1
                  return res
              
              # n = セグメントの順番
              def make_segment(array, order, n):
                  global ans, tmp_ans, ans_order
              
                  if n == len(array):
                      tmp_ans += check_change(order[n-2], order[n-1])
                      if ans > tmp_ans:
                          ans = tmp_ans
                          ans_order = order
                      tmp_ans -= check_change(order[n-2], order[n-1])
                      return
                  for i in range(len(array)):
                      if array[i] not in order:
                          order.append(array[i])
                          if len(order) >= 2: tmp_ans += check_change(order[n-1], order[n])
                          make_segment(array, order, n+1)
                          if len(order) >= 2: tmp_ans -= check_change(order[n-1], order[n])
                          order.pop()
                      else:
                          continue
              # main
              array = ['1111110','0110000','1101101','1111001','0110011','1011011','1011111','1110000','1111111','1111011']
              
              make_segment(array, order, 0)
              print ans
              

とりあえず0〜9の2進数表示をarrayに格納。

2つの要素を渡すと切り替え回数を求めるcheck_change関数を作成。

それでひたすら0〜9の順列を求めて総当り。

ans変数に暫定トップの答えを格納。

一応答えは出せたので提出しました。答え合わせ待ち〜

ただ、言わずもがなですが処理時間が長すぎるのでうまいこと枝切りする必要がありましたね。

いじってgistにあげようと思います。


※この記事は WordPress に投稿した記事を変換したものです。一部不自然な表示があるかも知れません。ご了承ください。また、記事タイトル先頭の * は WordPress から移行した記事である印です。

comments powered by Disqus