2012 LP Programming Contest


lace.pi

 
main => test.

test => lace(5).

lace(N) =>
    grid_size(N,S),
    Grid = new_array(S,S),
    R0 is S // 2 + 1, C0 is R0,
    foreach(I in 1..N) draw(I,Grid,R0,C0) end,
    foreach(R in 1..S)
        foreach(C in 1..S)
	    G = Grid[C,R], 
            (var(G) -> print(' '); print('*'))
	end,
        nl
    end.
    
draw(I,Grid,R0,C0),
    I mod 2=:=0
=>
    grid_size(I,S), 
    foreach(Offset in 0..S//2)
        Grid[R0-Offset,C0-S//2+Offset] = '*',
        Grid[R0-Offset,C0+S//2-Offset] = '*',
	Grid[R0+Offset,C0-S//2+Offset] = '*',
	Grid[R0+Offset,C0+S//2-Offset] = '*'
    end.
draw(I,Grid,R0,C0) =>
    grid_size(I,S), 
    foreach(C in C0-S//2..C0+S//2)
        Grid[R0-S//2,C] = '*',
        Grid[R0+S//2,C] = '*'
    end,	    
    foreach(R in R0-S//2..R0+S//2)
        Grid[R,C0-S//2] = '*',
        Grid[R,C0+S//2] = '*'
    end.
	
table (+,-)
grid_size(1,S) => S=3.
grid_size(N,S),
    0 is N mod 2
=>
    N1 is N-1,
    grid_size(N1,S1),
    S is S1 + S1 // 2 * 2.
grid_size(N,S) =>
    N1 is N - 1,
    grid_size(N1,S).

cube.pi

 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rubik's Cube (cube.pi)
% by Nuno Lopes
% Example queries
%   cube([front],  4).
%   cube([left,left], 2).
%   cube([left,front], 15).
%   cube([up,left,down,front], 45).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
main => test.

test => cube([up,left,down,front], M), writeln(M).

cube(L, M) =>
    S = $cube([1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16], [17,18,19,20], [21,22,23,24]),
    apply(S, S, L, 0, M).


apply(S, F, L, I, M) =>
    apply_moves(L, S, S1),
    I1 is I + 1,
    (S1 == F -> 
	M = I1
    ;
        apply(S1, F, L, I1, M)
    ).

apply_moves([], S, SF) => SF=S.
apply_moves([M|Ms], S, SF) =>
    apply_moves(Ms, move(M, S), SF).

% cube representation: cube(FRONT, BACK, UP, DOWN, LEFT, RIGHT)
move(front,
    cube([F1,F2,F3,F4], B, [U1,U2,U3,U4], [D1,D2,D3,D4], [L1,L2,L3,L4], [R1,R2,R3,R4])) =
    $cube([F4,F1,F2,F3], B, [U1,U2,L2,L3], [R4,R1,D3,D4], [L1,D1,D2,L4], [U4,R2,R3,U3]).
move(back,
    cube(F, [B1,B2,B3,B4], [U1,U2,U3,U4], [D1,D2,D3,D4], [L1,L2,L3,L4], [R1,R2,R3,R4])) =
    $cube(F, [B4,B1,B2,B3], [R2,R3,U3,U4], [D1,D2,L4,L1], [U2,L2,L3,U1], [R1,D3,D4,R4]).
move(up,
    cube([F1,F2,F3,F4], [B1,B2,B3,B4], [U1,U2,U3,U4], D, [L1,L2,L3,L4], [R1,R2,R3,R4])) =
    $cube([R1,R2,F3,F4], [B1,B2,L1,L2], [U4,U1,U2,U3], D, [F1,F2,L3,L4], [B3,B4,R3,R4]).
move(down,
    cube([F1,F2,F3,F4], [B1,B2,B3,B4], U, [D1,D2,D3,D4], [L1,L2,L3,L4], [R1,R2,R3,R4])) =
    $cube([F1,F2,L3,L4], [R3,R4,B3,B4], U, [D4,D1,D2,D3], [L1,L2,B1,B2], [R1,R2,F3,F4]).
move(left,
    cube([F1,F2,F3,F4], [B1,B2,B3,B4], [U1,U2,U3,U4], [D1,D2,D3,D4], [L1,L2,L3,L4], R)) =
    $cube([U1,F2,F3,U4], [D1,B2,B3,D4], [B1,U2,U3,B4], [F1,D2,D3,F4], [L4,L1,L2,L3], R).
move(right,
    cube([F1,F2,F3,F4], [B1,B2,B3,B4], [U1,U2,U3,U4], [D1,D2,D3,D4], L, [R1,R2,R3,R4])) =
    $cube([F1,D2,D3,F4], [B1,U2,U3,B4], [U1,F2,F3,U4], [D1,B2,B3,D4], L, [R4,R1,R2,R3]).

omelet.pi

 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Example queries:
% ?- omelet(1,1,D)
%    D = 1
% ?- omelet(2,1,D)
%    D=1
% ?- omelet(2,7,D)
%    D=4
% ?- omelet(3,7,D)
%    D=3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

main => test.

test => omelet(3,7,D), writeln(D).

table  (+,+,min)
omelet(_,0,NTries) => NTries=0.
omelet(_,1,NTries) => NTries=1.
omelet(1,H,NTries) => NTries=H.
omelet(N,H,NTries) =>
    between(1,H,L),            % make a choice
    omelet(N-1,L-1,NTries1),   % the egg breaks
    omelet(N,H-L,NTries2),     % the egg survives
    NTries is max(NTries1,NTries2)+1.

cop.pi

 
main => test.

test => cop($[q(start,d,gotcha,start)],$[q(start,d,gotcha,q2),q(q2,d,gotcha,start)]).

cop(Graph1,Graph2) =>
    p(Graph1,start,gotcha,t,Path1,_),
    p(Graph2,start,gotcha,t,Path2,_),
    Path1=Path2.

table (+,+,+,+,-,min)
p(_,X,X,_,Path,Len) => Path=[],Len=0.
p(Graph,X,Y,Pid,Path,Len) =>
    (member($q(X,Id,Z,_),Graph); member($q(X,Id,_,Z),Graph)),
    p(Graph,Z,Y,Id,Path1,Len1),
    (Id==Pid->Path=Path1,Len=Len1; Path=[Id|Path1],Len is Len1+1).