116 lines
1.7 KiB
Go
116 lines
1.7 KiB
Go
|
//go:build nazis_hitler_AGHAGHAAHHAHAHAH
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
func Check(err error) {
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var numbers = []int{23, 20, 31, 5, 29}
|
||
|
|
||
|
func DoubleChars(r io.Reader) io.Reader {
|
||
|
const n = 2
|
||
|
|
||
|
pr, pw := io.Pipe()
|
||
|
scanner := bufio.NewScanner(r)
|
||
|
buf := bufio.NewWriter(pw)
|
||
|
|
||
|
go func() {
|
||
|
defer func() {
|
||
|
Check(pw.Close())
|
||
|
}()
|
||
|
defer func() {
|
||
|
Check(buf.Flush())
|
||
|
}()
|
||
|
for scanner.Scan() {
|
||
|
text := scanner.Text()
|
||
|
for i := range text {
|
||
|
s := make([]byte, n, n)
|
||
|
for j := 0; j < n; j++ {
|
||
|
s[j] = text[i]
|
||
|
}
|
||
|
buf.Write(s)
|
||
|
}
|
||
|
_, err := buf.Write([]byte{'\n'})
|
||
|
Check(err)
|
||
|
}
|
||
|
}()
|
||
|
return pr
|
||
|
}
|
||
|
|
||
|
func Tr(r io.Reader, m map[byte]byte) io.Reader {
|
||
|
pr, pw := io.Pipe()
|
||
|
r = bufio.NewReader(r)
|
||
|
buf := bufio.NewWriter(pw)
|
||
|
|
||
|
go func() {
|
||
|
defer func() {
|
||
|
Check(pw.Close())
|
||
|
}()
|
||
|
defer func() {
|
||
|
Check(buf.Flush())
|
||
|
}()
|
||
|
loop:
|
||
|
for {
|
||
|
bs := make([]byte, 1)
|
||
|
_, err := r.Read(bs)
|
||
|
if err != nil {
|
||
|
switch err {
|
||
|
case io.EOF:
|
||
|
break loop
|
||
|
default:
|
||
|
panic(err)
|
||
|
}
|
||
|
}
|
||
|
b, ok := m[bs[0]]
|
||
|
if !ok {
|
||
|
b = bs[0]
|
||
|
}
|
||
|
buf.Write([]byte{b})
|
||
|
}
|
||
|
}()
|
||
|
return pr
|
||
|
}
|
||
|
|
||
|
func BinaryChar() io.Reader {
|
||
|
tr := map[byte]byte{
|
||
|
'0': ' ',
|
||
|
'1': '#',
|
||
|
}
|
||
|
|
||
|
r := func(r io.Reader) io.Reader {
|
||
|
return Tr(r, tr)
|
||
|
}(func(r io.Reader) io.Reader {
|
||
|
return DoubleChars(r)
|
||
|
}(func(nums []int) io.Reader {
|
||
|
pr, pw := io.Pipe()
|
||
|
buf := bufio.NewWriter(pw)
|
||
|
|
||
|
go func(w io.Writer) {
|
||
|
defer func() {
|
||
|
Check(pw.Close())
|
||
|
}()
|
||
|
defer func() {
|
||
|
Check(buf.Flush())
|
||
|
}()
|
||
|
for i := range nums {
|
||
|
fmt.Fprintf(w,
|
||
|
fmt.Sprintf("%%0%db\n",
|
||
|
len(nums)),
|
||
|
nums[i])
|
||
|
}
|
||
|
}(buf)
|
||
|
|
||
|
return pr
|
||
|
}(numbers)))
|
||
|
return r
|
||
|
}
|