Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

perl6 and a multi-interpreted-language example

8 views
Skip to first unread message

William Herrera

unread,
Sep 17, 2006, 3:45:52 PM9/17/06
to perl6...@perl.org
Hi! I was wondering what a perl 6 program of a game of Reverse would
look like?

see http://e-scribe.com/news/193

================================================

Ruby (10 lines, 274 bytes)

numbers = (1..9).sort_by{ rand }
steps = 0

while numbers != numbers.sort
puts numbers.join(" ")
print "Reverse how many? "
flipcount = gets.to_i
numbers[0...flipcount] = numbers[0...flipcount].reverse
steps += 1
end

print "Done! That took you #{steps} steps.\n"

=================================================

Python (9 lines, 304 bytes)

import random

numbers = random.sample(range(1,10), 9)
steps = 0

while numbers != sorted(numbers):
print " ".join(map(str, numbers))
flipcount = int(raw_input("Reverse how many? "))
numbers[:flipcount] = reversed(numbers[:flipcount])
steps += 1

print "Done! That took you %d steps." % steps


=========================================================

PHP (12 lines, 381 bytes)

$numbers = range(1, 9);
shuffle($numbers);
$sorted = $numbers;
sort($sorted);
$steps = 0;

while ($numbers != $sorted)
{
print implode(" ", $numbers) . "\n";
print "Reverse how many? ";
$flipcount = (int)trim(fgets(STDIN));
array_splice($numbers, 0, $flipcount,
array_reverse(array_slice($numbers, 0, $flipcount)));
$steps++;
}

print "Done! That took you $steps steps.\n";

==========================================================

perl 5 (9 lines, 353 bytes)

use FreezeThaw qw(cmpStr);

my @a1_9 = (1 .. 9);
my @numbers = sort {rand(10) > $a} @a1_9;

for (my $steps = 0; cmpStr(\@numbers, \@a1_9); ++$steps) {
print join(" ", @numbers), "\nReverse how many? ";
my $flipcount = <STDIN>;
@numbers[0..$flipcount - 1] = reverse(@numbers[0..($flipcount-1)]);
}

print "Done! That took you $steps steps.\n";

==================================================================

Does perl6's Array class allow for more compact syntax, without
FreezeThaw.pm?

William Herrera

unread,
Sep 17, 2006, 4:33:31 PM9/17/06
to perl6...@perl.org
I just took a second glance at my post and saw the scoping error in the
$steps variable. Please don't bother fixing it-- I want to know what a
perl6 version would be like :)

Juerd

unread,
Sep 17, 2006, 2:36:40 PM9/17/06
to perl6...@perl.org
William Herrera skribis 2006-09-17 13:45 (-0600):

> Ruby (10 lines, 274 bytes)

This is the nicest example, so I'll base my response off this one.

my @numbers = (1..9).sort:{ rand };
my $steps = 0;
while ("@numbers[]" ne "@numbers.sort()") {
say "@numbers";
my $flipcount = prompt "Reverse how many?";
@numbers[0..^$flipcount].=reverse;
$steps++;
}
say "Done! That took you $steps steps.\n";

> Does perl6's Array class allow for more compact syntax, without
> FreezeThaw.pm?

Interpolate the arrays:

while ("@numbers" ne "@{[ sort @numbers ]}") { ... }

--
korajn salutojn,

juerd waalboer: perl hacker <ju...@juerd.nl> <http://juerd.nl/sig>
convolution: ict solutions and consultancy <sa...@convolution.nl>

A. Pagaltzis

unread,
Sep 17, 2006, 6:23:33 PM9/17/06
to perl6...@perl.org
* William Herrera <wher...@skylightview.com> [2006-09-17 21:50]:

> perl 5 (9 lines, 353 bytes)
>
> use FreezeThaw qw(cmpStr);
>
> my @a1_9 = (1 .. 9);
> my @numbers = sort {rand(10) > $a} @a1_9;
>
> for (my $steps = 0; cmpStr(\@numbers, \@a1_9); ++$steps) {
> print join(" ", @numbers), "\nReverse how many? ";
> my $flipcount = <STDIN>;
> @numbers[0..$flipcount - 1] = reverse(@numbers[0..($flipcount-1)]);
> }
>
> print "Done! That took you $steps steps.\n";

To be fair, Perl 5 can be a good deal nicer. 10 lines, 316 bytes,
and much less punctuation:

use List::Util 'shuffle';

my @numbers = shuffle my @goal = ( 1 .. 9 );
my $num_steps;

while ( "@numbers" ne "@goal" ) {
print "@numbers\nReverse how many? ";
my @slice = 0 .. <STDIN> - 1;
@numbers[ @slice ] = reverse @numbers[ @slice ];
++$num_steps;
}

print "Done! That took you $num_steps steps.\n";

Regards,
--
#Aristotle
*AUTOLOAD=*_;sub _{s/(.*)::(.*)/print$2,(",$\/"," ")[defined wantarray]/e;$1};
&Just->another->Perl->hacker;

Ilmari Vacklin

unread,
Sep 17, 2006, 6:47:53 PM9/17/06
to perl6...@perl.org
su, 2006-09-17 kello 20:36 +0200, Juerd kirjoitti:
> while ("@numbers[]" ne "@numbers.sort()") {

Should C<eqv> be used here?

while @numbers !eqv @numbers.sort {

--
Ilmari Vacklin <ilmari....@helsinki.fi>

signature.asc

Larry Wall

unread,
Sep 17, 2006, 7:16:43 PM9/17/06
to perl6...@perl.org
Okay, combining all these approaches minimalistically but without
golfing we get something like:

my @numbers = sort { rand }, constant @goal = 1..9;
my $steps = 0;

until @numbers ~~ @goal {
say ~@numbers;
@numbers[ 0 ..^ prompt "Reverse how many? " ] .= reverse;
++$steps;
}

say "Done! That took you $steps steps.";

Larry

Ben Morrow

unread,
Sep 18, 2006, 12:38:34 AM9/18/06
to perl6...@perl.org

Quoth la...@wall.org (Larry Wall):

Can I just say: I've never written a line of Perl6, and I love it
already :).

Ben

--
I've seen things you people wouldn't believe: attack ships on fire off
the shoulder of Orion; I watched C-beams glitter in the dark near the
Tannhauser Gate. All these moments will be lost, in time, like tears in rain.
Time to die. benm...@tiscali.co.uk

0 new messages