⚠️ 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!