Last active
September 29, 2022 20:28
-
-
Save scruss/f7af59d59efd6af2c7964cb8f771c828 to your computer and use it in GitHub Desktop.
there's something badly wrong with raku ...
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
# collatz-memo.pl | |
# run time: appx 7 s | |
# output: max: 8400511 steps: 685 | |
use v5.20; | |
use strict; | |
use warnings; | |
my ( $maxsteps, $maxval, $n, $steps, $x ) = qw/0 0 0 0 1/; | |
my @s; | |
$s[$x] = 0; | |
foreach $x ( 1 .. 10000000 ) { | |
$steps = 0; | |
$n = $x; | |
while ( ( $n > 1 ) && ( $n >= $x ) ) { | |
$n = ( $n & 1 ) ? 3 * $n + 1 : $n >> 1; | |
$steps++; | |
} | |
$steps += $s[$n]; | |
$s[$x] = $steps; | |
( $maxsteps, $maxval ) = ( $steps, $x ) if ( $steps > $maxsteps ); | |
} | |
say 'max: ', $maxval, ' steps: ', $maxsteps; | |
exit; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env raku | |
# collatz-memo - uses over 10 GB and fails to complete in 5+ minutes | |
# raku version v2022.07 | |
# equivalent Perl5 completes in 7 s and minimal memory | |
my ( $maxsteps, $maxval, $n, $steps, $x ) = qw/0 0 0 0 1/; | |
my @s; | |
@s[$x] = 0; | |
# Perl 5 used | |
# foreach $x ( 1 .. 10000000 ) { | |
loop ($x=1; $x <= 10000000; $x++) { | |
$steps = 0; | |
$n = $x; | |
while ( ( $n > 1 ) && ( $n >= $x ) ) { | |
$n = ( $n & 1 ) ?? 3 * $n + 1 !! $n +> 1; | |
$steps++; | |
} | |
$steps += @s[$n]; | |
@s[$x] = $steps; | |
( $maxsteps, $maxval ) = ( $steps, $x ) if ( $steps > $maxsteps ); | |
} | |
say 'max: ', $maxval, ' steps: ', $maxsteps; | |
exit; |
I'm pretty amazed that I managed to pick up the +>
thing from Perl to Raku guide - in a nutshell: I think the interpreter complained so I read up on it. It's a shame that Raku doesn't switch from int to bigints automatically like Python does: it's a huge speed increase
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It didn't complain because it was syntacticly valid code. Semantically pretty non-sensical in that context, but there you go.
Oddly enough, you did notice that the bit-shift right operator is
+>
. Anyways, all of those bitty operators start with a+
, so at least that is consistent. So the bitwise OR is+|
.But yeah, I guess you could call
&
a false friend coming from Perl. I'll give you that :-)