| Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann. |
Diskussion: Sicherheitsbits im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Die Firma EyBiM hat ein neues Sicherheitssystem entwickelt - vereinfacht gesagt handelt es sich um einen Chip mit X ...
![]() |
| | #1 (permalink) | ||
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Anzeige Die Firma EyBiM hat ein neues Sicherheitssystem entwickelt - vereinfacht gesagt handelt es sich um einen Chip mit X "Sicherheitsbits". Bsp: [1,1,1,1,1,1] Sofern alle Bits gesetzt sind, wird ein OK Signal gesendet (und dadurch ein Schloss aufgemacht bzw. eine Tür geöffnet). Regeln zum Setzen der Bits: das höchste Bit (links) kann beliebig gesetzt oder gelöscht werden. sonst: ein Bit kann nur dann gesetzt oder gelöscht werden, wenn das nächsthöhere Bit gelöscht und die anderen höherwertigen Bits gesetzt sind. D.h das "nächstlinkere" Bit muss 0 sein und die anderen "linkeren" Bits (sofern vorhanden) 1 entsprechen. Formaler ausgedrückt: Sei A ein Array mit Bits =[a1,a2,a3,...,an] Das i-te Bit kann nur dann gesetzt/gelöscht werden, wenn: a)es das erste Bit ist <=> i=1 b)wenn das Bit i-1=0 ist und alle anderen Bits von 1 bis i-2=1 sind. Bsp: x,0,0,0,0,0 <- x kann beliebig sein. 0,x,0,0,0,0 <- x kann beliebig sein. 1,0,x,0,0,0 <- x kann beliebig sein. 1,1,0,x,0,0, <- x kann beliebig sein. Die Sicherheitsprüfung besteht nun darin, mit einem biometrsichen Scanner einige Daten auszulesen, daraus einen Startzustand für den Chip zu bilden (z.B 1,1,0,1,0,0). Nach diesem Schritt führt der User seine persönliche Security-Card ein. Auf dieser Karte ist einfach eine Abfolge an Schritten gespeichert, so dass der Chip aus dem Startzustand in den [1,1,1,1,1,1] Zustand kommt. Damit bleibt ein Diebstahl/Verlust der Karte unproblematisch. Ganz zufälligerweise ist der Startzustand des Chips für Dich gleich den ersten 6 Bits Deiner Habo-Userid. Berechne nun eine (für Dich gültige) Abfolge von Schritten. Bsp: von [0,0,0] nach [1,1,1] Zitat:
Zitat:
Wenn Du Dich an das Ausgabeformat in diesem Beispiel hälst, bekommst Du einen Bonus Edit: hab mal die Schwierigkeit etwas höher gesetzt.
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | ||
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | 1)ein gesetztes Bit ist =1 2)die ersten 6 Bits sind bei Dir 000111 (ist zumindest imho üblich, von rechts nach links zu gehen, wegen der zweierpotenzen ->2^5+2^4+2^3+2^2+2^1+ 2^0) das wären 4 Zwischenschritte. Natürlich kannst Du bei der [1,0,0,0,0,0] Version bleiben - wären mindestens 42 Zwischenschritte
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #4 (permalink) |
![]() Registriert seit: 17.01.06 ![]() Likes: 7 | Bin.: 11000000001010 [0,0,1,0,1,0], [1,0,1,0,1,0], [1,0,1,0,0,0], [1,0,1,0,0,1], [1,0,1,0,1,1], [1,0,0,0,1,1], [1,0,0,1,1,1], [1,0,1,1,1,1], [0,0,1,1,1,1], [0,1,1,1,1,1], [1,1,1,1,1,1] Wäre das richtig? Bin mir nicht ganz sicher ob ich es richtig verstanden habe. |
| | |
| | #5 (permalink) | |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Zitat:
Man kann ein Bit ändern, wenn es das erste (von links) ist oder wenn das linke "Nachbarbit"=0 und die anderen linkeren Nachbarn (sofern vorhanden) =1 sind. Code:
[0,0,1,0,1,0], [1,0,1,0,1,0], [1,0,1,0,0,0], [1,0,1,0,0,1]
^ ^ ^ ^ ^=0=>ok
| | | =0 ->nicht ok
=0 ->nicht ok Code: [0,0,1,0,1,0],[0,1,1,0,1,0],[1,1,1,0,1,0],[1,1,1,0,0,0],[0,1,1,0,0,0]...
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | |
| | |
| | #6 (permalink) |
| Registriert seit: 07.03.08 ![]() Likes: 0 | Mir war, als hätte ich kürzlich einen permutations-Algo gesehen, der genau nach diesem Schema vorgegegangen ist. Mal schauen ob ich den wieder finde... |
| | |
| | #7 (permalink) | |
![]() Registriert seit: 17.01.06 ![]() Likes: 7 | Zitat:
| |
| | |
| | #8 (permalink) |
| Registriert seit: 01.11.03 ![]() Likes: 0 | Hab mich mal dran gesetzt. Der erste Ansatz hat sogar funktioniert (dem entsprechend kurz ist auch das Programm...) ![]() Denke ich zumindest mal: Code: [[1,0,0,1,0,0],[1,0,1,1,0,0],[0,0,1,1,0,0],[0,1,1,1,0,0],[1,1,1,1,0,0],[1,1,1,1,0,1],[0,1,1,1,0,1],[0,0,1,1,0,1],[1,0,1,1,0,1],[1,0,0,1,0,1],[0,0,0,1,0,1],[0,1,0,1,0,1],[1,1,0,1,0,1],[1,1,0,0,0,1],[0,1,0,0,0,1],[0,0,0,0,0,1],[1,0,0,0,0,1],[1,0,1,0,0,1],[0,0,1,0,0,1],[0,1,1,0,0,1],[1,1,1,0,0,1],[1,1,1,0,1,1],[0,1,1,0,1,1],[0,0,1,0,1,1],[1,0,1,0,1,1],[1,0,0,0,1,1],[0,0,0,0,1,1],[0,1,0,0,1,1],[1,1,0,0,1,1],[1,1,0,1,1,1],[0,1,0,1,1,1],[0,0,0,1,1,1],[1,0,0,1,1,1],[1,0,1,1,1,1],[0,0,1,1,1,1],[0,1,1,1,1,1],[1,1,1,1,1,1]] |
| | |
| | #9 (permalink) | |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Zitat:
der versprochene Bonus
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | |
| | |
| | #10 (permalink) |
| Registriert seit: 22.03.08 ![]() Likes: 0 | perl-Lösung Ein Fünftel des Codes ist nur die Vorbereitung für die Darstellung der validierbaren Ausgabe und ich hab n Bisschen viele Klammern benutzt, weil ich mir bei der prescendence von logischem NOT, bitweisen Operatoren und Potenz-Operator nicht sicher war, aber nunja. Mein Lösung für meine UID (18149): Code: [[1,0,0,1,0,1],[0,0,0,1,0,1],[0,1,0,1,0,1],[1,1,0,1,0,1],[1,1,0,0,0,1],[0,1,0,0,0,1],[0,0,0,0,0,1],[1,0,0,0,0,1],[1,0,1,0,0,1],[0,0,1,0,0,1],[0,1,1,0,0,1],[1,1,1,0,0,1],[1,1,1,0,1,1],[0,1,1,0,1,1],[0,0,1,0,1,1],[1,0,1,0,1,1],[1,0,0,0,1,1],[0,0,0,0,1,1],[0,1,0,0,1,1],[1,1,0,0,1,1],[1,1,0,1,1,1],[0,1,0,1,1,1],[0,0,0,1,1,1],[1,0,0,1,1,1],[1,0,1,1,1,1],[0,0,1,1,1,1],[0,1,1,1,1,1],[1,1,1,1,1,1]] |
| | |
| | #11 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | @MontyPerl: Bonus Sonst: Validierer zum selbsttesten
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #12 (permalink) |
| Senior Member Registriert seit: 03.09.05 ![]() Likes: 0 | Hier eine Haskell-Lösung, hätte man ein bisschen lesbarer schreiben können, funktioniert aber auch so. Man kann einen Startzustand in beliebige Endzustände überführen(findPathExt). Zum Finden einer Lösung ist findPath <startzustand> aufzurufen. code Beispiel für meine User-Id(11149): loesung Edit: Leicht verbesserte Version eingefügt. |
| | |
| | #13 (permalink) |
| Registriert seit: 01.11.03 ![]() Likes: 0 | So... dann will ich auch mal meine C++ Lösung posten ... |
| | |
| | #14 (permalink) |
| Senior Member Registriert seit: 07.01.03 ![]() Likes: 19 | Ich hab leider grad gar keine Zeit, das zu vervollständigen, daher hier nur mal die flip-Operationen in SML zusammengehackt. Wer mag, erweitert die Funktionen einfach um einen weiteren Parameter (Liste), an die jeder Schritt angehängt wird. hd2 und tl2 sind einfach ein Umbau von head und tail (beides auf leeren Listen nicht definiert). An isOne_, set _ und clear _ sollte eigentlich ne Exception fliegen, da hab ich aber die Syntax nicht mehr im Kopf ![]() Code: fun tl2 [] = [] | tl2 (xs) = tl(xs) fun hd2 [] = [] | hd2 (xs) = hd(xs)::[] fun isOne [] = true | isOne (0::xs) = false | isOne (1::xs) = isOne(xs) | isOne _ = false fun set [] = [] | set (1::xs) = 1::(set(xs)) | set (0::(0::xs)) = if isOne(xs) then set(1::(0::xs)) else set(0::(0::(set(xs)))) | set (0::(1::xs)) = set (0::(hd2(clear(1::xs)))@(set(tl2(clear(1::xs))))) | set (0::xs) = 1::[] | set _ = [] and clear [] = [] | clear (0::xs) = 0::xs | clear (1::(0::xs)) = if isOne(xs) then 0::(0::xs) else clear(1::(0::(set(xs)))) | clear (1::xs) = 0::((hd2(clear(xs))))@(set(tl2(clear(xs)))) | clear _ = [] |
| | |
| | #15 (permalink) |
| Registriert seit: 21.04.08 ![]() Likes: 0 | Hallo! Code: def doIt(id, fr=True):
if "".join(id) == "1"*len(id): return
if fr: result.append("["+ ",".join(id) +"]")
for i in range(0, len(id)):
if fr and id[i] == "1": continue
if validFlip(id, i):
id[i] = str(int(not int(id[i])))
result.append("["+ ",".join(id) +"]")
doIt(id, False)
def validFlip(id, i):
if (i==0) or (id[i-1] == "0" and False not in [ bool(int(id[x])) for x in range(0,i-1) ]): return True
elif i-2 == -1: return id[i-1] == "0"
else: return False
if __name__ == '__main__':
result = [ ]
doIt(list("001100"))
print "["+ ",".join(result) +"]" Code: valid([[0,0,1,1,0,0],[1,0,1,1,0,0],[0,0,1,1,0,0],[0,1,1,1,0,0],[1,1,1,1,0,0],[1,1,1,1,0,1],[0,1,1,1,0,1],[0,0,1,1,0,1],[1,0,1,1,0,1],[1,0,0,1,0,1],[0,0,0,1,0,1],[0,1,0,1,0,1],[1,1,0,1,0,1],[1,1,0,0,0,1],[0,1,0,0,0,1],[0,0,0,0,0,1],[1,0,0,0,0,1],[1,0,1,0,0,1],[0,0,1,0,0,1],[0,1,1,0,0,1],[1,1,1,0,0,1],[1,1,1,0,1,1],[0,1,1,0,1,1],[0,0,1,0,1,1],[1,0,1,0,1,1],[1,0,0,0,1,1],[0,0,0,0,1,1],[0,1,0,0,1,1],[1,1,0,0,1,1],[1,1,0,1,1,1],[0,1,0,1,1,1],[0,0,0,1,1,1],[1,0,0,1,1,1],[1,0,1,1,1,1],[0,0,1,1,1,1],[0,1,1,1,1,1],[1,1,1,1,1,1]]) yes Felix |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |