Kodierer

Code-Stücke können hier veröffentlicht werden.
Penguin6
User
Beiträge: 10
Registriert: Dienstag 21. Juli 2009, 12:42
Wohnort: Schweiz

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also das kann man einfacher lösen:

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)):
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

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Eine interessante Definition von ASCII hast du da :)

Also mal die Signatur von Hyperion beachten
Penguin6
User
Beiträge: 10
Registriert: Dienstag 21. Juli 2009, 12:42
Wohnort: Schweiz

Danke viel Mal's!!!

Habe itertools nicht gekannt, werde ich gleich anschauen, bin noch ein Anfänger :oops:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Penguin6 hat geschrieben: Habe itertools nicht gekannt, werde ich gleich anschauen, bin noch ein Anfänger :oops:
Hehe... naja, die itertools muss man sich auch erst mal erarbeiten ;-) Leonidas hatte dazu afair mal nette Folien gebastelt. Leider find ich die grad nicht im wiki...

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
Benutzeravatar
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))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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))
Ich glaube jetzt haben wie alle unterschiedlichen Konzepte, oder? :D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:Ich glaube jetzt haben wie alle unterschiedlichen Konzepte, oder? :D
Das klingt nach einer Herausforderung :) Zumindest objekt-orientierung fehlt noch, evtl mit Leonidas' Ring-Klasse, die irgendwo im Forum rumgeistert.

Und dann bleiben ja immernoch verschiedene Sprachen :)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

cofi hat geschrieben:Und dann bleiben ja immernoch verschiedene Sprachen :)
Dann fang ich mal mit OCaml an. Imperativ, weil ich sehr lange nichts mehr damit gemacht habe: http://paste.pocoo.org/show/325480/
OverNord
User
Beiträge: 72
Registriert: Donnerstag 24. Januar 2008, 11:59
Kontaktdaten:

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.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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.
lunar

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 ;)
Zuletzt geändert von lunar am Sonntag 23. Januar 2011, 19:39, insgesamt 2-mal geändert.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Simples Java, weil 's so bloated ist :-) (Jaja, ist kein Enterprise Java :-D )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Hyperion hat geschrieben:Simples Java, weil 's so bloated ist :-) (Jaja, ist kein Enterprise Java :-D )
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

name hat geschrieben:
Hyperion hat geschrieben:Simples Java, weil 's so bloated ist :-) (Jaja, ist kein Enterprise Java :-D )
Wieso machst du die Methoden nicht static...
Gute Idee!
name hat geschrieben: und wieso zum Teufel der Konstruktor?
s.o. ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

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
Benutzeravatar
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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
*patsch* danke, ist korrigiert.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten