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); aber wie erwähnt: 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

4 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)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Programmieraufgabe: Code knacken
https://www.programmieraufgaben.ch/aufgabe/code-knacken/d4kocgvt
"""

import itertools
from typing import *


def is_hannas_code(code: Tuple[int, ...]) -> bool:
    """
    Die Funktion prüft ob es eine Kombination von Hanna sein kann.
    :param code: Zu überprüfenden Zahlencode.
    :return: True, genau dann, wenn der Code von Hanna sein kann.
    """
    # Bereits vorher wurde festgelegt: keine 5 enthalten und erste Ziffer ungerade
    assert 5 not in code
    assert code[0] % 2 == 1
    # Ziffer 3 und 6 müssen enthalten sein
    # erste Ziffer muss ungerade und keine 0 sein
    # Nur maximal einmal darf die Ziffernfolge aufsteigend sein
    return 3 in code and \
           6 in code and \
           sum(a > b for (a, b) in zip(code, code[1:])) <= 1


print("Programmieraufgabe Code Knacken, http://www.programmieraufgaben.ch")
# Die Kombination besteht aus den Ziffer 0..9 ohne die Ziffer 5
hannas_digits = [digit for digit in range(10) if digit != 5]
# Die erste Ziffer muss ungerade und keine 0 sein.
hannas_first_digit = [digit for digit in hannas_digits if digit % 2 == 1]
# Hannas Kombination hat 5 Stellen und weitere Kritrien müssen erfüllt sein.
hannas_options = [code for code in itertools.product(hannas_first_digit,*(hannas_digits,) * 4) if is_hannas_code(code)]
for number in hannas_options:
    print(number)
print("Anzahl der Kombinationen:", len(hannas_options))
print("Bei 3s pro Kombination und 50% ausprobieren: {:.0f}min".format(len(hannas_options) * 3 / 2 / 60))
                

Lösung von: Name nicht veröffentlicht

'12.6.2018 - Powerbasic 10

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG

DIM i AS LONG
DIM x AS INTEGER
DIM Loesung AS STRING
DIM AnzMgl AS LONG
DIM anzAbst AS INTEGER
DIM ZeitInMin AS INTEGER

FOR i = 00000 TO 99999
    'Startet nicht mit gerader Zahl, auch nicht 0
    IF (i \ 10000) MOD 2 = 0 THEN ITERATE
    'Enthält nicht die Ziffer 5
    IF LEN(RETAIN$(FORMAT$(i),ANY "5")) THEN ITERATE
    'Enthält mindestens einmal die Ziffern 3 und 6
    IF TALLY(FORMAT$(i),ANY "3") < 1 THEN ITERATE
    IF TALLY(FORMAT$(i),ANY "6") < 1 THEN ITERATE

    'Check Aufsteigend
    anzAbst = 0
    FOR x = 1 TO LEN(FORMAT$(i)) -1
        IF VAL(MID$(FORMAT$(i),x,1)) > VAL(MID$(FORMAT$(i),x+1,1)) THEN anzAbst += 1
    NEXT x
    IF anzAbst > 1 THEN ITERATE

    Loesung += FORMAT$(i) & $CRLF
    AnzMgl += 1
NEXT i


'Teilaufgabe 1
MSGBOX STR$(AnzMgl) & $CRLF & loesung

'Teilaufgabe 2
ZeitInMin = FIX((anzMgl * 3 / 2) / 60)
MSGBOX "Erwartet werden ca. " &  FORMAT$(ZeitInMin) & " Minuten für die Hälfte der Codes"

END FUNCTION


                

Lösung von: Markus Sägesser (keine)

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