Σελίδα 1 από 1

count from 1 to 100

Δημοσιεύτηκε: 17 Δεκ 2018, 10:26
από foscilis

Κώδικας: Επιλογή όλων

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