Announcement

Collapse
No announcement yet.

Kombinatorik-Problem: Zeichen in 2-dimensionalem Array miteinander kombinieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Klar, von mir aus gern ... die Wordlist war am Anfang größer (2.7MB auf der Platte, k.a. wieviel Worte), aber ich hab die ganzen Worte rausgefiltert, die mehr als 15 Zeichen hatten und sie ist nun gut 700k groß. Hast du schon n Prog, wo man doppelte rausfiltern kann? Wenn nich, mach ich fix eins *g*

    Grüße,
    Mari

    Comment


    • #17
      Wenn du den Code fürs Dawg nutzt dann brauchst Du keinen Filter. Ein Dawg kennt keine Duplikate und ist immer sortiert. Schon während der Erzeugung des Dawgs werden keine Duplikate zugelassen.<br>
      In einigen Test zeigte sich das das dawg demzufolge unsortierte Textworddateien schneller sortiert als Quicksort und konsorten.<br>
      Aber warum schmeißt du die >15 Zeichenworte raus, willst du nur 15x15 Boards unterstützen ?? <br>
      Übrigens: die Daten von mir sind noch nicht becleant, d.h. es gibt Wörter mit 1 und >15 Buchstaben, auch Wörter mit 'ß' kommen vor.<br>

      Gruß Hage

      Comment


      • #18
        Hi

        Ich habe mal meine 200023 Wortliste nach den Scrabbleregeln bereinigt, übrig bleiben 174294.<br>
        Hier mal der Code dafür:

        <pre>

        <code><font size=2 face="Courier New"><b>procedure </b>CleanupForGermanScrabble;
        <br>
        <b>function </b>DoCopy(Found: TDawg; Word: PChar; WordLength: Integer): Boolean; <b>register</b>;
        <b>var
        </b>L,I: Integer;
        <b>begin
        </b>Result := False;
        <b>if </b>(WordLength &gt; 1) <b>and </b>(WordLength &lt;= 15) <b>then
        begin
        </b>L := WordLength;
        <b>while </b>L &gt; 0 <b>do
        begin
        </b>Dec(L);
        <b>if </b>Word[L] = 'ß' <b>then
        begin
        </b>Word[L] := 's';
        <b>for </b>I := WordLength <b>downto </b>L +1 <b>do </b>Word[I] := Word[I -1];
        Word[L +1] := 's';
        Inc(WordLength);
        <b>end else
        if not </b>(Word[L] <b>in </b>['a'..'z','ä','ö','&uuml;']) <b>then </b>Exit;
        <b>end</b>;
        Found.Insert(PByte(Word), WordLength);
        Found.Insert;
        <b>end</b>;
        <b>end</b>;
        <br>
        <b>var
        </b>Dawg,Found: TDawg;
        Map: TDawgMapping;
        Symbol: TDawgChar;
        <b>begin
        </b>Dawg := TDawg.Create;
        Found := TDawg.Create;
        <b>try
        for </b>Symbol := Low(Symbol) <b>to </b>High(Symbol) <b>do </b>Map[Symbol] := Symbol;
        AnsiLowerBuff(Map, SizeOf(Map));
        Found.SetMapping(Map, [#0,#10,#13,',',';',':']);
        <br>
        Dawg.LoadFromFile('d:\deutsch.dawg');
        Dawg.Enum(@DoCopy, Found);
        Found.Pack;
        Found.SaveToFile('d:\scrabble.dawg');
        <br>
        WriteLn(Dawg.Count:10, Dawg.Size:10);
        WriteLn(Found.Count:10, Found.Size:10);
        <b>finally
        </b>Dawg.Free;
        Found.Free;
        <b>end</b>;
        <b>end</b>;
        </font>
        </code></pre>

        Die Größe des Dawgs reduziert sich von 830Kb auf 655Kb.<br>

        Gruß Hage

        Comment


        • #19
          Hallöle!

          Hab mir die Mail gesaugt und versucht, den Code zu testen. Allerdings funktionieren die nich. Bei dem aus der Mail passiert nix, wird auch keine deutsch.txt erzeugt und bei dem 2. Code meint er, dass er in der Funktion DoCopy die Methode Insert bei Found nicht kennt (is in der Unit dawg.pas auch im protected-Bereich) ...

          Grüße, Mari

          Comment


          • #20
            Richtig, .Insert() einfach in den public Bereiche verschieben.<br>

            Du solltest die Dateinamen mit dem Pfad expandieren.<br>
            Angenommen du hast alles nach D:\Test\ entzippt, dann sollte D:\test\deutsch.dawg benutzt werden.

            Gruß Hage

            Comment


            • #21
              Funktioniert irgendwie nich. Compilen geht aber nach Dawg.Create steigt er mit einer Zugriffsverletzung aus. Hab D5 Enterprise ... aber auch noch D6 E hier rumliegen ... könntes an der D-Version liegen?<pre>
              <DIV><FONT face="Courier New" size=2><FONT color=#000000><FONT
              face="Courier New" size=2><FONT
              color=#000000><B>var</B><BR>&nbsp;&nbsp;xDawg,&nbsp;Found:&nbsp;TDawg;<B R>&nbsp;&nbsp;C:&nbsp;Char;<BR>&nbsp;&nbsp;Map:&nb sp;TDawgMapping;<BR><B>begin</B><BR>&nbsp;&nbsp;xDawg.Create;<BR>&nbsp;&nbsp;<FO NT
              face="Courier New" color=#000080
              size=2><I>//&nbsp;Die&nbsp;Ausgabe&nbsp;von&nbsp;WriteLn&nbsp; erfolgt&nbsp;nich&nbsp;mehr&nbsp;...</I></FONT><BR>&nbsp;&nbsp;writeln(<FONT
              face="Courier New" size=2><FONT
              color=#800080>'--&gt;&nbsp;hier'</FONT>);<BR>&nbsp;&nbsp;Found.Create;<BR>&nbsp;&nbs p;<B>try</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;...<BR>&nbsp;&nbsp;< B>end</B>;</FONT></FONT></FONT></FONT></FONT></DIV>
              <DIV><STRONG><FONT face="Courier New" size=2>end;</FONT></STRONG></DIV>
              </pre&gt

              Comment


              • #22
                Aua, was machst Du da ??

                <pre>

                var
                Dawg,Found: TDawg;
                begin
                Dawg := TDawg.Create;
                Found := TDawg.Create;
                try
                finally
                Found.Free;
                Dawg.Free;
                end;
                end;

                </pre>

                Immer ObjectInstance := ObjectClass.Create !!

                Gruß Hage

                Comment


                • #23
                  xDawg, weil Delphi sonst Probleme mit der Unit Dawg bringt. Der Compiler denkt wohl, ich mein mit Dawg.Create die Funktion Create in der Unit Dawg.pas ..

                  Comment


                  • #24
                    <pre>

                    ok , dann aber <bR>

                    uses Dawg;

                    var
                    xDawg: TDawg;
                    begin
                    xDawg := TDawg.Create;
                    try
                    finally
                    xDawg.Free;
                    end;
                    end;

                    </pre>

                    Gruß Hage

                    Comment


                    • #25
                      Logisch ... jetz gehts ... so stands aber in deinem Code in der Mail *g* Die erzeugte Scrabble.dawg enthält allerdings 0 Einträge und is nur 1.060 Bytes groß ...

                      Hier mal der Code:<pre>

                      <DIV><FONT face="Courier New" size=2><FONT color=#000000><FONT
                      face="Courier New" size=2><FONT color=#000000><FONT face="Courier New"
                      size=2><FONT face="Courier New" size=2><FONT face="Courier New" size=2><FONT
                      color=#000000><FONT face="Courier New" size=2><FONT
                      color=#000000><B>program</B>&nbsp;dawg_impl;<BR><FONT face="Courier New"
                      color=#000080
                      size=2><I>{$APPTYPE&nbsp;CONSOLE}</I></FONT><BR><B>uses</B><BR>&nbsp;&nbsp;SysUtils,&nbsp;Windows,&nbsp;Daw g;<BR></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><FONT
                      face="Courier New" size=2><FONT color=#000000><FONT face="Courier New"
                      size=2><FONT color=#000000><FONT face="Courier New" size=2><FONT
                      face="Courier New" size=2><FONT face="Courier New" size=2><FONT
                      color=#000000><FONT face="Courier New" size=2><FONT
                      color=#000000><B>procedure</B>&nbsp;CleanupForGermanScrabble;<BR>&nbsp;&nbsp;< B>function</B>&nbsp;DoCopy(Found:&nbsp;TDawg;&nbsp;Word:&nbsp; PChar;&nbsp;WordLength:&nbsp;Integer):&nbsp;Boolea n;<BR>&nbsp;&nbsp;&nbsp;&nbsp;register;<BR>&nbsp;& nbsp;<B>var</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;L,&nbsp;I:&nbsp;Inte ger;<BR>&nbsp;&nbsp;<B>begin</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp; False;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>if</B>&nbsp;(WordLength&nbsp;&gt;&nbsp;1)&nbsp;<B>and </B>&nbsp;(WordLength&nbsp;&lt;=&nbsp;15)&nbsp;<B>th en</B>&nbsp;<B>begin</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L&nbsp;: =&nbsp;WordLength;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;<B>while</B>&nbsp;L&nbsp;&gt;&nbsp;0&nbsp;<B>do</B>&nbsp;<B>begin</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;Dec(L);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;<B>if</B>&nbsp;Word[L]&nbsp;=&nbsp;<FONT
                      face="Courier New" size=2><FONT
                      color=#800080>'ß'</FONT>&nbsp;<B>then</B>&nbsp;<B>begin</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;Word[L]&nbsp;:=&nbsp;<FONT
                      face="Courier New" size=2><FONT
                      color=#800080>'s'</FONT>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;<B>for</B>&nbsp;I&nbsp;:=&nbsp;WordLength&nbsp;<B>downto</B>&nbsp;L&nbsp;+&nbsp;1&nbsp;<B>do</B>&nbsp;Word[I]&nbsp;:=&nbsp;Word[I&nbsp;-&nbsp;1];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;&nbsp;Word[L&nbsp;+&nbsp;1]&nbsp;:=&nbsp;<FONT
                      face="Courier New" size=2><FONT
                      color=#800080>'s'</FONT>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;Inc(WordLength);<BR>&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<B>end</B>&nbsp;<B>else</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;<B>if</B>&nbsp;<B>not</B>&nbsp;(Word[L]&nbsp;<B>in</B>&nbsp;[<FONT
                      face="Courier New" size=2><FONT color=#800080>'a'</FONT>..<FONT
                      face="Courier New" size=2><FONT color=#800080>'z'</FONT>,&nbsp;<FONT
                      face="Courier New" size=2><FONT color=#800080>'ä'</FONT>,&nbsp;<FONT
                      face="Courier New" size=2><FONT color=#800080>'ö'</FONT>,&nbsp;<FONT
                      face="Courier New" size=2><FONT
                      color=#800080>'ü'</FONT>])&nbsp;<B>then</B>&nbsp;Exit;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;<B>end</B>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Found.I nsert(PByte(Word),&nbsp;WordLength);<BR>&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;Found.Insert;<BR>&nbsp;& nbsp;&nbsp;&nbsp;<B>end</B>;<BR>&nbsp;&nbsp;<B>end</B>;<BR></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><FONT
                      face="Courier New" size=2><FONT color=#000000><FONT face="Courier New"
                      size=2><FONT color=#000000><FONT face="Courier New" size=2><FONT
                      face="Courier New" size=2><FONT face="Courier New" size=2><FONT
                      color=#000000><FONT face="Courier New" size=2><FONT
                      color=#000000><B>var</B><BR>&nbsp;&nbsp;xDawg,&nbsp;Found:&nbsp;TDawg;<B R>&nbsp;&nbsp;Map:&nbsp;TDawgMapping;<BR>&nbsp;&nb sp;Symbol:&nbsp;TDawgChar;<BR><B>begin</B><BR>&nbsp;..

                      Comment


                      • #26
                        <pre><FONT face="Courier New" size=2><FONT
                        color=#000000>...<br>
                        &nbsp;&nbsp;xDawg&nbsp;:=&nbsp;TDawg.Create;<BR>&n bsp;&nbsp;Found&nbsp;:=&nbsp;TDawg.Create;<BR>&nbs p;&nbsp;<B>try</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>for</B>&nbsp;Symbol&nbsp;:=&nbsp;Low(Symbol)&nbsp;<B>to </B>&nbsp;High(Symbol)&nbsp;<B>do</B>&nbsp;Map[Symbol]&nbsp;:=&nbsp;Symbol;<BR>&nbsp;&nbsp;&nbsp;&nbsp;A nsiLowerBuff(Map,&nbsp;SizeOf(Map));<BR>&nbsp;&nbs p;&nbsp;&nbsp;Found.SetMapping(Map,&nbsp;[#0,&nbsp;#10,&nbsp;#13,&nbsp;<FONT
                        face="Courier New" size=2><FONT color=#800080>','</FONT>,&nbsp;<FONT
                        face="Courier New" size=2><FONT color=#800080>';'</FONT>,&nbsp;<FONT
                        face="Courier New" size=2><FONT
                        color=#800080>':'</FONT>]);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;xDawg.LoadFromFi le(<FONT
                        face="Courier New" size=2><FONT
                        color=#800080>'wordlist\deutsch.dawg'</FONT>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;xDawg.Enum(@DoC opy,&nbsp;Found);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Found .Pack;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Found.SaveToFile (<FONT
                        face="Courier New" size=2><FONT
                        color=#800080>'wordlist\scrabble.dawg'</FONT>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteLn(xDawg.C ount:&nbsp;10,&nbsp;xDawg.Size:&nbsp;10);<BR>&nbsp ;&nbsp;&nbsp;&nbsp;WriteLn(Found.Count:&nbsp;10,&n bsp;Found.Size:&nbsp;10);<BR>&nbsp;&nbsp;<B>finall y</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;xDawg.Free;<BR>&nbsp ;&nbsp;&nbsp;&nbsp;Found.Free;<BR>&nbsp;&nbsp;<B>e nd</B>;<BR><B>end</B>;<BR><B>begin</B><BR>&nbsp;&nbsp;CleanUpForGermanScrabble;<BR><B> end</B>.<BR></FONT></FONT></FONT></FONT></FONT></pre>

                        <u><b>DOS-Fenster:</b></u><pre>
                        <P><FONT face="Courier New" size=2><FONT color=#000000><FONT face="Courier New"
                        size=2><FONT
                        color=#000000>c:\Borland\projects\dev\Scrabble&gt; dawg_impl<BR>&nbsp;&nbsp;&nbsp;&nbsp;200023&nbsp;& nbsp;&nbsp;&nbsp;830376<BR>&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</FONT></FONT></FONT></FONT></P></pre&gt

                        Comment


                        • #27
                          In DoCopy() ändere mal die Charsets von Klein- auf Großbuchstaben um. Also ['a'..'z', 'ä', 'ö', 'ü'] in ['A'..'Z', 'Ä', 'Ö', 'Ü']) . Es könnte sein das Deutsch.dawg von mir so eingestellt wurde das es mit Großbuchstaben arbeitet.<br>
                          Besser gleich mal in ['a'..'z', 'ä', 'ö', 'ü', 'A'..'Z', 'Ä','Ö','Ü']) ändern.<br>
                          Gundsätzlich bestimmt der Aufruf Dawg.SetMapping() wie die Buchstaben der eingelesenen Wörter konvertiert werden. Im obigen Code wird z.B. für Found ein Zeichenmapping auf Kleinbuchstaben eingestellt. D.h. das komplette Found Dawg speichert nur Kleinbuchstaben.<br>Die erhöht die Kompressionsrate und beschleunigt das Suchen im Dawg.
                          Du kannst natürlich in DoCopy() einen Breakpoint setzen und dann Word:PChar auswerten. Dann siehst du selber was benutzt wurde.

                          Gruß Hage

                          Comment


                          • #28
                            OK, tHx jetzt funktionierts ordentlich. Ich hab mal oberflächlich die beiden Wordlists verglichen (meine und deine), und ich glaube, es gibt da kaum Unterschiede. Die deutsch.txt ist 2.714.064 Bytes groß und meine 2.713.829.

                            Grüße,
                            Mari

                            Comment


                            • #29
                              Mail mir mal deine an [email protected]<br>
                              Haste auch mal die Performance verglichen ?
                              Um in deinem Falle die Scrabble Racks aufzulösen machste folgendes:

                              <pre>

                              function DoPrint(userData: Pointer; Word: PChar; WordLength: Integer): Boolean; register;
                              begin
                              Result := False;
                              WriteLn(Word);
                              end;<br>

                              var
                              Dawg,Found: TDawg;
                              Tick: Cardinal;
                              I: Integer;
                              begin
                              Found := TDawg.Create;
                              Dawg := TDawg.Create;
                              try
                              Dawg.LoadFromFile('deutsch.dawg');
                              Tick := GetTickCount;
                              for I := 1 to 10000 do
                              Dawg.SearchCombinatoric('ABDEEHI', Found);
                              Tick := GetTickCount - Tick;
                              WriteLn( Tick/10000:10:4, ' ms, ', Found.Count:10);
                              Found.Enum(@DoPrint);
                              finally
                              Found.Free;
                              Dawg.Free;
                              end;
                              end;

                              </pre>

                              Danke und Gruß, Hage

                              Comment


                              • #30
                                Hab geschickt.

                                Yo, aber der Computer soll ja auch die schon gelegten Worte mit einbeziehen. Irgendwie ganz schön knifflig, das umzusetzen, merk ich *g* Grübel jetz schon seit ner Weile, wie ich am besten die gelegten Steine im Spielfeld auflöse ...

                                Grüße, Mari

                                Comment

                                Working...
                                X