その時々

その時々で違うんです。特に決まっていないんです。

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