examples/advanced/01_advanced_techniques.cat
# Exemple 6 : Exemples avancés

print("⇒ Calculatrice avec pattern matching")

calculer = (operation, a, b) => {
    match operation {
        "+" => { a + b }
        "-" => { a - b }
        "*" => { a * b }
        "/" => {
            match b {
                0 => {
                    print("Erreur: division par zéro")
                    None
                }
                _ => { a / b }
            }
        }
        "**" => { a ** b }
        op => {
            print("Opération inconnue:", op)
            None
        }
    }
}

print("10 + 5 =", calculer("+", 10, 5))
print("10 - 5 =", calculer("-", 10, 5))
print("10 * 5 =", calculer("*", 10, 5))
print("10 / 5 =", calculer("/", 10, 5))
print("2 ** 10 =", calculer("**", 2, 10))
print("10 / 0 =", calculer("/", 10, 0))

print("\n⇒ Nombres de Fibonacci")

fibonacci = (n) => {
    match n {
        0 => { 0 }
        1 => { 1 }
        n => {
            a = 0
            b = 1
            i = 2
            while i <= n {
                temp = a + b
                a = b
                b = temp
                i = i + 1
            }
            b
        }
    }
}

print("Premiers nombres de Fibonacci:")
for i in range(15) {
    print("  fib(", i, ") =", fibonacci(i))
}

print("\n⇒ Nombres premiers")

est_premier = (n) => {
    match n {
        n if n < 2 => { False }
        2 => { True }
        n if n % 2 == 0 => { False }
        n => {
            # Vérifier les diviseurs impairs jusqu'à √n
            diviseur = 3
            limite = n / 2  # Approximation simple
            premier = True

            while diviseur <= limite and premier {
                if n % diviseur == 0 {
                    premier = False
                }
                diviseur = diviseur + 2
            }

            premier
        }
    }
}

print("Nombres premiers jusqu'à 50:")
for n in range(2, 51) {
    if est_premier(n) {
        print("  ", n)
    }
}

print("\n⇒ Somme avec boucle")

# Calculer la somme des n premiers entiers
somme_entiers = (n) => {
    somme = 0
    i = 1
    while i <= n {
        somme = somme + i
        i = i + 1
    }
    somme
}

print("Somme 1..10:", somme_entiers(10))
print("Somme 1..100:", somme_entiers(100))

print("\n⇒ Conversion de température")

convertir_temperature = (valeur, de, vers) => {
    # D'abord convertir en Celsius
    celsius = match de {
        "C" => { valeur }
        "F" => { (valeur - 32) * 5 / 9 }
        "K" => { valeur - 273.15 }
        _ => { print("Unité source inconnue"); 0 }
    }

    # Puis convertir de Celsius vers l'unité cible
    match vers {
        "C" => { celsius }
        "F" => { celsius * 9 / 5 + 32 }
        "K" => { celsius + 273.15 }
        _ => { print("Unité cible inconnue"); 0 }
    }
}

print("0°C en Fahrenheit:", convertir_temperature(0, "C", "F"))
print("100°C en Fahrenheit:", convertir_temperature(100, "C", "F"))
print("32°F en Celsius:", convertir_temperature(32, "F", "C"))
print("273.15 K en Celsius:", convertir_temperature(273.15, "K", "C"))