指数え

問題

小さい女の子が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