Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Code Knacken (Simulationen)

Hannas fünfstelliges Zahlenschloss wurde verstellt. Das Zahlenschloss besteht aus fünf Ringen mit je zehn möglichen Einstellungen ('0', '1', '2', ..., '9').


Irgend eine Klassenkameradin hat ihr den Code abgeschaut und nun neu eingestellt.
Die Klassenkameradin hat den neuen Code leider vergessen. Aufgrund von Lieblingszahlen und Mustern haben die beiden zusammen jedoch folgendes rekonstruieren können:

  • Der neue Code enthält keine 5.
  • Der neue Code enthält mindestens einmal die Ziffer 3.
  • Der neue Code enthält mindestens einmal die Ziffer 6.
  • Der neue Code startet nicht mit einer geraden Ziffer, auch nicht mit der Null ("0").
  • Der neue Code ist fast aufsteigend. Das heißt, die nachfolgenden Ziffern sind nicht kleiner als die vorangehenden (z. b. "23368"). Dies jedoch mit maximal einer Ausnahme. An einer Stelle darf die Ziffernfolge absteigend sein (z. b. 23326), jedoch maximal einmal!



Lohnt es sich nun, von den theoretisch 100'000 Möglichkeiten die verbleibenden auszuprobieren? Oder soll Hanna doch besser ein neues Zahlenschloss anschaffen.

Teilaufgabe 1: Schreiben Sie ein Programm, das alle verbleibenden
Möglichkeiten ausgibt.

Teilaufgabe 2: Hanna kann eine Kombination in drei (3) Sekunden ausprobieren. Gehen wir davon aus, dass sie die richtige Kombination nach Durchprobieren etwa der Hälfte aller Möglichkeiten gefunden haben wird; wird sie es in weniger als einer Stunde schaffen?

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

2 Lösung(en)

package ch.programmieraufgaben.simulation.zahlenschloss;


/**
 * Programmieraufgabe Zahlenschloss
 * Web-Code: d4ko-cgvt
 * @version 0.1 (Apr 21, 2018)
 * @author Philipp Gressly Freimann 
 *         (phi@gress.ly)
 */
public class Zahlenschloss {

	final int ANZAHL_ZIFFERN       =      5;
	final int MAX_CODE             = 99_999;
	final int SEKUNDEN_PRO_VERSUCH =      3;

	public static void main(String[] args) {
		new Zahlenschloss().top();
	}


	void top() {
		int anzahlMoeglichkeiten = 0;
		for(int m = 0; m < MAX_CODE; m++) {
			if(istMoeglicherCode(m)) {
				anzahlMoeglichkeiten = anzahlMoeglichkeiten + 1;
				printMoeglichkeit(m);
			}
		}
		System.out.println("Total Möglichkeiten: " + anzahlMoeglichkeiten);
		int sekunden = anzahlMoeglichkeiten * SEKUNDEN_PRO_VERSUCH;
		int minuten  = sekunden / 60;
		System.out.println("Total Minuten für alle Möglichkeiten: " + minuten);
		System.out.println("Erwartungswert: " + minuten/2 + " Minuten.");
	}


	public boolean istMoeglicherCode(int m) {
		return okAufsteigend(m) &&
		       okZiffern(m)     &&
		       okNichtBeginnendMitGeraderZiffer(m);
	}


	boolean okNichtBeginnendMitGeraderZiffer(int m) {
		return   1 == ((codeToString(m)).charAt(0) - '0') % 2;
	}


	void printMoeglichkeit(int m) {
		System.out.println(m);
	}


	boolean okAufsteigend(int code) {
		return 1 >= anzahlAbstiege(code);
	}


	int anzahlAbstiege(int code) {
		int abstiege = 0;
		String codeZiffern = codeToString(code);
		for(int pos = 0; pos+1 < codeZiffern.length(); pos++) {
			if(codeZiffern.charAt(pos) > codeZiffern.charAt(pos+1)) {
				abstiege = abstiege + 1;
			}
		}
		return abstiege;
	}


	boolean okZiffern(int code) {
		return
		  !enthaeltZiffer('5', code) && 
		   enthaeltZiffer('3', code) &&
		   enthaeltZiffer('6', code);
	}


	String codeToString(int code) {
		String str = "" + code;
		while(str.length() < ANZAHL_ZIFFERN) {
			str = "0" + str;
		}
		return str;
	}


	boolean enthaeltZiffer(char ziffer, int code) {
		return (codeToString(code)).contains(""+ziffer);
	}

} // end of class Zahlenschloss

                

Lösung von: Philipp Gressly Freimann (SANTIS Training AG)

import time


def no_five(nr):
    if '5' in nr:
        return 1
    return 0


def used_three(nr):
    if '3' in nr:
        return 0
    return 2


def used_six(nr):
    if '6' in nr:
        return 0
    return 3


def starts_with_valid(nr):
    digit = int(nr[0])

    if digit == 0 or digit % 2 == 0:
        return 4
    return 0


def is_ascending(nr):
    exception = 1

    for i in range(0, len(nr) - 1):
        if int(nr[i]) > int(nr[i + 1]):
            exception -= 1

    if exception < 0:
        return 5
    return 0


def check_number(nr):
    ok = no_five(nr)
    if ok == 0:
        ok = used_three(nr)
    if ok == 0:
        ok = used_six(nr)
    if ok == 0:
        ok = starts_with_valid(nr)
    if ok == 0:
        ok = is_ascending(nr)

    return ok


number_of_codes = 0

print('start...')

t0 = time.time()

for i in range(0, 100000):
    code = '{0:05d}'.format(i)
    is_code = check_number(code)

    if is_code == 0:
        print('found code number {0}: {1}'.format(number_of_codes, code))
        number_of_codes += 1

print('finished!\n')

t1 = time.time()

print('found {0} valid codes in {1} seconds'.format(number_of_codes, t1 - t0))

seconds_per_code = 3

used_seconds = 0.5 * seconds_per_code * number_of_codes

print('the lock will be cracked in {0} seconds - that are {1} minutes and {2} seconds'.format(used_seconds,
                                                                                         used_seconds // 60,
                                                                                         used_seconds % 60))

                

Lösung von: Ich Bins (tubs)

Verifikation/Checksumme:

Total Möglichkeiten: 1550
Total Minuten für alle Möglichkeiten: 77
Erwartungswert: 38 Minuten.

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: Mittel
Webcode: d4ko-cgvt
Autor: Philipp Gressly Freimann (SANTIS Training AG)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen