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

This is just another perl newbie here.Thanks every1 for replying to my question about merging files.
.Phew! i really do have a long way to go. Anyway i was going through some C exercises i had done previously and i came across an interesting
exercise. You have to write a program to produce
the following output
Well, um i wrote the code , but since er i just baby talk perl,
the code is very big i just know that there
is a more better and more intelligent way to do it
.I will really appreciate your help perl monks if you kindly
THANKS ankur
ABCDEFGFEDCBA ABCDEF FEDCBA ABCDE EDCBA ABCD DCBA ABC CBA AB BA A A <CODE> #!/usr/bin/perl -w @store=('a'..'g'); $i=@store; $count=0; while($i>=0){ &printline($i-1,@store); &revline($i-1,$count,@store); $count++; pop(@store); } sub printline{ ($itemp,@printarray)=@_; for($j=0;$j<=$itemp;$j++){ print "$printarray[$j]"; } } sub revline{ ($it,$cou,@linarray)=@_; if ($cou==0){ for($k=$it;$k>=0;$k--){ print "$linarray[$k]"; } print '/n'; return; } $p=$cou-1; $r=2*$p + 1; for ($j=1;$j<=$r;$j++){ print " "; } for($k=@linarray-1;$k>=0;$k--){ print "$store[$k]"; if ($k==0){ print '\n' ; } } }
er i dont know formatting yet

Replies are listed 'Best First'.
Re: outputting fun
by indigo (Scribe) on Aug 29, 2000 at 20:08 UTC
    #!/usr/bin/perl -w use strict; my $string = 'ABCDEFGFEDCBA'; print "$string\n" and $string =~ s/$_/ /g for reverse 'A' .. 'G';
RE: outputting fun
by Shendal (Hermit) on Aug 29, 2000 at 19:51 UTC
    Here's my entry:
    #!/usr/bin/perl -w use strict; # always $_ = join("",('A' .. 'G'), reverse('A' .. 'F'),"\n"); foreach my $letter (reverse ('A' .. 'G')) { print; s/$letter/ /g; }

Re: outputting fun
by Corion (Patriarch) on Aug 29, 2000 at 19:47 UTC

    Here's my try at it. It uses two forms of string replacement - one transliteration, replacing every G with a space, and one regular expression, replacing a single character, followed by one or more spaces and then that character again, with two more spaces.

    #!/usr/bin/perl -w use strict; my $line; print( $line = join( "", ('A' .. 'G'), reverse ( 'A'..'F' )), "\n" ); $line =~ tr/G/ /; print( $line, "\n" ); while ($line !~ /^\s+$/) { $line =~ s/(\S)(\s+)\1/ $2 /; print( $line, "\n"); };
    This is obviously not the smallest possible code, but a bit more Perlish and elegant (IMholyO) :-)

      Just would like to say that Iam a wingnut :)
      for(my($c)=71,my($i)=0; $c >= 65; $c--,$i++) { print ( (chr(65)..chr($c)), (' 'x($i+($i-1))), reverse(chr(65)..chr(($c==71)? $c-1 : $c)), "\n" ); }
      p.s. I broke it into multi-line so that it was readable :)

      /****************************/, /*****************************/
      There is the obvious
      How about?
      $a = "ABCDEFGFEDCBA\n"; print($a), substr($a, 7-$_, 2*$_-1) = " " ." " x ($_-1) for 1..7
      -- stef
Re: outputting fun
by Boogman (Scribe) on Aug 29, 2000 at 19:51 UTC
    Here's another way. I just printed the first line cause it didn't really fit the pattern used for the rest of the lines...
    print 'ABCDEFGFEDCBA', "\n"; my @letters = ( 'A' .. 'F' ); for ( 0 .. $#letters ) { print @letters[ 0 .. $#letters - $_ ], ' ' x ( 1 + 2 * $_ ), reverse( @letters[ 0 .. $#letters - $_ ] ), "\n"; }
    A bit shorter, but I must say I like Corion's solution better.
Re: outputting fun
by tye (Sage) on Aug 29, 2000 at 20:43 UTC
    #!/usr/bin/perl -l print reverse join"\n",reverse map{reverse sprintf "%-6.6s%7s",(reverse join"",@$_=reverse@$_),reverse join "",reverse@$_}reverse map{[reverse'A'..$_]}reverse'A'..'G'

    I think I can eliminate one of those reverses, but I'm not sure which one. (:

            - tye (but my friends call me "Tye")
      how about eliminating 8 of them:
      #!/usr/bin/perl -l print join $/, map { sprintf "%-6.6s%7s", join("", @$_), join("", reverse @$_) } map { [ 'A' .. $_ ] } reverse 'A'..'G';
Re: outputting fun
by cwest (Friar) on Aug 29, 2000 at 22:51 UTC
    BEGIN{$_=7 # Change this number to control pivot -1}foreach $.(int(length()/2)..length()-2){print ((/\s/?s/\w(\s+)\w/ $1 /:s/(\w{$;})./$1 /)?$_:1) ;}BEGIN{($;,$_,$\)=($_,join(''=>chr(65)..chr(65+ $_),reverse(chr(65)..chr(65+$_-1))),$/);print}
    because I'm nuts, that's why :-)
Re (tilly) 1: outputting fun
by tilly (Archbishop) on Mar 28, 2001 at 05:17 UTC
    Another silly entry.
    $_="ABCDEFGFEDCBA\n"; print; print while s/(?<!^)(G|\b\w|\w\b)(?!$)/ /g;
Re: outputting fun
by Arry (Initiate) on Jan 09, 2002 at 19:16 UTC
    OK, I'm new to this, but thought I would have a go. On my own I get: $d="ABCDEFGFEDCBA"; for($i=71;$i>64;$i-=1) { print "$d\n"; $c=chr($i); $d =~ s/$c/ /g; } With a little help, I then got: $_="ABCDEFGFEDCBA\n";for $r(reverse(A..G)){print; s/$r/ /g} Same theory, better solution.