⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
{{implementation|SNUSP}}{{collection|RCSNUSP}} Only Core SNUSP today. Fixed size data store, no bounds checking.
package main
import (
"fmt"
"strings"
)
// lovely Core SNUSP implementation of Hello World,
// taken from the Ruby Execute SNUSP page.
// it happens to run with only 5 bytes of data store!
const hw = `
/++++!/
### =====
?\>++.>+.+++++++..+++\
\+++\ | /+>+++++++>/ /++++++++++<<.++>./
$+++/ | \+++++++++>\ \+++++.>.+++.-----\
\==-<<<<+>+++/ /=.>.+>.--------.-/`
func main() {
snusp(5, hw)
}
// input is a multi-line string.
func snusp(dLen int, raw string) {
ds := make([]byte, dLen) // data store
var dp int // data pointer
// toss leading \n of code if it's there
if raw[0] == '\n' {
raw = raw[1:]
}
// make 2 dimensional instruction store, declare instruction pointers
is := strings.Split(raw, "\n")
var ipr, ipc int
// look for starting instruction
findStart:
for r, row := range is {
for c, i := range row {
if i == '$' {
ipr, ipc = r, c
break findStart
}
}
}
// starting direction is always rt
const (
rt = iota
dn
lt
up
)
id := rt
// handy, below
step := func() {
if id&1 == 0 {
ipc += 1 - int(id&2)
} else {
ipr += 1 - int(id&2)
}
}
// execute
for ipr >= 0 && ipr < len(is) && ipc >= 0 && ipc < len(is[ipr]) {
switch is[ipr][ipc] {
case '>':
dp++
case '<':
dp--
case '+':
ds[dp]++
case '-':
ds[dp]--
case '.':
fmt.Printf("%c", ds[dp])
case ',':
fmt.Scanf("%c", &ds[dp])
case '/':
id = ^id
case '\\':
id ^= 1
case '!':
step()
case '?':
if ds[dp] == 0 {
step()
}
}
step()
}
}
Output:
Hello World!