Problem:
7 セグメント

電卓などでよく目にするデジタル数字を表示している画面は、デジタル数字が 7 つの部分(セグメン
ト)で構成されることから、「7セグメントディスプレイ」と呼ばれています。

ワカマツ社で新しく売り出す予定の製品は、7セグメントディスプレイを製品に組み込むことになり、社員であるあなたは、与えられた数字を 7 セグメントディスプレイに表示するプログラムを作成することになりました。

この7セグメントディスプレイは、次の切り替えの指示が送られてくるまで表示状態は変わりません。7 ビットからなるシグナルを送ることで、それぞれ対応したセグメントの表示情報を切り替える事ができます。ビットとは 1 か 0 の値を持つもので、ここでは 1 が「切り替え」、0 が「そのまま」を表します。

各ビットとセグメントの対応関係は下の図のようになっています。シグナルは 7 つのビットを"gfedcba"の順番に送ります。例えば、非表示の状態から「0」を表示するためには"0111111"をシグナルとしてディスプレイに送らなければなりません。「0」から「5」に変更する場合には"1010010"を送ります。続けて「5」を「1」に変更する場合には"1101011"を送ります。

表示したい n (1 ≤ n ≤ 100) 個の数字を入力とし、それらの数字 di (0 ≤ di ≤ 9) を順に 7 セグメントディスプレイに正しく表示するために必要なシグナル列を出力するプログラムを作成してください。なお、7 セグメントディスプレイの初期状態は全て非表示の状態であるものとします。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりは-1 ひとつの行で示されます。
各データセットは以下の形式で与えられます。

n
d1
d2
:
dn

データセットの数は 120 を超えません。

Output

入力データセットごとに、数字をディスプレイに正しく出力するために必要なシグナルの列を出力してください。

Sample Input

3
0
5
1
1
0
-1

Output for the Sample Input

0111111
1010010
1101011
0111111

Solution in Scala (judge verdict: Accepted)

import java.util.Scanner

import scala.collection.Searching._
import scala.annotation.tailrec
import scala.collection.immutable.{NumericRange, Queue}
import scala.collection.mutable
import scala.io.StdIn.readLine

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}


object Main {
  def solve(sc: => Scanner): Unit = {
    val N = sc.nextLong
    if (N != -1) {
      solve2(sc, N = N, now = 0)
      solve(sc)
    }
  }

  val Data = Array[Long](
    Integer.parseInt("0111111", 2),
    Integer.parseInt("0000110", 2),
    Integer.parseInt("1011011", 2),
    Integer.parseInt("1001111", 2),
    Integer.parseInt("1100110", 2),
    Integer.parseInt("1101101", 2),
    Integer.parseInt("1111101", 2),
    Integer.parseInt("0100111", 2),
    Integer.parseInt("1111111", 2),
    Integer.parseInt("1101111", 2)
  )

  def solve2(sc: => Scanner, N: Long, now: Long): Unit = {
    if (N != 0) {
      val next = Data(sc.nextInt)
      println((now ^ next).toBinaryString.reverse.padTo(7, '0').reverse)
      solve2(sc, N - 1, next)
    }
  }

  def gcd(i: Long, j: Long): Long = {
    if (i < j) (gcd(j, i)) else (if (j == 0) (i) else (gcd(j, i % j)))
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}