Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php kahden sanan vertailu

Sivun loppuun

illu [27.10.2011 13:32:49]

#

Moro!
Teen eräänlaista sanakoesimulaattoria ja ongelmana on, että jos sanaan vastaa esim. niin että yksi kirjain on väärä, niin koodi merkitsee koko sanan vääräksi. Haluaisin systeemin, mikä kertoo käyttäjälle, että jostain välistä puuttuu kirjain tai värittää väärän kirjaimen eri värillä. Ongelma on etten tiedä mistä pitäisi lähteä liikkeelle. Löytyykö vastaus säännöllisistä lausekkeista vai pitääkö koko funktio tehdä itse?

Grez [27.10.2011 13:57:45]

#

En usko säännöllisistä lausekkeista olevan juurikaan apua. Periaatteessa voisit soveltaa diffin logiikkaa merkkitasolle.

illu [27.10.2011 14:36:33]

#

tietysti jos vaan lukis oikean sanan ja vastauksen taulukkoon niin että jakais jokaisen kirjaimen erikseen, niin kirjaimia olis helppo vertailla yksitellen, mutta sitten jos jostain välistä puuttuu kirjain, niin koko loppu sana merkattais vääräksi.. Ellei sitten tekis hemmetin monimutkasta vertailua :p

Grez [27.10.2011 14:37:54]

#

Ei kai siihen "hemmetin monimutkaista" vertailua tarvitse. Ihan hemmetin yksinkertainenkin toimisi.

Yucca [27.10.2011 15:54:32]

#

Eikö tässä voisi ihan vain käydä sanoja (käyttäjän kirjoittamaa sanaa K ja oikeaa sanaa O) alusta alkaen kirjain kerrallaan. Kun löytyy ensimmäinen ero, niin katsotaan aluksi, tekeekö kyseisen merkin poistaminen K:sta K:n samaksi kuin O; tällöin merkitään ylimääräinen kirjain. Jos ei, niin tehdään sama toisin päin, ja jos "onnistuu", merkitään kirjaimen puuttuminen. Ja jos ei, niin sitten vielä verrataan, tekeekö kyseisen kirjaimen muuttaminen K:ssa samaksi kuin O:n vastaava kirjain sanat samoiksi; silloin merkitään väärä kirjain. Muutokset tehdään tietysti sanojen kopioihin, jotta voidaan jatkaa alkuperäisillä sanoilla jos on tarvis jatkaa.

Tuo kai hoitaisi kaikki varsinaiset yhden kirjaimen virheet. Lisäksi voisi tuon käsittelyn jälkeen - jos asia ei ratkennut yhden kirjaimen virheenä vaan sanoissa on enemmän eroa - käsitellä sen tavallisen tilanteen, jossa kaksi merkkiä on vaihtanut paikkaa. Tämäkin lienee parasta tehdä tosi simppelisti, eli käydään K:n kirjaimia läpi ensimmäisestä toiseksi viimeiseen ja kokeillaan vaihtaa kirjain sanan seuraavan kirjaimen kanssa.

Metabolix [27.10.2011 16:58:35]

#

Yksi mahdollisuus on valita sanasta pisin yhteinen alkuosa ja pisin yhteinen loppuosa ja merkitä näiden väli virheeksi. Esimerkiksi sanojen "eksistentialismi" ja "eksitsentalismi" kohdalla siis alku olisi "eksi", virheellinen osa "stenti" vs. "tsent" ja loppu "alismi". Uskon, että tällainen tarkistus toimisi käytännön sanastoharjoituksissa aika hyvin.

AkeMake [27.10.2011 21:40:40]

#

Itsekin olen joskus tällaisen kanssa pähkäillyt ja tuo Metabolixin vastaus kuulosti melko hyvältä. Mielestäni olisi kuitenkin hyvä onnistua tarkistamaan myös tilanne, jossa alku ja loppu on väärin, mutta keskikohta oikein. Miten tällaisessa tilanteessa kannattaisi toimia? Esimerkkinä sama sana "eksistentialismi" kirjoitetaan väärin "aksistentialisnui". Alun virhe olisi siis ensimmäinen a-kirjain ja lopun virhe "mi" vs. "nui".

jlaire [28.10.2011 00:29:27]

#

No jos tuo todetaan yleiseksi tapaukseksi, että käyttäjä typottaa alun ja lopun mutta kirjoittaa keskiosan oikein, niin sille voi helposti lisätä oman tarkistuksen. Yksi rajatapaus Metabolixin menetelmässä on "eksisstentialismi". Mutta tässähän ei olla hakemassa mitään täydellistä ratkaisua vaan jotain käytännössä hyödyllistä, joten kannattaa Keep it Simple, Stupid.

Virheen suuruutta voi arvioida Levenshtein distancella. Tarkemman diffittelyn voisi esimerkiksi rajoittaa tapauksiin, joissa ero on 1-3 merkkiä. Mahdollista mutta varmaan overkilliä on myös tehdä oma toteutus kyseisen etäisyyden laskemisesta ja etsiä eroavat kohdat. Siten voisi havaita esimerkiksi kolme yhden kirjaimen virhettä, jotka eivät ole vierekkäin.

illu [29.10.2011 16:06:46]

#

Kiitos avusta! Sain riittävän hyvin toimivan version parilla silmukalla ja if lauseella, eli koodiltaan ei mikään monimutkainen juttu toteuttaa, jotenkin vaan oma logiikka ei riittänyt tähän :p Mutta tosiaan, jos haluaisi täysin takuuvarman ja kaikki virheet tunnistavan systeemin, niin koodista tulisi turhan pitkä ja tässä tapauksessa ei tarvitse olla mikään täydellinen tarkistaja, koska oikean vastauksen voi aina tulostaa väärän vastauksen viereen, mistä käyttäjä itse näkee mikä meni väärin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta