stable_neib_sat
% 2017 Round 1B, Problem A, in Picat, by Afa Zhou
% https://code.google.com/codejam/contest/8294486/dashboard#s=p1
% Stable Neigh-bors
import util, sat.
main =>
T = read_line().to_int(),
foreach (TC in 1..T)
[N,R,O,Y,G,B,V] = [to_int(Token) : Token in read_line().split()],
once catch(dc(TC,N,R,O,Y,G,B,V),_, printf(stderr,"Case #%w: IMPOSSIBLE\n", TC))
end.
dc(TC,N,R,O,Y,G,B,V) ?=>
Vr = new_list(N), Vr :: 0..1,
Vb = new_list(N), Vb :: 0..1,
Vy = new_list(N), Vy :: 0..1,
foreach (I in 1..N)
Vr[I]+Vb[I]+Vy[I] #=< 2,
Vr[I]+Vb[I]+Vy[I] #> 0
end,
sum([Vr[I] : I in 1..N]) #= R+O+V,
sum([Vb[I] : I in 1..N]) #= B+G+V,
sum([Vy[I] : I in 1..N]) #= Y+O+G,
sum([Vr[I] #/\ Vy[I] : I in 1..N]) #= O,
sum([Vr[I] #/\ Vb[I] : I in 1..N]) #= V,
sum([Vy[I] #/\ Vb[I] : I in 1..N]) #= G,
foreach (I in 1..N-1)
Vr[I]+Vr[I+1] #=< 1,
Vb[I]+Vb[I+1] #=< 1,
Vy[I]+Vy[I+1] #=< 1
end,
Vr[1]+Vr[N] #=< 1,
Vb[1]+Vb[N] #=< 1,
Vy[1]+Vy[N] #=< 1,
once solve({Vr,Vb,Vy}),
printf(stderr,"Case #%w: ", TC),
foreach (I in 1..N)
print_a(Vr[I],Vb[I],Vy[I])
end,
nl(stderr).
dc(TC,N,R,O,Y,G,B,V) ?=>
printf(stderr,"Case #%w: IMPOSSIBLE\n", TC).
print_a(1,_,1) => print(stderr,'O').
print_a(1,1,_) => print(stderr,'V').
print_a(_,1,1) => print(stderr,'G').
print_a(1,_,_) => print(stderr,'R').
print_a(_,1,_) => print(stderr,'B').
print_a(_,_,1) => print(stderr,'Y').