Hallo, eine zweite Frage hätt\' ich da noch:
Gibt es ein Prog., daß mir Wörter editiert, und zwar in der Art, daß auf Grundlage eines vorgegebenen Namens Variationen bez. GROßER und kleiner Buchstaben herausgegeben werden?
Beispiel:
Folge AA aa Aa aA
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Beschreib Dein Problem mal etwas genauer, evtl. gibt es eine einfachere Lösung...
Sonst hast Du recht schenell (2^lengt z.B. 65536 für 16 Zeichen - Speicherbedarf > 1MB) sehr viele Wortvarianten und einen hohen Speicherverbrauch...
CU borlander
Also, ich suche ein Prog, daß mir bei folgende Arbeit abnimmt:
Als Vorgabe meinetwegen: google; daraus soll das Prog. nun Wörter editieren (-->In der Schule hieß es immer n-Fakultät, oder so), die alle Möglichkeiten der Groß- und Kleinschreibung berücksichtigen.
Die Reihe würde also anfangen mit google, Google, gOogle, goOgle,..., GOogle, gOOgle, ....
Das Problem kannst Du relativ einfach mit einer rekursiven Funktion lösen, hatte mal was ähnliches Programmiert - in Delphi (würde ich bei Bedarf hier posten)...
CU Borlander
Hallo Borlander!
So ein Problem gibt mir ja wieder keine Ruhe, obwohl ich genug andere Sachen zu tun hätte ...
Also, ich habe eine Menge Hirnschmalz verwendet, für mich war es offen gestanden gar nicht so einfach, wie es aussah, zumindest wenn man nicht gleich eine mathematische Formel zur Hand hat oder Bill oder Linus heißt.
Strategie 1 - Zuerst habe ich die Großbuchstaben durch das Wort laufen lassen nach dem Muster (Ausgangswort "auto"):
auto, Auto, aUto, auTo, autO, AUto, AuTo, AutO, AUTo, AUtO, AuTO, aUTO, AUTO
Dabei blieben aber einige Kombinationen unberücksichtigt, bspw. aUTo!
Strategie 2 - Die Sortieralgorithmen arbeiten viel mit benachbarten Elementen, die ausgetauscht werden, so könnten immer benachbarte Kleinbuchstaben durch Großbuchstaben ersetzt werden (Ausgangswort "auto"):
auto, Auto, aUto, auTo, autO, AUto, AuTo, AutO, aUtO, auTO, AUTo, AUtO, AuTO, aUTO, AUTO
Dabei wird die Kombination von Großbuchstaben nicht berücksichtigt, die in der Mitte des Wortes nebeneinander liegen: aUTo!
Strategie 3 - Groß- und Kleinschreibung kann doch als Schalter zwischen zwei Möglichkeiten betrachtet werden. Also müsste das Ganze vielleicht im Binärsystem zu lösen zu sein und tatsächlich: Wenn ich die Anzahl der Kombinationsmöglichkeiten binär hochzähle und die Binärzahlen als 0/1- bzw. Klein-/Großbuchstabenraster verwende, komme ich auf alle Kombinationen. Allerdings ist die Zahl der möglichen Kombinationen nicht gleich n^2 !
Peter III. habe ich ein VBScript gepostet (siehe oben im Thread), dass nach diesem System funktioniert. Ist etwas umfangreicher geworden, weil eine Umwandlung von Dezimalzahlen in Binärzahlen erfolgen muss, die dann in einen String ausgegeben und als "Raster" ausgelesen werden.
Vielleicht gibt es elegantere Methoden, aber immerhin, es funzt!!! Für eine "einfache" rekursive Funktion habe ich keinen Ansatz gefunden.
MfG
UselessUser
Ja ;-)
Die Funktion muss nur folgendes machen: Aufgerufen wird sie mit 2 Parametern: dem String und der Position des zu ändernden Zeichens.
Die Funktion ruft sich solange wieder selbst auf bis das letzte Zeichen geändert wurde (und gibt dann den modifizierten String aus). Ansonsten ruft sich die Funktion zweimal selbst auf: einmal mit dem zum kleinbuchstabane geänderten Zeichen, einmal mit Großbuchstaben - die Position wird natürlich um 1 incrementiert.
CU Borlander
Hab das eben beim Chatten nebenbei umgesetzt:
{
if($pos<strlen($str))
{
$str[$pos] = strtolower($str[$pos]);
variant($str, $pos+1);
$str[$pos] = strtoupper($str[$pos]);
variant($str, $pos+1);
}
else
{
echo "$str<BR>";
}
}
// CU Borlander
Hi Borlander!
Es scheint immer 2^Wortlänge Kombinationen zu geben, bei 4 Buchstaben bswp. 16 Kombinationsmöglichkeiten.
1. Kommt dein Code auf diese Anzahl von Kombinationen?
2. Wenn ja, kannst du mir das Verfahren ein wenig erläutern, denn ich kenne die Syntax von PHP nicht: Warum ist "pos" ein String und was bedeutet "$str[$pos]" und "strtolower($str[$pos])"?
MfG
UselessUser
Klar, sonst hätte ich sie kaum hier gepostet ;-)
Ist bei der Struktur auch garnicht anders möglich, das die Function sich jeweils 2 mal selbst aufruft. Für jeden Buchstaben wird für groß und klein verzweigt...
Das Prinzip basiert auf der selben Grundlase wie Dein Binäransatz - für Jedes Zeichen beide Möglichkeiten durchlaufen...
zu 2)
Kein Problem:
Warum ist "pos" ein String
Pos wird hier als Integer genutzt, PHP verwendet im Gegensatz zu Basic (und Dialiekten) für alle Variablen das $-Zeichen. Allerdings ist PHP da sowieso recht flexibel...
was bedeutet "$str[$pos]"
Damit kann man Char $pos des Strings $str ansprechen (als Left- und Rightvalue).
strtolower($str[$pos])
Die Function strtolower($string) gibt wie man am Namen schon fast vermuten könnte den in kleinbuchstaben konvertierten String zurück...
CU Borlander
Hi Borlander,
thx für deine Erläuterungen. Werde bei Gelegenheit einmal versuchen, diese Variante in VB zu schreiben.
MfG
UselessUser
Müsstest Du fast 1 zu 1 übernehmen können, abgesehen von den Funktionsnamen...
Hallo UselessUser !
Danke für Dein VBScript. Es funktioniert ! Allerdings hätt' ich da noch eine Frage: Wie kann ich eine andere Ausgabeform wählen (.txt oder .html) ?
An Borlander: Wie verwende ich die PHP Funktion ? An einer passenden Ausgabeform wäre mir auch gelegen. Ebenfalls: Danke!
Mit dem PHP Interpreter, am besten zusammen mit dem Apache Webserver (kannst Du auch lokal installieren) - Als Ausgabe erhält Du dann eine HTML-Seite, in eine Datei schreiben ist allerings auch kein Problem...
CU Borlander
Hallo Peter III.!
Hier poste ich dir den Code für ein VBScript: Kopieren, in eine txt.-Datei einfügen und mit einem beliebigen Namen und der Endung ".vbs" abspeichern. Mit einem Doppelklick starten (Scripte müssen bei dir allerdings ablaufen dürfen, was die Standardeinstellung bei Windows ist) und jetzt dürfte es funktionieren.
Bei Wörtern, die länger als 5 Buchstaben sind, empfehle ich eine andere Ausgabeform, z. B. über HTML-Interface oder in eine Textdatei. Oder in VB. Oder, oder ... Aber das Prinzip wird hoffentlich deutlich.
'###### Begin Code
'----- MAIN
word = InputBox ("Bitte das Wort eingeben:", "Wortkombinationen")
For binpos = 1 To Len(word)
z = z + (2^(binpos-1))
Next
For pos = 0 To z
act = convert(pos)
actword = ""
For wordpos = 1 To Len(word)
If Mid(act, wordpos, 1) = 0 Then
actword = actword & UCase(Mid(word, wordpos, 1))
Else
actword = actword & LCase(Mid(word, wordpos, 1))
End If
Next
wordcombi = wordcombi & actword & vbCr
Next
MsgBox wordcombi
'----- SUBS
Function convert(pos)
deci = pos
Do
Select Case deci
Case 0
binary = "0" & binary : Exit Do
Case 1
binary = "1" & binary : Exit Do
Case 2
binary = "10" & binary : Exit Do
Case 3
binary = "11" & binary : Exit Do
End Select
deci1 = deci
deci = deci \ 2
decimo = deci1 Mod 2
If decimo = 0 Then
binary = "0" & binary
Else
binary = "1" & binary
End If
Loop
Do While Len(binary) binary = "0" & binary
Loop
convert = binary
End Function
'###### End Code
MfG
UselessUser