"Tresor knacken" in C

#1
Hi.

Ich stecke gerade bei einer ziemlich kniffligen Aufgabe fest:

Code:
Knacke den Tresor mit 9 Kippschaltern (oben || unten):

1. Wenn Schalter 3 auf „oben“ gestellt wird, dann müssen sowohl Schalter 7 als auch Schalter 8
auf „unten“ gestellt werden.
2. Wenn Schalter 1 auf „unten“ gestellt wird, dann muss von den Schaltern 2 und 4 mindestens
einer auf „unten“ gestellt werden.
3. Von den beiden Schaltern 1 und 6 muss mindestens einer auf „unten“ gestellt werden.
4. Wenn Schalter 6 auf „unten „gestellt wird, dann müssen 7 auf „unten“ und 5 auf „oben“
stehen
5. Falls sowohl Schalter 9 auf „unten“ als auch Schalter 1 auf „oben“ gestellt werden, dann
muss 3 auf „unten“ stehen.
6. Von den Schaltern 8 und 2 muss mindestens einer auf „oben“ stehen.
7. Wenn Schalter 3 auf „unten“ oder Schalter 6 auf „oben“ steht oder beides der Fall ist, dann
müssen Schalter 8 auf „unten“ und Schalter 4 auf „oben“ stehen.
8. Falls Schalter 9 auf „oben“ steht, dann müssen Schalter 5 auf „unten“ und Schalter 6 auf
„oben“ stehen.
9. Wenn Schalter 4 auf „ unten“ steht, dann müssen Schalter 3 auf „unten“ und Schalter 9 auf
„oben“ stehen.
Ich habe mal die Bedingungen mal so formuliert, allerdings finde ich keinen Weg, wie ich mit der Abfrage beginnen soll...

Code:
1. 3+            7-  &&  8-
2. 1-            2-  ||  4-
3.               1-  ||  6-
4. 6-            5+  &&  7-
5. 9- && 1+      3-    
6.               2+  ||  8+
7. 3- || 6+      4+  &&  8-
8. 9+            5-  &&  6+
9. 4-            3-  &&  9+
C:
#include <stdio.h>

int main(int argc, char** argv)
{
    int schalter[9] = {};

    int ergebnis[9] = {0,0,0,0,0,0,0,0,0};


    if (schalter[6] == 0 && schalter[7] == 0)  // 1. Bedingung
    {
        ergebnis[2] == 1;
    }
    if (schalter[1] == 0 || schalter[3] == 0)   // 2. Bedingung
    {
        ergebnis[0] == 1;
    }
    
    (schalter[0] == 0 || schalter[5] == 0);   // 3. Bedingung

    if (schalter[4] == 1 && schalter[6] == 0)   // 4. Bedingung
    {
        ergebnis[5] == 1;
    }
    if (schalter[8] == 0 && schalter[0] == 1)  // 5. Bedingung
    {
        ergebnis[2] == 0;
    }
    
    (schalter[1] == 1 || schalter[7] == 1);  // 6. Bedingung
    
    if ((schalter[2] == 0 || schalter[5] == 1) || (schalter[2] == 0 && schalter[5] == 1))  // 7. Bedingung
    {
        (ergebnis[7] == 0 && ergebnis[3] == 1);
    }
    if (schalter[8] == 1)  // 8. Bedingung
    {
        (ergebnis[4] == 0 && ergebnis[5] == 1);
    }
    if (schalter[3] == 0)  // 9. Bedingung
    {
        (ergebnis[2] == 0 && ergebnis[8] == 1);
    }
}
Die Bedingungen sind fürs erste einfach nur reingetippt... ich bin mir nicht sicher wie ich hier überhaupt weitermachen kann.

Hat davon hier eventuell jemand Ahnung wie man hier vorgehen könnte?

Bin für jeden Tipp dankbar!
 

German

Well-Known Member
c-b Experte
#2
Wenn ich das zu lösen hätte, wären bitweise Operationen das Mittel meiner Wahl. Zwei Zustände lassen sich durch 0 und 1 beschreiben. Wie's der Teufel will kann ein Bit auch genau diese beiden Zustände annehmen ;) Also deklariere ein unsigned und initialisiere es. Dann arbeitest du mit den 9 niedrigsten Bits. Diese kannst du mit dem | Operator verändern und mit dem & Operator prüfen, ob andere Bits gesetzt sind oder nicht. Indem du dir zur Aufgabenstellung passende Bitmasken erstellst, kannst du mit einer Operation gleich mehrere Bits in einer Operation ändern bzw. prüfen.
Dazu ist es natürlich nötig sich mit der binären Repräsentation von Zahlen auseinander zu setzen. Mag nicht jeder sofort. Aber wenn man es einmal verstanden hat, ist das unglaublich hilfreich und schnell.
Sofern du auf Windows unterwegs bist, hilft dir dessen Rechner App. Style auf "Programmierer" einstellen, dann hast du Integer parallel in ihrer hexadezimalen, dezimalen, oktalen und binären Darstellung, und du kannst auch gleich mit den bitweisen Operationen testen, was passiert.
 
Gefällt mir: neo
Oben