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 Meine Lösung in Java Java     Code: public class Sicherheit { private String ablauf; //Speicher für den Ablauf ...

Antwort
Alt 12.12.08, 16:08   #16 (permalink)
 
Registriert seit: 09.12.08
Painii Leistung: Facit NTK
Likes: 0
Standard

Anzeige

Meine Lösung in Java

Java   
Code:
public class Sicherheit {
	private String ablauf;	//Speicher für den Ablauf der Änderungen
	private boolean first;	//Für ordentliche Auflistung in ablauf
	private int[] bits;	//Das Array mit der ID die geändert wird
	public Sicherheit(int[] a){
		this.ablauf="[";
		this.first=true;
		this.bits=a;
		ablauf();
	}
	
	private void ablauf(){	//Schreibt die Änderungen auf damit sie in den Validierer passen
		if(!first)ablauf=ablauf+",";
		ablauf=ablauf+"[";
		for(int i=0;i<this.bits.length;i++){
			if(i==0)ablauf=ablauf+this.bits[i];
			else ablauf=ablauf+","+this.bits[i];
		}
		ablauf=ablauf+"]";
		first=false;
	
	}
	private void machEins(int pos){
		if(this.bits[pos]==1)return;	//Zahl ist schon 1
		if(pos==0){						//Erste Zahl kann einfach geändert werden
			this.bits[pos]=1;
			this.ablauf();				//Schreibt die Änderung auf
			return;
		}
		else{							
			machNull(pos-1);			//Änder die Zahl links in eine 0
			for(int i=pos-2;i>=0;i--)machEins(i);	//Mach alle Zahlen links von der 0 zu 1
			this.bits[pos]=1;		//Jetzt darf ich ändern
			this.ablauf();			//Schreibt die Änderung auf
		}
	}
	private void machNull(int pos){
		if(this.bits[pos]==0)return;	//Zahl ist schon 0
		if(pos==0){	//Erste Zahl kann einfach geändert werden
			this.bits[pos]=0;
			this.ablauf();	//Schreibt die Änderung auf
			return;
		}
		else{
			machNull(pos-1);	//Änder die Zahl links in eine 0
			for(int i=pos-2;i>=0;i--)machEins(i);	//Mach alle Zahlen links von der 0 zu 1
			this.bits[pos]=0;	//Jetzt darf ich ändern
			this.ablauf();	//Schreibt die Änderung auf
		}
	}
	public void loesen(){	//Startet die Loesung
		for(int i=this.bits.length-1;i>=0;i--){
			this.machEins(i);	//Geht von rechts nach links durch das array und macht alles zu 1
		}
		this.ablauf=this.ablauf+"]";	//Abschluss des Verlaufs
	}
	
	public static void main(String[] args){
		int[] d1={1,1,1,0,1,1};	//Meine ID
		Sicherheit a=new Sicherheit(d1);
		a.loesen();
		System.out.println(a.ablauf);	//Ausgabe des Lösungswegs
	}
}

Prüfung   

Code:
valid([[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.
Painii ist offline   Mit Zitat antworten
Alt 12.12.08, 16:24   #17 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von Painii
Code:
private void machEins(int pos){
		if(this.bits[pos]==1)return;	//Zahl ist schon 1
		if(pos==0){						//Erste Zahl kann einfach geändert werden
			this.bits[pos]=1;
			this.ablauf();				//Schreibt die Änderung auf
			return;
		}
		else{							
			machNull(pos-1);			//Änder die Zahl links in eine 0
			for(int i=pos-2;i>=0;i--)machEins(i);	//Mach alle Zahlen links von der 0 zu 1
			this.bits[pos]=1;		//Jetzt darf ich ändern
			this.ablauf();			//Schreibt die Änderung auf
		}
	}
	private void machNull(int pos){
		if(this.bits[pos]==0)return;	//Zahl ist schon 0
		if(pos==0){	//Erste Zahl kann einfach geändert werden
			this.bits[pos]=0;
			this.ablauf();	//Schreibt die Änderung auf
			return;
		}
		else{
			machNull(pos-1);	//Änder die Zahl links in eine 0
			for(int i=pos-2;i>=0;i--)machEins(i);	//Mach alle Zahlen links von der 0 zu 1
			this.bits[pos]=0;	//Jetzt darf ich ändern
			this.ablauf();	//Schreibt die Änderung auf
		}
	}
Kleine Anregung zur Verbesserung: Fallen dir irgendwelche Gemeinsamkeiten bei den beiden Funktionen auf, die sich evtl. zusammenfassen ließen?
Lesco ist offline   Mit Zitat antworten
Alt 12.12.08, 17:53   #18 (permalink)
 
Registriert seit: 09.12.08
Painii Leistung: Facit NTK
Likes: 0
Standard

Ja, ich könnte einen 2. Parameter nehmen (z.b. boolean), und daraus eine Funktion machen die beide Werte setzen kann (false->0, true->1)...

Was ich auch zusammenfassen könnte ist der Teil wo ich die Werte vorher auf 1 bzw. 0 setze, da ich da eh nur kopiert habe:
...   
Code:
	private void machEins(int pos){
		if(this.bits[pos]==1)return;	//Zahl ist schon 1
		if(pos==0){						//Erste Zahl kann einfach geändert werden
			this.bits[pos]=1;
			this.ablauf();				//Schreibt die Änderung auf
			return;
		}
		else{							
			machTauschbar(pos);
			this.bits[pos]=1;		//Jetzt darf ich ändern
			this.ablauf();			//Schreibt die Änderung auf
		}
	}
	private void machNull(int pos){
		if(this.bits[pos]==0)return;	//Zahl ist schon 0
		if(pos==0){	//Erste Zahl kann einfach geändert werden
			this.bits[pos]=0;
			this.ablauf();	//Schreibt die Änderung auf
			return;
		}
		else{
			machTauschbar(pos);
			this.bits[pos]=0;	//Jetzt darf ich ändern
			this.ablauf();	//Schreibt die Änderung auf
		}
	}
	private void machTauschbar(int pos){
		machNull(pos-1);
		for(int i=pos-2;i>=0;i--)machEins(i);
	}

Aber ich mag sowas nicht so gerne und hab lieber zwei "eindeutige" Funktionen wo jeder auf einen Blick weiss was die machen
Painii ist offline   Mit Zitat antworten
Alt 12.12.08, 19:44   #19 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Das führt aber zu doppeltem Code, was bei Änderungen an diesem Codeabschnitt sehr schnell sehr nervig wird und setzeBit(int pos, int wert) oder so halte ich für ziemlich eindeutig. Außerdem machen derartige Wiederholungen den Code meines Erachtens schlechter les- und wartbar.
Lesco 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