LoginSignup
2
1

More than 5 years have passed since last update.

プログラマの考えが・・身につく本より:ルーンチェックサムの検証(可変長)その2

Last updated at Posted at 2016-04-18

Pythonでプログラミング入門中
前回より引き続き

前回やった部分の流用がほとんどになりそうですが、
前回解決したことといえば、

・6桁の識別番号を標準入力から取得
・取得した6桁の識別番号を足し合わせる(以下特殊事項)
(6桁の中で奇数桁には2を乗算し、乗算の計算結果が2桁の場合は各桁を個別に分けて
 足し合わせる)

ここで次の問題になりますが、当初からの問題では『任意の桁数』となっており
6桁の数字とは限らないということ。

任意の長さの識別番号に対応するコード

書籍での解答はC++でASCII文字コードによる入出力結果の数字で判断しています。
(ASCII文字コードの”改行”を取得した場合にループを終了させる)

書籍解答

char digit;
int checksum = 0;
int position = 1;
cout << "Enter a number with an even number of digits: ";
digit = cin.get();
while(digit != 10) {
    if (position % 2 == 1) checksum += digit - '0';###奇数番目はそのまま
    else checksum += doubleDigitValue(digit - '0');###偶数番目を2
    digit = cin.get();
    position++;
}

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";
}
・・・

自分の解答

コメントをいただいた部分を参考に変更しています。
(また、本来の問題では奇数番目を2倍していますが、最初の課題では偶数番目を2倍と
なっており、尚 ルーンチェックサムアルゴリズムの参考サイトでも同じく偶数番目を2倍となっているので
その点、変更しています)

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

import sys
from ConsoleOut import cout
from test import doubleDigitValue


def number():
    checksum = 0
    position = 0
    cout << "Enter a number with an even number of digits:"
digits = input()
    while position < len(digits):
        digits = digits[position]
        if position % 2 == 1:
            checksum += int(digit)
        else:
            checksum += doubleDigitValue(int(digit))
        position += 1

    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. Invalud. \n"

・・・(ターミナル出力結果)
>>> from test02 import number
>>> number()
Enter a number with an even number of digits:49927398716
Checksum is 70. 
Checksum is divisible by 10. Valid .


入力された文字数の合計をだしてその奇数番目を見つける方法で考えていたのですが、
前回コメントいただいていた偶数のみと奇数のみというとてもシンプルでわかり易い方法を
教えて頂いていたので利用させて頂きました。

また、標準入力では教えていただいたraw_input()も利用してみようと
試みましたが、自分がPython3.5を使っていた為、NameErrorになってしまい、
Python3では sys.stdin.readline() を使えと参考サイトにあったので
試したのですが、これがうまくいかず前回のままのコードです。

こちらの記事に「Python Tips:標準入力から文字列を取得したい」sys.stdin.readline()の使い方がありました。

2
1
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1