Python osaajilta tarvitaan apua

Elikkäs olisi pieni pulma ohjelman toimivuuden suhteen:

# -*- coding: latin-1 -*-
lause = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
lauselista = list(lause) #pilkotaan lause kirjaimiksi jolloin voidaan käydä ne läpi kirjain kirjaimelta
avain = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","x","y","z"]
avain = avain[::-1] #käännetään avain lista nurin
for kirjain in lauselista: #seulotaan lause kirjaimittain läpi
if kirjain in avain: #jos löydetään lauseen kirjain avain listasta
y = avain.index(kirjain) #haetaan sitten kyseisen kirjaimen sijainti avain listasta
y2 = y - 2 #vähennetään kirjaimen sijaintia kahdella että saadaan oikea kirjain g -> i jne
lause = lause.replace(kirjain, avain[y2]) #korvataan lauseen kirjain oikealla kirjaimella joka
#aikaisemmin haettiin
print lause #tulostetaan muunneltu lause oikeilla kirjaimilla


Kyseinen koodi ei ota toimiakseen sitten millään koska se tulostaa aivan väärät kirjaimet mitä olisi tarkoitus vaikka kaiken järjen mukaan sen pitäisi toimia oikein. Olen tätä yrittänyt jo selvitellä useita tunteja ja hakenut tietoa muttei mikään tunnu auttavan joten olisiko kellään tietoa ongelman korjaamiseksi? Olen äskettäin aloitellut ohjelmointia Pythonilla mutta kyseiset 'näkymättömät' ongelmat laittavat seinän vastaan.
Kyseinen koodi liittyy tähän tehtävään:
http://www.pythonchallenge.com/pc/def/map.html
7690
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

Tuo koodi nyt ei pysty toimimaan. Ajatus sinänsä ihan hyvä että teet taulukon kirjaimien kääntämistä varten, toteutus vain tökkii eikä ole kauhean pythonmaista.

Ehkä helpointa olisi käyttää dictionary-objektia käännöstaulukkona. Teet ohjelmanpätkän joka muodostaa "taulukon" esim:
d = {'a': 'c', 'b': 'd', 'c': 'e' .. jne} (tosin, älä tee tätä taulukkoa käsin vaikka se niin toimisikin =)

Kun "taulukon" olet luonut voit kääntää salatun viestin vaikka näin:
for kirjain in lause:
....print d[kirjain]

Ja se taulukon luominenkaan ei ole kovin monimutkaista.. siihenkin on kovin monta tapaa.
Yksi helppo tapa olisi vaikka aloittaa jotenkin näin - tämä on puutteellinen tarkoituksella, jääpähän vielä jotain mietittävääkin:
d = {}
for i in xrange(len(aakkoset)): # silmukoidaan i:n arvoilla 0,1,2,3,4 kirjainten lukumäärän mukaan
....d[aakkoset[i]] = aakkoset[i 2] # talletetaan taulukkoon kirjaimesta - tässä menee viduralleen tiiätkös miksi?

Kysessähän on siis rot13 salauksen muoto jossa kirjaimia käännetäänkin vaan se 2 merkkiä. Rot13 hakemalla löytynee moniakin toteutustapoja jos tästä ei meinaa päästä eteenpäin millään.

Onnea vaan!

ps. "import this" ;)

Äänestä
  • [quote]d[aakkoset[i]] = aakkoset[i 2] # talletetaan taulukkoon kirjaimesta - tässä menee viduralleen tiiätkös miksi? [/quote]
    Ainakin koska se yrittää hakea kahdella viimeisellä kerralla tietoa taulukon ulkopuolelta ja pukkaa vaan erroria. Kyseistä menetelmää en saanut toimimaan vaikka laitoin rajoitukset siihen koska se pukkasi kirjaimet tyyliin a:c c:c c:e tai vastaavaa elikkä vain ensimmäinen pari meni oikein eikä hajuakaan miksi :)

    Noh nyt kumminkin hulppeat 8 tuntia myöhemmin sain sen vihdoinkin toimimaan, sitkeys palkitaan:

    import string
    kirjaimet = string.ascii_lowercase
    avain = 2
    kaanna = kirjaimet[avain:] kirjaimet[0:avain]
    swap = string.maketrans(kirjaimet,kaanna)
    text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    print text.translate(swap)

    Kiitoksia paljon avusta vaikkei se paksuun kallooni uponnutkaan, sainpahan ainakin pohdiskella tovin.
    Aamuun asti meni joten tästä varmaan joutais jo pitkälleen :)

    Äänestä

  • Ippee kirjoitti:

    [quote]d[aakkoset[i]] = aakkoset[i 2] # talletetaan taulukkoon kirjaimesta - tässä menee viduralleen tiiätkös miksi? [/quote]
    Ainakin koska se yrittää hakea kahdella viimeisellä kerralla tietoa taulukon ulkopuolelta ja pukkaa vaan erroria. Kyseistä menetelmää en saanut toimimaan vaikka laitoin rajoitukset siihen koska se pukkasi kirjaimet tyyliin a:c c:c c:e tai vastaavaa elikkä vain ensimmäinen pari meni oikein eikä hajuakaan miksi :)

    Noh nyt kumminkin hulppeat 8 tuntia myöhemmin sain sen vihdoinkin toimimaan, sitkeys palkitaan:

    import string
    kirjaimet = string.ascii_lowercase
    avain = 2
    kaanna = kirjaimet[avain:] kirjaimet[0:avain]
    swap = string.maketrans(kirjaimet,kaanna)
    text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    print text.translate(swap)

    Kiitoksia paljon avusta vaikkei se paksuun kallooni uponnutkaan, sainpahan ainakin pohdiskella tovin.
    Aamuun asti meni joten tästä varmaan joutais jo pitkälleen :)

    Tapoja on monia kuten näet :) maketrans on tosin pitkälti valmis ratkaisu, mutta pätevä juuri tuollaiseen

    Tässä vielä tämä mikä itellä tuli ensiksi mieleen (jos kiinnostusta enää riittää).. korvaa rivin alussa olevat .... asianmukaisella sisennyksellä niin toimii paremmin ;)

    import string
    letters = string.lowercase
    d = {}
    for i in xrange(0, len(letters)):
    ....d[letters[i]] = letters[(i+2) % len(letters)] #jakojäännös estää indeksin vuotamasta yli

    text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    l = [] # lista johon kirjaimet lisätään
    for c in text:
    ....l.append(d.get(c, c)) # d[c] tai c jos taulukossa ei kyseistä merkkiä
    print ''.join(l)

    En tehnyt tuosta mitään extrakompaktia. Ehkä tuosta jotain apua jollekin on :)

    Äänestä

  • sdfsdfsf kirjoitti:

    Tapoja on monia kuten näet :) maketrans on tosin pitkälti valmis ratkaisu, mutta pätevä juuri tuollaiseen

    Tässä vielä tämä mikä itellä tuli ensiksi mieleen (jos kiinnostusta enää riittää).. korvaa rivin alussa olevat .... asianmukaisella sisennyksellä niin toimii paremmin ;)

    import string
    letters = string.lowercase
    d = {}
    for i in xrange(0, len(letters)):
    ....d[letters[i]] = letters[(i+2) % len(letters)] #jakojäännös estää indeksin vuotamasta yli

    text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    l = [] # lista johon kirjaimet lisätään
    for c in text:
    ....l.append(d.get(c, c)) # d[c] tai c jos taulukossa ei kyseistä merkkiä
    print ''.join(l)

    En tehnyt tuosta mitään extrakompaktia. Ehkä tuosta jotain apua jollekin on :)

    sama lyhempänä :)
    from string import lowercase as x
    print ''.join([dict([(x[i], x[(i+2) % len(x)]) for i in xrange(len(x))]).get(c, c) for c in "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."])

    Eri asia tekeekö tämmöisellä sitten enää mitään..

    Äänestä

  • sdfsfsfsfd kirjoitti:

    sama lyhempänä :)
    from string import lowercase as x
    print ''.join([dict([(x[i], x[(i+2) % len(x)]) for i in xrange(len(x))]).get(c, c) for c in "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."])

    Eri asia tekeekö tämmöisellä sitten enää mitään..

    Ahaa jakojäännöksellä saa korjattua tuon tsydeemin, hyvä tietää.

    Tuo jälkimmäinen metodi hieman epäselvä ainakin aloittelijan kalloon mutta hyvä kuitenkin tietää miten eri ratkaisut voidaan toteuttaa. Kiitoksia jälleen :)

    Äänestä

Ihan vinkkinä voit käyttää jatkossa vaikka pastebiniä tai muuta vastaavaa. Ne osaavat myös koodin värjäyksen.

Äänestä

Kommentoi aloitusta


Ippee kirjoitti:

Elikkäs olisi pieni pulma ohjelman toimivuuden suhteen:

# -*- coding: latin-1 -*-
lause = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
lauselista = list(lause) #pilkotaan lause kirjaimiksi jolloin voidaan käydä ne läpi kirjain kirjaimelta
avain = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","x","y","z"]
avain = avain[::-1] #käännetään avain lista nurin
for kirjain in lauselista: #seulotaan lause kirjaimittain läpi
if kirjain in avain: #jos löydetään lauseen kirjain avain listasta
y = avain.index(kirjain) #haetaan sitten kyseisen kirjaimen sijainti avain listasta
y2 = y - 2 #vähennetään kirjaimen sijaintia kahdella että saadaan oikea kirjain g -> i jne
lause = lause.replace(kirjain, avain[y2]) #korvataan lauseen kirjain oikealla kirjaimella joka
#aikaisemmin haettiin
print lause #tulostetaan muunneltu lause oikeilla kirjaimilla


Kyseinen koodi ei ota toimiakseen sitten millään koska se tulostaa aivan väärät kirjaimet mitä olisi tarkoitus vaikka kaiken järjen mukaan sen pitäisi toimia oikein. Olen tätä yrittänyt jo selvitellä useita tunteja ja hakenut tietoa muttei mikään tunnu auttavan joten olisiko kellään tietoa ongelman korjaamiseksi? Olen äskettäin aloitellut ohjelmointia Pythonilla mutta kyseiset 'näkymättömät' ongelmat laittavat seinän vastaan.
Kyseinen koodi liittyy tähän tehtävään:
http://www.pythonchallenge.com/pc/def/map.html

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu