プログラマの考えが・・身につく本より：ルーンチェックサムの検証（固定長）

Pythonでプログラミング入門中
[前回](http://qiita.com/teratera/items/a76667d8e6cc23078292)より引き続き

また今回は[その前に問題提示](http://qiita.com/teratera/items/6dfa72d6b5d1e987c2df)されている
・数値を最後まで読み終えたことを知る
これを解決するため問題に挑戦します。

<h1>ルーンチェックサムの検証（固定長）</h1>
>6桁の識別番号（チェックディジットを含むもの）を受け取り、その値がルーン式で妥当かどうかを調べるプログラムを書こう。このプログラムでは、１つの桁を読み込んだら次の桁に進む前に、その桁の処理をすませなければいけない。

ただ、いつものことながらこのままではむずかしいので
<h2>○単純なチェックサムの検証（固定長）</h2>
>6桁の識別番号（チェックディジットを含むもの）を受け取り、その値がルーン式で妥当かどうかを調べるプログラムを書こう。各桁の数値を足した結果が１０で割り切れれば、その値が妥当であると見なす。このプログラムでは、１つの桁を読み込んだら次の桁に進む前に、その桁の処理を済ませなければいけない。

```c++
char digit;
int checksum = 0;
cout << "Enter a six-digit number:";
for (int position = 1; position <= 6; position ++) {
    cin >> digit;
    checksum += digit - '0';
}
cout << "Checksum is " << checksum << ". \n";
if (checksum % 10 == 0) {
    cout << "Checksum is divisible by 10. Valid. \n";
} else {
    cout << "Checksum is not divisible by 10. Invalid. \n";
}
```

<h1>自分の解答(Python)</h1>

```py:ConsoleOut.py 
#!/usr/bin/env python
#coding:utf-8

#shiracamusさんに教えていただいたpythonでのcoutを利用
from ConsoleOut import cout


def number():
    checksum = 0
    for i in range(6):
        cout << "Enter a six-digit number:"
        digit = input()
        checksum += int(digit)
    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalid. \n"

```

```py:test01.py(６桁入力数字を足し合わせる)
### こっから自作と言えるほどでもないですが書きました。
#!/usr/bin/env python
#coding:utf-8

from ConsoleOut import cout


def number():
    checksum = 0
    for i in range(6):
        cout << "Enter a six-digit number:"
        digit = input()
        checksum += int(digit)
    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalid. \n"

```

いままでの流用で書いている部分がほとんどですが、
int型とstr型や内部変数などの理解がまだ不十分で最初 checksum += int(digit) の
部分でなぜか、足しあわせてくれないな〜と悩んでいましたところ。
checksum = 0で宣言？しておけば合計してくれました。
とりあえずできたかな（汗

<h1>（追記）同時に奇数番目の入力は２倍にする</h1>
この当初の問題は奇数番目に入力された数字は２倍してその数が２桁の場合は各桁をさらに
たす必要があるのでその関数を以前ご指導のもと作っているので流用する
関数はこちら

```py:test.py(入力数が10以上なら各桁を足し合わせる関数)
#!/usr/bin/env python
#coding:utf-8

def doubleDigitValue(digit):
    doubledDigit = digit * 2
    if (doubledDigit >= 10):
        sum = 1 + doubledDigit % 10 
    else:
        sum = doubledDigit
    return sum
```

そして、こちらをさきほどの

```py:test.py(doubleDigitValue関数を追加)
#!/usr/bin/env python
#coding:utf-8

from ConsoleOut import cout
from test import doubleDigitValue


def number():
    checksum = 0
    for i in range(6):
        cout << "Enter a six-digit number:"
        digit = input()
        if i % 2 == 0:
            checksum += int(digit)
        else:  #奇数の場合、2倍して10以上なら各桁足し合わせる
            checksum += doubleDigitValue(int(digit)) 
    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalid. \n"
```


```pycon:実行結果
>>> from test01 import number
>>> number()
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Checksum is 9. 
Checksum is not divisible by 10. Invalid. 
>>> number()
Enter a six-digit number:2  #2
Enter a six-digit number:1  #1*2
Enter a six-digit number:1  #1 
Enter a six-digit number:1  #1*2
Enter a six-digit number:1  #1
Enter a six-digit number:1  #1*2
Checksum is 10. 
Checksum is divisible by 10. Valid .
>>> 
#問題解決しました。ありがとうございます！
```

最初の結果として
(1*2)+1+(1*2)+1+(1*2)+1 = 9  //1回目
なんだろう結果が表示されてみると最初はあってるっぽいけど
２回目に入力してるのは違う気がする。
(2*2)+1+(1*2)+1+(1*2)+1 = 10???　//2回目
不十分な状況ですがもう少し考えてみます。