gpt4 book ai didi

python - 遍历字符串时,我在结果中得到一个从未给出的字符

转载 作者:行者123 更新时间:2023-12-04 17:16:19 25 4
gpt4 key购买 nike

最近我一直致力于制作一个迭代字符串的 Python 程序。我正在用它制作 ESOLANG,但我遇到了一个大问题。这个问题很长,对此我深表歉意。这是基本语法,您需要了解这些语法才能回答这个问题。

  • 当前值是以 ascii 数字形式存储的单个字符。
  • e 将当前值设置为下一个字符,因此 eA 将当前值设置为 AeB将其设置为 B
  • p 打印当前值,所以 eFpeopp 打印 Foo
  • v 设置一个变量。运行 eAvB 会将变量 B 设置为 A
  • g 获取变量的值。插值器带有一个返回版本的默认变量 (?)。所以 evpg?p 将打印 v2。使用gc获取与当前值同名的变量。
  • ( 开始一个循环,) 结束一个循环。您可以使用 (n) 指定循环运行的次数,n 为 0-9 之间的数字。您可以在 c 中使用更大的数字,这将使用当前值(ascii 数字)
  • +- 增加和减少当前值。
  • f 生成阶乘。变量 0 将被设置为输出的长度,因此 5 将使 0 变为 3 因为5 的阶乘是 120,即 3 位数。然后变量 1-3 将有结果,因为有三个字母。所以这个程序将当前值设置为 5 并打印它的阶乘。 +++++fg1pg2pg3p。在此示例中,长度 (3) 是硬编码的,因此另一个数字将不起作用。另一个缺陷是输入只有一个数字。这可以用循环来修复。还有一些其他角色,但与此无关。有兴趣的可以用this Discord bot .现在,我的问题。我试图让阶乘工作,但我无法让它工作。这是我的代码(是的,它很长):
from math import factorial
def parse(code, currentValue=0, varis={"?":"2"}, getCurrent=False):
# Copyright (c) UCYT5040
# minlang - A minimal language
output = ""
outputNext = False
getNext = False
setNext = False
valNext = False
appendNext = False
getLoopAmount = False
inLoop = False
loopCode = ""
runMoreTimes = 0
openLoops = 0
for i in code:
if valNext:
currentValue = ord(i)
valNext = False
continue
if appendNext:
currentValue += ord(i)
appendNext = False
continue
if getNext:
if i == "c":
currentValue = ord(varis[chr(currentValue)])
else:
currentValue = ord(varis[i])
getNext = False
continue
if outputNext:
output += chr(i)
outputNext = False
continue
if setNext:
varis[i] = chr(currentValue)
setNext = False
continue
dontDoThis = False
if inLoop:
if i == "(": openLoops+=1
if i == ")" and openLoops != 0:
openLoops -= 1
if openLoops == 0:
inLoop = False
dontDoThis = True
if not dontDoThis:
loopCode += i
continue
if getLoopAmount:
if i == "c": runMoreTimes = currentValue
else: runMoreTimes = int(i)
getLoopAmount = False
inLoop = True
while runMoreTimes > 0:
if not inLoop:
runMoreTimes -= 1
output += parse(loopCode, currentValue, varis)
currentValue = parse(loopCode, currentValue, varis, getCurrent=True)
else: break
if runMoreTimes == 0 and not inLoop:
loopCode = ""

if i == "e": # Sets the current value to the next character
valNext = True
if i == "a": # Adds the next character to the current value
appendNext = True
if i == "p": # Print current value
output += chr(currentValue)
if i == "g": # Get the value of a variable
getNext = True
if i == "v": # Set a variable
setNext = True
if i == "(":
getLoopAmount = True
openLoops += 1
if i == "-":
currentValue -= 1
if i == "+":
currentValue += 1
if i == "i":
currentValue = ord(input("Enter only 1 character of input: "))
if i == "?":
if varis["%"] == varis["!"]:
output += chr(currentValue)
if i == "&":
if not varis["%"] == varis["!"]:
break
if i == "f":
fact = str(factorial(currentValue))
varis["0"] = str(len(fact))
for ii in range(len(fact)):
f = fact[ii]
print(type(f),f,"fact")
varis[str(ii+1)] = f
print(varis["0"])
if getCurrent:
return currentValue
return output
print(parse(input("Enter code to run: ")))

以下是我为使其正常工作所做的一些尝试。

UCYT5040: min run +++++fg1pg2pg3p 
BOT > Minlang Runner: 120

这是成功的,但下面的不是。

UCYT5040: min run va++++f g0(cga+vagcp)
Command raised an exception: KeyError: '\x01'
Expanation: Set var a to 0. Get the factorial of 4. Get the value of 0, and run a loop of its length. Edit var a to get each digit. Get the value of the 1st digit (var 1). --ERROR: Trying to get var \x01 rather than 1.--

为什么\x01 通过了?

最佳答案

我认为您需要将 chr()ord() 替换为简单的 str()int() getNext 函数的 if 分支中,即,

currentValue = ord(varis[chr(currentValue)])

为什么:使用 currentValue = 1 并假设已计算出阶乘

chr(1) = '\x01' 因此,当您尝试访问 varis['\x01'] 时,字典中不存在 key [因为在阶乘中,您使用 str(ii+1)... 而不是 chr()

存储它

相反,str(1) = '1',因此您将访问 varis['1'],这将导致 '2'int('2') = 2

关于python - 遍历字符串时,我在结果中得到一个从未给出的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68659919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com