[Purdue-pm] More on Mark's challenge

Mark Senn mark at ecn.purdue.edu
Sat Jan 16 22:00:56 PST 2010


  Phillip San Miguel wrote:
  > I now have a single statement (68 characters for the "golf"
  > version--including "@print=" characters) solution which may be of the
  > 1st kind or the 2nd kind. I am presuming that the here doc is dumped
  > into $_ and that step doesn't count against my "score". It is ugly, I
  > guess. But I'm not using any JAPHistry. All the commands I deploy do
  > what you expect them to--they don't rely on some side effect to get
  > the job done.
  > 
  > Strictly speaking it is of the 2nd kind in that it passes the test
  > Mark stipulates above. But past that I'm not sure whether it would
  > suit Mark's purposes or not.
  > Phillip

Here is a better spec.  Changed lines have  "+" in column one.

+ The changes in this document contain information about
+     o  a better description of how the here document should be set up
+     o  a requirement that your program use at least same data from
+        here document---see the description of the three kinds or solutions
+     o  the array name has changed from print to p
+     o  my solution doesn't use goto
+     o  a third kind of solution has been added (I meant to have this
+        as the second kind of solution but goofed).  The description of
+        the second kind of solution doesn't make a lot of sense but I'm
+        not going to change it.

+ You must have a here document like the following that your program
+ uses to get the data from.  The number of characters used in the
+ here document isn't included in "perl golf" scores.  The here document
+ should be indented as shown here, so that the "1" of "128" has four spaces
+ before it.
+
+ [your one-line command to read the here document goes here, it can only
+ be used to read the data in the here documentn, not do anything else]
      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
HERE

+ Running your program with the above here document should set up an array
+ p so that elements
     0..31 are '.'
     32 is ' '
     33..126 are as listed
    127 is '.'
    128..255 are '.'

I'll show my solution (that doesn't use
    chr
    do
    for
+   goto (added on 2010-01-17)
    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.

+ THIRD KIND: uses the character numbers so that if, for example, "127 DEL"
+ were changed to "40 X" then $print[40] 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.

+ Your program must end with the following two lines.  These characters
+ are not included in any Perl golf score.
+
+ use Data::Dumper;
+ print Dumper @p;

-mark


More information about the Purdue-pm mailing list