Hallo
Ich habe ein kleinen Kodierer gemacht, er funktioniert wie folgt:
0 1 2 3 4 # immer plus "Position" in ASCII
H a l l o
H b n o s
P y t h o n
P z v k s s
Ich hoffe es ist verständlich.
Variante 1: http://paste.pocoo.org/show/325304/
Variante 2: http://paste.pocoo.org/show/325318/
1. Ich habe nichts kommentiert, es ist nicht soviel Code, würdet ihr trotzdem kommentieren?
2. Welche Variante ist besser, oder sind beide schlecht?
3. Wenn ich decode(" " * 300) eingebe kommt manchmal IndexError: string index out of range und manchmal nicht, wieso? Finde den Fehler nicht.
Kodierer
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Also das kann man einfacher lösen:

Auch wenn man es nicht funktional implementiert, ist die ASCII-Tabelle obsolet. Mit ord() bekommst Du doch den ASCII-Wert und mitr chr() wieder das Zeichen.
Einzig bei einem "Überlauf" weiß ich nicht, wie meine Lösung reagiert. Da müßte man ggf. noch ein modulo einbauen.
Zu deinem Code:
So etwas kann man idR vermeiden, indem man enumerate() benutzt. Damit hast Du einen Index und das Element der Liste.
Bei Deiner zweiten Lösung würde ich anstatt 2x eine neue Liste anzulegen eher mit reversed(iterable) arbeiten.
Ach so, man sollte wohl noch erwähnen, dass der Codierer nicht wirklich sicher ist
Da bringt selbst eine Cäsar-Chiffre mehr, da man dort nicht den Hinweis mit den korrekten Anfangsbuchstaben hat.
Edit: Das count() besser nach hinten stellen, dann klappt das decodieren leichter mit dem gleichen Code:
Code: Alles auswählen
In [19]: data = "Hallo"
In [20]: "".join(imap(chr, (starmap(add, (izip(count(), imap(ord, data)))))))
Out[20]: 'Hbnos'
In [21]: data = "Python"
In [22]: "".join(imap(chr, (starmap(add, (izip(count(), imap(ord, data)))))))
Out[22]: 'Pzvkss'

Auch wenn man es nicht funktional implementiert, ist die ASCII-Tabelle obsolet. Mit ord() bekommst Du doch den ASCII-Wert und mitr chr() wieder das Zeichen.
Einzig bei einem "Überlauf" weiß ich nicht, wie meine Lösung reagiert. Da müßte man ggf. noch ein modulo einbauen.
Zu deinem Code:
Code: Alles auswählen
for i in range(len(klartext)):
Bei Deiner zweiten Lösung würde ich anstatt 2x eine neue Liste anzulegen eher mit reversed(iterable) arbeiten.
Ach so, man sollte wohl noch erwähnen, dass der Codierer nicht wirklich sicher ist

Edit: Das count() besser nach hinten stellen, dann klappt das decodieren leichter mit dem gleichen Code:
Code: Alles auswählen
from operator import add, sub
from itertools import imap, izip, count, starmap
def encode(data):
return _code(data, add)
def decode(data):
return _code(data, sub)
def _code(data, method):
return "".join(imap(chr, (starmap(method, (izip(imap(ord, data), count()))))))
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hehe... naja, die itertools muss man sich auch erst mal erarbeitenPenguin6 hat geschrieben: Habe itertools nicht gekannt, werde ich gleich anschauen, bin noch ein Anfänger

Man kann das auch "herkömmlich" lösen:
Code: Alles auswählen
In [53]: res = []
In [54]: for index, char in enumerate(data):
....: res.append(chr(ord(char) + index))
....:
....:
In [55]: "".join(res)
Out[55]: 'Pzvkss'
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Und das jetzt nochmal als LC bzw GE:
Code: Alles auswählen
"".join(chr(ord(char) + index) for index, char in enumerate(data))
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ich glaube jetzt haben wie alle unterschiedlichen Konzepte, oder?cofi hat geschrieben:Und das jetzt nochmal als LC bzw GE:Code: Alles auswählen
"".join(chr(ord(char) + index) for index, char in enumerate(data))

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Das klingt nach einer HerausforderungHyperion hat geschrieben:Ich glaube jetzt haben wie alle unterschiedlichen Konzepte, oder?

Und dann bleiben ja immernoch verschiedene Sprachen

Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Dann fang ich mal mit OCaml an. Imperativ, weil ich sehr lange nichts mehr damit gemacht habe: http://paste.pocoo.org/show/325480/cofi hat geschrieben:Und dann bleiben ja immernoch verschiedene Sprachen
Und hier ist eine mögliche Lösung in Erlang: http://paste.pocoo.org/show/325495/
Ich gebe zu, man könnte das ganze noch auf Nebenläufigkeit optimieren. Und es würde so auch noch nicht wirklich gut auf mehreren Erlang-Nodes laufen.
Ich gebe zu, man könnte das ganze noch auf Nebenläufigkeit optimieren. Und es würde so auch noch nicht wirklich gut auf mehreren Erlang-Nodes laufen.
Zuletzt geändert von name am Sonntag 23. Januar 2011, 19:24, insgesamt 1-mal geändert.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek
In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Haskell
Edit: So oder ähnlich könnte man das bestimmt auch in OCaml oder Standard ML lösen, allerdings wohl weniger elegant, da Zeichenkette in beiden Sprachen keine Liste von Zeichen sind, und erst explizit in eine solche konvertiert werden müssen. In OCaml wüsste ich auf Anhieb nicht einmal, wie das gehen könnte. Haskell ist eben doch die schönste funktionale Sprache
Edit: So oder ähnlich könnte man das bestimmt auch in OCaml oder Standard ML lösen, allerdings wohl weniger elegant, da Zeichenkette in beiden Sprachen keine Liste von Zeichen sind, und erst explizit in eine solche konvertiert werden müssen. In OCaml wüsste ich auf Anhieb nicht einmal, wie das gehen könnte. Haskell ist eben doch die schönste funktionale Sprache

Zuletzt geändert von lunar am Sonntag 23. Januar 2011, 19:39, insgesamt 2-mal geändert.
Clojure inspiriert von lunars Haskelllunar hat geschrieben:Haskell
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek
In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Wieso machst du die Methoden nicht static und wieso zum Teufel der Konstruktor?
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek
In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Gute Idee!name hat geschrieben:Wieso machst du die Methoden nicht static...
s.o.name hat geschrieben: und wieso zum Teufel der Konstruktor?

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
CoffeeScript:
Code: Alles auswählen
add = (a, b) -> a + b
sub = (a, b) -> a - b
ord = (char) -> char.charCodeAt(0)
_code = (f, text) -> String.fromCharCode((f(ord(c), i) for c, i in text)...)
encode = (plaintext) -> _code add, plaintext
decode = (cyphertext) -> _code sub, cyphertext
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Da sich Leonidas nicht rührt und mich das Problem irgend wie motiviert hat, hier mein Vorschlag in Scheme.
Bitte nicht hauen, ist quasi mein erstes Scheme-Programm. Kritik daher erwünscht
Bitte nicht hauen, ist quasi mein erstes Scheme-Programm. Kritik daher erwünscht

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@Hyperion: `add` und `sub` scheint mir ein wenig redundant zu sein. Scheme hat dafür schon Funktionen. Die heissen `+` und `-`. Das sind in Scheme ja ganz normale *Namen* und keine speziellen Operatoren oder so.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
*patsch* danke, ist korrigiert.BlackJack hat geschrieben:@Hyperion: `add` und `sub` scheint mir ein wenig redundant zu sein. Scheme hat dafür schon Funktionen. Die heissen `+` und `-`. Das sind in Scheme ja ganz normale *Namen* und keine speziellen Operatoren oder so.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert