Assembly - anagramma ellenőrzés

Assembly - anagramma ellenőrzés
2018-05-04T10:12:26+02:00
2018-05-04T16:47:36+02:00
2022-10-15T21:41:40+02:00
Gunyóca
Sziasztok!
Az a feladatom, hogy be kérjek két szót szóközzel elválasztva, majd kiírni, hogy anagrammák-e vagy nem. Az Irvine könyvtár segítségével olyat sikerült csinálnom, hogy ENTER-rel kér be egy-egy szót, majd megnézi, hogy egyenlő hosszúak-e a szavak. És itt akadtam el: nem tudom ,hogyan menjek végig a szavakon, és távolítsam el a megegyező karaktereket. Csatolom az asm fájlt, ameddig eljutottam vele.
Előre is köszi a válaszokat!
Mutasd a teljes hozzászólást!
Csatolt állomány
Na végül sikerült megoldanom egy teljesen más módon: az első szó minden karaktere után végigmentem a második szó karakterein, és ha egyezéest talált akkor egy '_' karakterre kicserélte.
Miután az első szó végére értem újabb ciklust csináltam a második szóra, ami a '_' karaktereket számolta meg. És ha ez megegyezett az első szó hosszával, akkor kiírja, hogy anagramma.
Mutasd a teljes hozzászólást!

  • Ha sorba rendezed a két szót, és az eredményeket összehasonlítod, az pont megfelelő eredményt ad.
    Ha nem akarsz rendezni, akkor felveszel két "tömböt", amiben számolod az egyes karakterek előfordulását, a végén pedig megnézed, hogy a két tömb egyforma-e.
    És még biztos ki lehet találni 8 másik megoldást is, de a fenti kettő már bőven elegendő kell, hogy legyen.
    Mutasd a teljes hozzászólást!
  • A legegyszerűbb, amit balage73 is írt, hogy rendezd sorba a szavak betűit. Ha ez megvan, akkor már csak végig kell lépkedni a két "tömbön" és betűnként összehasonlítani. Ha minden "tömbelem" egyezik, akkor nyert ügy, az első eltérés esetén pedig kiírod, hogy nem nyert.

    pl a két szó: kép pék, ezeket rendezve: ékp, ékp. Összehasonlítás után ez anagramma.
    alma lakás: aalm, aákls-> második betűnél eltérés, nem nyert.

    Természetesen csinálhatsz hossz vizsgálatot is. Ha a kettő nem egyezik, akkor eleve bukta van és így felesleges a cpu-t dolgoztatni a rendezéssel és összehasonlítással.
    Mutasd a teljes hozzászólást!
  • Ez a rendezés jónak tűnik, még csak annyit hogy ezt hogyan lehet megvalósitani assemblyben?
    Mutasd a teljes hozzászólást!
  • Pálda az asm art könyvből:

    ; Compare arr1 and arr2 lea si, arr1 ; Reset pointer to arr1 mov cl, 10 ; Length of arr1 = loop counter for loopOne mov bx, 0 ; Counter for matches loopOne: ; Loop through arr1 mov al, [si] ; Load one element of arr1 lea di, arr2 ; Reset pointer to arr2 mov ch, 10 ; Length of arr2 = loop counter for loopTwo loopTwo: ; Loop through arr2 mov ah, [di] ; Load one element of arr2 cmp al, ah ; Compare it jne @1 ; Skip the next line if no match inc bx ; Increment match counter @1: inc di ; Next element in arr2 dec ch ; Decrement loop counter jne loopTwo ; Loop - break if CH == 0 inc si ; Next elemnt in arr1 dec cl ; Decrement loop counter jne loopOne ; Loop - break if CL == 0 mov ax, bx ; match counter into AX for print_num_uns
    Mutasd a teljes hozzászólást!
  • Rendezést írni tetszőleges nyelvben besz@rás, de assembly-ben végképp.
    Amúgy meg nincs is rá szükséged: ha van elég memóriád, egy statisztika is elég. Foglalj minden létező karakternek egy számlálót, és számold össze az előfordulásait az első sztringben. Majd ugyanezt a másodikkal. Majd hasonlítsd össze a két statisztikát. Advanced esetben egy statisztika is elég, az első sztringgel növeled, a másodikkal meg csökkented és a végére 0-ra kell mindegyik számlálónak beállnia.
    ASCII és legfeljebb 255 egyforma karaktert tartalmazó sztringek esetére C-szerű pszeudokód:

    boolean anagrammak(char *string1,char* string2){ byte stats[256]; for("byte" i=0;"i<256";i++) stats[i]=0; while(*string1)stats[*string1++]++; while(*string2)stats[*string2++]--; for("byte" i=0;"i<256";i++) if(stats[i])return false; return true; }
    A for ciklusokat azért idézőjeleztem, mert ha a ciklusváltozó 1 byte-os, akkor túlcsordulást kell figyelni (amikor másodszor felveszi a 0 értéket, akkor ért véget a ciklus, ez szerintem a z és c flagekben is megjelenik), ha viszont tényleg "<256"-ra tesztelsz, akkor nem lehet 1 byte-os a ciklusváltozó.
    Mutasd a teljes hozzászólást!
  • Ez is jó (jobb) megoldás. Egyébként annyira azért a rendezés sem vészes, ha standard ascii karakterekről van szó. Amibe természetesen az ékezetes magánhangzóink is beleférnek. Habár ha unicode karakterek vannak, az más tészta.
    Mutasd a teljes hozzászólást!
  • Ebbe most belekavarodtam, az ASCII csak 0-127 lett volna. 128-256 már extended, meg kódlapok, stb.

    Nyilván ha über-rugalmas karakterkészlet meg darabszám kéne, akkor valami listába tenném a már látott karaktereket (meg persze a darabszámukat), és akkor egy idő után a lineáris keresés már lassúnak bizonyulna, és inkább rendezett listát építenék, és bináris keresést játszanék benne. Ez még mindig elég békés, mert a bináris keresés végén vagy megvan az elem, vagy megvan, hogy hova kell beszúrni (és a lista maradékát egy elemmel odébbpakolni nem olyan bonyolult).
    Ha meg megbolondulnék, akkor nyilván lehet hashmapet írni assembly-ben is.
    Mutasd a teljes hozzászólást!
  • Na végül sikerült megoldanom egy teljesen más módon: az első szó minden karaktere után végigmentem a második szó karakterein, és ha egyezéest talált akkor egy '_' karakterre kicserélte.
    Miután az első szó végére értem újabb ciklust csináltam a második szóra, ami a '_' karaktereket számolta meg. És ha ez megegyezett az első szó hosszával, akkor kiírja, hogy anagramma.
    Mutasd a teljes hozzászólást!
  • Ezek szerint akkor a "kacsa" és a "macska" is anagramma? Plusz mi van, ha az egyik szóban eleve szerepel a wildcard? (Miért ne lehetne összehasonlítani a "kutya" és a "_____" karakterláncokat?)
    Mutasd a teljes hozzászólást!
  • Igen, erre én is gondoltam, de a feladat kikötésében szavakról szól, így nem hiszem, hogy bármilyen karakterre működnie kell. A vége meg így néz ki:

    CMP EAX, betukszama1 JE lehet JNE rossz lehet: CMP EAX, betukszama2 JE jolesz CALL NEMJO JMP kilep jolesz: CALL HELYES JMP kilep rossz: CALL NEMJO JMP kilep kilep:
    Mutasd a teljes hozzászólást!
  • de a feladat kikötésében szavakról szól

    A takarítónő, Piroskát is megkérdezted erről? Vagy a főnök mű-szöszi titkárnőjét?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd