-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstrange_numbers_in_base_n.sf
41 lines (31 loc) · 1.55 KB
/
strange_numbers_in_base_n.sf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/ruby
# Daniel "Trizen" Șuteu
# Date: 05 July 2021
# https://github.com/trizen
# Generate "strange numbers": numbers such that the absolute difference of any two adjacent digits (in a given base) is prime.
# See also:
# https://oeis.org/A219248
# https://rosettacode.org/wiki/Strange_numbers
func generate_from_prefix(limit, p, base, digits) {
var seq = [p]
digits.each {|d|
for k in ([1, -1]) {
var r = (p%base)+(k*d)
next if (r < 0)
next if (r >= base)
var num = (p*base + r)
if (num <= limit) {
seq << __FUNC__(limit, num, base, digits)...
}
}
}
return seq
}
func strange_numbers(limit, base = 10, digits = @(^base)) {
var prime_digits = @(^base).grep { .is_prime }
digits.map {|p| generate_from_prefix(limit, p, base, prime_digits)... }\
.sort.uniq
}
say strange_numbers(500)
__END__
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 16, 18, 20, 24, 25, 27, 29, 30, 31, 35, 36, 38, 41, 42, 46, 47, 49, 50, 52, 53, 57, 58, 61, 63, 64, 68, 69, 70, 72, 74, 75, 79, 81, 83, 85, 86, 92, 94, 96, 97, 130, 131, 135, 136, 138, 141, 142, 146, 147, 149, 161, 163, 164, 168, 169, 181, 183, 185, 186, 202, 203, 205, 207, 241, 242, 246, 247, 249, 250, 252, 253, 257, 258, 270, 272, 274, 275, 279, 292, 294, 296, 297, 302, 303, 305, 307, 313, 314, 316, 318, 350, 352, 353, 357, 358, 361, 363, 364, 368, 369, 381, 383, 385, 386, 413, 414, 416, 418, 420, 424, 425, 427, 429, 461, 463, 464, 468, 469, 470, 472, 474, 475, 479, 492, 494, 496, 497]