RDW #3 (Rätsel vom 23.07.2004)

Aufgabe

 RDW #3 - Rätsel der Woche Nummer 3
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


 Regeln:  * Bitte nicht vor Ablauf der ersten 72 Stunden ( = drei Tage )
 ~~~~~~~    nach Veröffentlichung Hinweise (Spoiler) oder Lösungen ver-
            öffentlichen!

          * Wenn diese Zeit abgelaufen ist, werde ich einen Thread mit
            passendem Titel erstellen, in dem die Lösungen gepostet werden
            und diskutiert werden können.

          * Die Lösungen sollten nicht nur gepostet, sondern auch an mich
            gemailt werden, damit ich sie testen, "bewerten"  und zu-
            sammenfassen kann.
            Die Adrese dafür lautet:

            crian <---AT---> perl <---MINUS---> community <---DOT---> de

            Im Betreff sollte 'RDW' und die Nummer des Rätsels stehen.
            Hilfreich wäre neben dem Quellcode der Username im Forum
            sowie Perl- und OS-Version, falls Du diese kennst.

          * Verständnisfragen dürfen in diesem Thread gestellt werden, aber
            Tipps und (Teil-) Lösungen sind hier unerwünscht.

          * Ich werde die eingeschickten Programme im Netz zur Verfügung
            stellen, so dass gerade lange Quellcodes nicht (komplett)
            gepostet werden müssen.

          * Zur Verwendung von Modulen: Ich möchte diese nicht generell
            ausschließen, aber wenn quasi die komplette Aufgabe durch
            die Verwendung eines Moduls ersetzt werden kann, ist dies
            vielleicht nicht der Sinn der Aufgabe gewesen.



 Aufgabe:  Schreibe eine Funktion hexdump(), die Daten als Hexdump ausgibt.
 ~~~~~~~~ 
           Beispiel:

               hexdump("Ich bin Text");

           Erzeugt folgende Ausgabe auf der Konsole:

0000: 49 63 68 20 62 69 6e 20 - 54 65 78 74                Ich bin Text


           Der Aufruf
           
               hexdump(qq~Lorem ipsum dolor sit amet, consectetuer adipiscing
               elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore
               magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis
               nostrud exerci tation ullamcorper suscipit lobortis nisl ut
               aliquip ex ea commodo consequat. Duis autem vel eum iriure
               dolor in hendrerit in vulputate velit esse molestie consequat,
               vel illum dolore eu feugiat nulla facilisis at vero eros et
               accumsan et iusto odio dignissim qui blandit praesent luptatum
               zzril delenit augue duis dolore te feugait nulla facilisi.\n~);

           Erzeugt folgende Ausgabe auf der Konsole:

0000: 4c 6f 72 65 6d 20 69 70 - 73 75 6d 20 64 6f 6c 6f    Lorem ipsum dolo
0010: 72 20 73 69 74 20 61 6d - 65 74 2c 20 63 6f 6e 73    r sit amet, cons
0020: 65 63 74 65 74 75 65 72 - 20 61 64 69 70 69 73 63    ectetuer adipisc
0030: 69 6e 67 20 65 6c 69 74 - 2c 20 73 65 64 20 64 69    ing elit, sed di
0040: 61 6d 20 6e 6f 6e 75 6d - 6d 79 20 6e 69 62 68 20    am nonummy nibh
0050: 65 75 69 73 6d 6f 64 20 - 74 69 6e 63 69 64 75 6e    euismod tincidun
0060: 74 20 75 74 20 6c 61 6f - 72 65 65 74 20 64 6f 6c    t ut laoreet dol
0070: 6f 72 65 20 6d 61 67 6e - 61 20 61 6c 69 71 75 61    ore magna aliqua
0080: 6d 20 65 72 61 74 20 76 - 6f 6c 75 74 70 61 74 2e    m erat volutpat.
0090: 20 55 74 20 77 69 73 69 - 20 65 6e 69 6d 20 61 64     Ut wisi enim ad
00a0: 20 6d 69 6e 69 6d 20 76 - 65 6e 69 61 6d 2c 20 71     minim veniam, q
00b0: 75 69 73 20 6e 6f 73 74 - 72 75 64 20 65 78 65 72    uis nostrud exer
00c0: 63 69 20 74 61 74 69 6f - 6e 20 75 6c 6c 61 6d 63    ci tation ullamc
00d0: 6f 72 70 65 72 20 73 75 - 73 63 69 70 69 74 20 6c    orper suscipit l
00e0: 6f 62 6f 72 74 69 73 20 - 6e 69 73 6c 20 75 74 20    obortis nisl ut
00f0: 61 6c 69 71 75 69 70 20 - 65 78 20 65 61 20 63 6f    aliquip ex ea co
0100: 6d 6d 6f 64 6f 20 63 6f - 6e 73 65 71 75 61 74 2e    mmodo consequat.
0110: 20 44 75 69 73 20 61 75 - 74 65 6d 20 76 65 6c 20     Duis autem vel
0120: 65 75 6d 20 69 72 69 75 - 72 65 20 64 6f 6c 6f 72    eum iriure dolor
0130: 20 69 6e 20 68 65 6e 64 - 72 65 72 69 74 20 69 6e     in hendrerit in
0140: 20 76 75 6c 70 75 74 61 - 74 65 20 76 65 6c 69 74     vulputate velit
0150: 20 65 73 73 65 20 6d 6f - 6c 65 73 74 69 65 20 63     esse molestie c
0160: 6f 6e 73 65 71 75 61 74 - 2c 20 76 65 6c 20 69 6c    onsequat, vel il
0170: 6c 75 6d 20 64 6f 6c 6f - 72 65 20 65 75 20 66 65    lum dolore eu fe
0180: 75 67 69 61 74 20 6e 75 - 6c 6c 61 20 66 61 63 69    ugiat nulla faci
0190: 6c 69 73 69 73 20 61 74 - 20 76 65 72 6f 20 65 72    lisis at vero er
01a0: 6f 73 20 65 74 20 61 63 - 63 75 6d 73 61 6e 20 65    os et accumsan e
01b0: 74 20 69 75 73 74 6f 20 - 6f 64 69 6f 20 64 69 67    t iusto odio dig
01c0: 6e 69 73 73 69 6d 20 71 - 75 69 20 62 6c 61 6e 64    nissim qui bland
01d0: 69 74 20 70 72 61 65 73 - 65 6e 74 20 6c 75 70 74    it praesent lupt
01e0: 61 74 75 6d 20 7a 7a 72 - 69 6c 20 64 65 6c 65 6e    atum zzril delen
01f0: 69 74 20 61 75 67 75 65 - 20 64 75 69 73 20 64 6f    it augue duis do
0200: 6c 6f 72 65 20 74 65 20 - 66 65 75 67 61 69 74 20    lore te feugait
0210: 6e 75 6c 6c 61 20 66 61 - 63 69 6c 69 73 69 2e 0a    nulla facilisi..


           (Diese Aufgabe stammt von Esskar.)

           Ich bitte darum, dass die nicht-Golf-Lösungen folgende Regeln
           beachten:

           1) Falls das Programm mit Parameter gestartet wird, so wird dieser
              als Dateiname interpretiert und das Ergebnis der Funktion
              die den Hex-Dump erzeugt auf STDOUT ausgegeben.
           2) Falls das Programm ohne Parameter gestartet wird, so wird der
              zu hexdumpende Text von STDIN gelesen. Die Ausgabe erfolgt
              wieder nach STDOUT.
           3) Eventuell auszugebende Fehler werden nach STDERR ausgegeben.
           4) Die Form der Ausgabe soll mit obigem Beispiel übereinstimmen
              (falls es nicht irgendwo Tippfehler hat ;).
              Um die Ergebnisse vergleichen zu können werde ich die Ausgaben
              maschinell miteinander vergleichen. Dehalb bitte um die
              Einhaltung dieser Regel.
           5) Bitte nennt die Funktion hexdump und nicht irgendwie.
           6) Es wäre schön, wenn die Golflösungen wenigstens die Verarbeitung
              in der Pipe zulassen würden.
           7) Es sollen keine Module verwendet werden (um use strict/warnings
              wird gebeten).

           (Das in 1 und 2 geforderte Verhalten ist durch einfaches Bearbeiten
           des Arrays @inhalt nach

           my @inhalt = <>;

           gegeben.)

Ergänzungen

Die Lösung sollte auch mit Binärdateien klarkommen. (Augenmerk auf 0d!)

Zeichen < 32 sollen (auf der rechten Seite) durch Punkte ersetzt werden, alle anderen werden direkt ausgegeben.

Auswertung RDW #3

Teilnehmer (alphabetisch nach Nickname)

  1. Coax
  2. Crian
  3. DS
  4. Esskar
  5. Ishka
  6. Kabel
  7. Ronnie

Teilnehmer Golf (alphabetisch nach Nickname)

  1. Crian
  2. DS

Übersicht über die normalen Lösungen

Unter Windows (getestet mit Active Perl 5.8.0):

Name Beispieltext 8 Zeichen Umbrüche binäre Datei
Coax        
Crian ok ok ok ok
DS nicht ok nicht ok nicht ok nicht ok
Esskar ok (ok) ok ok
Ishka ok ok ok nicht ok
Kabel nicht ok nicht ok nicht ok nicht ok
Ronnie ok (ok) ok nicht ok

(Bei Ronnie wird bei der binären Datei nicht nur das 0d nicht mit ausgegeben, sondern auch nicht der hexadezimale Wert aller Zeichen ausgegeben. Genaueres siehe http://www.perl-community.de/rdw/rdw03/rdw03_auswertung_windows.txt )

Unter Linux (getestet mit Perl 5.8.1):

Name Beispieltext 8 Zeichen Umbrüche binäre Datei
Coax        
Crian ok ok ok ok
DS ok ok ok ok
Esskar ok ok (ok) ok
Ishka ok ok ok ok
Kabel nicht ok nicht ok nicht ok nicht ok
Ronnie ok (ok) ok nicht ok

"(ok) bedeutet, dass die Datei zwar richtig ausgegeben wurde, aber bei einer Zeile, wo am Ende genau acht Zeichen stehen, der Trenner ' - ' in der Mitte trotzdem noch mit ausgegeben wird, obwohl er unnötig ist.

Coax

#!/usr/bin/perl
$|++; # Ausgabepufferung aus

use strict;
use warnings;

  my($filename);
  
  if(defined $ARGV[0]) {       # wurden ein Argument uebergeben ...
      if(-f $ARGV[0]) {        # und ist Argument eine regulaere Datei ?
          $filename = shift;   # dann verwende Argument als Eingabe
      }
      else {
          warn "No regular file specified, using standard input\n";
          $filename = '-';     # verwende sonst Standardeingabe
      }
  } else {   
      $filename = '-';  # verwende Standardeingabe
  }

  open(FH, '<', $filename) or die $!;
  binmode(FH);   # behandle Datei binaer
  {
      local $/;
      hexdump(<FH>);
  }      
  close(FH);

sub hexdump {
    my($str) = shift;

    # fuer jede Ausgabezeile...
    for (my($line, $offset) = (0,0); $offset < length $str; $line++, $offset += 16) {

        # extrahiere 16 Zeichen langen String
        my $rawdata = substr($str, $offset, 16);

        # zerlege 16-Zeichen-String in 16 Hex-Werte
        my @hexdata = unpack('H2' x length $rawdata, $rawdata);

        # elemeniere nicht-druckbare Zeichen
        $rawdata =~ s/[^[:print:]]/./g;

          # unterdruecke Warnungen waehrend der Ausgabe
          no warnings;
            printf("%04x %-24s- %-24s    %-16s\n",    # formatierte Ausgabe
                   $offset, "@hexdata[0..7]", "@hexdata[8..15]", $rawdata);
          use warnings;
    }
}

Die Lösung wurde nachgereicht, deshalb steht die Auswertung noch aus.

Crian

#!/usr/bin/perl
use strict;
use warnings;

#
# Inhalt der Datei oder aus STDIN einlesen
# (unter Verwendung des Snippets von Esskar)
# und hexdump erzeugen und ausgeben:
#
if (defined $ARGV[0] and -f $ARGV[0])
{
    if (open(my $fh, $ARGV[0]))
    {
        binmode $fh;
        my $buffer;
        my $len = 0;
        while ($_ = read($fh, $buffer, 1024, $len)) { $len += $_ }
        hexdump($buffer);
    }
}
else
{
    hexdump(<>);
}


sub hexdump {
    my ($text) = @_;

    my $count = 0;
    my $hexstring;
    my $textstring;
    for my $char (split //, $text) {
        ++$count;
        $hexstring  .= sprintf("%02x", ord $char);
        $hexstring  .= ($count % 8 ? ' ' : ' - ') if $count % 16;
        $textstring .= (ord $char > 31 and ord $char < 128) ? $char : '.';
        #$textstring .= (ord $char > 31) ? $char : '.';
        if ($count % 16 == 0) {
            ausgabe($count, $hexstring, $textstring);
            $hexstring  = '';
            $textstring = '';
        }
    }
    $hexstring =~ s~ - $~~;
    ausgabe($count, $hexstring, $textstring) unless $count % 16 == 0;
}


sub ausgabe {
    my ($count, $hexstring, $textstring) = @_;
    $hexstring .= ' ' x (49 - length $hexstring);
    printf "%04x: %s    %s\n",
           int(($count-1)/16)*16,
           $hexstring,
           $textstring;
}

Wegen Problemen mit Sonderzeichen im XTerm gebe ich Zeichen über 127 nicht aus. Die Zeile wo alles ab 32 ausgegeben wird ist aber noch auskommentiert im Quellcode enthalten.

DS

#!perl

use strict;
use warnings;

local $/ = undef;
my $daten = @ARGV ? do {
 open DATEI, $ARGV[0];
 binmode DATEI;
 <DATEI>;
} : do {
 binmode STDIN;
 <STDIN>;
};

&hexdump($daten);

sub hexdump {
 my $string = shift;
 my $pos    = 0;
 while ( $string =~ s/^(.{1,16})//s ) {
  my $t = $1;
  my $hex = sprintf '%*v02x', ' ', $t;
  $hex =~ s/(?<=.{24})/- /;
  $t =~ y/\0-\x1f/./;
  printf "%03x0: %-52s %-16s\n", $pos++, $hex, $t;
 }
}

DS schreibt im Forum zu seinem Code: Mit 5.6.1, 5.8.2, 5.8.3 und 5.8.4 geht's, nur mit 5.8.0 nicht... komisch...

Esskar

#!/usr/bin/perl

use strict;
use warnings;

if(defined $ARGV[0] and -f $ARGV[0])
{
   if(open(my $fh, $ARGV[0]))
   {
      binmode $fh;
      my $buffer;
      my $len = 0;
      while($_ = read($fh, $buffer, 1024, $len)){ $len += $_; }
      hexdump($buffer);
   }
}
else
{
   hexdump(<>);
}

sub hexdump
{
   my ($data) = @_;
   my $len = length $data;
   my $i = 0;
   my $line = "";
   my @asc = ();
   while($i < $len or $i & 15)
   {
      if(($i & 15) == 0)
      {
         @asc = ();
         $line = sprintf("%04x:", $i);
      }
      $line .= sprintf(" -") if ($i & 15) == 8;
      if($i < $len)
      {
         my $c = substr($data, $i, 1);
         my $o = ord($c);
         $line .= sprintf(" %02x", $o);
         $asc[$i & 15] = ord($c) > 31 ? $c : '.';
      }
      else
      {
         $line .= sprintf("   ");
         $asc[$i & 15] = ' ';
      }
      if(($i & 15) == 15)
      {
         $line .= sprintf("    %s", join "", @asc);
         print "$line\n";
      }
      $i++;
   }
} 

... und in C:

void hexdump(void *ptr, size_t len)
{
    char line[100];
    char asc[20];
    char *lp;
    size_t i = 0;
   unsigned char *s = (unsigned char *)ptr;

   while ((i < len) || (i & 15))
    {
        if((i & 15) == 0)
        {
            lp = line;
            memset(asc, 0, sizeof(asc));
            lp += sprintf(lp, "%04x:", i);
        }
        if ((i & 15) == 8) lp += sprintf(lp, " -");
        if (i < len)
        {
           lp += sprintf(lp, " %02x", *s);
           asc[i & 15] = *s > 31 ? *s : '.';
        }
        else
        {
           lp += sprintf(lp,"   ");
           asc[i & 15] = 32;
        }
        if((i & 15) == 15)
        {
            lp += sprintf(lp, "    %s", asc);
            printf("%s\n", line);
        }
        i++; s++;
    }
} 

Ishka

Die unbekannten Zeichen werden hier als Fragezeichen und nicht als Punkte dargestellt.

#!/usr/bin/perl

####
# Lösungsansatz:
##
# Ausgabe linear durchlaufen..

use strict;
use warnings;

### Programm
print hexdump(join '',<>);

### Ab hier nur noch Subroutinendefinition
## hexdump gibt den gewünschten Dump zurück
sub hexdump
{
my $ret='';# Rückgabewert
my $v=$_[0];# Parameter
my $links=1;# alternierende Variable für die Ausgabe - linker oder rechter Teil
my $pos=-16;# für den Positionszähler ganz links
my $zeile='';# für die direkte ausgabe ganz rechts
for($v=~m#(.{1,8})#gs){
my $i=$_;
if($links){$zeile='';
$ret.=sprintf "%04x: ",$pos+=16;
$ret.=smalldump($i);
$zeile.=$i}else{
$ret.='- ';
$ret.=smalldump($i);
$zeile.=$i;
$zeile=~s#[^a-zA-Z0-9_\.:,;/"'\#\*\+\-<>\|\[\]\(\)äöüÄÖÜß`§\$\%\&~\^° ]#?#g;# Damit keine Sonderzeichen den Dump verunstalten
$ret.="   $zeile\n"}
;$links=!$links}
$ret.="                             $zeile\n" unless $links;# falls der Dump auf der Linken Seite zuende war
return $ret;
}

## smalldump macht die eigentliche Arbeit (zB. 'ci tatio' => '63 69 20 74 61 74 69 6f ')
sub smalldump
{
my $ret='';
my $p=shift;
warn "sub smalldump wird für längere dumps verwendet, als sie ausgelegt ist!\nkonstannte Länge für alle Zeilen kann nicht garantiert werden.\n" if length $p>8;
for(split //,$p){$ret.=sprintf "%02x ",ord($_)}
$ret.=' ' x (3*(8-length($p)));# Mit Leerzeichen auffüllen, falls der Eingangsstring weniger als 8 Zeichen hatte
return $ret;
}

Kabel

#!/usr/bin/perl
use strict;

# es ist nicht direkt verboten, nur geboten ;-)
use IO::Handle; 
use locale; # thx@betterworld

# immer chunks mit 16 bytes einlesen
IO::Handle->input_record_separator (\16);

# kein argument => STDIN
# ein argument => einfacher hexdump
# mehr als ein argument => hexdump + angabe der datei

if (@ARGV == 0) {
   my $string = "";
   $string .= $_ while (<>);
   hexdump ($string);
} elsif (@ARGV == 1) {
   hexdump (slurpfile (@ARGV));
} else {
   foreach my $file (@ARGV) {
      my $filecontents = "";
      open (my $data, "<$file") or die "open failed: [$file]\n";
      { local $/; $filecontents = <$data>; }
      close $data;

      print "$file:\n";
      hexdump ($filecontents);
      print "\n";
   }
}

# parameter: datei zum einlesen
# liefert: skalar, in dem der dateiinhalt steht
sub slurpfile {
   my $filecontents = "";
   open (my $data, "<$$_[0]") or die "open failed: [$_[0]]\n";
   { local $/; $filecontents = <$data>; }
   close $data;
   return $filecontents;
}

# parameter: string zum hexdumpen
# liefert: nix
# 
# schreibt direkt auf STDOUT
# benutzt [:print:], um nicht druckbare zeichen durch " "zu ersetzen
sub hexdump {
   my $string = shift;
   my $position = 0;
   open (my $sstream, "<", \$string);
   while (<$sstream>) {
      length or next;
      (length $_ < 16) and $_ .= " " x (16-length);
      s/[^[:print:]]/./g;
      print
         sprintf ("%04x: ", $position), 
         join " ", (map {to_hex (ord)} split (//, substr ($_, 0, 8))),
         " - ",
         join " ", (map {to_hex (ord)} split (//, substr ($_, 8, 8))),
         "    ",
         func_s($_),
         "\n";
      $position = $position + 16;
   }
   close $sstream;
}

# parameter: liste von zahlen zur basis 10
# liefert: liste von zahlen zur basis 16
sub to_hex { return sprintf ("%02x"x@_,@_) }

# parameter: string
# liefert: kopie mit newline ersetzt durch " "
sub func_s { my $s = $_[0]; $s =~ s/\n/ /g; $s }

Ronnie

#!/usr/bin/perl

use strict;
use warnings;

my $input;

{
  local $/;
  binmode(STDIN);
  $input = <>;
}

hexdump($input);
exit;

sub as_val { return unpack('C*', shift) }
sub as_hex { return map { $_ ? sprintf("%02x", $_) : '  ' } @_ }
sub as_chr { return map { $_ ? $_>31 && $_<128 ? chr($_) : '.' : ' ' } @_ }

sub hexdump {
  my @val = as_val($_[0]);

  for (my $i = 0; $i < $#val; $i+=16) {
    local $, = ' ';
    printf "%04x: ", $i;
    print as_hex(@val[$i..$i+7]),
          '-',
          as_hex(@val[$i+8..$i+15]),
          ' 'x4,
          join '', as_chr(@val[$i..$i+15]),
          "\n";
  }
}

Übersicht über die Golf-Lösungen

Unter Windows (getestet mit Active Perl 5.8.0):

Name Beispieltext 8 Zeichen Umbrüche binäre Datei
Crian1 ok ok ok nicht ok
Crian2 ok ok ok ok
DS nicht ok nicht ok nicht ok nicht ok

Genaueres siehe: http://www.perl-community.de/rdw/rdw03/rdw03_auswertung_golf_windows.txt

Unter Linux (getestet mit Perl 5.8.1):

Name Beispieltext 8 Zeichen Umbrüche binäre Datei
Crian1 ok ok ok ok
Crian2 ok ok ok ok
DS ok ok ok ok

"(ok) bedeutet, dass die Datei zwar richtig ausgegeben wurde, aber bei einer Zeile, wo am Ende genau acht Zeichen stehen, der Trenner ' - ' in der Mitte trotzdem noch mit ausgegeben wird, obwohl er unnötig ist.

Crian (Golf)

Lösung 1:

Diese Lösung funktioniert nicht mit Binärdateien unter Windows:

$/=$\;$:=<>;$.=0;for(split//,$:){++$.;$/.=sprintf("%02x",ord$_);$/.=($.%8?' ':' - ')if$.%16;$I.=
(ord$_>31&&ord$_<128)?$_:'.';_($.,$/,$I),$/=$I=''unless$.%16;}$/=~s? - $??;_($.,$/,$I)if$.%16;sub
_{$/.=$"x(49-length$/);printf"%04x: %s    %s\n",int(($.-1)/16)*16,$/,$I;}

Lösung 2:

Diese Lösung funktioniert auch mit Binärdateien unter Windows, ist dafür aber nicht ganz so schön:

$/=$\;$.=0;@_=@ARGV;if(defined$_[0]&&-f$_[0]){if(open($f,$_[0])){binmode$f;
while($r=read($f,$:,1024,$l)){$l+=$r}}}else{$:=<>}for(split//,$:){++$.;$/.=
sprintf("%02x",ord$_);$/.=($.%8?' ':' - ')if$.%16;$I.=(ord$_>31&&ord$_<128)
?$_:'.';_($.,$/,$I),$/=$I=''unless$.%16;}$/=~s? - $??;_($.,$/,$I)if$.%16;sub
_{$/.=$"x(49-length$/);printf"%04x: %s    %s\n",int(($.-1)/16)*16,$/,$I;}

Wegen Problemen mit Sonderzeichen im XTerm gebe ich Zeichen über 127 nicht aus.

DS (Golf)

Diese Golf-Lösung ist sehr schön kurz, verarbeitet aber "nur" von STDIN, nicht aus angegebenen Dateinamen:

binmode STDIN;($.=sprintf'%*v02x',$",$_)=~s/.{24}/$&- /,y/\0-\x1f/./,printf"%03x0: %-53s$_\n",$p++,$.while read STDIN,$_,16

Allerdings sieht die Ausgabe unter Windows mit Active Perl 5.8.0 leider so aus:

...\rdw\rdw03>type hexdump.png | perl rdw03_ds_golf.pl
0000: %*v02x                                               ëPNG........IHDR
0010: %*v02x                                               ...û...û.....+/l
0020: %*v02x                                               Ð...$PLTE   ...¶
0030: %*v02x                                               -+¦I4Ûùï´¦¿¨ÕÔÓc
0040: %*v02x                                               QÕ}n´ )...Í0.7.)
0050: %*v02x                                               µ....tRNS.7ßÞ­..
0060: %*v02x                                               .ÒIDATx£ÝʦN+0.F
0070: %*v02x                                               aïʦÆ.àÑÛ+àØÑ.K.
0080: %*v02x                                               .&.È5[+u+- Êbñ Õ
0090: %*v02x                                               ©7...ÎÛt¥-±td;7Ñ
00a0: %*v02x                                               øYùùj¡VÅiZØÌ½Áñ-
00b0: %*v02x                                               °mNù.¡Å1i+~+¦iJ.
00c0: %*v02x                                               .lj¦-.-¡/[{iêÝ+Á
00d0: %*v02x                                               ¦î+X­+:}·rÖ×ý.j§
00e0: %*v02x                                               û¦cÝm¦¦*íÍôåöþãØ
00f0: %*v02x                                               .j=ÏÖ¦¯Ë.[o6°yܦ
0100: %*v02x                                               ÈÏ.#.÷Óy£.&#402;¦´Pk-
0110: %*v02x                                               ò¼ß+»¦_³/&#402;°¼_¹P
0120: %*v02x                                               -¦]Y¯µÈ6ö¦..+iy=
0130: %*v02x                                               R9.S............
0140: %*v02x                                               ..³+..Úc:¯.Ç5...
0150: %*v02x                                               .IEND«B`é

...\rdw\rdw03>type rdw03_beispiel.txt | perl rdw03_ds_golf.pl
0000: %*v02x                                               Lorem ipsum dolo
0010: %*v02x                                               r sit amet, cons
0020: %*v02x                                               ectetuer adipisc
0030: %*v02x                                               ing elit, sed di
0040: %*v02x                                               am nonummy nibh
0050: %*v02x                                               euismod tincidun
0060: %*v02x                                               t ut laoreet dol
0070: %*v02x                                               ore magna aliqua
0080: %*v02x                                               m erat volutpat.
0090: %*v02x                                                Ut wisi enim ad
00a0: %*v02x                                                minim veniam, q
00b0: %*v02x                                               uis nostrud exer
00c0: %*v02x                                               ci tation ullamc
00d0: %*v02x                                               orper suscipit l
00e0: %*v02x                                               obortis nisl ut
00f0: %*v02x                                               aliquip ex ea co
0100: %*v02x                                               mmodo consequat.
0110: %*v02x                                                Duis autem vel
0120: %*v02x                                               eum iriure dolor
0130: %*v02x                                                in hendrerit in
0140: %*v02x                                                vulputate velit
0150: %*v02x                                                esse molestie c
0160: %*v02x                                               onsequat, vel il
0170: %*v02x                                               lum dolore eu fe
0180: %*v02x                                               ugiat nulla faci
0190: %*v02x                                               lisis at vero er
01a0: %*v02x                                               os et accumsan e
01b0: %*v02x                                               t iusto odio dig
01c0: %*v02x                                               nissim qui bland
01d0: %*v02x                                               it praesent lupt
01e0: %*v02x                                               atum zzril delen
01f0: %*v02x                                               it augue duis do
0200: %*v02x                                               lore te feugait
0210: %*v02x                                               nulla facilisi..
0220: %*v02x                                               .

Im Gegensatz zu

...\rdw\rdw03>rdw03_crian_golf2.pl hexdump.png
0000: 89 50 4e 47 0d 0a 1a 0a - 00 00 00 0d 49 48 44 52    .PNG........IHDR
0010: 00 00 00 96 00 00 00 96 - 04 03 00 00 00 ce 2f 6c    ............../l
0020: d1 00 00 00 24 50 4c 54 - 45 ff ff ff 00 00 00 f4    ....$PLTE.......
0030: cb c5 db 49 34 ea 97 8b - ef b1 a8 f9 e5 e2 e0 63    ...I4..........c
0040: 51 e5 7d 6e ef ff 29 00 - 00 00 d6 30 18 37 12 29    Q.}n..)....0.7.)
0050: e6 00 00 00 01 74 52 4e - 53 01 37 e1 e8 f0 00 00    .....tRNS.7.....
0060: 00 e3 49 44 41 54 78 9c - ed d2 b1 4e c3 30 14 46    ..IDATx....N.0.F
0070: 61 8b d2 b4 92 1f 85 a5 - ea da 85 9d a5 13 4b 16    a.............K.
0080: 16 26 16 d4 35 5b 2b 75 - c9 cb 20 d2 62 a4 ff e5    .&..5[+u.. .b...
0090: b8 37 09 0f 00 d7 ea 74 - be c1 f1 74 64 3b 37 a5    .7.....t...td;7.
00a0: 9b 59 97 97 6a ad 56 8f - d5 5a 9d de ab b5 a4 cd    .Y..j.V..Z......
00b0: f8 6d 4e 97 0a ad 8f 31 - d5 2b 7e d9 b9 d5 4a 0a    .mN....1.+~...J.
00c0: 1f 6c 6a dd cb 1d c2 ad - 2f 5b 7b d5 88 ed bc b5    .lj...../[{.....
00d0: b2 8c bf 58 f0 c9 3a 7d - fa 72 99 9e ec 1a 6a f5    ...X..:}.r....j.
00e0: 96 b1 63 ed 6d db b4 2a - a1 d6 93 86 94 e7 c6 9d    ..c.m..*........
00f0: 14 6a 3d d8 99 b2 df d3 - 05 5b 6f 36 f8 79 9a b1    .j=......[o6.y..
0100: d4 d8 19 23 16 f6 e0 79 - 9c 0b 9f b2 ef 50 6b 2d    ...#...y.....Pk-
0110: 95 ac e1 d9 b6 af dd dc - fc 2f 9f f8 ac 5f fb 50    ........./..._.P
0120: cb fe 5d 59 ee e6 d4 36 - 94 b2 01 1b ce 69 79 f2    ..]Y...6.....iy.
0130: 52 39 06 53 00 00 00 00 - 00 00 00 00 00 00 00 00    R9.S............
0140: 00 00 fc c9 0f 15 e9 63 - 3a ee 06 80 35 00 00 00    .......c:...5...
0150: 00 49 45 4e 44 ae 42 60 - 82                         .IEND.B`.

Dateien

normale Lösungen

Golf-Lösungen

Testdateien

Auswertungen

-- ChristianDuehl - 23 Jul 2004

-- ChristianDuehl - 26 Jul 2004

-- ChristianDuehl - 27 Jul 2004

UtilPerlSkripteSubForm edit

Titel RDW #3 (Rätsel vom 23.07.2004)
Autor ChristianDuehl
Bereich RaetselDerWoche
Topic revision: r7 - 2004-08-04 - 10:15:09 - ChristianDuehl
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.