同じ数を表示し続ける7セグメントディスプレイ
締め切りが 2018/02/06 10:00 AM なので,その 1 分後に投稿されるように予約
7セグメントディスプレイは7箇所の点灯の有無で数字を表示します。
この7セグメントディスプレイを横に並べて数を表示したとき、点灯している場所を数え、各桁での個数の「積」を次に表示します。
例えば、「718」からスタートすると、「7」は3箇所、「1」は2箇所、「8」は7箇所が点灯しているので、
3×2×7=42を計算し、次に「42」を表示します。
また、「42」において、「4」は4箇所、「2」は5箇所が点灯しているので、4×5=20より次に「20」を表示します。
次に「20」において、「2」は5箇所、「0」は6箇所が点灯しているので、5×6=30より次に「30」を表示します。
さらに「30」において、「3」は5箇所、「0」は6箇所が点灯しているので、5×6=30より次に「30」を表示します。
つまり、「718」から始まると「718」→「42」→「20」→「30」→「30」→…というように「30」が続くようになります。
このとき、登場する数は「718」「42」「20」「30」の4種類だけです。
標準入力から整数 n が与えられたとき、上記の処理を行って過去に表示した数が再度表示されるまで探索したとき、
登場する数がいくつあるか求め、その数を標準出力に出力してください。
なお、n は符号なし32ビット整数型の範囲(0〜4,294,967,295)とします。
【入出力サンプル】
標準入力
718
標準出力
4
=========================
R だと,簡単に書ける
f = function(n) {
segments = c(6, 2, 5, 5, 4, 5, 6, 3, 7, 6)
stack = n
repeat {
n = prod(segments[as.integer(unlist(strsplit(as.character(n), "")))+1])
if (n %in% stack) {
break
}
stack = c(stack, n)
}
cat(length(stack))
}
# f(scan(file("stdin", "r")))
f(718) # 4
f(0) # 2
f(31) # 3
f(12345) # 8
f(4198723075) # 11