Seite 1 von 1

Zahlenschloss rätsel lösen

Verfasst: Montag 11. Mai 2020, 09:17
von quhxl
Ich bin letztens im Internet auf einige Rätsel gestoßen und dachte mir, dass man das Lösen doch automatisieren könnte. Ich habe damit aber noch keine Erfahrung und frage mich wie man das ganze wohl am besten angeht. Die Rätsel sind wie folgt aufgebaut: Man bekommt mehrere Hinweise um ein dreistelliges Zahlenschloss zu lösen. Beispiel Rätsel:

682: Der finale Code beinhaltet nur eine dieser Zahlen. Sie befindet sich bereits an der richtigen Stelle.
614: Der finale Code beinhaltet nur eine dieser Zahlen. Sie befindet sich nicht an der richtigen Stelle.
206: Der finale Code beinhaltet zwei dieser Zahlen. Sie befinden sich nicht an der richtigen Stelle.
738: Keine dieser Zahlen ist im finalen Code enthalten.
780: Der finale Code beinhaltet nur eine dieser Zahlen. Sie befindet sich nicht an der richtigen Stelle.

Vielleicht kann mir ja jemand weiterhelfen.

Re: Zahlenschloss rätsel lösen

Verfasst: Dienstag 26. Mai 2020, 13:54
von DarthNihilus
Also du müsstest den Computer dazu bringen die Zahlen zu vergleichen. Du musst mehrere Funktionen schreiben, die nacheinander die Kriterien abfragen. Zunächst ob irgendeine Zahl überhaupt im Code ist. Danach wie viele Zahlen. Dann ob die Zahl an der richtigen Stelle steht oder nicht. Das muss der Computer dann kombinieren und auf Regelmäßigkeit prüfen. Wenn das dann beendet ist muss er den Code ausgeben. Dann musst du ein paar mal überprüfen ob stimmt was er macht. Wenn das dann fertig ist hast du alles automatisiert.

LG

Re: Zahlenschloss rätsel lösen

Verfasst: Dienstag 26. Mai 2020, 14:13
von kbr
Die Lösung lautet 042 (kann man im Kopf rauskriegen).
Das Spiel heißt Mastermind. Einfach mal nach "Mastermind Python" googlen – dann findest Du sogar Beiträge hier im Forum.

Re: Zahlenschloss rätsel lösen

Verfasst: Dienstag 26. Mai 2020, 14:30
von __blackjack__
@quhxl: Du müsstest Funktionen schreiben, die eine gegebene Kombination darauf testet ob sie dem jeweiligen Hinweis genügt. Dann eine Funktion die eine gegebene Kombination mit Hilfe der Funktionen auf alle Hinweise prüft. Und dann eine Schleife über alle Kombinationen, die diese Funktion aufruft. Und die Kombination(en) die alle Hinweise erfüllen, gibst Du aus.

Re: Zahlenschloss rätsel lösen

Verfasst: Dienstag 26. Mai 2020, 17:37
von sparrow
@quhxl: Wobei auch die Frage ist, ob du das Rätstel einfach nur lösen - oder möglichst effizient lösen möchtest.

Re: Zahlenschloss rätsel lösen

Verfasst: Mittwoch 27. Mai 2020, 10:46
von __blackjack__
Eine Lösung, die die Hinweise etwas strikter auslegt als nötig, aber trotzdem das Ergebnis liefert:

Code: Alles auswählen

#!/usr/bin/env python3
from functools import partial


def contains_at_correct_position(digits, expected_count, combination):
    return (
        sum(
            int(expected_digit == candidate_digit)
            for expected_digit, candidate_digit in zip(digits, combination)
        )
        == expected_count
    )


def contains_at_incorrect_position(digits, expected_count, combination):
    return (
        contains_at_correct_position(digits, 0, combination)
        and len(set(digits) & set(combination)) == expected_count
    )


def does_not_contain_any(digits, combination):
    return not set(digits) & set(combination)


def apply_tests(tests, combination):
    return all(test(combination) for test in tests)


def main():
    all_combinations = (format(i, "03d") for i in range(1000))
    hints_filter = partial(
        apply_tests,
        [
            partial(contains_at_correct_position, "682", 1),
            partial(contains_at_incorrect_position, "614", 1),
            partial(contains_at_incorrect_position, "206", 2),
            partial(does_not_contain_any, "738"),
            partial(contains_at_incorrect_position, "780", 1),
        ],
    )
    for combination in filter(hints_filter, all_combinations):
        print(combination)


if __name__ == "__main__":
    main()