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")
この記事が気に入ったらサポートをしてみませんか?