:- use_module(contestlib, [for/3]). remote(Channels,Zaps) :- once(gen_shortest(Channels,Zaps)). gen_shortest(Channels,Zaps) :- LastZapped = none, length(Zaps,_), gen_allowed_zapping(Zaps,LastZapped), check_zaps(Zaps,Channels,[X,X,X,X]). gen_allowed_zapping([],_). gen_allowed_zapping([Zap|Zaps],LastZapped) :- for(Zap,1,5), Zap \== LastZapped, gen_allowed_zapping(Zaps,Zap). check_zaps([],Channels,Channels). check_zaps([Zap|Zaps],ChannelsIn,ChannelsOut) :- zap(Zap,ChannelsIn,Channels1), check_zaps(Zaps,Channels1,ChannelsOut). zap(1,[A,B,C,D],[A1,B,C,D]) :- zap(A,A1). zap(2,[A,B,C,D],[A,B1,C,D]) :- zap(B,B1). zap(3,[A,B,C,D],[A,B,C1,D]) :- zap(C,C1). zap(4,[A,B,C,D],[A,B,C,D1]) :- zap(D,D1). zap(X,Y) :- Y is (X mod 5) + 1.