Lychrel numbers: Difference between revisions

Content added Content deleted
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 2,079: Line 2,079:
</pre>
</pre>


=={{Header|Pascal}}==
=={{header|Pascal}}==
{{works with|Free Pascal}}
{{works with|Free Pascal}}
I use an array of byte.The trick is to add first, so i don't need to create a reversed number and only have to sum up one half and than correct the carry, which is most time consuming.
I use an array of byte.The trick is to add first, so i don't need to create a reversed number and only have to sum up one half and than correct the carry, which is most time consuming.
Line 2,395: Line 2,395:
</pre>
</pre>


=={{Header|Perl}}==
=={{header|Perl}}==
<lang perl>use strict;
<lang perl>use strict;
use English;
use English;
Line 2,472: Line 2,472:
Palindromes among seed and related <= 10000: 4994, 8778, 9999
Palindromes among seed and related <= 10000: 4994, 8778, 9999
</pre>
</pre>

=={{header|Perl 6}}==
{{works with|Rakudo|2018.03}}

<lang perl6>my %lychrels;
my @seeds;
my @palindromes;
my $count;
my $max = 500;
my $limit = '10_000';
my %seen;

for 1 .. $limit -> $int {
my @test;
my $index = 0;
if $int.&is-lychrel {
%lychrels.push: ($int => @test).invert;
@palindromes.push: $int if $int == $int.flip;
$count++;
}

sub is-lychrel (Int $l) {
if %seen{$l} or $index++ > $max {
%seen{$_} = True for @test;
return True;
}
@test.push: my $m = $l + $l.flip;
return False if $m == $m.flip;
$m.&is-lychrel;
}
}

for %lychrels{*}»[0].unique.sort -> $ly {
my $next = False;
for %lychrels -> $l {
for $l.value[1..*] -> $lt {
$next = True and last if $ly == $lt;
last if $ly < $lt;
}
last if $next;
}
next if $next;
@seeds.push: $ly;
}

say " Number of Lychrel seed numbers < $limit: ", +@seeds;
say " Lychrel seed numbers < $limit: ", join ", ", @seeds;
say "Number of Lychrel related numbers < $limit: ", +$count - @seeds;
say " Number of Lychrel palindromes < $limit: ", +@palindromes;
say " Lychrel palindromes < $limit: ", join ", ", @palindromes;</lang>

{{out}}
<pre> Number of Lychrel seed numbers < 10_000: 5
Lychrel seed numbers < 10_000: 196, 879, 1997, 7059, 9999
Number of Lychrel related numbers < 10_000: 244
Number of Lychrel palindromes < 10_000: 3
Lychrel palindromes < 10_000: 4994, 8778, 9999</pre>


=={{header|Phix}}==
=={{header|Phix}}==
Line 2,596: Line 2,539:
</pre>
</pre>


=={{Header|PicoLisp}}==
=={{header|PicoLisp}}==
<lang PicoLisp>(de pali? (N)
<lang PicoLisp>(de pali? (N)
(let N (chop N)
(let N (chop N)
Line 2,791: Line 2,734:
</pre>
</pre>


=={{Header|Python}}==
=={{header|Python}}==
<lang python>from __future__ import print_function
<lang python>from __future__ import print_function


Line 2,885: Line 2,828:
print("%d Lychel palindromes:" % len(palin), palin)</lang>
print("%d Lychel palindromes:" % len(palin), palin)</lang>


=={{Header|Racket}}==
=={{header|R}}==
<lang rsplus>
library(gmp)
library(magrittr)

cache <- NULL

cache_reset <- function() { cache <<- new.env(TRUE, emptyenv()) }
cache_set <- function(key, value) { assign(key, value, envir = cache) }
cache_get <- function(key) { get(key, envir = cache, inherits = FALSE) }
cache_has_key <- function(key) { exists(key, envir = cache, inherits = FALSE) }

# Initialize the cache
cache_reset()

isPalindromic <- function(num) {
paste0(unlist(strsplit(num,"")), collapse = "") ==
paste0(rev(unlist(strsplit(num,""))),collapse = "")
}


aStep <- function(num) {
num %>%
strsplit("") %>%
unlist() %>%
rev() %>%
paste0(collapse = "") %>%
sub("^0+","",.) %>%
as.bigz() %>%
'+'(num) %>%
as.character
}

max_search <- 10000
limit <- 500
related <- 0
lychrel <- vector("numeric")
palindrome_lychrel <- vector("numeric")

for (candidate in 1:max_search) {
n <- as.character(candidate)
found <- TRUE
for (iteration in 1:limit) {
n <- aStep(n)
if (cache_has_key(n)) {
related <- related + 1
found <- FALSE
if (isPalindromic(as.character(candidate))) palindrome_lychrel <- append(palindrome_lychrel, candidate)
break
}
if (isPalindromic(n)) {
found <- FALSE
break
}
}
if (found) {
if (isPalindromic(as.character(candidate))) palindrome_lychrel <- append(palindrome_lychrel, candidate)
lychrel <- append(lychrel,candidate)
seeds <- seeds + 1
n <- as.character(candidate)
for (iteration in 1:limit) {
cache_set(n,"seen")
n <- aStep(n)
}
}
}
cat("Lychrel numbers in the range [1, ",max_search,"]\n", sep = "")
cat("Maximum iterations =",limit,"\n")
cat("Number of Lychrel seeds:",length(lychrel),"\n")
cat("Lychrel numbers:",lychrel,"\n")
cat("Number of related Lychrel numbers found:",related,"\n")
cat("Number of palindromic Lychrel numbers:",length(palindrome_lychrel),"\n")
cat("Palindromic Lychrel numbers:",palindrome_lychrel,"\n")
</lang>
{{out}}
<pre>
Lychrel numbers in the range [1, 10000]
Maximum iterations = 500
Number of Lychrel seeds: 5
Lychrel numbers: 196 879 1997 7059 9999
Number of related Lychrel numbers found: 244
Number of palindromic Lychrel numbers: 3
Palindromic Lychrel numbers: 4994 8778 9999
</pre>

=={{header|Racket}}==


<lang racket>#lang racket
<lang racket>#lang racket
Line 2,953: Line 2,981:
Palindromic Lychrel numbers: ((4994 (related)) (8778 (related)) (9999 (seed)))</pre>
Palindromic Lychrel numbers: ((4994 (related)) (8778 (related)) (9999 (seed)))</pre>


=={{Header|REXX}}==
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.03}}

<lang perl6>my %lychrels;
my @seeds;
my @palindromes;
my $count;
my $max = 500;
my $limit = '10_000';
my %seen;

for 1 .. $limit -> $int {
my @test;
my $index = 0;
if $int.&is-lychrel {
%lychrels.push: ($int => @test).invert;
@palindromes.push: $int if $int == $int.flip;
$count++;
}

sub is-lychrel (Int $l) {
if %seen{$l} or $index++ > $max {
%seen{$_} = True for @test;
return True;
}
@test.push: my $m = $l + $l.flip;
return False if $m == $m.flip;
$m.&is-lychrel;
}
}

for %lychrels{*}»[0].unique.sort -> $ly {
my $next = False;
for %lychrels -> $l {
for $l.value[1..*] -> $lt {
$next = True and last if $ly == $lt;
last if $ly < $lt;
}
last if $next;
}
next if $next;
@seeds.push: $ly;
}

say " Number of Lychrel seed numbers < $limit: ", +@seeds;
say " Lychrel seed numbers < $limit: ", join ", ", @seeds;
say "Number of Lychrel related numbers < $limit: ", +$count - @seeds;
say " Number of Lychrel palindromes < $limit: ", +@palindromes;
say " Lychrel palindromes < $limit: ", join ", ", @palindromes;</lang>

{{out}}
<pre> Number of Lychrel seed numbers < 10_000: 5
Lychrel seed numbers < 10_000: 196, 879, 1997, 7059, 9999
Number of Lychrel related numbers < 10_000: 244
Number of Lychrel palindromes < 10_000: 3
Lychrel palindromes < 10_000: 4994, 8778, 9999</pre>

=={{header|REXX}}==
<lang rexx>/*REXX program finds and displays Lychrel numbers, related numbers, and palindromes. */
<lang rexx>/*REXX program finds and displays Lychrel numbers, related numbers, and palindromes. */
parse arg high limit . /*obtain optional argument from the CL.*/
parse arg high limit . /*obtain optional argument from the CL.*/
Line 3,443: Line 3,529:
Lychrel palindromes found: [4994, 8778, 9999]</pre>
Lychrel palindromes found: [4994, 8778, 9999]</pre>


=={{header|R}}==
<lang rsplus>
library(gmp)
library(magrittr)

cache <- NULL

cache_reset <- function() { cache <<- new.env(TRUE, emptyenv()) }
cache_set <- function(key, value) { assign(key, value, envir = cache) }
cache_get <- function(key) { get(key, envir = cache, inherits = FALSE) }
cache_has_key <- function(key) { exists(key, envir = cache, inherits = FALSE) }

# Initialize the cache
cache_reset()

isPalindromic <- function(num) {
paste0(unlist(strsplit(num,"")), collapse = "") ==
paste0(rev(unlist(strsplit(num,""))),collapse = "")
}


aStep <- function(num) {
num %>%
strsplit("") %>%
unlist() %>%
rev() %>%
paste0(collapse = "") %>%
sub("^0+","",.) %>%
as.bigz() %>%
'+'(num) %>%
as.character
}

max_search <- 10000
limit <- 500
related <- 0
lychrel <- vector("numeric")
palindrome_lychrel <- vector("numeric")

for (candidate in 1:max_search) {
n <- as.character(candidate)
found <- TRUE
for (iteration in 1:limit) {
n <- aStep(n)
if (cache_has_key(n)) {
related <- related + 1
found <- FALSE
if (isPalindromic(as.character(candidate))) palindrome_lychrel <- append(palindrome_lychrel, candidate)
break
}
if (isPalindromic(n)) {
found <- FALSE
break
}
}
if (found) {
if (isPalindromic(as.character(candidate))) palindrome_lychrel <- append(palindrome_lychrel, candidate)
lychrel <- append(lychrel,candidate)
seeds <- seeds + 1
n <- as.character(candidate)
for (iteration in 1:limit) {
cache_set(n,"seen")
n <- aStep(n)
}
}
}
cat("Lychrel numbers in the range [1, ",max_search,"]\n", sep = "")
cat("Maximum iterations =",limit,"\n")
cat("Number of Lychrel seeds:",length(lychrel),"\n")
cat("Lychrel numbers:",lychrel,"\n")
cat("Number of related Lychrel numbers found:",related,"\n")
cat("Number of palindromic Lychrel numbers:",length(palindrome_lychrel),"\n")
cat("Palindromic Lychrel numbers:",palindrome_lychrel,"\n")
</lang>
{{out}}
<pre>
Lychrel numbers in the range [1, 10000]
Maximum iterations = 500
Number of Lychrel seeds: 5
Lychrel numbers: 196 879 1997 7059 9999
Number of related Lychrel numbers found: 244
Number of palindromic Lychrel numbers: 3
Palindromic Lychrel numbers: 4994 8778 9999
</pre>
=={{header|Tcl}}==
=={{header|Tcl}}==