作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我一直致力于制作一个迭代字符串的 Python 程序。我正在用它制作 ESOLANG,但我遇到了一个大问题。这个问题很长,对此我深表歉意。这是基本语法,您需要了解这些语法才能回答这个问题。
e
将当前值设置为下一个字符,因此 eA
将当前值设置为 A
和 eB
将其设置为 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/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!