[gelöst] Nicht so ernst: Seltsame Sache mit random.sample()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Die ganze Sache ist nicht so ganz ernst zu nehmen, nur eine Spielerei am Rande, weil ich stinkefaul bin und lieber meinen Rechner machen lasse als selbst zu denken :-) . (Das man sowas nicht machen soll, weiss ich im Prinzip schon :-D )

In einem anderen Forum wurde die Frage gestellt, ob jemand den "Code" knacken könnte, der zu den Zeichenketten von Zeile 5 im Python-Code geführt hat. (Leider wird das eine Apostroph nicht richtig angezeigt...) Da das ziemlich wenig Text ist, dachte ich, ich lasse mir ein paar Anregungen geben. Ich habe also (etwas umständlich, eine rein string-basierte Lösung wäre vermutlich weit eleganter) versucht, einfach mal zufällige Alphabete zu erzeugen und zu probieren, ob ein kurzer, gebräuchlicher Wortteil in dem "codierten" Textfetzen vorkommt.

Code: Alles auswählen

import random

alphabet = [["a"],["b"],["c"],["d"],["e"],["f"],["g"],["h"],["i"],["j"],["k"],["l"],["m"],["n"],["o"],["p"],["q"],["r"],["s"],["t"],["u"],["v"],["w"],["x"],["y"],["z"]]

input1 = "Neben Tod, Mars, off’nen real. ... Ali Moselm null. Aber Susi Moslem im Nennen. Saga Otto, Mirja."

i = 0
output = []

n = 0

while True:
    mixedup = random.sample(alphabet[::],26)   # hier versuche ich zufällige Alphabete zu erzeugen
    newout = []
    outputstring = " "
    reversestring = " "
    for i in range(len(input1)):
        
        if input1[i] in (",", ".", "'", "’", " "):  # == "," or "." or "'" or "’":
            newout.append(input1[i])
            
        else:
            lowerstring = string.lower(input1[i])
            # print lowerstring
            oripos = alphabet.index([lowerstring])
            
            newout.append(mixedup[oripos])
            buchst = str(mixedup[oripos])
            
        if input1[i] in (",", ".", "'", "’", " "):  # == "," or "." or "'" or "’":
            outputstring = outputstring + input1[i]
            reversestring = input1[i] + reversestring
        else:
            outputstring = outputstring + buchst[2]
            reversestring = buchst[2] + reversestring

        l = len(outputstring)    
        if l > len(input1):
            n = n+1
            if ("komm" or "soll" or "hab" or "wird") in outputstring:
                print n, ":", outputstring
            if ("komm" or "soll" or "hab" or "wird") in reversestring:
                print n, ":", reversestring
            output.append(newout[::])
#print output
print "done" 
Was ich jetzt nicht verstehe, ist der Output:

Code: Alles auswählen

17493 :  kjljk bxr, cpaz, xii’kjk ajpm. ... pmw cxzjmc komm. plja zozw cxzmjc wc kjkkjk. zpnp xbbx, cwaqp.
41034 :  kuquk nlj, gbie, laa’kuk iubm. ... bmp gleumg komm. bqui eoep glemug pg kukkuk. ebrb lnnl, gpisb.
43107 :  kdndk ife, twuq, fyy’kdk udwm. ... wma tfqdmt komm. wndu qoqa tfqmdt at kdkkdk. qwrw fiif, tausw.
82325 :  kznzk bcw, edyq, cuu’kzk yzdm. ... dma ecqzme komm. dnzy qoqa ecqmze ae kzkkzk. qdgd cbbc, eaypd.
88832 :  kpwpk faq, xbrd, azz’kpk rpbm. ... bmy xadpmx komm. bwpr dody xadmpx yx kpkkpk. dbib affa, xyrcb.
98671 :  kbzbk apt, efri, puu’kbk rbfm. ... fmv epibme komm. fzbr ioiv epimbe ve kbkkbk. ifxf paap, evrcf.
113131 :  kybyk rji, vufa, jee’kyk fyum. ... umq vjaymv komm. ubyf aoaq vjamyv qv kykkyk. aulu jrrj, vqfzu.
142848 :  keiek fbr, vnda, bgg’kek denm. ... nmh vbaemv komm. nied aoah vbamev hv kekkek. anun bffb, vhdsn.
186104 :  kedek tfj, avgw, fuu’kek gevm. ... vmi afwema komm. vdeg wowi afwmea ia kekkek. wvhv fttf, aigrv.
188290 :  kznzk lbw, agic, bvv’kzk izgm. ... gmy abczma komm. gnzi cocy abcmza ya kzkkzk. cgeg bllb, ayiug.
194498 :  ktytk zif, pqvd, ixx’ktk vtqm. ... qme pidtmp komm. qytv dode pidmtp ep ktkktk. dqaq izzi, pevlq.
198246 :  kfifk gax, tnzv, ahh’kfk zfnm. ... nmw tavfmt komm. nifz vovw tavmft wt kfkkfk. vnsn agga, twzun.
230414 :  kuquk nyg, rwps, yjj’kuk puwm. ... wmz rysumr komm. wqup sosz rysmur zr kukkuk. swtw ynny, rzpbw.
236041 :  kcjck igw, lzet, gss’kck eczm. ... zmp lgtcml komm. zjce totp lgtmcl pl kckkck. tznz giig, lperz.
268351 :  kjdjk bwi, ervs, wll’kjk vjrm. ... rmq ewsjme komm. rdjv sosq ewsmje qe kjkkjk. srzr wbbw, eqvcr.
269082 :  kiwik gby, djqp, bll’kik qijm. ... jmr dbpimd komm. jwiq popr dbpmid rd kikkik. pjzj bggb, drqaj.
273121 :  ksysk btq, pljc, tvv’ksk jslm. ... lmf ptcsmp komm. lysj cocf ptcmsp fp kskksk. clil tbbt, pfjgl.
279460 :  knrnk dyx, zfuv, yll’knk unfm. ... fmb zyvnmz komm. frnu vovb zyvmnz bz knkknk. vfpf yddy, zbutf.
281104 :  kehek bfi, yzxp, fnn’kek xezm. ... zmj yfpemy komm. zhex popj yfpmey jy kekkek. pzcz fbbf, yjxvz.
283488 :  kiyik rjf, uvdn, jpp’kik divm. ... vmh ujnimu komm. vyid nonh ujnmiu hu kikkik. nvqv jrrj, uhdav.
284512 :  kbubk caf, ghez, arr’kbk ebhm. ... hmv gazbmg komm. hube zozv gazmbg vg kbkkbk. zhdh acca, gvewh.
293803 :  kprpk dwf, euti, wll’kpk tpum. ... umv ewipme komm. urpt ioiv ewimpe ve kpkkpk. iuju wddw, evtsu.
313524 :  krtrk dfq, azsl, fgg’krk srzm. ... zmv aflrma komm. ztrs lolv aflmra va krkkrk. lznz fddf, avsuz.
321801 :  kfpfk ier, vwuj, ehh’kfk ufwm. ... wmg vejfmv komm. wpfu jojg vejmfv gv kfkkfk. jwaw eiie, vguzw.
350040 :  kfifk dwt, glsj, wpp’kfk sflm. ... lmz gwjfmg komm. lifs jojz gwjmfg zg kfkkfk. jlql wddw, gzsvl.
355223 :  kipik ylq, cwgz, ldd’kik giwm. ... wms clzimc komm. wpig zozs clzmic sc kikkik. zwuw lyyl, csgnw.
361669 :  krwrk qfn, lcsx, fvv’krk srcm. ... cma lfxrml komm. cwrs xoxa lfxmrl al krkkrk. xcdc fqqf, lasjc.
363983 :  kqyqk ezv, bual, zxx’kqk aqum. ... umj bzlqmb komm. uyqa lolj bzlmqb jb kqkkqk. lusu zeez, bjagu.
375656 :  kvrvk ciy, dnfx, izz’kvk fvnm. ... nml dixvmd komm. nrvf xoxl dixmvd ld kvkkvk. xntn icci, dlfan.
377872 :  khfhk lep, caiy, egg’khk iham. ... ams ceyhmc komm. afhi yoys ceymhc sc khkkhk. yaua elle, csiba.
408892 :  kqpqk uls, cbie, lrr’kqk iqbm. ... bmn cleqmc komm. bpqi eoen clemqc nc kqkkqk. ebfb luul, cnitb.
410629 :  kjzjk anv, yplu, nxx’kjk ljpm. ... pmw ynujmy komm. pzjl uouw ynumjy wy kjkkjk. upqp naan, ywlcp.
Warum bekomme ich immer ein "komm" an derselben Stelle?
(Das Verhalten ist zumindest derzeit auf meinem Rechner reproduzierbar.) Liegt das an einem Fehler in meinem Code, an der Funktionsweise von random.sample() - oder ist das einfach absoluter Zufall :-o ?
Ersetze ich "komm" durch "mach", ist das Ergebnis übrigens "gemischter"...
Zuletzt geändert von merlin_emrys am Sonntag 26. November 2006, 01:21, insgesamt 1-mal geändert.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

merlin_emrys hat geschrieben:In einem anderen Forum wurde die Frage gestellt, ob jemand den "Code" knacken könnte, der zu den Zeichenketten von Zeile 5 im Python-Code geführt hat.
Das sieht mir sehr nach "Dissociated Press" aus.

Der Algorithmus ist:
1. Gebe eine vorher bestimmte oder jedesmal zufällige Anzahl Wörter/Buchstaben an der aktuellen Stelle im Text aus.
2. Suche vorwärts nach einem erneuten Auftauchen der letzen N Wörter/Buchstaben, setze den Algorithmus von dort fort.

So ergibt sich z.B. folgender Text, wenn N=1 Wort ist, und man als Vorlage den Algorithmus-Artikel von Wikipedia nimmt.
1 Wort hat geschrieben:Unter einem '''Algorithmus''' versteht man allgemein eine genau
definierte Handlungsvorschrift zur Lösung eines Problems oder einer
Reihe mit großen antiken Schriftstellern wie Platon, Aristoteles und
Euklid, so im altfranzösischen ''Roman de la Rose'', während das
altitalienische Gedicht ''Il Fiore'' ihn sogar als Erbauer des
Schiffes [[Argo]] ausgibt, mit dem Jason sich auf die Suche nach dem
Goldenen Vlies begab.
8 Buchstaben hat geschrieben:Der erste für einen Computer gedachte Algorithmus wurde 1842 von
Ada Lovelace in ihren Notizen zu Charles Babbages Analytical
Engine, festgehalten. Sie gilt deshalb als die erste
Programmablaufplan nach DIN 66001 oder ISO 5807 grafisch dargestellt werden.
Sehr schöne Text kann man übrigens erhalten, wenn man den Algorithmus auf die Bibel loslässt ;-)
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Joghurt hat geschrieben:Das sieht mir sehr nach "Dissociated Press" aus.
Könnte sein... Muss ich mal daraufhin ansehen.
Ganze Worte können es eigentlich nicht sein, dafür sind die Fetzen zu kurz. Blieben Einzelbuchstaben oder kurze Gruppen...? Und zwischen denen wird etwas eingefügt, d.h. die Originalbotschaft ist kürzer als die "codierte"?

Aber... kann es sein, dass Deine Beispieltexte reine Zitate sind? Sie klingen so sinnvoll... :o Oder steh ich jetzt auf dem Schlauch? *verwirrt* [/quote]
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

merlin_emrys hat geschrieben:die Originalbotschaft ist kürzer als die "codierte"?
Nein, kürzer. Lies die Beschreibung noch mal durch. Du kannst natürlich auch wieder von vorne anfangen, wenn du hinten angekommen bist, dann kann der Text auch länger werden.

Aber... kann es sein, dass Deine Beispieltexte reine Zitate sind? Sie klingen so sinnvoll... :o Oder steh ich jetzt auf dem Schlauch? *verwirrt*
Soso, ein Algorithmus ist also eine Reihe von großen antiken Schriftstellern, und außerdem der Erbauer der Argo...

Und Ada Lovelace gilt als der erste Programmablaufplan nach DIN 66001... :wink:
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Joghurt hat geschrieben:
merlin_emrys hat geschrieben:die Originalbotschaft ist kürzer als die "codierte"?
Nein, kürzer.
Hm? Sag ich doch... *extrem verwirrt*
Joghurt hat geschrieben:Soso, ein Algorithmus ist also eine Reihe von großen antiken Schriftstellern, und außerdem der Erbauer der Argo...
Und Ada Lovelace gilt als der erste Programmablaufplan nach DIN 66001... :wink:
Sorry, vielleicht ist mein Fieber gerade doch höher als gedacht (hab mich erkältet...) , und hier ist es schon spät... :-o Nebenbei, "Ada Lovelace" sagt mir genausowenig wie irgendwelche DIN-Normen; da kann ich also aufgrund fehlenden Hintergrundwissens keine Plausibitätsanalyse machen. Kann ja sein, dass der Ablaufplan den Namen seiner Programmierin bekommen hat oder so, wer weiss das schon? Und bei Wikipedia darf man sich nicht wundern, wenn die Sätze sinnlos, fehlerhaft in den Bezügen oder verkrüppelt sind; damit nehmen es bekanntlich nicht alle Autoren so genau...
Joghurt hat geschrieben:Lies die Beschreibung noch mal durch. Du kannst natürlich auch wieder von vorne anfangen, wenn du hinten angekommen bist, dann kann der Text auch länger werden.
Mach ich wohl besser mal, wenn ich wieder denken kann. Derzeit kann ich ihn lesen, so oft ich will, ich versteh ihn schlicht nicht... Bin halt kein Verschlüsselungsprofi.
BlackJack

merlin_emrys hat geschrieben:In einem anderen Forum wurde die Frage gestellt, ob jemand den "Code" knacken könnte, der zu den Zeichenketten von Zeile 5 im Python-Code geführt hat. (Leider wird das eine Apostroph nicht richtig angezeigt...)
Das ist ein rechtes einfaches Anführungszeichen. Hättest Du auch einfach durch ein ' ersetzen können. Es sei denn der Code berücksichtigt wirklich Zeichen die nicht in ASCII/ISO-8859-1 enthalten sind.

Code: Alles auswählen

import random

alphabet = [["a"],["b"],["c"],["d"],["e"],["f"],["g"],["h"],["i"],["j"],["k"],["l"],["m"],["n"],["o"],["p"],["q"],["r"],["s"],["t"],["u"],["v"],["w"],["x"],["y"],["z"]]
Ist das wirklich notwendig jeden einzelnen Buchstaben in eine Liste zu packen?

Code: Alles auswählen

    for i in range(len(input1)):

IIiiiih ein C/Java-Programmierer. :-)

Code: Alles auswählen

        if input1[i] in (",", ".", "'", "’", " "):  # == "," or "." or "'" or "’":
Der Kommentar ist extrem falsch und irreführend.

Code: Alles auswählen

            if ("komm" or "soll" or "hab" or "wird") in outputstring: #...
Was dieses ``if`` testet solltest Du Dir nochmal genau überlegen bzw. was das Ergebnis des geklammerten Ausdrucks ist und was folglich in `outputstring` gesucht wird. Notfalls einfach mal im Interpretierer eingeben und ausprobieren.

Hilfreich wäre es gewesen wenn Du verraten hättest, dass es sich um zwei unabhängige verschlüsselte Sätze handelt und das der Code ohne Computer erzeug- und knackbar ist. Damit fällt etwas in Richtung "Dissociated Press" oder Markov-Ketten raus. Das macht niemand per Hand. :-)

Cäsar-Codes/Vertauschen von Symbolen fällt ebenfalls flach, sonst käme kein "lesbarer" Text heraus. Bleiben z.B. Codes übrig, die auf Zuordnung von Worten oder Silben zu anderen Worten oder Silben oder Buchstaben beruhen und solche, die bestimmte Buchstaben nach einem Muster auswählen. Zu letzterem könnte das "off'nem" ein Hinweis sein und evt. das "Moselm" um die Buchstaben durch Auslassung oder Buchstabendreher an die richtige Stelle zu bringen.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

BlackJack hat geschrieben:Ist das wirklich notwendig jeden einzelnen Buchstaben in eine Liste zu packen?
Noe, mit Sicherheit nicht (siehen Anmerkung im Eingangspost). War nur ein Ansatz, und ich hatte keine Lust, den Teil umzuschreiben, nachdem er erstmal eingetippt war.
IIiiiih ein C/Java-Programmierer. :-)
Interessant... von beiden Programmiersprachen weiss ich gerade mal, dass es sie gibt, habe aber nie auch nur das mindeste damit zu tun gehabt. :-o
Der Kommentar ist extrem falsch und irreführend.
Das versteh ich jetzt nicht... Mir sagt er, was er mir sagen soll, nämlich dass an der Stelle die Nicht-Buchstaben abgehandelt werden.
Was dieses ``if`` testet solltest Du Dir nochmal genau überlegen bzw. was das Ergebnis des geklammerten Ausdrucks ist und was folglich in `outputstring` gesucht wird.
... und das genaugenommen auch nicht. Das es nicht tut, was ich fand, dass es tun soll, ist mir aufgefallen; aber warum es das nicht tut, hab ich noch nicht begriffen. Nachschlagen unter "if" und "or" hat jedenfalls keine Ergebnisse gebracht.
BlackJack hat geschrieben:Hilfreich wäre es gewesen wenn Du verraten hättest, dass es sich um zwei unabhängige verschlüsselte Sätze handelt und das der Code ohne Computer erzeug- und knackbar ist.
Wenn ich um Hilfe beim Entschlüsseln gebeten hätte, ja; aber darum ging es mir ja überhaupt nicht. Wie schon im Titel angegeben und als eigentliche Frage im Eingangsposting formuliert: Was mich verblüfft hat, war, dass ich das "komm" immer an derselben Stelle bekomme, was dafür spricht, dass da irgendwas überhaupt nicht so zufällig ist, wie ich angenommen hatte.

(Die ganze Sache mit der Entschlüsselung habe ich nur dazugepackt, um zu erklären, warum ich ein so völlig sinnloses Programm schreibe. IMHO fehlen schlicht Zusatzinformationen, um auf Basis von so wenigen Zeichen irgendwas zu decodieren... aber sinnfrei rumprobieren kann man ja mal, wenn man ohnehin nicht denken kann.)

Nach einer Nacht Schlafen ist mir aber inzwischen klar, warum... hab gestern abend einfach nicht an alles gedacht.
Es gibt einfach keine andere Stelle, in der ein Doppelbuchstabe auftaucht, ohne dass derselbe Buchstabe durch einen weiteren Buchstaben davon abgetrennt ist. Insofern passt die Struktur von "komm" nur auf diese Stelle...
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Kann mir Leien einer mal in verständlichen Worten erklären, was ihr da eigentlich treibt oder besser gesagt wie das geht was ihr da tut? :D *gg

Hab null verstanden was das Programm genau soll und wie das Funktioniert usw.

lg
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

XtraNine hat geschrieben:Kann mir Leien einer mal in verständlichen Worten erklären, was ihr da eigentlich treibt oder besser gesagt wie das geht was ihr da tut? :D *gg

Hab null verstanden was das Programm genau soll und wie das Funktioniert usw.
Könnte daran liege, dass Du tieferen Sinn erwartest, wo keiner ist... :-o Ich habe mehr zum Spass meinen Computer auf eine Codierungsfrage losgelassen und mich über die Ausgabe gewundert.

Aber kein Problem... Nochmal etwas ruhiger:

Ich bin in einem anderen Forum auf die Frage gestossen, ob wohl jemand innerhalb einer begrenzten Zeitspanne (das ergibt sich aus der Situation) eine bestimmte Codierung knacken könnte. Der Fragesteller hat zu dem Zweck zwei Schnipsel codierten Textes ins Forum festellt:

Neben Tod, Mars, off’nen real.
Ali Moselm null. Aber Susi Moslem im Nennen. Saga Otto, Mirja.

So, nun dachte ich, statt selber Sachen durchzuprobieren, lasse ich meinen Rechner machen. Also: Jeden zweiten, dritten, vierten Buchstaben und so zusammensetzen, oder eben auch: Ein anders angeordnetes Alphabet zugrundelegen. Das müsste sich programmieren lassen... dachte ich so.

Was ich gestern abend hier hereingestellt habe, ist nur ein Teil des Programms, aber soweit vollständig, dass man es laufen lassen kann. Was mich zu dem Zeitpunkt verwirrt hatte, war, dass ich eine Regelmässigkeit in der Ausgabe gefunden habe, die ich mir nicht erklären konnte und die mit der implizierten "Zufälligkeit" meines Vorgehens nicht zusammenpassen wollte.

Und jetzt nochmal Stück für Stück:

Zeile 1: Holt mir das random-Modul
Zeile 3: Enthält das von mir zugrundegelegte Alphabet in Form einer geschachtelten Liste. (Könnte man sicher auch anders machen.)
Zeile 5: Enthält die beiden Code-Schnipsel, der Bequemlichkeit halber zu einem zusammengefasst.
Zeile 7 bis 10: Setzt ein paar Variablen auf Startwerte.
Zeile 12: Lässt das Programm in dieser gekürzten Version solange geduldig weitermachen, bis ich es abbreche.
Zeile 13: Erstellt ein Alphabet, in dem die Zeichen in einer anderen Reihenfolge angeordnet sind also in Zeile 3. (Ausführlichere Programmversionen setzen Vokale nur auf andere Vokale, um "rein konsonantische Worte" auszuschliessen.)
Zeile 14 bis 16: Hier werden Variablen auf ihre jeweiligen Startwerte gesetzt, die jedesmal neu "zurückgesetzt" werden sollen, wenn das Programm einen neuen Durchlauf startet.

Zeile 17: Geht die Zeichen meines Codes Zeichen für Zeichen durch. (Was daran obsolet sein soll, weiss ich nicht.)
Zeile 18f: Ist an sich noch ein Rest des anderen Programms, den ich vergessen habe, herauszulöschen. Wenn das Zeichen kein Buchstabe ist, wird es so, wie es ist, an "newout" angehängt. (Hätte ich in bezug auf diese gekürzte Version auch durch ein "pass" ersetzen können.)
Zeile 22 bis 28: Und wenn es doch ein Buchstabe ist, wird es zuerst in einen Kleinbuchstaben umgewandelt und dann seine Position im "normalen" Alphabet ermittelt. Dieselbe Position des "neugemischen" Alphabets gibt an, durch welchen Buchstaben es ersetzt werden soll. Da ich aus "historischen" Gründen das Alphabet noch in Form einer Liste dastehen habe, ist die entstehende Zeichenkette hier 5 Zeichen lang.
Ausserdem wird der neue Buchstabe an "newout" angehängt.
Zeile 30 bis 35: Basteln zwei Zeichenketten aus den unverändert übernommenen Nicht-Buchstaben-Zeichen (30 bis 32) und Buchstaben (33 bis 35).
37 bis 43: Zeigt mir nur bestimmte der entstandenen Zeichenketten an. Ich prüfe, ob bestimmte, im Deutschen häufig vorkommende Silben bzw. kurze Worte in der Zeichenkette auftreten (wobei in dem oben angegebenen Fall nur der jeweils erste Ausdruck geprüft wird und nicht alle, die in der Klammer stehen; der Teil ist also "programmiertechnisch falsch". Da ich jedoch eine Ausgabe "zitiere", die auf diese Weise zustandegekommen ist, kann ich das jetzt sinnvollerweise nicht korrigieren.). Wenn das der Fall ist, wird sie, mit ihrer laufenden Nummer versehen, auf dem Bildschirm ausgegeben.
Zeile 45 und 46: Werden in dieser Programmversion nicht ausgeführt, sondern nur, wenn das Programm um eine Abbruchbedingung erweitert ist. Die ist aber den Kürzungen, bevor ich es ins Forum gestellt habe, zum Opfer gefallen.

Was ich dann mache, ist, die Ausgabe zu überfliegen. Es ist erstaunlich, wie effektiv das menschliche Gehirn für die Muttersprache "sinnvolle" Zeichenkombinationen von "unsinnigen" trennt - ich kann beim Ablaufen zusehen und "sinnvolle" Varianten, die einen zweiten Blick verdienen, recht problemlos von "Ausschuss" trennen.

Ich gehe dabei von bestimmten Vorannahmen aus, die nicht bestätigt sind, beispielsweise:
- Die angegebenen Schnipsel enthalten alle notwendigen resp. "genug" Informationen zur Decodierung.
(- Ich teste in diesem Programmschnipsel: Der Codierung liegt eine Abbildung der Buchstaben auf andere Buchstaben im Verhältnis 1:1 zugrunde. )
- Der "uncodierte" Satz oder Ausdruck liegt in deutscher Sprache vor.
- Der "uncodierte" Satz oder Ausdruck stellt eine Beschreibung oder eine Aufforderung dar.
- Vermutlich ist daran gedacht, die "Decodierung" nicht mit Hilfe eines Computers durchzuführen.

Das Programm ist nur eine Krücke, um meine eigenen, "handschriftlichen" Versuche um ein paar weitere zu ergänzen, da es sich trotz allem mit dieser Krücke schneller humpelt als ohne sie normal zu gehen...

@ Joghurt:
Joghurt hat geschrieben:an der aktuellen Stelle im Text
Welchem Text eigentlich?
BlackJack

merlin_emrys hat geschrieben:
IIiiiih ein C/Java-Programmierer. :-)
Interessant... von beiden Programmiersprachen weiss ich gerade mal, dass es sie gibt, habe aber nie auch nur das mindeste damit zu tun gehabt. :-o
Dann aber mit einer anderen Programmiersprache in der man so über Container iteriert? Ist jedenfalls nicht "pythonisch" den Umweg über einen Index zu gehen.

Code: Alles auswählen

    for i in range(len(input1)):
        do_something(input1[i])
# vs.
    for character in input1:
        do_something(character)
Der Kommentar ist extrem falsch und irreführend.
Das versteh ich jetzt nicht... Mir sagt er, was er mir sagen soll, nämlich dass an der Stelle die Nicht-Buchstaben abgehandelt werden.
Er sieht aber wie ein Python-Ausdruck aus der semantisch völlig falsch ist. Den Fehler hast Du weiter unten dann auch "in echt" gemacht.
Was dieses ``if`` testet solltest Du Dir nochmal genau überlegen bzw. was das Ergebnis des geklammerten Ausdrucks ist und was folglich in `outputstring` gesucht wird.
... und das genaugenommen auch nicht. Das es nicht tut, was ich fand, dass es tun soll, ist mir aufgefallen; aber warum es das nicht tut, hab ich noch nicht begriffen. Nachschlagen unter "if" und "or" hat jedenfalls keine Ergebnisse gebracht.
In der Sprachreferenz:
5.10 Boolean operations hat geschrieben:The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.
Es wird also das erste Element zurückgegeben wenn es als Wahrheitswert betrachtet wahr ist, oder das zweite. Eine nicht-leere Zeichenkette ist wahr, also wird der Ausdruck in Klammern bei Dir immer zu 'komm' ausgewertet. Du hättest stattdessen auch ``if 'komm' in outputstring:`` schreiben können.

``or`` ist ein mathematisch definierter Operator und nicht das mehrdeutige "oder" aus der natürlichen Sprache.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

BlackJack hat geschrieben:Dann aber mit einer anderen Programmiersprache in der man so über Container iteriert? Ist jedenfalls nicht "pythonisch" den Umweg über einen Index zu gehen.
Container? Ich dachte, das ist ein String...? :-o *verwirrt* ?
BlackJack hat geschrieben:

Code: Alles auswählen

    for i in range(len(input1)):
        do_something(input1[i])
# vs.
    for character in input1:
        do_something(character)
Hm... gut, in diesen Programmteilen brauche ich das "i" wirklich nicht mehr. Ich hatte es gebraucht, als ich jeden xten Buchstaben herausnehmen lassen wollte; das schien mir am komfortabelsten mit einer Positionsnummer zu funktionieren.
In der Sprachreferenz:
5.10 Boolean operations hat geschrieben:The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.
Es wird also das erste Element zurückgegeben wenn es als Wahrheitswert betrachtet wahr ist, oder das zweite. Eine nicht-leere Zeichenkette ist wahr, also wird der Ausdruck in Klammern bei Dir immer zu 'komm' ausgewertet. Du hättest stattdessen auch ``if 'komm' in outputstring:`` schreiben können.

``or`` ist ein mathematisch definierter Operator und nicht das mehrdeutige "oder" aus der natürlichen Sprache.
Naja, ich dachte, wenn das Programm eine Klammer findet, betrachtet es das irgendwie als was, was halt zusammengehört... Ich meine, wenn ich sage: 'if (n+a) == 3', ersetzt das "== 3' offenkundig das implizierte "is TRUE", und (n+a) ersetzt die Summe der beiden Variablen. Es wird weder das n noch das a direkt auf '== 3' geprüft. Wenn ich also "(a or n) in outputstring" schreibe, fände ich nicht unlogisch anzunehmen, dass mein 'in outputstring' dem Vergleichsteil entspricht ('== 3'), während alles in der Klammer daraufhin ausgewertet wird (also ohne eigenen, implizierten "is TRUE"-Vergleich.
Es steht, soweit ich bisher gelesen habe, auch nicht da, dass es anders ist - gut, es steht eigentlich genaugenommen gar nichts dazu da, was ein OR in einer Klammer vor einem Vergleich macht. Also gab es erstmal keinen Grund für mich anzunehmen, dass man es nicht so machen könnte. Nachdem es offenbar immer nur den ersten Teil ausgewertet hat, war mir dann zumindest klar, dass es so nicht ist; aber warum eigentlich nicht, habe ich immer noch nicht herausgefunden.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

merlin_emrys hat geschrieben:
BlackJack hat geschrieben:Dann aber mit einer anderen Programmiersprache in der man so über Container iteriert? Ist jedenfalls nicht "pythonisch" den Umweg über einen Index zu gehen.
Container? Ich dachte, das ist ein String...? :-o *verwirrt* ?
Ein String ist auch nur ein Container. Nämlich für Datentypen 'char'. In C gibt es keine strings, sondern die werden aus einem eindimensionalen Array zusammengebaut, wo jedes Element vom type 'char' ist.

Code: Alles auswählen

int main() {
    char *foo = "Hello World";
    short i=0;

    for (i=0, i < 10, i++) {
        printf ("%c", foo[i]);
    }
    printf("%c", foo[0]);
}
Und in Python ist es ja nicht anders. Dort wird ein String auch aus dem primitivsten Datentype 'char' (natürlich intern! Ein Datentype 'char' gibt es in diesem sinne nicht in Python) zusammengebaut.

Code: Alles auswählen

string = "Hello World"
for char in string:
    print char,

print string[0]
EDIT3: Ergänzung eingefügt und Erklärung verbessert.
BlackJack

merlin_emrys hat geschrieben:
BlackJack hat geschrieben:Dann aber mit einer anderen Programmiersprache in der man so über Container iteriert? Ist jedenfalls nicht "pythonisch" den Umweg über einen Index zu gehen.
Container? Ich dachte, das ist ein String...? :-o *verwirrt* ?
Und ein String enthält wieder Strings, nämlich die Buchstaben.
Hm... gut, in diesen Programmteilen brauche ich das "i" wirklich nicht mehr. Ich hatte es gebraucht, als ich jeden xten Buchstaben herausnehmen lassen wollte; das schien mir am komfortabelsten mit einer Positionsnummer zu funktionieren.
Jeden `x`-ten Buchstaben bekommt man auch mit "slicing":

Code: Alles auswählen

for character in input1[::x]:
    do_something(character)
Ich hatte auch mal verschiedene Schrittweiten und Verschiebungen ausprobiert:

Code: Alles auswählen

def main():
    message = 'Ali Moselm null. Aber Susi Moslem im Nennen. Saga Otto, Mirja.'
    # message = ''.join(c for c in message if c.isalpha() or c == ' ')
    for step in xrange(1, len(message) // 2):
        for offset in xrange(step):
            print message[offset::step]
Ist aber nicht wirklich was lesbares bei rausbekommen. :-(
Naja, ich dachte, wenn das Programm eine Klammer findet, betrachtet es das irgendwie als was, was halt zusammengehört...
Tut es auch. Auch in diesem Fall.
Ich meine, wenn ich sage: 'if (n+a) == 3', ersetzt das "== 3' offenkundig das implizierte "is TRUE", und (n+a) ersetzt die Summe der beiden Variablen. Es wird weder das n noch das a direkt auf '== 3' geprüft. Wenn ich also "(a or n) in outputstring" schreibe, fände ich nicht unlogisch anzunehmen, dass mein 'in outputstring' dem Vergleichsteil entspricht ('== 3'), während alles in der Klammer daraufhin ausgewertet wird (also ohne eigenen, implizierten "is TRUE"-Vergleich.
Dir ist klar das bei ``(n+a) == 3`` nicht `n` und `a` einzeln gegen die 3 geprüft werden sondern der Inhalt der Klammer erst zu *einem* Wert ausgewertet wird, aber bei ``(a or b) in xs`` bist Du überrascht, dass der Ausdruck in den Klammern erst ausgewertet wird und dann erst das Ergebnis davon in `xs` gesucht wird?

Vielleicht wird es so klarer:

Code: Alles auswählen

(1   +  2  ) == 3
('x' or 'y') in 'Tux'
In beiden Fällen passiert exakt das gleiche, erst wird die Klammer ausgewertet und dann wird der andere Operator auf das Ergebnis und den dritten Wert angewandt.
Es steht, soweit ich bisher gelesen habe, auch nicht da, dass es anders ist - gut, es steht eigentlich genaugenommen gar nichts dazu da, was ein OR in einer Klammer vor einem Vergleich macht.
Es passiert genau das gleiche wie bei *jedem anderen Operator* auch. Sachen in Klammern werden immer als erstes ausgewertet, wie man das in der Mathematik so gewohnt ist. Was *nach* der Klammer kommt, ein Vergleich oder ein anderer Operator, wird erst interessant wenn das Ergebnis *in* der Klammer feststeht.

Ohne Klammern entscheidet der Operatorvorrang was zuerst ausgewertet wird, also z.B. Punkt vor Strichrechnung und bei gleichrangigen Operatoren wird fast immer von links nach rechts ausgewertet.

Deine Bedingung und wie sie Schrittweise ausgewertet wird und nochmal ein anderer Ausdruck zum Vergleich:

Code: Alles auswählen

("komm" or "soll" or "hab" or "wird") in outputstring
# plus implizite Klammerung:
(((("komm" or "soll") or "hab") or "wird")) in outputstring
            ((("komm" or "hab") or "wird")) in outputstring
                       (("komm" or "wird")) in outputstring
                                     "komm" in outputstring

(1 + 2 + 3) == x
# plus implizite Klammerung:
(((1 + 2) + 3)) == x
       (3 + 3)  == x
            6   == x
Antworten