問題
小さい女の子が1から1000までを左手の指を使って数えている。
まず親指を1として数え、人差し指を2、中指を3、薬指を4、小指で5を数える。
次に向きを変えて、薬指を6、中指を7、人差し指を8、親指で9を数える。月は人差し指で10を数え、といった風に続ける。
このように数を数えていったとして、1000まで数えたときの指はどの指になるだろうか?
方針
まずは、数えてみます。
図から、2周目以降は8つ数が進むことが分かります。
であるので、周の最後の親指の数は下記の式を満たすことになります。
1 + 8 * x
(x=1のとき9、x=2のとき17、・・・・・)
1 + 8 * x = 1000
とすると
x = 124 あまり 7
となります。
親指から7つ進んだ位置であるので、答えは人差し指ということになります。
コード
swift3
//
// main.swift
// PredictingAFingerCount
//
// Created by 山崎真一郎 on 2017/02/12.
// Copyright © 2017 山崎真一郎. All rights reserved.
//
import Foundation
enum Finger {
case
thumb, // 親指
forefinger, // 人指し指
middlefinger, // 中指
ringfinger, // 薬指
littlefinger // 小指
}
enum FingerChkError:Error
{
case UnKnownFinger
}
func GetNextPos(finger: Finger, isUp: Bool) throws -> Finger
{
if isUp
{
switch finger {
case .thumb:
return .forefinger
case .forefinger:
return .middlefinger
case .middlefinger:
return .ringfinger
case .ringfinger:
return .littlefinger
default:
throw FingerChkError.UnKnownFinger
}
}
else {
switch finger {
case .littlefinger:
return .ringfinger
case .ringfinger:
return .middlefinger
case .middlefinger:
return .forefinger
case .forefinger:
return .thumb
default:
throw FingerChkError.UnKnownFinger
}
}
}
var finger = Finger.thumb
var isUp = true
for cnt in 2...1000
{
try
finger = GetNextPos(finger: finger, isUp: isUp)
if (finger == Finger.littlefinger)
{
isUp = false
}
if (finger == Finger.thumb)
{
isUp = true
}
}
print(finger)
実行結果
forefinger
Program ended with exit code: 0