Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Kleine Spielereien und deren Programmierung in Python (1)
Autor
Kein bestimmter Bereich Kleine Spielereien und deren Programmierung in Python (1)
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4007
Wohnort: Harz
  Themenstart: 2019-08-10

Hallo ihr Lieben (und Bösen) alle miteinander, anlässlich des Sommerlochs werde ich in lockerer Folge kleine Aufgaben vorstellen, die zum Programmieren anregen, und deren Lösung in Python. Ich dachte mir ich lasse immer so 24 Stunden vergehen, bevor ich meine eigene Lösung präsentiere, damit wer mag gerne selber etwas erstellen und hier vorstellen kann. Es kommt mir dabei erst einmal darauf an, überhaupt eine Lösung zu bekommen (natürlich in akzeptabler Zeit), wir können dann gerne später noch darauf eingehen wie man das Problem unter Einsatz von möglichst wenig Rechenzeit gelöst bekommt. Die heute Problemstellung lautet: Es sollen Rätsel der folgenden Form betrachtet werden: Jeweils zwei dreistellige Zahlen werden addiert und ergeben ebenfalls eine dreistellige Zahl. Dabei bedeutet dreistellig, dass die Zahl im Dezimalsystem wirklich drei Ziffern hat, also nicht mit einer "0" beginnt. In den Zahlen werden nun gleiche Ziffern durch gleiche Symbole ersetzt, und die sich ergebende Folge aus neun Symbolen als Rätsel präsentiert. Die Frage ist nun: Wie viele dieser Aufgaben gibt es, die eindeutig lösbar sind, das heißt bei denen es für die angegebenen Symbole nur eine Möglichkeit gibt, die Symbole durch Ziffern zu ersetzen, sodass sich eine korrekt gelöste Additionsaufgabe ergibt (und die sich natürlich nicht nur durch die verwendeten Symbole unterscheiden). Ein Beispiel wäre die folgende eindeutig lösbare Aufgabe: ABC + DDC = BDD Lösungen, Musterprogramme, Ideen zu Algorithmen und Anmerkungen gerne hier gleich als Hide Bereich posten! Einen schönen Tag und viel Spaß damit Gonz


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 3042
  Beitrag No.1, eingetragen 2019-08-10

Dein Beispiel ist bei mir das Letzte in einer Liste mit einer Aufgabe für jeden Tag. Reiner Brute-Force-Ansatz leider. \hideon \sourceon Python T=[(a,b,a+b) \ for a in range(100,1000) \ for b in range(100,1000) if a+b >= 100 and a+b<1000] def Stringify(t): a,b,c = t s = list(str(a) + str(b) + str(c)) i=0 for r in "ABCDEFGHI": if i>= len(s): break c = s[i] for j in range(i,len(s)): if s[j]==c: s[j]=r while i


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4007
Wohnort: Harz
  Beitrag No.2, vom Themenstarter, eingetragen 2019-08-10

Das ging ja fix :) Mein Ansatz ist ähnlich einfach gestrickt, hat ungefähr dieselbe Zeilenzahl an Code und braucht auch ungefähr die gleiche Zeit. \hideon \sourceon Python muster = [] for summand_1 in range(100,900): for summand_2 in range(100,1000-summand_1): mymuster = str(summand_1)+str(summand_2)+str(summand_1+summand_2) mychar = 'A' for mypos in range(0,9): if ord(mymuster[mypos]) in range(ord('0'),ord('9')+1): mymuster=mymuster.replace(mymuster[mypos],mychar) mychar=chr(ord(mychar)+1) muster.append(mymuster) muster.sort() cnt=0 lastmuster="" unique=False for thismuster in muster: if thismuster!=lastmuster: if unique: cnt=cnt+1 print("%3d. %s" % (cnt,lastmuster)) unique=True lastmuster = thismuster else: unique=False if unique: cnt=cnt+1 print("%3d. %s" % (cnt,lastmuster)) \sourceoff \hideoff


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 3042
  Beitrag No.3, eingetragen 2019-08-10

\quoteon(2019-08-10 12:33 - gonz in Beitrag No. 2) Das ging ja fix :) \quoteoff Ging auch so ein bisschen in Richtung 5% oder 10% Aufgaben im Euler-Project.


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4007
Wohnort: Harz
  Beitrag No.4, vom Themenstarter, eingetragen 2019-08-11

Da ich ja selber noch dabei bin, mich da einzufinden, hätte ich nebenbei ein paar Fragen zum Handling von char-Variablen. Geht es irgendwie einfacher als mychar=chr(ord(mychar)+1) # incrementiere mychar und if ord(mymuster[mypos]) in range(ord('0'),ord('9')+1): ?


   Profil
querin
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 12.01.2018
Mitteilungen: 327
  Beitrag No.5, eingetragen 2019-08-11

Frei nach den Gebrüdern Grimm ;) \showon \sourceon Python Pfefferkuchenhaus = 'ABCDEFGHI' knusper = {} for Hänsel in range(100, 900): for Gretel in range(100, 1000 - Hänsel): Pfefferkuchen = str(Hänsel) + str(Gretel) + str(Hänsel + Gretel) knabber = 0 Hexenbesen = {} knäuschen = '' for Krume in Pfefferkuchen: if Krume not in Hexenbesen: Hexenbesen[Krume] = Pfefferkuchenhaus[knabber] knabber += 1 knäuschen += Hexenbesen[Krume] knusper[knäuschen] = '' if knäuschen in knusper else Pfefferkuchen for knäuschen in list(knusper): if not knusper[knäuschen]: del knusper[knäuschen] for knabber, knäuschen in enumerate(knusper): Pfefferkuchen = knusper[knäuschen] print('{:3d}. {}+{}={} Lösung: {}+{}={}'. format(knabber + 1, knäuschen[:3], knäuschen[3:6], knäuschen[6:], Pfefferkuchen[:3], Pfefferkuchen[3:6], Pfefferkuchen[6:])) \sourceoff \showoff


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4007
Wohnort: Harz
  Beitrag No.6, vom Themenstarter, eingetragen 2019-08-11

Cool :) :) :)


   Profil
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 81
  Beitrag No.7, eingetragen 2021-09-26

”Hochzählen” von Buchstaben einfach per iterator über `string.ascii_uppercase`, ersetzen von Ziffern in einem `translate()`-Aufruf pro Kandidat, und das ausfiltern der eindeutigen Lösungen mit `collections.Counter`: \hideon \sourceon python \numberson #!/usr/bin/env python3 from collections import Counter from string import ascii_uppercase from more_itertools import unique_everseen def replace_digits_with_letters(digits): return digits.translate( dict(zip(map(ord, unique_everseen(digits)), ascii_uppercase)) ) def main(): candidates = ( replace_digits_with_letters( f"{summand_a}{summand_b}{summand_a + summand_b}" ) for summand_a in range(100, 1000) for summand_b in range(100, 1000 - summand_a) ) results = ( letters for letters, count in Counter(candidates).items() if count == 1 ) for number, letters in enumerate(sorted(results), 1): print(f"{number:3d}. {letters}") if __name__ == "__main__": main() \sourceoff \hideoff Bis auf den Ausdruck der das Argument für `translate()` erstellt, finde ich das recht aufgeräumt und lesbar.


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4007
Wohnort: Harz
  Beitrag No.8, vom Themenstarter, eingetragen 2021-09-27

Sieht wirklich gut aus @ __blackjack__ :) Das ist python, sozusagen :) Ich hatte diese eigentlich als kleine Serie geplante Reihe dann eingestellt, da ich auch für mich "Projekt Euler" entdeckt hatte. Man muss das Rad nicht immer neu erfinden... Danke für den Beitrag! Grüße aus dem Harz Gerhard/Gonz


   Profil
gonz hat die Antworten auf ihre/seine Frage gesehen.
gonz hatte hier bereits selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]