clock/swastika.go

116 lines
1.7 KiB
Go
Raw Normal View History

2024-08-11 00:51:15 +04:00
//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
}