Python :: Aufgabe #157
1 Lösung
Schneller als der Taschenrechner
Anfänger - Python
von hollst
- 16.05.2017 um 16:39 Uhr
Wenn ihr die folgende Aufgabe programmiert habt, könnt ihr auf jeder Party durch eure brilliante Kopfrechenleistung glänzend, ihr werdet schneller sein als jeder andere, selbst wenn er einen Tscherechner oder euren benutzen darf.
Zu programmieren ist ein kleiner, aber sehr spezieller Taschenrechner (Bild 1), der folgendes kann:
1) Entgegennahme einer dreistelligen positiven, geraden Ganzzahl (Bild 2).
2) Vergrößern der Dreistellenzahl auf sechs Stellen, indem die Zahl einfach noch einmal angehängt wird (Bild 3).
3) … 5) (komplizierte) Division der Sechstellenzahl nacheinander durch 22, 7 und 13. Reihenfolge spielt keine Rolle, aber nur jeweils 1x (deshalb deuten rote Buttons auf „nicht mehr benutzbar“ hin).
Im Beispiel (Bild 1 … 6) habt ihr allerdings das Ergebnis (117) wesentlich schneller per Kopf ausgerechnet als euer Freund mit dem Taschenrechner. Das liegt nicht daran, dass der Rechner so langsam rechnet, sondern daran, das das Buttondrücken so lange dauert.
Die ganze Übung vor größerem Publikum solltet ihr allerdings nach etwa höchstens 10 Vorführungen zunächst abbrechen, also noch bevor jemand hinter den Trick kommt. Was der Trick ist? Nun, bitte erst einmal selber nachdenken.
Zu programmieren ist ein kleiner, aber sehr spezieller Taschenrechner (Bild 1), der folgendes kann:
1) Entgegennahme einer dreistelligen positiven, geraden Ganzzahl (Bild 2).
2) Vergrößern der Dreistellenzahl auf sechs Stellen, indem die Zahl einfach noch einmal angehängt wird (Bild 3).
3) … 5) (komplizierte) Division der Sechstellenzahl nacheinander durch 22, 7 und 13. Reihenfolge spielt keine Rolle, aber nur jeweils 1x (deshalb deuten rote Buttons auf „nicht mehr benutzbar“ hin).
Im Beispiel (Bild 1 … 6) habt ihr allerdings das Ergebnis (117) wesentlich schneller per Kopf ausgerechnet als euer Freund mit dem Taschenrechner. Das liegt nicht daran, dass der Rechner so langsam rechnet, sondern daran, das das Buttondrücken so lange dauert.
Die ganze Übung vor größerem Publikum solltet ihr allerdings nach etwa höchstens 10 Vorführungen zunächst abbrechen, also noch bevor jemand hinter den Trick kommt. Was der Trick ist? Nun, bitte erst einmal selber nachdenken.
Lösungen:
Der mathematische Trick besteht darin, dass das Ergebnis immer = dreistellige Zahl / 2 ist. Das habe ich aus den C# Lösungen, da Mathe nicht mein Fall ist. Für die Programmierung des "Taschenrechners" spielt dieser Trick keine Rolle, was mich zunächst verwirrt hatte (siehe meine unbeantwortete Frage an den Aufgabensteller). Somit ist diese Aufgabe eine nette Übung für die GUI Programmierung.
Python-Code
# -*- coding: utf-8 -*- # python 2.7 import Tkinter as tk def expand(): if len(entry_eingabe.get()) == 0: entry_eingabe.delete(0, "end") entry_eingabe.insert(0, "Fehlende Eingabe!") elif len(entry_eingabe.get()) != 3: entry_eingabe.delete(0, "end") entry_eingabe.insert(0, "3-stellige Zahl eingeben!") else: entry_eingabe.insert(0, entry_eingabe.get()) button_expand.config(bg="red", state="disabled") button_22.config(bg="green", state="normal") button_7.config(bg="green", state="normal") button_13.config(bg="green", state="normal") def divideBy22(): x = entry_eingabe.get() entry_eingabe.delete(0, 'end') entry_eingabe.insert(0, int(x) / 22) button_22.config(bg="red", state="disabled") def divideBy7(): x = entry_eingabe.get() entry_eingabe.delete(0, 'end') entry_eingabe.insert(0, int(x) / 7) button_7.config(bg="red", state="disabled") def divideBy13(): x = entry_eingabe.get() entry_eingabe.delete(0, 'end') entry_eingabe.insert(0, int(x) / 13) button_13.config(bg="red", state="disabled") def reset(): entry_eingabe.delete(0, "end") button_expand.config(bg="green", state="normal") button_22.config(bg="red", state="disabled") button_7.config(bg="red", state="disabled") button_13.config(bg="red", state="disabled") ########## GUI ######################### fenster = tk.Tk() fenster.title("Aufgabe 157") fenster.geometry("190x250") button_reset = tk.Button(fenster, text="Reset", command=reset) button_reset.grid(row=0, column=0, pady=5) entry_eingabe = tk.Entry(fenster) entry_eingabe.grid(row=1, column=0, padx=10, pady=5) button_expand = tk.Button(fenster, text="Expand", command=expand) button_expand.grid(row=2, column=0, pady=5) button_expand.config(bg="green") button_22 = tk.Button(fenster, text="/ 22", command=divideBy22) button_22.grid(row=3, column=0, pady=5) button_22.config(bg="red", state="disabled") button_7 = tk.Button(fenster, text="/ 7", command=divideBy7) button_7.grid(row=4, column=0, pady=5) button_7.config(bg="red", state="disabled") button_13 = tk.Button(fenster, text="/ 13", command=divideBy13) button_13.grid(row=5, column=0, pady=5) button_13.config(bg="red", state="disabled") fenster.mainloop()