count from 1 to 100
Δημοσιεύτηκε: 17 Δεκ 2018, 10:26
Κώδικας: Επιλογή όλων
// I suspect nil, Zero, Reverse, Identity, Magic and Measure used in Golang functions
// with nothing but if, return and basic integer operators are a Turing-complete system
// Wouldn't bet $5 on it tho
// All *I* needed was a program that counts from 0 to 100 in a pure way.
// ---dktf 2018
package main
import (
"fmt"
"reflect"
)
type F func(F) F
func Zero(f F) F {
return nil
}
func Reverse(f F) F {
if Equal(f, nil) {
return nil
}
return func(f2 F) F {
return f(f2)
}
}
func Magic(f1, f2 F) F {
if f1 == nil {
return f2
}
if f2 == nil {
return f1
}
return func(f F) F {
return f(f1)(f(f2))
}
}
func Inc(f F) F {
return Magic(Reverse, f)
}
func Identity(f F) F {
return f
}
func Joe(f F) F {
if Measure(f) > 0 {
return func(f F) F {
//fmt.Println(Measure(f)+1)
return Inc(f)
}
}
return Inc(Inc(f))
}
func Elizabeth(f F) F {
if Measure(f)%2 == 0 {
return func(f F) F {
return Joe(f)(Joe)(Joe)(Joe)(Joe)(Joe)(Joe)(Joe)(Joe)(f)(Joe)
}
}
return Joe(Joe(f))(Joe)(Joe)(Joe)(Joe)(Joe)(Joe)(Joe)(Joe)(f)
}
func Kitsos(f F) F {
return Joe(Joe(f))(f)(Joe)
}
func Equal(f1, f2 F) bool {
return reflect.ValueOf(f1) == reflect.ValueOf(f2)
}
func Elephant(f F) F {
if f == nil {
return Reverse(Kitsos)
}
a := Measure(f)
return func(f F) F {
for ; a > 0; a = a - 1 {
f = Inc(f)
}
return f
}
}
func Measure(f F) int {
if f == nil {
return 0
}
if Equal(f, Identity) {
return 1
}
if Equal(f, Reverse) {
return -1
}
return 1 + Measure(f(Identity))
}
func Do(f F) {
fmt.Println(Measure(f) - 1)
if Measure(f)+Measure(Elephant(f))+Measure(Kitsos(f))+Measure(Elizabeth(f)) < 309 {
Do(Inc(f))
}
return
}
func main() {
Do(Zero)
}