見出し画像

ChatGTPを利用してBEAF計算機を作ってみた

正確には配列表記と呼ばれるものです。ChatGTPに指令を出すこと10時間ほどで完成しました。ただ、ほとんどの計算はメモリエラーになります。
ググってみた限りでは私以外は作成していなさそうです。

 #Python  3.10 or 3.11

import re

def parse_input(input_str):
    numbers = re.findall(r'\d+', input_str)
    return [int(num) for num in numbers]

def count_consecutive_ones(numberlist):
    count = 0
    for num in numberlist[2:]:
        if num == 1:
            count += 1
        else:
            break
    return count

def extract_inner_brackets(s):
    pattern = re.compile(r"\{([^{}]+)\}")
    matches = pattern.findall(s)
    inner_parts = []
    for match in matches:
        inner_parts.append(match)
    return inner_parts or [s]

def calculate(inner_parts):
    numberlist = parse_input(inner_parts)
    if len(numberlist) == 1:
        return numberlist[0]
    elif len(numberlist) == 2:
        return numberlist[0] ** numberlist[1]
    elif numberlist[-1] == 1:
        lst0 = numberlist[:-1]
        lst0_str = ','.join(str(num) for num in lst0)
        return lst0_str
    elif numberlist[1] == 1:
        a = str(numberlist[0])
        return a
    elif numberlist[2] == 1:
        lst1 = [numberlist[0]] * (count_consecutive_ones(numberlist) + 1)
        lst1_str = ','.join(str(num) for num in lst1)
        numberlist[1] -= 1
        lst2 = numberlist
        lst2_str = ','.join(str(num) for num in lst2)

        lst3 = numberlist[2:]
        c = None
        count = 0
        for num in lst3:
            count += 1
            if num != 1:
                c = num
                found = True
                break
        if c is not None:
            c -= 1
            lst3 = [c] + numberlist[count + 2:]
            lst3_str = ','.join(str(num) for num in lst3)
            return lst1_str + ",{" + lst2_str + "}," + lst3_str
    else:
        a = str(numberlist[0])
        numberlist[1] -= 1
        lst4 = numberlist
        lst4_str = ','.join(str(num) for num in lst4)
        numberlist[2] -= 1
        lst5 = numberlist[2:]
        lst5_str = ','.join(str(num) for num in lst5)
        return a + ",{" + lst4_str + "}," + lst5_str


def replace_brackets(string):
    result = ""
    for char in string:
        if char == '{':
            result += '['
        elif char == '}':
            result += ']'
        else:
            result += char
    return result

def remove_brackets(sequence):
    result = []
    for item in sequence:
        if isinstance(item, int):
            result.append(item)
        elif isinstance(item, list) and len(item) == 1 and isinstance(item[0], int):
            result.append(item[0])
        else:
            result.append(remove_brackets(item))
    return result

def replace_brackets2(string):
    result = ""
    for char in string:
        if char == '[':
            result += '{'
        elif char == ']':
            result += '}'
        else:
            result += char
    return result


def main():
    numberstr = str(input("配列を入力: "))
    print(numberstr)

    while "," in numberstr:
        inner_parts_lst = extract_inner_brackets(numberstr)

        for part in inner_parts_lst:
            replacement = str(calculate(part))
            numberstr = numberstr.replace(part, replacement)

        converted_string = replace_brackets(numberstr) #{ }→[ ]にする
        processed_sequence = remove_brackets(eval(converted_string)) #[n]の[ ]をはずす
        processed_sequence = str(processed_sequence).replace(" ", "") # スペースを削除して出力
        numberstr = replace_brackets2(processed_sequence) #[ ]→{ }にする

        print("=", numberstr)

print("BEAFの基礎となる配列表記を計算します。{2,2,3}や{2,{2,3},3}のように入力。")
while True:
    try:
        main()
    except MemoryError:
        print("MemoryError")


この記事が気に入ったらサポートをしてみませんか?