brainfuck-encoder/main.go

119 lines
1.8 KiB
Go
Raw Permalink Normal View History

2024-01-14 15:39:36 +09:00
package main
import (
"fmt"
"os"
"regexp"
"slices"
)
// encode text to brainfuck
func encode(text string, format bool) (bf string) {
pointer := 0
ascii_codes := []rune{}
bf += "++++++++++[\n"
for _, c := range text {
if !slices.Contains(ascii_codes, c) {
ascii_codes = append(ascii_codes, c)
bf += "> "
for i := 1; i <= int(int(c)/10); i++ {
if i%5 == 0 {
bf += "+ "
continue
}
bf += "+"
}
bf += "\n"
}
}
for i := 0; i < len(ascii_codes); i++ {
bf += "<"
}
bf += "-\n]\n"
printed_chars := []rune{}
for _, c := range text {
var next_pointer int
for i, ascii := range ascii_codes {
if ascii == c {
next_pointer = i + 1
break
}
}
pointer_delta := next_pointer - pointer
delta_abs := pointer_delta
if pointer_delta < 0 {
delta_abs = -pointer_delta
}
for i := 0; i < delta_abs; i++ {
if pointer_delta < 0 {
bf += "<"
continue
}
bf += ">"
}
is_printed := false
for _, printed_char := range printed_chars {
if c == printed_char {
is_printed = true
}
}
if !is_printed {
for i := 1; i <= int(c)%10; i++ {
if i%5 == 0 {
bf += "+ "
continue
}
bf += "+"
}
printed_chars = append(printed_chars, c)
}
bf += " .\n"
pointer = next_pointer
}
if !format {
re := regexp.MustCompile(`[^><+-.,\[\]]+`)
bf = re.ReplaceAllString(bf, "")
}
return bf
}
func main() {
format := false // if format is true, turn on formatter
// check there are arguments
if len(os.Args) < 2 {
panic("arguments error")
} else if len(os.Args) >= 3 {
// parse flag
if os.Args[2] == "--format" || os.Args[2] == "-F" {
format = true
}
}
// get ascii text
text := os.Args[1]
encoded_code := encode(text, format)
fmt.Println(encoded_code)
}