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) }