Was this page helpful?

Mark Senn's Challenge

    The challenge

        I came across the following when doing normal work for my job.
    
        Using the following
        ==== start with next line
               0 NUL   1 SOH    2 STX    3 ETX    4 EOT    5 ENQ    6 ACK    7 BEL
               8 BS    9 HT    10 NL    11 VT    12 NP    13 CR    14 SO    15 SI
              16 DLE  17 DC1   18 DC2   19 DC3   20 DC4   21 NAK   22 SYN   23 ETB
              24 CAN  25 EM    26 SUB   27 ESC   28 FS    29 GS    30 RS    31 US
              32 SP   33 !     34 "     35 #     36 $     37 %     38 &     39 '
              40 (    41 )     42 *     43 +     44 ,     45 -     46 .     47 /
              48 0    49 1     50 2     51 3     52 4     53 5     54 6     55 7
              56 8    57 9     58 :     59 ;     60 <     61 =     62 >     63 ?
              64 @    65 A     66 B     67 C     68 D     69 E     70 F     71 G
              72 H    73 I     74 J     75 K     76 L     77 M     78 N     79 O
              80 P    81 Q     82 R     83 S     84 T     85 U     86 V     87 W
              88 X    89 Y     90 Z     91 [     92 \     93 ]     94 ^     95 _
              96 `    97 a     98 b     99 c    100 d    101 e    102 f    103 g
             104 h   105 i    106 j    107 k    108 l    109 m    110 n    111 o
             112 p   113 q    114 r    115 s    116 t    117 u    118 v    119 w
             120 x   121 y    122 z    123 {    124 |    125 }    126 ~    127 DEL
        ==== end with previous line
        in a here document set up an array @print in Perl 5 so that elements
            0..31 are '.'
            32 is ' '
            33..126 are as listed
            127 is '.'
            128..255 is '.'
    
        I'll show my solution (that doesn't use
            chr
            do
            for
            grep (added on 2010-01-12)
            if
            map (added on 2010-01-12)
            ord
            repeat (added on 2010-01-12)
            require (added on 2010-01-14)
            sub
            while
            until
            use (added on 2010-01-14)
        ) at next meeting and would like to see other solutions with
        or without the parenthesized restraint above.    -mark
     
    

    Responses

     Gribskov -1

    $line = <<'END';
          0 NUL   1 SOH    2 STX    3 ETX    4 EOT    5 ENQ    6 ACK    7 BEL
          8 BS    9 HT    10 NL    11 VT    12 NP    13 CR    14 SO    15 SI
         16 DLE  17 DC1   18 DC2   19 DC3   20 DC4   21 NAK   22 SYN   23 ETB
         24 CAN  25 EM    26 SUB   27 ESC   28 FS    29 GS    30 RS    31 US
         32 SP   33 !     34 "     35 #     36 $     37 %     38 &     39 '
         40 (    41 )     42 *     43 +     44 ,     45 -     46 .     47 /
         48 0    49 1     50 2     51 3     52 4     53 5     54 6     55 7
         56 8    57 9     58 :     59 ;     60 <     61 =     62 >     63 ?
         64 @    65 A     66 B     67 C     68 D     69 E     70 F     71 G
         72 H    73 I     74 J     75 K     76 L     77 M     78 N     79 O
         80 P    81 Q     82 R     83 S     84 T     85 U     86 V     87 W
         88 X    89 Y     90 Z     91 [     92 \     93 ]     94 ^     95 _
         96 `    97 a     98 b     99 c    100 d    101 e    102 f    103 g
        104 h   105 i    106 j    107 k    108 l    109 m    110 n    111 o
        112 p   113 q    114 r    115 s    116 t    117 u    118 v    119 w
        120 x   121 y    122 z    123 {    124 |    125 }    126 ~    127 DEL
    END
    
    $line =~ s/^\s+0 |\s*\n$//g && $line =~ s/\n* +/ /g && $line =~ s/SP/ / && $line =~ s/[A-Z]{2,3}\d*/./g && (@print = split / \d+ /, $line." 1 ."x128);
    
    print "\n\nResult\n\n";
    print "@print\n";
    
    foreach my $i ( 0 .. 255 ) {
        unless ( $i % 5 ) { print "\n"; }
        printf "%4d (%s)     ", $i, $print[$i];
        
    } 
    
    

    Gribskov-2 (uses map)

    $line = <<'END';
          0 NUL   1 SOH    2 STX    3 ETX    4 EOT    5 ENQ    6 ACK    7 BEL
          8 BS    9 HT    10 NL    11 VT    12 NP    13 CR    14 SO    15 SI
         16 DLE  17 DC1   18 DC2   19 DC3   20 DC4   21 NAK   22 SYN   23 ETB
         24 CAN  25 EM    26 SUB   27 ESC   28 FS    29 GS    30 RS    31 US
         32 SP   33 !     34 "     35 #     36 $     37 %     38 &     39 '
         40 (    41 )     42 *     43 +     44 ,     45 -     46 .     47 /
         48 0    49 1     50 2     51 3     52 4     53 5     54 6     55 7
         56 8    57 9     58 :     59 ;     60 <     61 =     62 >     63 ?
         64 @    65 A     66 B     67 C     68 D     69 E     70 F     71 G
         72 H    73 I     74 J     75 K     76 L     77 M     78 N     79 O
         80 P    81 Q     82 R     83 S     84 T     85 U     86 V     87 W
         88 X    89 Y     90 Z     91 [     92 \     93 ]     94 ^     95 _
         96 `    97 a     98 b     99 c    100 d    101 e    102 f    103 g
        104 h   105 i    106 j    107 k    108 l    109 m    110 n    111 o
        112 p   113 q    114 r    115 s    116 t    117 u    118 v    119 w
        120 x   121 y    122 z    123 {    124 |    125 }    126 ~    127 DEL
    END
    
    @print = ( (".") x 256 );
    @pairs = split /\n*  +/, $line;
    foreach my $p ( 0 .. $#pairs ) {
        print "$p   $pairs[$p]\n";
    }
    
    map { ($i,$v) = split " ", $_; 
          if ( $v =~ /SP/ ) {
              $v = " ";
          } elsif ( $v=~/[A-Z][A-Z]+\d*/ ) {
              $v = ".";
          }
          $print[$i]=$v;
        } @pairs;
    foreach my $p ( 0 .. $#print ) {
        print "$p   $print[$p]\n";
    } 
    

    Ziegler-1

    #!/usr/bin/perl -w
    use strict;
    use Data::Dumper;
    
    my @print = (('.')x32,(' '),(<<'END' =~ m/\d+\s(\S+)/g)[33..126],('.')x129);
          0 NUL   1 SOH    2 STX    3 ETX    4 EOT    5 ENQ    6 ACK    7 BEL
          8 BS    9 HT    10 NL    11 VT    12 NP    13 CR    14 SO    15 SI
         16 DLE  17 DC1   18 DC2   19 DC3   20 DC4   21 NAK   22 SYN   23 ETB
         24 CAN  25 EM    26 SUB   27 ESC   28 FS    29 GS    30 RS    31 US
         32 SP   33 !     34 "     35 #     36 $     37 %     38 &     39 '
         40 (    41 )     42 *     43 +     44 ,     45 -     46 .     47 /
         48 0    49 1     50 2     51 3     52 4     53 5     54 6     55 7
         56 8    57 9     58 :     59 ;     60 <     61 =     62 >     63 ?
         64 @    65 A     66 B     67 C     68 D     69 E     70 F     71 G
         72 H    73 I     74 J     75 K     76 L     77 M     78 N     79 O
         80 P    81 Q     82 R     83 S     84 T     85 U     86 V     87 W
         88 X    89 Y     90 Z     91 [     92 \     93 ]     94 ^     95 _
         96 `    97 a     98 b     99 c    100 d    101 e    102 f    103 g
        104 h   105 i    106 j    107 k    108 l    109 m    110 n    111 o
        112 p   113 q    114 r    115 s    116 t    117 u    118 v    119 w
        120 x   121 y    122 z    123 {    124 |    125 }    126 ~    127 DEL
    END
    
    #print Dumper @print;
    foreach my $i (0..$#print){
        printf '% 5d % s', $i, $print[$i];
        print "\n" if (!(($i+1)%8));
    }
    


    Was this page helpful?
    Tag page (Edit tags)
    • No tags
    You must login to post a comment.