Zahlenrätsel mit PowerShell lösen

Hallo zusammen,

Ich bin per Zufall auf folgendes Zahlenrätsel gestossen. Und habe Beschlossen, das mit PowerShell zu lösen.

Abu Ali al-Hasan ibn al-Hasan ibn al-Haitham (965–1041) war ein Mathematiker, Astronom und Physiker ersten Ranges. In seiner Schrift "Über die Lösung einer Zahlenfrage+ findet man folgendes Rätsel:

Als ein Schäfer nach der Grösse seiner Herde gefragt wird, antwortet er: "Es sind weniger als 500 Schafe. Teile ich die Anzahl meiner Schafe durch 2, 3, 4, 5 oder 6, so bleibt jedes Mal ein Schaf übrig. Teile ich meine Herde jedoch durch 7, so geht die Rechnung glatt auf." Wie gross ist die Herde?

Nun lösen wir dieses Zahlenrätsel mit PowerShell. Dazu braucht es erstmal eine mathematische Funktion, welche den Rest einer Division ausgibt. Diese Funktion heisst "Modulo" und wird in PowerShell mit dem % Symbol angegeben.

Zeig mir den Rest von 7 geteilt durch 6 = 1 (PowerShell: 7 % 6)

Zeig mir den Rest von 8 geteilt durch 6 = 2 (PowerShell: 8 % 6)

Nun müssen wir also alle Zahlen zwischen 0 und 500 herausfinden, welche durch 7 Teilbar sind. In einer Schleife addieren wir also immer 7 dazu.

Um den Code möglichst effizient zu halten, starten wir mit dem grössten Divisor. Erst wenn dort der Rest 1 ergibt untersuchen wir die anderen Reste der Divison.

$i = 0
while ($i -lt 500)
{
    $i = $i +7
    #Write-Host "X: $i"
    $mod2 = $i % 2
    $mod3 = $i % 3
    $mod4 = $i % 4
    $mod5 = $i % 5
    $mod6 = $i % 6
    
    If ($Mod6 -eq 1)
    {
        If ($Mod5 -eq 1)
        {
            If ($mod4 -eq 1)
            {
                If ($mod3 -eq 1)
                {
                    If ($mod2 -eq 1)
                    {
                        Write-Host "Solution: $i" -ForeGroundColor Green
                    }
                }
            }
        }
    }
}

Die Lösung ist also: 301

Noch viel schöner ist die Lösung von Andre Sicking (Twitter: @andre_sicking)

For($i = 0$i -le 500$i = $i + 7) {
If(($i % 2 -eq 1) -and ($i % 3 -eq 1) -and ($i % 4 -eq 1) -and ($i % 5 -eq 1) -and ($i % 6 -eq 1)) { Write-Host "Es sind $i Schafe." }
}
Liebe Grüsse
Andres Bohren