54 lines
1.7 KiB
Prolog
54 lines
1.7 KiB
Prolog
main:-
|
|
forall(between(2, 16, Base),
|
|
(Min_index is Base * 4, Max_index is Base * 6,
|
|
print_esthetic_numbers1(Base, Min_index, Max_index))),
|
|
print_esthetic_numbers2(1000, 9999, 16),
|
|
nl,
|
|
print_esthetic_numbers2(100000000, 130000000, 8).
|
|
|
|
print_esthetic_numbers1(Base, Min_index, Max_index):-
|
|
swritef(Format, '~%tr ', [Base]),
|
|
writef('Esthetic numbers in base %t from index %t through index %t:\n',
|
|
[Base, Min_index, Max_index]),
|
|
print_esthetic_numbers1(Base, Format, Min_index, Max_index, 0, 1).
|
|
|
|
print_esthetic_numbers1(Base, Format, Min_index, Max_index, M, I):-
|
|
I =< Max_index,
|
|
!,
|
|
next_esthetic_number(Base, M, N),
|
|
(I >= Min_index -> format(Format, [N]) ; true),
|
|
J is I + 1,
|
|
print_esthetic_numbers1(Base, Format, Min_index, Max_index, N, J).
|
|
print_esthetic_numbers1(_, _, _, _, _, _):-
|
|
write('\n\n').
|
|
|
|
print_esthetic_numbers2(Min, Max, Per_line):-
|
|
writef('Esthetic numbers in base 10 between %t and %t:\n', [Min, Max]),
|
|
M is Min - 1,
|
|
print_esthetic_numbers2(Max, Per_line, M, 0).
|
|
|
|
print_esthetic_numbers2(Max, Per_line, M, Count):-
|
|
next_esthetic_number(10, M, N),
|
|
N =< Max,
|
|
!,
|
|
write(N),
|
|
Count1 is Count + 1,
|
|
(0 is Count1 mod Per_line -> nl ; write(' ')),
|
|
print_esthetic_numbers2(Max, Per_line, N, Count1).
|
|
print_esthetic_numbers2(_, _, _, Count):-
|
|
writef('\nCount: %t\n', [Count]).
|
|
|
|
next_esthetic_number(Base, M, N):-
|
|
N is M + 1,
|
|
N < Base,
|
|
!.
|
|
next_esthetic_number(Base, M, N):-
|
|
A is M // Base,
|
|
B is A mod Base,
|
|
(B is M mod Base + 1, B + 1 < Base ->
|
|
N is M + 2
|
|
;
|
|
next_esthetic_number(Base, A, C),
|
|
D is C mod Base,
|
|
(D == 0 -> E = 1 ; E is D - 1),
|
|
N is C * Base + E).
|