init
This commit is contained in:
commit
c55dac1b0f
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
brainfuck-encoder
|
11
README.md
Normal file
11
README.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Brainfuck Encoder
|
||||||
|
Encode ASCII text to brainfuck code.
|
||||||
|
|
||||||
|
## Using
|
||||||
|
```
|
||||||
|
# build
|
||||||
|
go build .
|
||||||
|
|
||||||
|
# run
|
||||||
|
./brainfuck-encoder "ASCII Text" [--format|-F]
|
||||||
|
```
|
3
go.mod
Normal file
3
go.mod
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module git.worldc.one/sunwoo1524/brainfuck-encoder
|
||||||
|
|
||||||
|
go 1.21.6
|
118
main.go
Normal file
118
main.go
Normal file
|
@ -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)
|
||||||
|
}
|
Loading…
Reference in a new issue