pythonの基数変換ドリルを改良しました。
pythonの基数変換ドリルを改良して
10進数から2進数、10進数から8進数、10進数から16進数をランダムに出題するようにしました。
2進数の場合は0100というように4桁で回答。
8進数の場合は010というように3桁で回答。
16進数の場合は0xaというように0xを付加して回答するようにしてあります。
前回よりさらにむずかしくなりました。
# -*- coding:utf-8 -*- """ ProgramName: RadixDrill """ import time import random import pickle stime = time.time() suc = 0 radixkeyword = { 2 : 'Binary', 8 : 'Oct', 10 : 'Decimal', 16 : 'Hex' } #--------------------------------------------------------------------------- # RadixMake # --------------------------------------------------------------------------- def radixmake (rrange=15, orgradix=10, targetradix=2, figure=4): print '%s -> %s' % (radixkeyword[orgradix], radixkeyword[targetradix]) #Radix Making x = random.randint(0, rrange) print 'Question %d' % x ques = '' for i in range(figure): ques = str(x % targetradix) + ques x /= targetradix if targetradix == 8: print 'answer sample 010' elif targetradix == 16: ques = hex(int(ques)) print 'answer sample 0xa' else: print 'answer sample 0110' return ques print '----------------------------------------------------------------------' print ' RadixDrill Start' print ' Try 10 Count' print '----------------------------------------------------------------------' for i in range(10): print '--------------------------------' print ' Q.%d' % (i + 1) print '--------------------------------' x = random.choice([2, 8, 16]) fig = { 2 : 4, 8 : 3, 16 : 1 }[x] ques = radixmake(targetradix=x, figure=fig) ans = raw_input('Decimal :') if ques==ans: print 'OK' suc += 1 else: print 'NG!' print 'answer : %s' % ques # Score Display etime = time.time() point = int((100 - (etime - stime)) * 10 * suc / 10.0) print 'correct (%d / 10) time (%d sec)' % (suc, int(etime - stime)) print 'score %dpoint' % point # Score Save data = (point, time.asctime()) try: file = open('radixdrill.dat', 'rb') rdata = pickle.load(file) file.close except IOError: rdata = [] rdata.append(data) rdata.sort() rdata.reverse() file = open('radixdrill.dat', 'wb') pickle.dump(rdata, file) file.close() # Score Ranking print '----------------------------------------' print ' Score Ranking TOP10' print '----------------------------------------' max = 10 for dt in rdata: print '%d point , %s' % dt if not max: break max -= 1
実行結果は以下のような感じです。
-------------------------------- Q.9 -------------------------------- Decimal -> Oct Question 9 answer sample 010 Decimal :011 OK -------------------------------- Q.10 -------------------------------- Decimal -> Binary Question 4 answer sample 0110 Decimal :0100 OK correct (9 / 10) time (56 sec) score 387point ---------------------------------------- Score Ranking TOP10 ---------------------------------------- 417 point , Sat Dec 11 08:54:33 2010 387 point , Sat Dec 11 10:49:46 2010