Zahlenschloss rätsel lösen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
quhxl
User
Beiträge: 1
Registriert: Montag 11. Mai 2020, 00:48

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.
DarthNihilus
User
Beiträge: 2
Registriert: Mittwoch 20. Mai 2020, 22:24

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
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@quhxl: Wobei auch die Frage ist, ob du das Rätstel einfach nur lösen - oder möglichst effizient lösen möchtest.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten