commit c55dac1b0f0d1a5cb64004002505c51306d5b7e9 Author: sunwoo1524 Date: Sun Jan 14 15:39:36 2024 +0900 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4223e96 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +brainfuck-encoder \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8fd33e6 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Brainfuck Encoder +Encode ASCII text to brainfuck code. + +## Using +``` +# build +go build . + +# run +./brainfuck-encoder "ASCII Text" [--format|-F] +``` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..da322e0 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.worldc.one/sunwoo1524/brainfuck-encoder + +go 1.21.6 diff --git a/main.go b/main.go new file mode 100644 index 0000000..8d98fec --- /dev/null +++ b/main.go @@ -0,0 +1,118 @@ +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) +}