Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
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.

Sicherheitsbits

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 ...

Antwort
Alt 16.11.08, 22:36   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard Sicherheitsbits

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:
[[0,0,0],[1,0,0],[1,0,1],[0,0,1],[0,1,1],[1,1,1]]
von [1,0,0] nach [1,1,1]
Zitat:
[[1,0,0],[1,0,1],[0,0,1],[0,1,1],[1,1,1]]
Optimalerweise sollte Dein Programm die Abfolge von jedem angegebenen Startzustand berechnen können.

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.
CDW ist offline   Mit Zitat antworten
Alt 16.11.08, 23:10   #2 (permalink)
 
Registriert seit: 16.10.07
Spyx Leistung: Facit NTK
Spyx eine Nachricht über ICQ schicken
Likes: 0
Standard

Ich hab jetzt einfach mal einen Online-Converter benutzt, um meine HaBo-User-ID ins Binärsystem zu übertragen (Link).

Meine User-ID ist: 16711
Umgerechnet ins Binärsystem: 100000101000111
Davon die ersten 6 Bits: 100000

Stimmt das so?
Wenn ja, dann hat es Qkiller ziemlich einfach .
Spyx ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 16.11.08, 23:39   #3 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

1)ein gesetztes Bit ist =1 , Ziel ist also [1,1,1,1,1,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.
CDW ist offline   Mit Zitat antworten
Alt 17.11.08, 07:43   #4 (permalink)
 
Registriert seit: 17.01.06
Oi!Alex Leistung: 8086
Likes: 7
Standard

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.
Oi!Alex ist offline   Mit Zitat antworten
Alt 17.11.08, 13:53   #5 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Zitat:
Original von Oi!Alex
Wäre das richtig? Bin mir nicht ganz sicher ob ich es richtig verstanden habe.
Nee, leider nicht. Habe noch eine formalere Definition im ersten Post hinzugefügt.
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
Währen bei Dir eher:
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.
CDW ist offline   Mit Zitat antworten
Alt 17.11.08, 15:24   #6 (permalink)
 
Registriert seit: 07.03.08
90nop Leistung: Facit NTK
Likes: 0
Standard

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...
90nop ist offline   Mit Zitat antworten
Alt 18.11.08, 07:28   #7 (permalink)
 
Registriert seit: 17.01.06
Oi!Alex Leistung: 8086
Likes: 7
Standard

Zitat:
Original von CDW
Nee, leider nicht. Habe noch eine formalere Definition im ersten Post hinzugefügt.
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.
Ah okay habs verstanden, muss mal schauen wann ich Zeit habe, da setzt ich mich da mal ran.
Oi!Alex ist offline   Mit Zitat antworten
Alt 18.11.08, 09:26   #8 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

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]]
Source folgt dann in ein paar Tagen
lagalopex ist offline   Mit Zitat antworten
Alt 18.11.08, 11:39   #9 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Zitat:
Original von lagalopex
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]]
der versprochene Bonus   

in diesem Format kann ich es durch den Validierer jagen :)
Code:
| ?- Lagalopexloesung=[[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]],
     valid(Lagalopexloesung).
yes
| ?-
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 20.11.08, 18:29   #10 (permalink)
 
Registriert seit: 22.03.08
MontyPerl Leistung: Facit NTK
Likes: 0
Standard

perl-Lösung   
Code:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
local $Data::Dumper::Indent = 0;

my $HaBoUID  = shift || 18149;    # My (MontyPerl's) UID is the default.
my $bits     = $HaBoUID & 63;     # 2**6 - 1
my @solution = fillBits($bits);

my $outArray = [];
for (@solution) {
    push @$outArray, [map { $_ ? 1 : 0 } split(//, sprintf("%06b", $_))];
}
my $dumped = Dumper $outArray;
$dumped =~ s/^\$VAR\d+ = //;
$dumped =~ s/;$//;
print $dumped, "\n";

sub fillBits {
    my ($bits, @way) = @_;
    if ($bits == 63) {
        # warm... warmer.. disco.
        return @way, $bits;
    }
    elsif (grep { $bits == $_ } @way) {
        # we had this number already.
        return;
    }
    for my $n (0 .. 5) {
        if (canSwitch($bits, $n)) {
            my @sol = fillBits($bits ^ (2**$n), @way, $bits);
            return @sol if @sol;
        }
    }
    return;
}

sub canSwitch {
    my ($bits, $bit) = @_;
    if (!((2**($bit + 1)) & $bits)) {
        for my $n (($bit + 2) .. 5) {
            if (!((2**$n) & $bits)) {
                return 0;
            }
        }
        return 1;
    }
    else {
        return 0;
    }
}

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]]
MontyPerl ist offline   Mit Zitat antworten
Alt 21.11.08, 18:16   #11 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

@MontyPerl:
Bonus   

Code:
valid([[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]]).
true.
:)


Sonst:
Validierer zum selbsttesten   

Code:
trans(X,X).                         
trans([0|T],[1|T]).                 
trans([1|T],[0|T]).                 
step([0|T1],[0|T2]) :- trans(T1,T2).  
step([1|T1],[1|T2]) :- step(T1,T2).  
                                    
valid([_]).                         
valid([X,Y|Z]) :- (trans(X,Y);step(X,Y)),        
        valid([Y|Z]),!; write(('Uebergang:',X->Y)).
auskommentiert   


Code:
trans(X,X).                          %Uebergang korrekt, wenn beide Zustaende gleich sind    
trans([0|T],[1|T]).                  %0 -> 1 ist zulaessig, Rest muss gleich sein
trans([1|T],[0|T]).                  %1 -> 0 genauso
step([0|T1],[0|T2]):-trans(T1,T2).   %auf eine 0 folgt ein Uebergang
step([1|T1],[1|T2]):- step(T1,T2).   %auf eine 1 kann nur der nächste Schritt folgen
                                     %Uebergang mit nur einem (Rest)Element 
valid([_]).                          %ist irgendwie immer korrekt ;)  
valid([X,Y|Z]):-(trans(X,Y);         %X->Y ein korrekter Uebergang oder
                 step(X,Y)),         %X->Y Schritt ist korrekt
        valid([Y|Z]),!;              %Y->Z sollte auch korrekt sein ->dann stimmt X->Z  
	write(('Uebergang:',X->Y)).  %sonst gib den unkorrekten Uebergang aus



Ausführbar mit Sicstus/SWI/GNU Prolog oder JLog (kann als Applet gestartet werden).
http://jlogic.sourceforge.net/download.html

Eingabe:
"valid([[0,1,0],[0,0,0],...])." <--- den "." am Ende nicht vergessen ;)
bei einer unkorrekten Schrittfolge wird der Schritt X->Y ausgegeben (bei einer korrekten nur yes/true).

__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 23.11.08, 16:35   #12 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

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   

Code:
import Control.Monad.State
import Control.Monad.Writer

canBeChanged :: [Int] -> Int -> Bool
canBeChanged _ 0 = True
canBeChanged xs n = all (==1) (take (n-1) xs) && (xs !! (n-1)) == 0

flipBit lst n = (take n lst) ++ [if (lst !! n) == 0 then 1 else 0] ++ (drop (n+1) lst)

getTransTo' :: Int -> Int -> [Int] -> StateT [Int] (Writer [[Int]]) ()
getTransTo' i n lst
    | lst !! i == n = return ()
    | canBeChanged lst i = put (flipBit lst i) >> get >>= tell . (:[])
    -- if we can't set it directly, set all bits left of it to their required values:
    | otherwise = sequence_ $ [getTransTo (i-1) 0] ++ [getTransTo x 1 | x <- reverse [0..i-2]] ++ [getTransTo i n]

getTransTo :: Int -> Int -> StateT [Int] (Writer [[Int]]) ()
getTransTo i n = get >>= getTransTo' i n

findPathExt :: [Int] -> [Int] -> [[Int]]
findPathExt lst pattern = [lst] ++ (execWriter $ execStateT solve lst)
    where solve = mapM_ (uncurry getTransTo) . reverse $ zip [0..length lst-1] pattern

findPath :: [Int] -> [[Int]]
findPath lst = findPathExt lst [1,1..]

Beispiel für meine User-Id(11149):
loesung   

Code:
[[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]]


Edit: Leicht verbesserte Version eingefügt.
Lesco ist offline   Mit Zitat antworten
Alt 23.11.08, 17:15   #13 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

So... dann will ich auch mal meine C++ Lösung posten
...   
Code:
#include <iostream>

using namespace std;

void bin(int i, bool sep = true)
{
	cout << ((sep)? "," : "") << "[";
	for (int n = 5; n >= 0; --n)
		cout << ((i>>n)&1) << ((n > 0)? "," : "");
	cout << "]";
}

void setbit(int &v, int p, int val = 1)
{
	if (((v >> p) & 1) == !!val)
		return;
	if (p < 5) {
		setbit(v, p + 1, 0);
		for (int pos = p + 2; pos < 6; ++pos)
			setbit(v, pos);
	}
	v ^= (1 << p);
	bin(v);
}

int main()
{
	int id;
	cout << "HaBo-UserId: " << flush;
	cin >> id;
	id &= 0x2f;
	cout << "Die Sechs-Bit-Zahl: " << id << endl;

	cout << "[";
	bin(id, false);

	int pos;
	for (pos = 0; pos < 6; ++pos)
		setbit(id, pos);
	cout << "]" << endl;
}
lagalopex ist offline   Mit Zitat antworten
Alt 24.11.08, 12:59   #14 (permalink)
Senior Member
 
Benutzerbild von t3rr0r.bYt3
 
Registriert seit: 07.01.03
t3rr0r.bYt3 Leistung: Z3
Likes: 19
Standard

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 _			= []
t3rr0r.bYt3 ist offline   Mit Zitat antworten
Alt 01.12.08, 20:15   #15 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard

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) +"]"
Prüfung mit JLog:
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
Gruß
Felix
Ook! ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Sicherheitsbits
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61