2019-07-03に更新

Python3で10240進数を作ろうぜ☆(^~^)?

読了目安:17分

KIFUWARABE_80x100x8_01_Futu.gif
「 Python3で 10240進数を作ってくれだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 欲しいものが具体的で わらう☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 NumPy にないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 知らね☆ 探すより自分で考えて作った方が早いだろ☆」

[1][2][3][10239]_10240

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば 10240進数は こんなノッテイションでいいだろうか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 10進に変換すると……☆」

1*10240^3 + 2*10240^2 + 3*10240^1 + 10239*10240^0 = 1073951580159

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 1073951580159 だな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ガウス記号とぶつからない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ASCII文字が足りない☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 正規表現で使う記号と被っているのは クソ仕様では☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 エスケープすれば問題ない☆」

リストあんの?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python のコレクションの書き方覚えてないぜ☆」

digits = []

digits.append("1")
digits.append("2")
digits.append("3")

s = "[{}]_10239".format("][".join(digits))

print("Answer: {}.".format(s))
Answer: [1][2][3]_10239.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こんな感じでいいのかだぜ☆」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits, base):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)


x = MultiAdic([1, 2, 3], 10240)
print("Answer: {}.".format(x.get_value()))

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 オブジェクト指向を使って 複数のプロパティーをメソッドを通して1つにして出力すれば すっきり☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 読者と一緒に Python3 を覚える気 無いだろ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 読者なんかいないだろ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 フォーマットは簡単なのよ。パースが難しいのよ」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits, base):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.base = int(arr[1])


x = MultiAdic([1, 2, 3], 10240)
print("Answer: {}.".format(x.get_value()))

x.parse_value("[2][5][6]_16")
print("Answer: {}.".format(x.get_value()))
Answer: [1][2][3]_10240.
Answer: [1][2][3]_16.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そういうときは 1度に全部作ろうとせず、
部分に分け、できる部分から作る☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 まあ そうなんだけど」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits, base):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.digits = arr[0].split("][")
        self.base = int(arr[1])


x = MultiAdic([1, 2, 3], 10240)
print("Answer: {}.".format(x.get_value()))

x.parse_value("[2][5][6]_16")
print("Answer: {}.".format(x.get_value()))
Answer: [1][2][3]_10240.
Answer: [[2][5][6]]_16.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 両端を1文字ずつ チョンプできれば いけそうだな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 読者のことなんか 頭に無いだろ☆」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits, base):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.digits = arr[0][1:-1].split("][")
        self.base = int(arr[1])


x = MultiAdic([1, 2, 3], 10240)
print("Answer: {}.".format(x.get_value()))

x.parse_value("[2][5][6]_16")
print("Answer: {}.".format(x.get_value()))
Answer: [1][2][3]_10240.
Answer: [2][5][6]_16.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 へぇ便利☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 どこを いじったのか、何をしたのか 解説が欲しいんだけど」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 読者なんか いないだろ☆ 気にするなだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ 多進数を 数値型に落とし込んでほしいが、そうか、int 型は10進整数なんだな☆」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits, base):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.digits = arr[0][1:-1].split("][")
        self.base = int(arr[1])

    def to_decimal(self):
        """
        10進整数
        """
        return 0


x = MultiAdic([1, 2, 3], 10240)
print("Answer: {}.".format(x.get_value()))

x.parse_value("[2][5][6]_16")
print("Answer: {}.".format(x.get_value()))

print("Answer: {}.".format(x.to_decimal()))
Answer: [1][2][3]_10240.
Answer: [2][5][6]_16.
Answer: 0.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そこも 漸進 して作る☆ 部分から作って全体へ至れだぜ☆ まずは 0 を出せだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 print文を使ったデバッグライトや ブレークポイントを置いてステップインするのとか 誰でもやってるだろ☆
説明不要だよな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 読者なんか いないんだろ、気にするなだぜ☆」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits, base):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.digits = [int(i) for i in arr[0][1:-1].split("][")]
        self.base = int(arr[1])

    def to_decimal(self):
        """
        10進整数
        """
        sum = 0
        for dig in self.digits:
            sum += dig
        return sum


x = MultiAdic([1, 2, 3], 10240)
print("Answer: {}.".format(x.get_value()))

x.parse_value("[2][5][6]_16")
print("Answer: {}.".format(x.get_value()))

print("Answer: {}.".format(x.to_decimal()))
Answer: [1][2][3]_10240.
Answer: [2][5][6]_16.
Answer: 13.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 まず 総和 を出すプログラムを作れだぜ☆ 基本をルーチンするだけで だいたいのものは作れる☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 パターン入ってるわよね」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits, base):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.digits = [int(i) for i in arr[0][1:-1].split("][")]
        self.base = int(arr[1])

    def to_decimal(self):
        """
        10進整数
        """
        sum = 0
        for dig in self.digits:
            sum *= self.base
            sum += dig

        return sum


x = MultiAdic([1, 2, 3], 10240)
print("Answer: {}.".format(x.get_value()))

x.parse_value("[2][5][6]_16")
print("Answer: {}.".format(x.get_value()))

print("Answer: {}.".format(x.to_decimal()))
Answer: [1][2][3]_10240.
Answer: [2][5][6]_16.
Answer: 598.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 筆算のリクツを そのままコードにしたら こうだが……☆ 1秒未満で結果出るし、これで十分だろ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 10240進数は できたのかだぜ☆?」

Answer: [1][2][3][10239]_10240.
Answer: 1073951580159.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 どうだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 できてるぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 案外 簡単に作れるのねぇ」

123
[1][2][3]_10

KIFUWARABE_80x100x8_01_Futu.gif
「 10進で どうやってセットするんだぜ☆?
1桁ずつ いちいち へんちくりん な箱で囲むのか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そうか、10進でセットするメソッドも用意するかだぜ☆」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits=[], base=10):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.digits = [int(i) for i in arr[0][1:-1].split("][")]
        self.base = int(arr[1])

    def set_by_decimal(self, dec):
        self.digits = [dec]
        self.base = 10

    def to_decimal(self):
        """
        10進整数
        """
        sum = 0
        for dig in self.digits:
            sum *= self.base
            sum += dig

        return sum


x = MultiAdic()
x.set_by_decimal(123)
print("Answer: {}.".format(x.get_value()))
print("Answer: {}.".format(x.to_decimal()))
Answer: [123]_10.
Answer: 123.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 まず 入れた数 を そのまま返すメソッドを作るんだぜ☆ ここから 完成に向けて 漸近していく☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 その途中の工程の 完成に少しずつ寄せていくための 頭の中にある考え方に プログラミングのテクニックがあるんじゃないのか☆?」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits=[], base=10):
        self.digits = digits
        self.base = base

    def get_value(self):
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_value(self, val):
        arr = val.split("_")
        self.digits = [int(i) for i in arr[0][1:-1].split("][")]
        self.base = int(arr[1])

    def set_by_decimal(self, sum):
        self.digits.clear()
        self.base = 10

        while 0 < sum:
            digit = sum % self.base
            sum -= digit
            sum //= self.base
            self.digits.append(digit)

        self.digits = [int(i) for i in reversed(self.digits)]

    def to_decimal(self):
        """
        10進整数
        """
        sum = 0
        for dig in self.digits:
            sum *= self.base
            sum += dig

        return sum


x = MultiAdic()
x.set_by_decimal(123)
print("Answer: {}.".format(x.get_value()))
print("Answer: {}.".format(x.to_decimal()))
Answer: [1][2][3]_10.
Answer: 123.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 はい、でけた☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 くそっ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 int型は decimal(10進数)というわけでは ないんじゃないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そうかだぜ☆」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits=[], base=10):
        self.digits = digits
        self.base = base

    def get_string(self):
        """
        多進数ブラケット書式
        """
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_string(self, val):
        """
        多進数ブラケット書式のパース
        """
        arr = val.split("_")
        self.digits = [int(i) for i in arr[0][1:-1].split("][")]
        self.base = int(arr[1])

    def set_by_int(self, sum):
        self.digits.clear()

        while 0 < sum:
            digit = sum % self.base
            sum -= digit
            sum //= self.base
            self.digits.append(digit)

        self.digits = [int(i) for i in reversed(self.digits)]

    def set_base(self, base):
        """
        基数変換
        """
        sum = self.to_int()
        self.base = base
        self.set_by_int(sum)

    def to_int(self):
        """
        整数
        """
        sum = 0
        for dig in self.digits:
            sum *= self.base
            sum += dig

        return sum


x = MultiAdic()

x.set_by_int(123)
print("Info    : x.set_by_int(123)")
print("String  : {}.".format(x.get_string()))
print("Int     : {}.".format(x.to_int()))

x.set_base(2)
print("Info    : x.set_base(2)")
print("String  : {}.".format(x.get_string()))
print("Int     : {}.".format(x.to_int()))
Info    : x.set_by_int(123)
String  : [1][2][3]_10.
Int     : 123.
Info    : x.set_base(2)
String  : [1][1][1][1][0][1][1]_2.
Int     : 123.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 直した☆ ついでに基数変換も付けた☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 テストは 1つで いいのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 めんどくさい☆」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits=[], base=10):
        self.digits = digits
        self.base = base

    def get_string(self):
        """
        多進数ブラケット書式
        """
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_string(self, val):
        """
        多進数ブラケット書式のパース
        """
        arr = val.split("_")
        self.digits = [int(i) for i in arr[0][1:-1].split("][")]
        self.base = int(arr[1])

    def set_int(self, sum):
        self.digits.clear()

        while 0 < sum:
            digit = sum % self.base
            sum -= digit
            sum //= self.base
            self.digits.append(digit)

        self.digits = [int(i) for i in reversed(self.digits)]

    def set_base(self, base):
        """
        基数変換
        """
        sum = self.to_int()
        self.base = base
        self.set_int(sum)

    def to_int(self):
        """
        整数
        """
        sum = 0
        for dig in self.digits:
            sum *= self.base
            sum += dig

        return sum


x = MultiAdic()
x.set_base(10240)

# n^16 で 0&lt;=n&lt;=20。
for n in range(0, 21):
    x.set_int(n**16)
    print("{:>2}: {:>24}.".format(n, x.get_string()))
 0:                 []_10240.
 1:                [1]_10240.
 2:          [6][4096]_10240.
 3:       [4203][8001]_10240.
 4:   [40][9830][4096]_10240.
 5: [1455][1961][1985]_10240.
 6: [2][6424][2054][4096]_10240.
 7: [30][9733][9455][9601]_10240.
 8: [262][1474][5734][4096]_10240.
 9: [1725][7777][6337][5761]_10240.
10: [9313][2311][6560][0]_10240.
11: [4][1834][212][1709][4801]_10240.
12: [16][8346][9052][1638][4096]_10240.
13: [60][5317][5218][9024][9281]_10240.
14: [198][857][1126][6][4096]_10240.
15: [597][4026][10045][1186][9985]_10240.
16: [1677][7389][1884][1638][4096]_10240.
17: [4425][7266][5135][4092][6401]_10240.
18: [1][804][8816][7792][4102][4096]_10240.
19: [2][5753][6079][9313][5484][6721]_10240.
20: [5][8404][6602][5120][0][0]_10240.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これで nの16乗を 10240進数で見る、ということも でけるようになったぜ☆」

KIFUWARABE_80x100x8_10_Yattaze.gif
「 やったぜ☆!」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 10240進数にすると 何が嬉しいの?」

class MultiAdic(object):
    """
    多進数
    """

    def __init__(self, digits=[], base=10):
        self.digits = digits
        self.base = base

    def get_string(self):
        """
        多進数ブラケット書式
        """
        return "[{}]_{}".format("][".join(map(str, self.digits)), self.base)

    def parse_string(self, val):
        """
        多進数ブラケット書式のパース
        """
        arr = val.split("_")
        self.digits = [int(i) for i in arr[0][1:-1].split("][")]
        self.base = int(arr[1])

    def set_int(self, sum):
        self.digits.clear()

        while 0 < sum:
            digit = sum % self.base
            sum -= digit
            sum //= self.base
            self.digits.append(digit)

        self.digits = [int(i) for i in reversed(self.digits)]

    def get_base(self):
        return self.base

    def set_base(self, base):
        """
        基数変換
        """
        sum = self.to_int()
        self.base = base
        self.set_int(sum)

    def to_int(self):
        """
        整数
        """
        sum = 0
        for dig in self.digits:
            sum *= self.base
            sum += dig

        return sum


x = MultiAdic()
# x = MultiAdic([1, 2, 3], 2)

# Example.
x.set_int(123)
print("Info    : x.set_by_int(123)")
print("String  : {}.".format(x.get_string()))
print("Int     : {}.".format(x.to_int()))

x.set_base(2)
print("Info    : x.set_base(2)")
print("String  : {}.".format(x.get_string()))
print("Int     : {}.".format(x.to_int()))

"""
# Show list.
power = 2
# 2乗と、5のn乗は合う☆
print("||10 adic|1000 adic|25 adic|125 adic|625 adic|")
print("|--:|--:|--:|--:|--:|--:|")
x.set_base(1000)
y = MultiAdic()
y.set_base(25)
z = MultiAdic()
z.set_base(125)
w = MultiAdic()
w.set_base(625)
for n in range(0, 1001):
    dec = n**power
    x.set_int(dec)
    y.set_int(dec)
    z.set_int(dec)
    w.set_int(dec)
    print("|{:>4}^{}|{:>8}_10|{:>20}|{:>25}|{:>20}|{:>20}|".format(
        n, power, dec, x.get_string(), y.get_string(), z.get_string(), w.get_string()))
"""

# Show list.
power = 6
# 6乗と、度数法は合う☆
print("||10 adic|96 adic|120 adic|240 adic|360 adic|")
print("|--:|--:|--:|--:|--:|--:|")
x.set_base(96)
y = MultiAdic()
y.set_base(120)
z = MultiAdic()
z.set_base(240)
w = MultiAdic()
w.set_base(360)
for n in range(0, 1001):
    dec = n**power
    x.set_int(dec)
    y.set_int(dec)
    z.set_int(dec)
    w.set_int(dec)
    print("|{:>4}^{}|{:>25}_10|{:>45}|{:>65}|{:>50}|{:>50}|".format(
        n, power, dec, x.get_string(), y.get_string(), z.get_string(), w.get_string()))

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 とりあえず 適当に書いてしまった 表を作るスクリプトを貼っておくぜ☆」

<書きかけ>

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント