BK-puun avulla saadaan haettua hyvin nopeasti tietyllä "etäisyydellä" toisistaan olevia sanoja. Alla oleva esimerkkiohjelma antaa suorittaa ristisana tyyppisiä hakuja kuten esimerkiksi: "_h_e_m_"
Eli haetaan saman pituista sanaa, missä alaviivalla merkitty kirjain voi olla mikä tahansa ja varsinainen kirjain pitää sitten löytyä haettavasta sanasta samalta kohtaa. Löydetyt sanat esitetään listassa. Ohjelmalla kestää muutama sekunti käynnistyä, koska ajettavaan tiedostoon on paketoitu mukaan kotuksen sanastosta muodostettu BK-puu tekstimuodossa ja se pitää lukea ja parsia.
Huomasin myös bugin Nuklearin "edit controllin" toiminnassa. Kursori käyttäytyy huonosti useamman tavun UTF-8 merkkiä kirjoittaessa (liikkuu todennäköisesti merkin tavujen lukumäärän eikä merkin verran).
Jerehän voisi vääntää nettiversion aiheesta... ;-)
Ajettavat binaarit Linux ja Windows käyttöjärjestelmille
needs nk/gui 22 font:system font:new "font1" font:atlas! drop : metric \ s1 s2 -- n true s:dist ; "words.bk" app:asset >s tree:parse ' metric tree:cmp! constant words : split-join+offsets? \ s1 -- s2 a a:new swap "_" >r repeat r@ s:search null? if drop break else _swap dup n:1+ >r a:push swap s:len r@ n:> not if rdrop break else r> then then again r> s:/ "" a:join swap ; : compare \ s1 a s2 -- s1 a T s:len 3 pick s:len nip 3 pick a:len nip n:+ n:= if swap ( '_ s:! ) a:each! swap "_" s:/ "" a:join 2 pick s:= else drop false then ; : candidates? \ s -- a dup >r split-join+offsets? a:len words r> rot tree:search nip ' compare a:filter nip nip ; a:new constant list-data with: nk : getcount \ -- n list-data a:len n:1- nip ; : getitem \ n -- s list-data swap a:@ nip ; : new-win { name: "main", title: "Sanahaku", wide: 0.5, high: 0.5, bg: "white" } win "list" list-new m! ; : list-item \ s -- nk:TEXT_LEFT "black" nk:label-colored ; : search list-data a:clear "word" nk:get candidates? a:+ ; : main-render { bg: "white", font: "f1", flags: [ @WINDOW_NO_SCROLLBAR ], word: "" } begin null { margin: 4, rows: [32, -1], cols: [0.8, 0.2], cgap: 8, rgap: 8 } layout-grid-begin 0 1 0 1 grid rect>local grid-push "word" get 31 EDIT_FIELD PLUGIN_FILTER_DEFAULT edit-string if "word" swap set else drop then 0 1 1 1 grid rect>local grid-push "Hae" ' search button-label 1 1 0 2 grid rect>local grid-push "list" TEXT_LEFT get-row-height getcount "list" m@ dup>r list-begin if 0 1 layout-row-dynamic ( getitem list-item ) r@ list-range drop loop r@ list-end then rdrop layout-grid-end end ; : app:main new-win ' main-render -1 render-loop ;
Taisit olla juuri sinä, "jalski", joka esitit tuota BK-puuta tuon sanahaku-ongelman yhteydessä aiemminkin, kun oli tuo säie kuvaristikon laadinnan automatisoimisesta, jonka aloitin aiemmin tänä vuonna loppuvuodesta.
Tuo 8th on itselleni kovin vieras kieli, ja tiedä, mahtaako tuo BK-puurakenne tulla tietojenkäsitteltieteen opinnoissa aineopintoihin sisältyvällä "Edistyneemmät tietorakenteet ja algoritmit" -kussilla, vai vasta sitten, jos Gradusta suosirutuu hyvällä menestyksellä, niin jos opiskelee dosentin tai tohtorin tutkinnon sitten ylemmän korkeakoulutkinnon, tuleeko se siellä vasta. Varmaan jossain vaiheessa tulee.
Tuosta BK-puusta on mielestäni ihan mielekäs esitys "geeksforgeeks" -lähteessä
pitäisi ensin syventyä ja ottaa haltuun (takeover) tuo BK-puurakenne, ennen kuin voisi alkaa implementoimaan sitä jollain nettiselaimella toimivien kielien osalta.
Tänään odotan iltaa, kun tämä Ohjelmointiputkan jouluaaton "Murra koodi" -ongelmanasettelu julkaistaan, minkälainen se on, jos aikaa kuluttaisi sen parissa sitten.
Aihe on jo aika vanha, joten et voi enää vastata siihen.