Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointiputka: Koodivinkki-pyyntö

InvalidCo [23.02.2007 20:08:41]

#

Olisi kiva jos joku osaavampi voisi tehdä relatiivinen haku -koodivinkin tänne Ohjelmointiputkaan, kun en Googlella löytänyt sellaista enkä osannut itse ohjelmoida. :/ ROM-muokkaajat varmaan tietävätkin termin, itse en osaa sitä selittää :(

tgunner [23.02.2007 21:01:34]

#

Voitko hieman kertoa tuosta? Tuli uutena asiana ja tekis mieli saada vähän täytettä tohon kohtaan tietovarastoa. :)

InvalidCo [23.02.2007 23:41:09]

#

No, sinulla on merkkijono ja tiedosto. Tiedät, että merkkijono (esim. "kissa") löytyy tiedoston sisältä, mutta tiedosto käyttää jotain outoa enkoodausta. Kuitenkin tiedät että aakkoset menevät enkoodauksessa järjestyksessä, eli a,b,c,d,e...etc. Sitten sinä haluat keksiä, onko A-kirjain enkoodauksessa 64 (niinku ASCII-muodossa) vai 28 (niinku se vois olla jossain muussa muodossa) ja sitten ne aakkoset tulee siihen perään. Niin, eli sitten annettua merkkijonon ASCII-arvoja shiftataan ja tutkitaan että millä shiftauksella ja missä se merkkijono tulee vastaan. Eli esim. "kissa" shiftattuna 4 kertaa "eteenpäin" olis "omwwe". Tälläinen toiminto löytyy joistakin hexa-editoreista. Ikävä kyllä ne ovat vain suljettua lähdekoodia :) Kysy toki lisää, jos ei tullut selväksi!

Antti Laaksonen [23.02.2007 23:50:32]

#

Ratkaisu on tutkia, kuinka paljon yhteen merkkiin pitää lisätä tai vähentää, jotta päästään seuraavaan merkkiin. Esimerkiksi merkkijonosta "kissa" havaitaan, että muutokset ovat -2, 10, 0 ja -18. Siis k:sta pääsee i:hin, kun menee kaksi askelta alas, i:stä pääsee s:ään, kun menee kymmenen askelta ylös jne. Nyt pitää enää käydä läpi koko tiedosto ja laskea sen kaikista peräkkäisistä merkeistä vastaavat muutokset. Tässä tapauksessa siis kaikista muutoksista haettaisiin sarjaa -2, 10, 0 ja -18.

InvalidCo [24.02.2007 10:43:18]

#

Hyvä Antti, osasit sanoa sen paremmin kuin minä! Mutta voisiko joku tehdä koodivinkin aiheesta?

Antti Laaksonen [24.02.2007 13:19:54]

#

Tässä tulee esimerkkikoodi Visual Basicille:

Dim teksti As String, sana As String
Dim i As Integer, j As Integer
Dim sama As Boolean

' tutkittava teksti
teksti = "qywxeromwwerteowyxtswoix"
' etsittävä sana
sana = "kissa"

' tarkastetaan kaikki aloituskohdat
For i = 1 To Len(teksti) - 1
    ' oletetaan, että sana löytyy
    sama = True
    ' tarkastetaan kaikki muutokset
    For j = 1 To Len(sana) - 1
        ' jos muutos ei ole sama, kohta ei kelpaa
        If Asc(Mid(teksti, i + j, 1)) - Asc(Mid(teksti, i + j - 1, 1)) <> _
           Asc(Mid(sana, j + 1, 1)) - Asc(Mid(sana, j, 1)) Then
            sama = False
            Exit For
        End If
    Next
    ' jos kaikki muutokset olivat samoja, sana löytyi
    If sama Then
        MsgBox "Sana löytyi kohdasta " & i & ": " & Mid(teksti, i, Len(sana))
    End If
Next

Koodi käy läpi tekstin jokaisen merkin ja tutkii, alkaako etsittävä sana siitä kohdasta. Jos kaikki muutokset ovat samoja tutkittavassa tekstissä ja etsittävässä sanassa, kun on valittu tietty aloituskohta, voidaan ilmoittaa käyttäjälle, että sana löytyi siitä kohdasta tekstiä. Tämä ei ole tehokkain mahdollinen ratkaisu, mutta luultavasti riittävän tehokas tarkoitukseesi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta