[Purdue-pm] More on Mark's challenge

Mark Senn mark at ecn.purdue.edu
Thu Jan 14 09:41:08 PST 2010


  On Wed, 13 Jan 2010 09:13:21 -0500 Rick Westerman wrote:
  > I had a question today as to if is required to use the 'hereis' text
  > Mark put in his original challenge email.  My feeling is 'yes'.  Just
  > filling up an array with serial ASCII characters defeats part of the
  > challenge -- one could certainly imagine a scenario where arbitrary text
  > is used in a non-serial manner.  But maybe I am saying this because
  > working with the 'hereis' took most of my less than 2 hour effort (I
  > almost never use 'hereis') and so want to see what other people come up
  > with.

The original challenge email with some reformattig to make it easier to read
and additions made on 2010-01-12 (they're clearly marked):

    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

One must use the here document in the original challenge email so that,
for example, if "R" where changed to "X" in the here document then
$print[82] would be "X" after your code runs.

There are two kinds of solutions:

FIRST KIND: ignores the character numbers like the "0" in "0 NUL" and
assumes the values for the @print array are listed in order.

SECOND KIND: uses the character numbers so that if, for example, "127 DEL"
were changed to "127 x" then $print[127] would be "x" after the code runs.

I did an easy to read and understand solution of the first kind.  After
reading comments by other people, I did a Perl golf solution (minimize
number of characters used) of the second kind, and a reformatted version
of the Perl golf solution so it is easier to read.

-mark


More information about the Purdue-pm mailing list