Lychrel numbers: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (→{{header|Perl 6}}: memoize) |
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
||
Line 2,079: | Line 2,079: | ||
</pre> |
</pre> |
||
=={{ |
=={{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}}== |
||
<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}}== |
||
<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}}== |
||
<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|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|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}}== |
||