goo blog サービス終了のお知らせ 

パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

39 36進数への招待

2018-06-09 | プログラムをマスター計画2020
以前 N進数の計算をするという問題で鬼苦労

関数型プログラムをしている今なら!

目標

任意の進数で足し算、引き算

制作過程
0〜Zまでの文字列作成
36進数までのサポートが確定

plusOneを作成
必要 文字列の任意の位置の変更関数
追加関数テスト
plusOneをテスト

minusOneを作成とテスト

plusを作成、plusOneを足す分ループ
必要 N進数から10進数への変換関数
変換関数テスト

minusを作成
全体的なテスト(完成)

未対応項目

マイナスで0以下
進数意外の文字エラー
桁あふれ
etc....

感想

32進数"VVVVV"を足すなどでも遅い。小学校でならった繰り上げ、繰り下げなどを実装しないとダメらしい。
lineAddまったく使ってなかった。









コピペできるソース

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
numStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def strPoint(s,l,w):
    return s[:l]+w+s[l+1:]

print(strPoint("0123456789",0,"X"))
print(strPoint("0123456789",9,"X"))
print(strPoint("0123456789",5,"X"))

def lineAdd(w):
    global numStr
    return numStr[numStr.find(w)+1]

def plusOne(s,base,l=None):
    global numStr
    if l==None:l=len(s)-1
    if l<0:
        return numStr[1]+s
    num=numStr.find(s[l])
    if num==base-1:
        s=strPoint(s,l,numStr[0])
        return plusOne(s,base,l-1)
    else:
        return strPoint(s,l,numStr[num+1])

def minusOne(s,base,l=None):
    global numStr
    if l==None:l=len(s)-1
    if l<0:
        return numStr[1]+s
    num=numStr.find(s[l])
    if num==0:
        s=strPoint(s,l,numStr[base-1])
        return minusOne(s,base,l-1)
    else:
        if num==1 and l==0:
            return s[1:]
        else:
            return strPoint(s,l,numStr[num-1])

"""
n="0"
for i in range(100):
    print(n)
    n=plusOne(n,16)
n="0"
for i in range(100):
    print(n)
    n=plusOne(n,2)
n="0"
for i in range(100):
    n=plusOne(n,32)
    print(n)
for i in range(100):
    n=minusOne(n,32)
    print(n)
"""

def baseToInt(s,base,l=None,ret=None):
    global numStr
    if l==None:l=0
    if ret==None:ret=0
    if l==len(s)-1:return ret*base+numStr.find(s[l])
    return baseToInt(s,base,l+1,ret*base+numStr.find(s[l]))

print(baseToInt("FFFFFFFF",16))
print(baseToInt("FFFFFFFFFFFFFFFF",16))

def plus(s1,s2,base):
    for i in range(baseToInt(s2,base)):
        s1=plusOne(s1,base)
    return s1

def minus(s1,s2,base):
    for i in range(baseToInt(s2,base)):
        s1=minusOne(s1,base)
    return s1

print(plus("F0F0","F0F",16))
print(minus("F0F0","F0F",16))

print(minus("10000000","1",32))
print(minus("VVVVVV","VVVV",32))
print(baseToInt("VVVVV",32))
print(baseToInt("ZZZZZ",36))
print(minus("1000","1",8))

syntax2html


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。