Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
21
Task/Hamming-numbers/Prolog/hamming-numbers-1.pro
Normal file
21
Task/Hamming-numbers/Prolog/hamming-numbers-1.pro
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
%% collect N elements produced by a generator in a row
|
||||
|
||||
take( 0, Next, Z-Z, Next).
|
||||
take( N, Next, [A|B]-Z, NZ):- N>0, !, next(Next,A,Next1),
|
||||
N1 is N-1,
|
||||
take(N1,Next1,B-Z,NZ).
|
||||
|
||||
%% a generator provides specific {next} implementation
|
||||
|
||||
next( hamm( A2,B,C3,D,E5,F,[H|G] ), H, hamm(X,U,Y,V,Z,W,G) ):-
|
||||
H is min(A2, min(C3,E5)),
|
||||
( A2 =:= H -> B=[N2|U],X is N2*2 ; (X,U)=(A2,B) ),
|
||||
( C3 =:= H -> D=[N3|V],Y is N3*3 ; (Y,V)=(C3,D) ),
|
||||
( E5 =:= H -> F=[N5|W],Z is N5*5 ; (Z,W)=(E5,F) ).
|
||||
|
||||
mkHamm( hamm(1,X,1,X,1,X,X) ). % Hamming numbers generator init state
|
||||
|
||||
main(N) :-
|
||||
mkHamm(G),take(20,G,A-[],_), write(A), nl,
|
||||
take(1691-1,G,_,G2),take(2,G2,B-[],_), write(B), nl,
|
||||
take( N -1,G,_,G3),take(2,G3,[C1|_]-_,_), write(C1), nl.
|
||||
74
Task/Hamming-numbers/Prolog/hamming-numbers-2.pro
Normal file
74
Task/Hamming-numbers/Prolog/hamming-numbers-2.pro
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
hamming(N) :-
|
||||
% to stop cleanly
|
||||
nb_setval(go, 1),
|
||||
|
||||
% display list
|
||||
( N = 20 -> watch_20(20, L); watch(1,N,L)),
|
||||
|
||||
% go
|
||||
L=[1|L235],
|
||||
multlist(L,2,L2),
|
||||
multlist(L,3,L3),
|
||||
multlist(L,5,L5),
|
||||
merge_(L2,L3,L23),
|
||||
merge_(L5,L23,L235).
|
||||
|
||||
|
||||
%% multlist(L,N,LN)
|
||||
%% multiply each element of list L with N, resulting in list LN
|
||||
%% here only do multiplication for 1st element, then use multlist recursively
|
||||
multlist([X|L],N,XLN) :-
|
||||
% the trick to stop
|
||||
nb_getval(go, 1) ->
|
||||
|
||||
% laziness flavor
|
||||
when(ground(X),
|
||||
( XN is X*N,
|
||||
XLN=[XN|LN],
|
||||
multlist(L,N,LN)));
|
||||
|
||||
true.
|
||||
|
||||
merge_([X|In1],[Y|In2],XYOut) :-
|
||||
% the trick to stop
|
||||
nb_getval(go, 1) ->
|
||||
|
||||
% laziness flavor
|
||||
( X < Y -> XYOut = [X|Out], In11 = In1, In12 = [Y|In2]
|
||||
; X = Y -> XYOut = [X|Out], In11 = In1, In12 = In2
|
||||
; XYOut = [Y|Out], In11 = [X | In1], In12 = In2),
|
||||
freeze(In11,freeze(In12, merge_(In11,In12,Out)));
|
||||
|
||||
true.
|
||||
|
||||
%% display nth element
|
||||
watch(Max, Max, [X|_]) :-
|
||||
% laziness flavor
|
||||
when(ground(X),
|
||||
(format('~w~n', [X]),
|
||||
|
||||
% the trick to stop
|
||||
nb_linkval(go, 0))).
|
||||
|
||||
|
||||
watch(N, Max, [_X|L]):-
|
||||
N1 is N + 1,
|
||||
watch(N1, Max, L).
|
||||
|
||||
|
||||
%% display nth element
|
||||
watch_20(1, [X|_]) :-
|
||||
% laziness flavor
|
||||
when(ground(X),
|
||||
(format('~w~n', [X]),
|
||||
|
||||
% the trick to stop
|
||||
nb_linkval(go, 0))).
|
||||
|
||||
|
||||
watch_20(N, [X|L]):-
|
||||
% laziness flavor
|
||||
when(ground(X),
|
||||
(format('~w ', [X]),
|
||||
N1 is N - 1,
|
||||
watch_20(N1, L))).
|
||||
Loading…
Add table
Add a link
Reference in a new issue