Rubrik: Variablen/Strings · Algorithmen/Mathematik | VB-Versionen: VB6/VBA | 09.07.22 |
![]() Wer kennt sie nicht - die "Buchstabenrätsel", bei denen man Gleichungen lösen muss und jeder Buchstabe eine andere Ziffer bedeutet. Besonders dafür ist dieser Tipp gedacht | ||
Autor: ![]() | Bewertung: ![]() ![]() ![]() ![]() ![]() | Views: 1.550 |
ohne Homepage | System: Vista, Win7, Win8, Win10 | kein Beispielprojekt |
Buchstaben-Rätsel kennt doch fast jeder. ABC + DE = FGH und ABC - IJ = SR (etc.)
Am einfachsten ist es, jeder Ziffer eine Schleife zu geben, von 0 - 9 alles durch zu arbeiten und gut.
Nun ist es aber so, dass jeder Buchstabe genau EINER Ziffer entspricht.
Hätte ich 10 Schleifen (von A bis J) dann sollte ich noch vor der Beweisführung (stimmen alle Formeln überein, dann ist Rätsel gelöst) eine Prüfung machen, dass auch jeder Wert unterschiedlich groß zu jedem anderen Wert ist.
Ein
If A <> B And A <> C And ... I <> J Then ...
kann nervig sein, dies zu notieren, hat man doch immerhin 10! Möglichkeiten.
Deshalb möchte ich das anders lösen ...
Man schreibe die 10 Schleifen (für die BruteForce-Methode) {wie man die Schleifen evtl. auch noch kürzen kann, ist mir noch nichts eingefallen} und in der innersten Schleife erstellt man ein Array mit allen Variablen, die existieren:
arr = Array(A, B, C, D, E, F, G, H, I, J)
mit
Erg = ungleich(arr)
übergebe ich das an meine Funktion und prüfe darin, ob einer der Werte gleich einem anderen ist. Wird eine Übereinstimmung gefunden, wird FALSE zurück gegeben.
Public Function ungleich(ParamArray Werte()) As Boolean Dim Result As Boolean Dim i As Long Dim u As Long Result = True ' Von Beginn bis Vorletzte For i = LBound(Werte(0)) To UBound(Werte(0)) - 1 ' von "Beginn + 1" bis letzte For u = LBound(Werte(0)) + i + 1 To UBound(Werte(0)) If Werte(0)(i) = Werte(0)(u) Then Result = False Exit Function End If Next u Next i ungleich = Result End Function
Ausbaufähig wäre es noch, wenn mit zurück gegeben würde, WELCHE Werte übereinstimmen, um die dann innere Schleife gleich um eins zu erhöhen.