http://qs321.pair.com?node_id=927466

blakew has asked for the wisdom of the Perl Monks concerning the following question:

Bit of silliness.

1. What's the next line?

1 1 1 2 1 1 2 1 1 1 1 1 2 2 1

2. Write code to print each line in the pattern (it gets unwieldy).

If the 5th line was 3 1 1 2 passing an argument gives that solution-
my $anchor = @ARGV ? '' : '^'; printf "%d\n", $_ = '1'; do { my $new; my ( $n ) = /^(\d)/o; while ( $_ ) { my $c = 0; $c++ while s/$anchor\s?$n\s?//; $new .= "$c $n " if $c; ( $n ) = /^(\d)/o; } print $_ = $new; } until ( <STDIN> =~ /\S/ );

Replies are listed 'Best First'.
Re: What's the answer to this puzzle? Most unique/golfed solution? (fun)
by thundergnat (Deacon) on Sep 23, 2011 at 02:09 UTC

    Hmm. Golf eh? 88 strokes. First 99 19 values. Bleh. 99 takes too long.

    Works under linux, Swap double and single quotes for Windows.

             1         2         3         4         5         6         7         8         9
    123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
    
    perl -E'$_=1;while(++$t<19){say;my@a;push@a,length$1,$2 while/((\d)\2* +)/g;$_=join"",@a}'

    Update 79 75 73 strokes

             1         2         3         4         5         6         7         8
    12345678901234567890123456789012345678901234567890123456789012345678901234567890
    
    perl -E'for(0..19){say$_=$t//1;$t="";$t.=(length$1).$2 while/((.)\2*)/ +g}'
      thundergnat,

      This just trims a few characters from your approach, which I think is a very good one (I couldn't find an inherently better one).

      # 68 strokes perl -E'map{say$_=$t||1;$t="";$t.=(length$&).$1while/(.)\1*/g}0..19'

      s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
Re: What's the answer to this puzzle? Most unique/golfed solution? (fun)
by AnomalousMonk (Archbishop) on Sep 23, 2011 at 01:00 UTC
Re: What's the answer to this puzzle? Most unique/golfed solution? (fun)
by Anonymous Monk on Sep 24, 2011 at 04:06 UTC

    55 characters:

    perl -E'$_=1;say,s/(.)\1*/$&=~y...c.$1/ge while$i++<19'