Programmieren eines Wortgenerators

So schwer ist das nicht. Perl ist ne coole Sprache.

draw-zimmi bevor hier jemand dir nen Kompletten Code hier reinposten kann, bräuchte man schon ein Wörterbuch. Eigendlich nur ne Wörterliste...
Dabei müsste das Programm aber sehr viel leisten. Stell dir das nur mal vor... :
Du hast 5 Buchstaben: F B A I O (nur so als Beispiel)
Der hätte dann folgende Möglichkeiten:
FBAIO
FAIOB
FIOBA
FOBAI
FBIOA
usw.
....
Und jedesmal müsste der in der ganzen Liste suchen, ob es dieses "Wort" gibt. (Ich würde das nicht für dich machen :D )

Es wäre aber schon ne coole Programmierherausvorderung.
Bitte sag jemand bescheid wenn er so ne coole Wörterliste findet.
 
@ terminal x

Du hast falsch begonnen.
Es muss heißen:

F
FB
FA
FI
FO
BF
FF
FA
BI
BO
AF
AB
AA
AI
AO
IF
IB
IA
II
IO
OF
...

Das mit dem Wörterbuch ist kein Problem. Man kann das alles ja mit Word verbinden und dort die Rechtschreib. laufen lassen.
Mir fehlt die Idee wie ich alle Buchstaben automatischh kombinieren kann.
 
Hallo,
also die Erstellung des Lexikons wäre gar nicht sooo umständlich. Ich habe sowas ähnliches mal zu Anfang meines Computerlinguistik Studiums gemacht:
man nehme sich einen Korpus bzw. mehrere Korpora und parse diese durch nach bestimmten Kriterien (z.B. alle Worte mit 7 Buchstaben, die mit einem bestimmten Buchstaben beginnen); diese Ergebnisse schreibe man in einen Hash. In einem weiteren Schritt könnte man dann die einzelnen gefundenen Worte in ihre einzelnen Buchstaben trennen, die Buchstaben alphabetisch ordnen und diese dann wieder zum Aufbau eines HoH verwenden (Anfangsbuchstabe => Wort => Buchstaben). Dann baue man sich einen weiteren HoH der Form: Anfangsbuchstaben => geordnete Buchstaben => alle passenden Worte. Um nun die gewünschte Länge und die zur Verfügung stehenden Buchstaben zu nutzen könnte man wie folgt vorgehen:
Eingabe der Buchstabenanzahl, z.B. 7, die zur Verfügung stehenden Buchstaben und den Anfangsbuchstaben. In einer if-else-Abfrage wird je nach eingebener Buchstabenanzahl der Zugriff auf die entsprechenden HoHs (mit der benötigten Buchstabenanzahl), in einer weiteren auf den jeweiligen Anfangsbuchstaben verweisenden if-else-Abfrage wird man dann auf den (Anfangsbuchstaben-)passenden HoH verwiesen; als letzten Schritt ordnet man die letzten zur Verfügung stehenden Buchstaben (Eingabeanzahl-Anfangsbuchstaben) wiederum alphabetisch und vergleicht das Resultal mit der vorhanden Datenstruktur. Wird dabei eine Übereinstimmung gefunden, lässt man sich die Worte, die zu den Buchstaben im HoH stehen ausgeben und schon hat man die gesuchten Worte.
MFG
 
hallo zusammen,

mal ne Frage an draw-zimmi: Hast Du denn selbst schon _irgendwelche_ Anstrengungen unternommen das selbst zu realisieren?
Oder erwartest Du ne fertige Lösung?
Im zweiten Fall würde ich dir empfehlen mal in den diversen Skripting-Seiten und -Foren zu suchen.
So etwas ähnliches gibt es bestimmt schon.

Wie oben schon gesagt wurde, ist perl sehr gut für so etwas.
Funktionieren würde das aber mit einem Shellskript genauso (Stichwort: grep).

Die Lösungsvorschläge mit TK, Filemaker etc. empfinde ich persönlich für zu aufwendig und unelegant.
 
Ja, schon einiges in Apple Script ausprobiert.
Eine fertige Lösung erwarte ich keineswegs, es sei denn einer macht das :)!

Danke für die Tipps
 
moin,

mal abgesehen davon, dass ich die idee total schwachsinnig finde, ist das ding ja nu wirklich nich das grosse problem.

(1) wortdatenbank (textfile, relationale db, spellchecker api von osx, whatever) nehmen
(2) abfrageschema basteln (mit regulären ausdrücken, sql, oder ner api ) basteln -> abfrage nach wortlänge, abfragen nach bestimmten buchstaben an bestimmten positionen
(3) frontend bauen welches abfrage generiert und die ergebnisse listet

jetzt musst du nur noch jemand finden, der dir das baut. mach ich dir gerne für 50 eur die stunde. meld dich per pn.

und - auch wenn es mir das geschäft versaut - alternativ hättest du ja einfach mal bei versiontracker nach scrabble suchen können :rolleyes: da findest du dann dein programm in 5 sekunden.

hoffe, geholfen zu haben...
 
also das geht grob gesagt so:
du nimmst irgend eine skript sprache (perl ist dafür wie gemacht) und nutzt das interne wörterbuch (/usr/share/dict/words) und bastelst dir das program zusammen. Für dieses läppiche problem solten nicht mehr als 10 Zeile code nötig sein.
 
schon mal nachgerechnet, wie viele Kombinationen man aus 7 Buchstaben bilden kann? Und dabei nicht vergessen, dass jeder Buchstabe auch mehrmals auftreten Kann.
 
WoSoft schrieb:
Und dabei nicht vergessen, dass jeder Buchstabe auch mehrmals auftreten Kann.
Bei Scrabble nicht, da hat man den Buchstaben oder eben nicht. Wenn man z.B. zwei 'M'-Steine hat, dann müsste man auch 2x das 'M' eintippen.
Was ihr alle noch nicht berücksichtigt habt, ist dass man die Buchstaben auch noch an andere Wörter anlegen kann. Daher müsste man neben den fixen 7 Buchstaben ('Bank') auch noch diverse variable Buchstaben eingeben können ('Wahl')... das macht dann das Projekt erst richtig interessant! Toll wäre eine Wortsuche die ähnlich wie die von iTunes oder Mac OS in Echtzeit arbeitet.
 
schon mal nachgerechnet, wie viele Kombinationen man aus 7 Buchstaben bilden kann? Und dabei nicht vergessen, dass jeder Buchstabe auch mehrmals auftreten Kann.

Die Lösung für ein solches Problem nennt man Algorithmus.
 
Also in AppleScript komme ich nicht wirklich weiter. Perl lerne ich gerade (gerade angefangen, wegen dieser Sache hier).

Danke für die Tipps
 
Also mann sollte mit jedem Buchstaben einen Baum aufbauen, dann durch alle Bäume iterieren und Jede Verzweigung und jedes Blatt durch ein Wörterbuch jagen.
 
Zuletzt bearbeitet:
draw-zimmi schrieb:
Also in AppleScript komme ich nicht wirklich weiter. Perl lerne ich gerade (gerade angefangen, wegen dieser Sache hier).
...
wobdurch man sieht, dass selbst schwachsinnige (entschuldigung :D) Ideen sinnvolle Effekte erzeugen können.
Viel Spass noch - und viel Erfolg.
 
Zuletzt bearbeitet:
Nach den vielen Sprüchen über Bäume, etc. hier mal eine ganz andere quick-and-dirty Lösung:

Code:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

/*
 * Created on 29.12.2004
 *
 * This is a quick-and-dirty version of a scrabble word-checker.
 * It depends on the common OS X infrastructure i.e. the dictionary 
 * (and is therefore a little bit focused on english ;))
 */


/**
 * @author ?=?
 *
 * The main Class to start . . .
 */
public class WordChecker {

	private static final String DICT_FILE_NAME = "/usr/share/dict/words";
	private static final int WORD_COUNT = 250000; // derived from "wc -l DICT_FILE_NAME"

	public static void main(String[] args) {
		
		// first of all get the words into RAM!
		try {
			FileReader fr = new FileReader(DICT_FILE_NAME);
			BufferedReader br = new BufferedReader(fr);
			
			Dictionary dict = getDictFromReader(br);

			System.out.println("Abbruch durch Eingabe einer Leerzeile.");
			
			// Jump into dialog loop . . .
			while(anotherRoundRequested(dict) == true) {};
			
			br.close();
			fr.close();
		} catch (FileNotFoundException e) {
			System.out.println("Sorry, but I wasn't able to access the dictionary \"" + DICT_FILE_NAME + "\"");
		} catch (IOException e) {
			System.out.println("Sorry, but I wasn't able to complete dictionary access for \"" + DICT_FILE_NAME + "\"");
		}
	} // End of main
	
	
	
	/**
	 * This routine has two purposes: First tell the caller when it's time to finish,
	 * second handle the dialog with the user to request a character-combination and return 
	 * the found words if any.
	 * @param dict The special dictionary in which to search
	 * @return False if the user whishes to end the cycle, else true.
	 */
	private static boolean anotherRoundRequested(Dictionary dict) {
		boolean result = true;
		
		BufferedReader br = new BufferedReader(
							 new InputStreamReader(System.in));
		System.out.println();
		System.out.print("Zu suchende Buchstaben: ");
		
		try {
			String chars = (br.readLine()).trim();
			if (chars.equals("")) {
				result = false;
			} else {
				String key = getKeyFor(chars);
				Set resultingWords = (Set)dict.get(key);
				if (resultingWords != null) {
					for (Iterator iter = resultingWords.iterator(); iter.hasNext();) {
						String word = (String) iter.next();
						System.out.println(word);
					}
				} else {
					System.out.println("Es wurden keine passenden Wörter gefunden.");
				}
			}
		} catch (IOException e) {
			result = false;
		}
		

		if (result == false) {
			System.out.println("Das Programm wird nun beendet.");
		}
		return result;
	} // End of anotherRoundRequested
	
	
	
	/**
	 * Build a special dictionary datastructure from the read input which will enable
	 * us to quickly reply to search requests.
	 * @param reader The reader from which the input word list is read.
	 * @return The build dictionary.
	 * @throws IOException
	 */
	private static Dictionary getDictFromReader(BufferedReader reader) throws IOException {
		Hashtable table = new Hashtable(WORD_COUNT);
		
		System.out.println("Bitte warten Sie einige Sekunden das Einlesen der Wörterverzeichnisses ab.");
		while (reader.ready())  {
			String word;
			word = reader.readLine();
			
			String key = getKeyFor(word);
			SortedSet ss = (SortedSet) table.get(key);
			if (ss != null){
				ss.add(word);
			} else {
				ss = new TreeSet();
				ss.add(word);
				table.put(key, ss);
			}
		} // while reader is ready
		
		return table;
	} // End of getDictFromStream
	
	

	/**
	 * Produce a key/hash value for the given string.
	 * Some special characteristic of the key is that he contains all characters from the value in sorted sequence.
	 * @param value The value to get hashed.
	 * @return The hashed key.
	 */
	private static String getKeyFor(String value) {
		String work = value.toLowerCase();
		StringBuffer key = new StringBuffer(work.length());
		
		Object ar = Array.newInstance(Character.TYPE, work.length());
		char[] car = (char[])ar;
		for (int i = 0; i < car.length; i++) {
			car[i] = work.charAt(i);
		}
		Arrays.sort(car);
		
		for (int i = 0; i < car.length; i++) {
			key.append(car[i]);
		}
		return key.toString();	
	} // End of getKey
} // End of class


Und: Ja, ich weiß, daß
  • das nicht wirklich OO ist (hab halt gerade kein Smalltalk zur Hand ;))
  • produktionsreifer Code anders aussieht
  • ...

Viel Spass beim weiter experimentieren ;)



Gruß,

?=?


Edit: Mein PB braucht ca. 8s vom Start bis zum input-prompt.
Anschließende Abfragen laufen praktisch ohne Zeitverzögerung
 
Zuletzt bearbeitet:
Ich habe mal ein bischen mit XCode und Cocoa herumgespielt, nachdem ich mir das Buch "Cocoa Programming for Mac OS X" gekauft habe. Das Ergebnis ist im angehängten .zip File.

Das Progrämmchen erzeugt alle Permutationen der eingegebenen Buchstaben und lässt sie durch den NSSpellChecker laufen. Die als korrekt geschrieben erkannten werden zusammen mit den Punkten in der Liste angezeigt. Vorsicht, bei mehr als sechs Buchstaben kanns sehr lange dauern...
 
current schrieb:
Ich habe mal ein bischen mit XCode und Cocoa herumgespielt, nachdem ich mir das Buch "Cocoa Programming for Mac OS X" gekauft habe. Das Ergebnis ist im angehängten .zip File.

Das Progrämmchen erzeugt alle Permutationen der eingegebenen Buchstaben und lässt sie durch den NSSpellChecker laufen. Die als korrekt geschrieben erkannten werden zusammen mit den Punkten in der Liste angezeigt. Vorsicht, bei mehr als sechs Buchstaben kanns sehr lange dauern...

hey thomas, das sieht ja gut aus, die gleiche idee hatte ich auch ;) leider bin ich mit dem NSSpellChecker unter eclipse/java nicht weitergekommen. deswegen bin ich sehr an deinem source interessiert ;)

grüsse,
marco
 
current schrieb:
Ich habe mal ein bischen mit XCode und Cocoa herumgespielt, nachdem ich mir das Buch "Cocoa Programming for Mac OS X" gekauft habe. Das Ergebnis ist im angehängten .zip File.

Das Progrämmchen erzeugt alle Permutationen der eingegebenen Buchstaben und lässt sie durch den NSSpellChecker laufen. Die als korrekt geschrieben erkannten werden zusammen mit den Punkten in der Liste angezeigt. Vorsicht, bei mehr als sechs Buchstaben kanns sehr lange dauern...
sieht doch schon mal ganz gut aus.
Wenn ich noch etwas anregen darf: Bei uns sind je nach Mitspielern auch andere Sprachen erlaubt. Deshalb würde ich noch -setLanguage:
einbauen.
Hilft nur nicht, wenn man auch Latein zulässt :)
 
vuuduu schrieb:
hey thomas, das sieht ja gut aus, die gleiche idee hatte ich auch ;) leider bin ich mit dem NSSpellChecker unter eclipse/java nicht weitergekommen. deswegen bin ich sehr an deinem source interessiert ;)
Ich heisse zwar Thorsten, aber der Quellcode ist trotzdem angehängt...

:D
 
Na hallo, da haben aber welche gearbeitet! :)

Danke für die tolle Arbeit. Versuche mich auch gerade an xCode.

Danke für alles!

PS:Endlich kann ich auch mal beim Scrabbeln gewinnen :)
 
current schrieb:
Ich heisse zwar Thorsten, aber der Quellcode ist trotzdem angehängt...

:D
pepp Funktioniert wirklich super, Dein Programm! pepp Was mir noch abgeht ist, das Festlegen der zugelassenen Sprachen (Popupmenü unter Lupensymbol?) inklusive des Benutzerwörterbuchs von Mac OS X. Etwas mehr 'maclike' wäre, wenn die Such gleich beim tippen der Buchstaben (Echtzeit) beginnt und man noch so ein (x) zum Löschen der Eingabe in der Suchmaske hätte.

Für so ein Programm würd' ich Dir dann auch 5,- € Shareware Gebühr zahlen!! :cool:

PS: Noch ein kleiner Bug ist mir aufgefallen, beim Vergrößern bzw. Verkleinern des Fensters ändert sich die Liste nicht in der Größe mit. - Noch was 'Elbbarcs' sollte man unbedingt auch rückwärts lesen!
 
Zuletzt bearbeitet:
Zurück
Oben Unten