Execute SNUSP: Difference between revisions

Content added Content deleted
(→‎{{header|J}}: I had used the incorrect start position character. It is now fixed as $ .)
(Python solution)
Line 115: Line 115:
=={{header|PicoLisp}}==
=={{header|PicoLisp}}==
See [[RCSNUSP/PicoLisp]].
See [[RCSNUSP/PicoLisp]].

=={{header|Python}}==
{{trans|Go}}
<lang python>#!/usr/bin/env python3

HW = r'''
/++++!/===========?\>++.>+.+++++++..+++\
\+++\ | /+>+++++++>/ /++++++++++<<.++>./
$+++/ | \+++++++++>\ \+++++.>.+++.-----\
\==-<<<<+>+++/ /=.>.+>.--------.-/'''

def snusp(store, code):
ds = bytearray(store) # data store
dp = 0 # data pointer
cs = code.splitlines() # 2 dimensional code store
ipr, ipc = 0, 0 # instruction pointers in row and column
for r, row in enumerate(cs):
try:
ipc = row.index('$')
ipr = r
break
except ValueError:
pass
rt, dn, lt, up = range(4)
id = rt # instruction direction. starting direction is always rt
def step():
nonlocal ipr, ipc
if id&1:
ipr += 1 - (id&2)
else:
ipc += 1 - (id&2)
while ipr >= 0 and ipr < len(cs) and ipc >= 0 and ipc < len(cs[ipr]):
op = cs[ipr][ipc]
if op == '>':
dp += 1
elif op == '<':
dp -= 1
elif op == '+':
ds[dp] += 1
elif op == '-':
ds[dp] -= 1
elif op == '.':
print(chr(ds[dp]), end='')
elif op == ',':
ds[dp] = input()
elif op == '/':
id = ~id
elif op == '\\':
id ^= 1
elif op == '!':
step()
elif op == '?':
if not ds[dp]:
step()
step()

if __name__ == '__main__':
snusp(5, HW)</lang>
{{out}}
<pre>
Hello World!
</pre>


=={{header|Racket}}==
=={{header|Racket}}==