OldComp.cz
http://www.oldcomp.cz/

Detekcia preklepov
http://www.oldcomp.cz/viewtopic.php?f=26&t=8427
Stránka 11

Autor:  pedromagician [ 03.04.2020, 16:03 ]
Předmět příspěvku:  Detekcia preklepov

Naportoval som Levenshtein/Damerau-Levenshtein a Jaro/Jaro-Winkler algoritmy na detekciu preklepov... do Turbo-BASICU XL a Action!
Takze od teraz uz je Atari aj na rosettacode :)
https://rosettacode.org/wiki/Levenshtein_distance
https://rosettacode.org/wiki/Jaro_distance

pripadne priamo na stiahnutie u Wolfa https://txt.pohroma.de/2020/04/03/porov ... -retazcov/

Autor:  _dworkin [ 05.04.2020, 03:48 ]
Předmět příspěvku:  Re: Detekcia preklepov

Tak ted se citim trochu zahanbene ze tam neni zx basic... :D
Dival jsem se u prvniho okazu na C variantu reseni (protoze jsem chtel videt algoritmus a prislo me C jako nesnazsi) a nelibi se mi
Kód:
        /* if either string is empty, difference is inserting all chars
         * from the other
         */
        if (!ls) return lt;
        if (!lt) return ls;

Radsi bych to prepsal na
Kód:
        /* if either string is empty, difference is inserting all chars
         * from the other
         */
        if (!(ls*lt)) return ls+lt;

Teda pro PC, takze pro procesor co ma instrukci nasobeni.
Tady je to vic univerzalni.. takze je to asi dobre. .)

Autor:  pedromagician [ 05.04.2020, 11:02 ]
Předmět příspěvku:  Re: Detekcia preklepov

Ukazky by som nechal citatelnejsie :) Mozes pridat a Jaro distance uz ma ZX https://rosettacode.org/wiki/Jaro_dista ... trum_Basic

Autor:  _dworkin [ 06.04.2020, 01:29 ]
Předmět příspěvku:  Re: Detekcia preklepov

Nikdy jsem nebyl dobry v programovani basicu na Spectru. A stejne jsem vsechno zapomnel. Ale kdyz uz je basic na ZX Spectru znamy tim ze zvlada funkce s parametry, nekonecne rekurze a jine vymozenosti modernejsich jazyku tak jsem prepsal tu C variantu.
Kód:
10 REM ZX Spectrum Levenshtein
20 INPUT "first word:", n$
30 INPUT "second word:", m$
40 LET r=LEN n$+LEN m$:DIM n(r):DIM m(r):DIM e(r)
50 LET n(2)=LEN n$:LET m(2)=LEN m$:LET n(1)=n(2)+1:LET m(1)=m(1)+1:LET r=1
60 GOSUB 1000
70 PRINT "The Levenshtein distance between """;n$;""", """;m$;""" is ";e(2);"."
80 STOP
1000 LET r=r+1
1010 IF n(r)=0 THEN LET e(r)=m(r):LET r=r-1:RETURN
1020 IF m(r)=0 THEN LET e(r)=n(r):LET r=r-1:RETURN
1030 IF n$(n(r) TO n(r))=m$(m(r) TO m(r)) THEN LET n(r)=n(r)-1:LET m(r)=m(r)-1:GOTO 1010
1040 LET n(r+1)=n(r)-1:LET m(r+1)=m(r)-1:GOSUB 1000:LET e(r)=e(r+1)
1050 IF n(r-1)>n(r) THEN LET n(r+1)=n(r)-1:LET m(r+1)=m(r):GOSUB 1000:if e(r+1)<e(r) THEN LET e(r)=e(r+1)
1060 IF m(r-1)>m(r) THEN LET n(r+1)=n(r):LET m(r+1)=m(r)-1:GOSUB 1000:if e(r+1)<e(r) THEN LET e(r)=e(r+1)
1070 LET e(r)=e(r)+1:LET r=r-1:RETURN

Pridal jsem tam optimalizaci, protoze ta C varianta je napsana tak jednoduse, ze jednou umaze jeden znak z prvniho retezce (1050) a zavola se znova, kde pak umaze znak z druheho retezce (1060)... :poke: coz je to same co zamena znaku (1040), jen delsi.

Obavam se ze tu trolim Atari forum a jeste hroznym kodem. Nevim kolik rekurzi ZX zvladne, ale aspon na testovacich slovech to ZX zvladnul (zrychlil jsem emulator 100x a cekal a cekal... :D ).

Mozna by stalo za to predhodit to dalsim lidem, :help: kdo to napise lepe. .)

EDIT: Tak to trva 3h 11m a bez optimalizace asi nekolik dni.

Přílohy:
zx_levensthein.png
zx_levensthein.png [ 1.37 KiB | Zobrazeno 11630 krát ]

Autor:  _dworkin [ 06.04.2020, 02:18 ]
Předmět příspěvku:  Re: Detekcia preklepov

Jinak bys mel tu Atari verzi dat na zacatek na treti misto, protoze to maji serazene podle abecedy. :D

Autor:  pedromagician [ 06.04.2020, 07:54 ]
Předmět příspěvku:  Re: Detekcia preklepov

Vidíš a to som si nevšimol, diky premiestnim :-)

Odoslané pomocou Tapatalku

Stránka 11 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/