Python

プログラマの考えが・・身につく本より:小問題のパーツをとりまとめる

More than 3 years have passed since last update.

Pythonでプログラミング入門中

前回より引き続き

この問題の最終になりまたが、各パーツをとりまとめて最終的な解答になります。

(前回ですでに完成していたようです(汗

問題:(最初の課題)ルーンチェックサムの検証


(問題文が重複していますがご了承ください)

ルーン式は、ルーン式は、識別番号の検証によく使われる方式だ。元の数字の各桁に対して、1桁おきにその数字を2倍する。そのあとで、各桁の数字を足していく(2倍した結果が2桁になる数字があれば、十の位と一の位をそれぞれ個別に足していく)。その合計が10で割り切れる場合に、識別番号は妥当なものであると見なす。

任意の長さの識別番号を受け取り、その値がルーン式で妥当かどうかを調べるプログラムを書こう。このプログラムでは、1つの桁を読み込んだら次の桁に進む前に、その桁の処理を済ませなければいけな。


どの桁を2倍すればいいのかを知る


解答

こちらのコメントでも頂いている通りPythonのinput()関数を利用して一旦全て入力してその文字列長さをだして、偶数番目・奇数番目を導いてくれています。


2倍した結果が2桁になったときに、それぞれの桁を個別に扱う


解答

(0〜9)2倍したあとの計算がめちゃくちゃでしたが、1 + (2倍数字 % 10) で求めたい数が出せました。


数値を最後まで読み終えたことを知る


解答

こちらも問題の解答C++ではASCII文字コードを求めて改行コードで判断するようでしたが、Pythonの場合input()関数が改行を判断してくれるようでしたのでとくに難しくならずにすみました。


各桁を個別に読み込む

解答

range()関数で繰り返しをしてinput()関数で個別に入力

(ただ、input()関数は文字列で入力可能でした)

以上のことから以下の解答となります。

#!/usr/bin/env python

#coding:utf-8

from ConsoleOut import cout
from test import doubleDigitValue

def number():
checksum = 0
position = 0
cout << "Enter a number:"
digits = input()
while position < len(digits):
digit = digits[position]
if position % 2 == 0:
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"

・・・(ターミナル結果)
問題の1762483がチェックサムで算出すると有効か無効化
>>> from test03 import number
>>> number()
Enter a number:1762483
Checksum is 30.
Checksum is divisible by 10. Valid .(有効)

10で割り切れるなら”有効”と求めたい結果になりました。

ここまでで、自分の中で勉強になった点は無数にありますが、これを活かして次の課題に取り組んでいきます。