// 1. hét – A gyakorlati feladatok megoldásai Go nyelven
// Futtatás: go run ./h01/exercises
package main

import (
	"fmt"
	"math"
	"strconv"
)

// F1. Hány bit szükséges egy n >= 0 egész szám tárolásához?
func bitsNeeded(n int64) int {
	bits := 1
	for n > 1 {
		n = n / 2
		bits++
	}
	return bits
}

// F2. Kettes számrendszerbeli alak ismételt osztással.
func toBinary(n int) string {
	if n == 0 {
		return "0"
	}
	result := ""
	for n > 0 {
		result = strconv.Itoa(n%2) + result
		n = n / 2
	}
	return result
}

// F3. Kisbetű -> nagybetű a karakterkód segítségével.
func toUpper(c rune) rune {
	if c >= 'a' && c <= 'z' {
		return c - ('a' - 'A')
	}
	return c
}

// F4. Két valós szám egyenlősége tűréssel.
func almostEqual(x, y float64) bool {
	return math.Abs(x-y) < 1e-9
}

// F5. Igazságtábla. Go-ban nincs logikai XOR operátor: a != b ugyanazt adja.
func truthTable() {
	fmt.Println("  a      b      a&&b   a||b   !a     a!=b")
	for _, a := range []bool{false, true} {
		for _, b := range []bool{false, true} {
			fmt.Printf("  %-6v %-6v %-6v %-6v %-6v %-6v\n", a, b, a && b, a || b, !a, a != b)
		}
	}
}

// F6. Túlcsordulás felismerése összeadás előtt (int32).
func addWouldOverflow(x, y int32) bool {
	if y > 0 {
		return x > math.MaxInt32-y
	}
	if y < 0 {
		return x < math.MinInt32-y
	}
	return false
}

func main() {
	x := 0.1
	fmt.Println("F1. bitsNeeded(255) =", bitsNeeded(255), ", bitsNeeded(256) =", bitsNeeded(256))
	fmt.Println("F2. toBinary(50) =", toBinary(50), " (ellenőrzés:", strconv.FormatInt(50, 2)+")")
	fmt.Printf("F3. toUpper('g') = %c, toUpper('7') = %c\n", toUpper('g'), toUpper('7'))
	fmt.Println("F4. almostEqual(0.1+0.2, 0.3) =", almostEqual(x+0.2, 0.3))
	fmt.Println("F5.")
	truthTable()
	fmt.Println("F6. MaxInt32 + 1 túlcsordul?", addWouldOverflow(math.MaxInt32, 1))
	fmt.Println("    1000 + 2000 túlcsordul?   ", addWouldOverflow(1000, 2000))
}
