Esthetic numbers: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Raku}}: missing curly brace)
Line 35: Line 35:





=={{header|Phix}}==
<lang Phix>constant aleph = "0123456789ABCDEF"
include builtins\ordinal.e

function efill(string s, integer ch, i)
s[i] = ch
for j=i+1 to length(s) do
ch = iff(ch>='1'?iff(ch='A'?'9':ch-1):'1')
s[j] = ch
end for
return s
end function

function esthetic(string s, integer base = 10)
for i=length(s) to 1 by -1 do
integer ch = s[i], cp = iff(i>1?s[i-1]:'Z')
if i>1 and ch<cp and cp<aleph[base] then
ch = iff(ch='8'?'A':iff(ch='9'?'B':ch+2))
return efill(s,ch,i)
elsif i=1 and ch<aleph[base] then
ch = iff(ch='9'?'A':ch+1)
return efill(s,ch,i)
end if
end for
s = "1"&s
return efill(s,'1',1)
end function

string s
sequence res
for base=2 to 16 do
s = ""
res = {}
for i=1 to base*6 do
s = esthetic(s, base)
if i>=base*4 then
res = append(res,s)
end if
end for
printf(1,"%d%s through %d%s esthetic numbers in base %d\n%s\n",
{base*4,ord(base*4),base*6,ord(base*6),base,join_by(res,1,16)})
end for

s = efill("1000",'1',1)
res = {}
while length(s)=4 do
res = append(res,s)
s = esthetic(s)
end while
printf(1,"Base 10 esthetic numbers between 1,000 and 9,999:\n%s\n",
{join_by(res,1,20)})

s = efill("100000000",'1',1)
res = {}
while s<"130000000" do
res = append(res,s)
s = esthetic(s)
end while
printf(1,"Base 10 esthetic numbers between 100,000,000 and 130,000,000:\n%s\n",
{join_by(res,1,9)})</lang>
{{out}}
<pre>
8th through 12th esthetic numbers in base 2
10101010 101010101 1010101010 10101010101 101010101010

12th through 18th esthetic numbers in base 3
1210 1212 2101 2121 10101 10121 12101

16th through 24th esthetic numbers in base 4
323 1010 1012 1210 1212 1232 2101 2121 2123

20th through 30th esthetic numbers in base 5
323 343 432 434 1010 1012 1210 1212 1232 1234 2101

24th through 36th esthetic numbers in base 6
343 345 432 434 454 543 545 1010 1012 1210 1212 1232 1234

28th through 42nd esthetic numbers in base 7
345 432 434 454 456 543 545 565 654 656 1010 1012 1210 1212 1232

32nd through 48th esthetic numbers in base 8
432 434 454 456 543 545 565 567 654 656 676 765 767 1010 1012 1210
1212

36th through 54th esthetic numbers in base 9
434 454 456 543 545 565 567 654 656 676 678 765 767 787 876 878
1010 1012 1210

40th through 60th esthetic numbers in base 10
454 456 543 545 565 567 654 656 676 678 765 767 787 789 876 878
898 987 989 1010 1012

44th through 66th esthetic numbers in base 11
456 543 545 565 567 654 656 676 678 765 767 787 789 876 878 898
89A 987 989 9A9 A98 A9A 1010

48th through 72nd esthetic numbers in base 12
543 545 565 567 654 656 676 678 765 767 787 789 876 878 898 89A
987 989 9A9 9AB A98 A9A ABA BA9 BAB

52nd through 78th esthetic numbers in base 13
545 565 567 654 656 676 678 765 767 787 789 876 878 898 89A 987
989 9A9 9AB A98 A9A ABA ABC BA9 BAB BCB CBA

56th through 84th esthetic numbers in base 14
565 567 654 656 676 678 765 767 787 789 876 878 898 89A 987 989
9A9 9AB A98 A9A ABA ABC BA9 BAB BCB BCD CBA CBC CDC

60th through 90th esthetic numbers in base 15
567 654 656 676 678 765 767 787 789 876 878 898 89A 987 989 9A9
9AB A98 A9A ABA ABC BA9 BAB BCB BCD CBA CBC CDC CDE DCB DCD

64th through 96th esthetic numbers in base 16
654 656 676 678 765 767 787 789 876 878 898 89A 987 989 9A9 9AB
A98 A9A ABA ABC BA9 BAB BCB BCD CBA CBC CDC CDE DCB DCD DED DEF
EDC

Base 10 esthetic numbers between 1,000 and 9,999:
1010 1012 1210 1212 1232 1234 2101 2121 2123 2321 2323 2343 2345 3210 3212 3232 3234 3432 3434 3454
3456 4321 4323 4343 4345 4543 4545 4565 4567 5432 5434 5454 5456 5654 5656 5676 5678 6543 6545 6565
6567 6765 6767 6787 6789 7654 7656 7676 7678 7876 7878 7898 8765 8767 8787 8789 8987 8989 9876 9878
9898

Base 10 esthetic numbers between 100,000,000 and 130,000,000:
101010101 101010121 101010123 101012101 101012121 101012123 101012321 101012323 101012343
101012345 101210101 101210121 101210123 101212101 101212121 101212123 101212321 101212323
101212343 101212345 101232101 101232121 101232123 101232321 101232323 101232343 101232345
101234321 101234323 101234343 101234345 101234543 101234545 101234565 101234567 121010101
121010121 121010123 121012101 121012121 121012123 121012321 121012323 121012343 121012345
121210101 121210121 121210123 121212101 121212121 121212123 121212321 121212323 121212343
121212345 121232101 121232121 121232123 121232321 121232323 121232343 121232345 121234321
121234323 121234343 121234345 121234543 121234545 121234565 121234567 123210101 123210121
123210123 123212101 123212121 123212123 123212321 123212323 123212343 123212345 123232101
123232121 123232123 123232321 123232323 123232343 123232345 123234321 123234323 123234343
123234345 123234543 123234545 123234565 123234567 123432101 123432121 123432123 123432321
123432323 123432343 123432345 123434321 123434323 123434343 123434345 123434543 123434545
123434565 123434567 123454321 123454323 123454343 123454345 123454543 123454545 123454565
123454567 123456543 123456545 123456565 123456567 123456765 123456767 123456787 123456789
</pre>


=={{header|Raku}}==
=={{header|Raku}}==

Revision as of 02:25, 18 March 2020

Esthetic numbers is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

An esthetic number is a positive integer where every adjacent digit differs from it neighbour by 1.


E.G.
  • 12 is an esthetic number. One and two differ by 1.
  • 5654 is an esthetic number. Each digit is exactly 1 away from its neighbour.
  • 890 is not an esthetic number. Nine and zero differ by 9.


These examples are nominally in base 10 but the concept extends easily to numbers in other bases. Traditionally, single digit numbers are included in esthetic numbers; zero may or may not be. For our purposes, for this task, do not include zero (0) as an esthetic number. Do not include numbers with leading zeros.

Esthetic numbers are also sometimes referred to as stepping numbers.


Task
  • Write a routine (function, procedure, whatever) to find esthetic numbers in a given base.
  • Use that routine to find esthetic numbers in bases 2 through 16 and display, here on this page, the esthectic numbers from index (base × 4) through index (base × 6), inclusive. (E.G. for base 2: 8th through 12th, for base 6: 24th through 36th, etc.)
  • Find and display, here on this page, the base 10 esthetic numbers with a magnitude between 1000 and 9999.
  • Stretch: Find and display, here on this page, the base 10 esthetic numbers with a magnitude between 1.0e8 and 1.3e8.


See also


Phix

<lang Phix>constant aleph = "0123456789ABCDEF" include builtins\ordinal.e

function efill(string s, integer ch, i)

   s[i] = ch
   for j=i+1 to length(s) do
       ch = iff(ch>='1'?iff(ch='A'?'9':ch-1):'1')
       s[j] = ch
   end for
   return s

end function

function esthetic(string s, integer base = 10)

   for i=length(s) to 1 by -1 do
       integer ch = s[i], cp = iff(i>1?s[i-1]:'Z')
       if i>1 and ch<cp and cp<aleph[base] then
           ch = iff(ch='8'?'A':iff(ch='9'?'B':ch+2))
           return efill(s,ch,i)
       elsif i=1 and ch<aleph[base] then
           ch = iff(ch='9'?'A':ch+1)
           return efill(s,ch,i)
       end if
   end for
   s = "1"&s
   return efill(s,'1',1)

end function

string s sequence res for base=2 to 16 do

   s = ""
   res = {}
   for i=1 to base*6 do
       s = esthetic(s, base)
       if i>=base*4 then
           res = append(res,s)
       end if
   end for
   printf(1,"%d%s through %d%s esthetic numbers in base %d\n%s\n",
            {base*4,ord(base*4),base*6,ord(base*6),base,join_by(res,1,16)})

end for

s = efill("1000",'1',1) res = {} while length(s)=4 do

   res = append(res,s)
   s = esthetic(s)

end while printf(1,"Base 10 esthetic numbers between 1,000 and 9,999:\n%s\n",

        {join_by(res,1,20)})

s = efill("100000000",'1',1) res = {} while s<"130000000" do

   res = append(res,s)
   s = esthetic(s)

end while printf(1,"Base 10 esthetic numbers between 100,000,000 and 130,000,000:\n%s\n",

        {join_by(res,1,9)})</lang>
Output:
8th through 12th esthetic numbers in base 2
10101010   101010101   1010101010   10101010101   101010101010

12th through 18th esthetic numbers in base 3
1210   1212   2101   2121   10101   10121   12101

16th through 24th esthetic numbers in base 4
323   1010   1012   1210   1212   1232   2101   2121   2123

20th through 30th esthetic numbers in base 5
323   343   432   434   1010   1012   1210   1212   1232   1234   2101

24th through 36th esthetic numbers in base 6
343   345   432   434   454   543   545   1010   1012   1210   1212   1232   1234

28th through 42nd esthetic numbers in base 7
345   432   434   454   456   543   545   565   654   656   1010   1012   1210   1212   1232

32nd through 48th esthetic numbers in base 8
432   434   454   456   543   545   565   567   654   656   676   765   767   1010   1012   1210
1212

36th through 54th esthetic numbers in base 9
434   454   456   543   545   565   567   654   656   676   678   765   767   787   876   878
1010   1012   1210

40th through 60th esthetic numbers in base 10
454   456   543   545   565   567   654   656   676   678   765   767   787   789   876   878
898   987   989   1010   1012

44th through 66th esthetic numbers in base 11
456   543   545   565   567   654   656   676   678   765   767   787   789   876   878   898
89A   987   989   9A9   A98   A9A   1010

48th through 72nd esthetic numbers in base 12
543   545   565   567   654   656   676   678   765   767   787   789   876   878   898   89A
987   989   9A9   9AB   A98   A9A   ABA   BA9   BAB

52nd through 78th esthetic numbers in base 13
545   565   567   654   656   676   678   765   767   787   789   876   878   898   89A   987
989   9A9   9AB   A98   A9A   ABA   ABC   BA9   BAB   BCB   CBA

56th through 84th esthetic numbers in base 14
565   567   654   656   676   678   765   767   787   789   876   878   898   89A   987   989
9A9   9AB   A98   A9A   ABA   ABC   BA9   BAB   BCB   BCD   CBA   CBC   CDC

60th through 90th esthetic numbers in base 15
567   654   656   676   678   765   767   787   789   876   878   898   89A   987   989   9A9
9AB   A98   A9A   ABA   ABC   BA9   BAB   BCB   BCD   CBA   CBC   CDC   CDE   DCB   DCD

64th through 96th esthetic numbers in base 16
654   656   676   678   765   767   787   789   876   878   898   89A   987   989   9A9   9AB
A98   A9A   ABA   ABC   BA9   BAB   BCB   BCD   CBA   CBC   CDC   CDE   DCB   DCD   DED   DEF
EDC

Base 10 esthetic numbers between 1,000 and 9,999:
1010   1012   1210   1212   1232   1234   2101   2121   2123   2321   2323   2343   2345   3210   3212   3232   3234   3432   3434   3454
3456   4321   4323   4343   4345   4543   4545   4565   4567   5432   5434   5454   5456   5654   5656   5676   5678   6543   6545   6565
6567   6765   6767   6787   6789   7654   7656   7676   7678   7876   7878   7898   8765   8767   8787   8789   8987   8989   9876   9878
9898

Base 10 esthetic numbers between 100,000,000 and 130,000,000:
101010101   101010121   101010123   101012101   101012121   101012123   101012321   101012323   101012343
101012345   101210101   101210121   101210123   101212101   101212121   101212123   101212321   101212323
101212343   101212345   101232101   101232121   101232123   101232321   101232323   101232343   101232345
101234321   101234323   101234343   101234345   101234543   101234545   101234565   101234567   121010101
121010121   121010123   121012101   121012121   121012123   121012321   121012323   121012343   121012345
121210101   121210121   121210123   121212101   121212121   121212123   121212321   121212323   121212343
121212345   121232101   121232121   121232123   121232321   121232323   121232343   121232345   121234321
121234323   121234343   121234345   121234543   121234545   121234565   121234567   123210101   123210121
123210123   123212101   123212121   123212123   123212321   123212323   123212343   123212345   123232101
123232121   123232123   123232321   123232323   123232343   123232345   123234321   123234323   123234343
123234345   123234543   123234545   123234565   123234567   123432101   123432121   123432123   123432321
123432323   123432343   123432345   123434321   123434323   123434343   123434345   123434543   123434545
123434565   123434567   123454321   123454323   123454343   123454345   123454543   123454545   123454565
123454567   123456543   123456545   123456565   123456567   123456765   123456767   123456787   123456789

Raku

Works with: Rakudo version 2020.02

<lang perl6>use Lingua::EN::Numbers;

sub esthetic($base = 10) {

   my @s = ^$base .map: -> \s {
       ((s - 1).base($base) if s > 0), ((s + 1).base($base) if s < $base - 1)
   }
   flat [ (1 .. $base - 1)».base($base) ],
   { [ flat .map: { $_ xx * Z~ flat @s[.comb.tail.parse-base($base)] } ] } … *

}

for 2 .. 16 -> $b {

   put "\n{(4 × $b).&ordinal-digit} through {(6 × $b).&ordinal-digit} esthetic numbers in base $b";
   put esthetic($b)[(4 × $b - 1) .. (6 × $b - 1)]».fmt('%3s').batch(16).join: "\n"

}

my @e10 = esthetic; put "\nBase 10 esthetic numbers between 1,000 and 9,999:"; put @e10.&between(1000, 9999).batch(20).join: "\n";

put "\nBase 10 esthetic numbers between {1e8.Int.&comma} and {1.3e8.Int.&comma}:"; put @e10.&between(1e8.Int, 1.3e8.Int).batch(9).join: "\n";

sub between (@array, Int $lo, Int $hi) {

   my $top = @array.first: * > $hi, :k;
   @array[^$top].grep: * > $lo

}</lang>

Output:
8th through 12th esthetic numbers in base 2
10101010 101010101 1010101010 10101010101 101010101010

12th through 18th esthetic numbers in base 3
1210 1212 2101 2121 10101 10121 12101

16th through 24th esthetic numbers in base 4
323 1010 1012 1210 1212 1232 2101 2121 2123

20th through 30th esthetic numbers in base 5
323 343 432 434 1010 1012 1210 1212 1232 1234 2101

24th through 36th esthetic numbers in base 6
343 345 432 434 454 543 545 1010 1012 1210 1212 1232 1234

28th through 42nd esthetic numbers in base 7
345 432 434 454 456 543 545 565 654 656 1010 1012 1210 1212 1232

32nd through 48th esthetic numbers in base 8
432 434 454 456 543 545 565 567 654 656 676 765 767 1010 1012 1210
1212

36th through 54th esthetic numbers in base 9
434 454 456 543 545 565 567 654 656 676 678 765 767 787 876 878
1010 1012 1210

40th through 60th esthetic numbers in base 10
454 456 543 545 565 567 654 656 676 678 765 767 787 789 876 878
898 987 989 1010 1012

44th through 66th esthetic numbers in base 11
456 543 545 565 567 654 656 676 678 765 767 787 789 876 878 898
89A 987 989 9A9 A98 A9A 1010

48th through 72nd esthetic numbers in base 12
543 545 565 567 654 656 676 678 765 767 787 789 876 878 898 89A
987 989 9A9 9AB A98 A9A ABA BA9 BAB

52nd through 78th esthetic numbers in base 13
545 565 567 654 656 676 678 765 767 787 789 876 878 898 89A 987
989 9A9 9AB A98 A9A ABA ABC BA9 BAB BCB CBA

56th through 84th esthetic numbers in base 14
565 567 654 656 676 678 765 767 787 789 876 878 898 89A 987 989
9A9 9AB A98 A9A ABA ABC BA9 BAB BCB BCD CBA CBC CDC

60th through 90th esthetic numbers in base 15
567 654 656 676 678 765 767 787 789 876 878 898 89A 987 989 9A9
9AB A98 A9A ABA ABC BA9 BAB BCB BCD CBA CBC CDC CDE DCB DCD

64th through 96th esthetic numbers in base 16
654 656 676 678 765 767 787 789 876 878 898 89A 987 989 9A9 9AB
A98 A9A ABA ABC BA9 BAB BCB BCD CBA CBC CDC CDE DCB DCD DED DEF
EDC

Base 10 esthetic numbers between 1,000 and 9,999:
1010 1012 1210 1212 1232 1234 2101 2121 2123 2321 2323 2343 2345 3210 3212 3232 3234 3432 3434 3454
3456 4321 4323 4343 4345 4543 4545 4565 4567 5432 5434 5454 5456 5654 5656 5676 5678 6543 6545 6565
6567 6765 6767 6787 6789 7654 7656 7676 7678 7876 7878 7898 8765 8767 8787 8789 8987 8989 9876 9878
9898

Base 10 esthetic numbers between 100,000,000 and 130,000,000:
101010101 101010121 101010123 101012101 101012121 101012123 101012321 101012323 101012343
101012345 101210101 101210121 101210123 101212101 101212121 101212123 101212321 101212323
101212343 101212345 101232101 101232121 101232123 101232321 101232323 101232343 101232345
101234321 101234323 101234343 101234345 101234543 101234545 101234565 101234567 121010101
121010121 121010123 121012101 121012121 121012123 121012321 121012323 121012343 121012345
121210101 121210121 121210123 121212101 121212121 121212123 121212321 121212323 121212343
121212345 121232101 121232121 121232123 121232321 121232323 121232343 121232345 121234321
121234323 121234343 121234345 121234543 121234545 121234565 121234567 123210101 123210121
123210123 123212101 123212121 123212123 123212321 123212323 123212343 123212345 123232101
123232121 123232123 123232321 123232323 123232343 123232345 123234321 123234323 123234343
123234345 123234543 123234545 123234565 123234567 123432101 123432121 123432123 123432321
123432323 123432343 123432345 123434321 123434323 123434343 123434345 123434543 123434545
123434565 123434567 123454321 123454323 123454343 123454345 123454543 123454545 123454565
123454567 123456543 123456545 123456565 123456567 123456765 123456767 123456787 123456789