OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 12:43

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 6 ] 
Autor Zpráva
 Předmět příspěvku: Detekcia preklepov
PříspěvekNapsal: 03.04.2020, 16:03 
Offline
Kecka
Uživatelský avatar

Registrován: 09.10.2013, 10:01
Příspěvky: 34
Has thanked: 105 times
Been thanked: 5 times
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/


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Detekcia preklepov
PříspěvekNapsal: 05.04.2020, 03:48 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
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. .)

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Detekcia preklepov
PříspěvekNapsal: 05.04.2020, 11:02 
Offline
Kecka
Uživatelský avatar

Registrován: 09.10.2013, 10:01
Příspěvky: 34
Has thanked: 105 times
Been thanked: 5 times
Ukazky by som nechal citatelnejsie :) Mozes pridat a Jaro distance uz ma ZX https://rosettacode.org/wiki/Jaro_dista ... trum_Basic


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Detekcia preklepov
PříspěvekNapsal: 06.04.2020, 01:29 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
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 11578 krát ]

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Naposledy upravil _dworkin dne 06.04.2020, 03:18, celkově upraveno 2
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Detekcia preklepov
PříspěvekNapsal: 06.04.2020, 02:18 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Jinak bys mel tu Atari verzi dat na zacatek na treti misto, protoze to maji serazene podle abecedy. :D

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Detekcia preklepov
PříspěvekNapsal: 06.04.2020, 07:54 
Offline
Kecka
Uživatelský avatar

Registrován: 09.10.2013, 10:01
Příspěvky: 34
Has thanked: 105 times
Been thanked: 5 times
Vidíš a to som si nevšimol, diky premiestnim :-)

Odoslané pomocou Tapatalku


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 6 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 4 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz