/* ABC words in Picat. https://twitter.com/madeofmistak3/status/1564362258557603840 """ you are the world's expert at creating 7 letter "words" using only the letters "a", "b" and "c". today someone has a special order: exclude words with a immediately followed by b b by c c by a how many different words can you create while following this rule? """ Below are some different approaches. All giving 192 solutions. Here's the result from go2/0: aaaaaaa aaaaaac aaaaacb aaaaacc aaaacba aaaacbb aaaaccb aaaaccc aaacbaa aaacbac aaacbba aaacbbb aaaccba aaaccbb aaacccb aaacccc aacbaaa aacbaac aacbacb aacbacc aacbbaa aacbbac aacbbba aacbbbb aaccbaa aaccbac aaccbba aaccbbb aacccba aacccbb aaccccb aaccccc acbaaaa acbaaac acbaacb acbaacc acbacba acbacbb acbaccb acbaccc acbbaaa acbbaac acbbacb acbbacc acbbbaa acbbbac acbbbba acbbbbb accbaaa accbaac accbacb accbacc accbbaa accbbac accbbba accbbbb acccbaa acccbac acccbba acccbbb accccba accccbb acccccb acccccc baaaaaa baaaaac baaaacb baaaacc baaacba baaacbb baaaccb baaaccc baacbaa baacbac baacbba baacbbb baaccba baaccbb baacccb baacccc bacbaaa bacbaac bacbacb bacbacc bacbbaa bacbbac bacbbba bacbbbb baccbaa baccbac baccbba baccbbb bacccba bacccbb baccccb baccccc bbaaaaa bbaaaac bbaaacb bbaaacc bbaacba bbaacbb bbaaccb bbaaccc bbacbaa bbacbac bbacbba bbacbbb bbaccba bbaccbb bbacccb bbacccc bbbaaaa bbbaaac bbbaacb bbbaacc bbbacba bbbacbb bbbaccb bbbaccc bbbbaaa bbbbaac bbbbacb bbbbacc bbbbbaa bbbbbac bbbbbba bbbbbbb cbaaaaa cbaaaac cbaaacb cbaaacc cbaacba cbaacbb cbaaccb cbaaccc cbacbaa cbacbac cbacbba cbacbbb cbaccba cbaccbb cbacccb cbacccc cbbaaaa cbbaaac cbbaacb cbbaacc cbbacba cbbacbb cbbaccb cbbaccc cbbbaaa cbbbaac cbbbacb cbbbacc cbbbbaa cbbbbac cbbbbba cbbbbbb ccbaaaa ccbaaac ccbaacb ccbaacc ccbacba ccbacbb ccbaccb ccbaccc ccbbaaa ccbbaac ccbbacb ccbbacc ccbbbaa ccbbbac ccbbbba ccbbbbb cccbaaa cccbaac cccbacb cccbacc cccbbaa cccbbac cccbbba cccbbbb ccccbaa ccccbac ccccbba ccccbbb cccccba cccccbb ccccccb ccccccc len = 192 This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import v3_utils. import util. import cp. main => go. % % Constraint modelling % len = 192 go => [A,B,C] = [1,2,3], N = 7, X = new_list(N), X :: 1..3, % a,b,c foreach(I in 1..N-1) X[I] #= A #=> X[I+1] #!= B, X[I] #= B #=> X[I+1] #!= C, X[I] #= C #=> X[I+1] #!= A end, All=solve_all(X), foreach(T in All) println(T.replace(A,a).replace(B,b).replace(C,c)) end, println(len=All.len), nl. % % Constraint modelling, using table_notin/2 % go2 => [A,B,C] = [1,2,3], N = 7, X = new_list(N), X :: [A,B,C], % The bad sequences NotValid = [ {A,B}, {B,C}, {C,A} ], foreach(I in 1..N-1) table_notin({X[I],X[I+1]},NotValid) end, All=solve_all(X), foreach(T in All) println(T.replace(A,a).replace(B,b).replace(C,c)) end, println(len=All.len), nl. % % Plain logic programming, using nextto/3 % % all = [aaaaaaa,aaaaaac,aaaaacb,aaaaacc,aaaacba,aaaacbb,aaaaccb,aaaaccc,aaacbaa,aaacbac,aaacbba,aaacbbb,aaaccba,aaaccbb,aaacccb,aaacccc,aacbaaa,aacbaac,aacbacb,aacbacc,aacbbaa,aacbbac,aacbbba,aacbbbb,aaccbaa,aaccbac,aaccbba,aaccbbb,aacccba,aacccbb,aaccccb,aaccccc,acbaaaa,acbaaac,acbaacb,acbaacc,acbacba,acbacbb,acbaccb,acbaccc,acbbaaa,acbbaac,acbbacb,acbbacc,acbbbaa,acbbbac,acbbbba,acbbbbb,accbaaa,accbaac,accbacb,accbacc,accbbaa,accbbac,accbbba,accbbbb,acccbaa,acccbac,acccbba,acccbbb,accccba,accccbb,acccccb,acccccc,baaaaaa,baaaaac,baaaacb,baaaacc,baaacba,baaacbb,baaaccb,baaaccc,baacbaa,baacbac,baacbba,baacbbb,baaccba,baaccbb,baacccb,baacccc,bacbaaa,bacbaac,bacbacb,bacbacc,bacbbaa,bacbbac,bacbbba,bacbbbb,baccbaa,baccbac,baccbba,baccbbb,bacccba,bacccbb,baccccb,baccccc,bbaaaaa,bbaaaac,bbaaacb,bbaaacc,bbaacba,bbaacbb,bbaaccb,bbaaccc,bbacbaa,bbacbac,bbacbba,bbacbbb,bbaccba,bbaccbb,bbacccb,bbacccc,bbbaaaa,bbbaaac,bbbaacb,bbbaacc,bbbacba,bbbacbb,bbbaccb,bbbaccc,bbbbaaa,bbbbaac,bbbbacb,bbbbacc,bbbbbaa,bbbbbac,bbbbbba,bbbbbbb,cbaaaaa,cbaaaac,cbaaacb,cbaaacc,cbaacba,cbaacbb,cbaaccb,cbaaccc,cbacbaa,cbacbac,cbacbba,cbacbbb,cbaccba,cbaccbb,cbacccb,cbacccc,cbbaaaa,cbbaaac,cbbaacb,cbbaacc,cbbacba,cbbacbb,cbbaccb,cbbaccc,cbbbaaa,cbbbaac,cbbbacb,cbbbacc,cbbbbaa,cbbbbac,cbbbbba,cbbbbbb,ccbaaaa,ccbaaac,ccbaacb,ccbaacc,ccbacba,ccbacbb,ccbaccb,ccbaccc,ccbbaaa,ccbbaac,ccbbacb,ccbbacc,ccbbbaa,ccbbbac,ccbbbba,ccbbbbb,cccbaaa,cccbaac,cccbacb,cccbacc,cccbbaa,cccbbac,cccbbba,cccbbbb,ccccbaa,ccccbac,ccccbba,ccccbbb,cccccba,cccccbb,ccccccb,ccccccc] % len = 192 % go3 :- All = findall(X,p3(X)), println(all=All), println(len=All.len), nl. p3(X) => N = 7, X = new_list(N), foreach(I in 1..N) member(X[I],"abc") end, not nextto('a','b',X), not nextto('b','c',X), not nextto('c','a',X). % % CP different approach % len = 192 go4 => [A,B,C] = [0,1,2], N = 7, X = new_list(N), X :: [A,B,C], foreach(I in 1..N-1) (X[I+1] - X[I] + 1) mod 3 #!= 2 end, All=solve_all(X), foreach(T in All) T := T.replace(A,a).replace(B,b).replace(C,c), println(T) end, println(len=All.len), nl. % % Using DCG as a generator. % % all = [aaaaaaa,aaaaaac,aaaaacb,aaaaacc,aaaacba,aaaacbb,aaaaccb,aaaaccc,aaacbaa,aaacbac,aaacbba,aaacbbb,aaaccba,aaaccbb,aaacccb,aaacccc,aacbaaa,aacbaac,aacbacb,aacbacc,aacbbaa,aacbbac,aacbbba,aacbbbb,aaccbaa,aaccbac,aaccbba,aaccbbb,aacccba,aacccbb,aaccccb,aaccccc,acbaaaa,acbaaac,acbaacb,acbaacc,acbacba,acbacbb,acbaccb,acbaccc,acbbaaa,acbbaac,acbbacb,acbbacc,acbbbaa,acbbbac,acbbbba,acbbbbb,accbaaa,accbaac,accbacb,accbacc,accbbaa,accbbac,accbbba,accbbbb,acccbaa,acccbac,acccbba,acccbbb,accccba,accccbb,acccccb,acccccc,baaaaaa,baaaaac,baaaacb,baaaacc,baaacba,baaacbb,baaaccb,baaaccc,baacbaa,baacbac,baacbba,baacbbb,baaccba,baaccbb,baacccb,baacccc,bacbaaa,bacbaac,bacbacb,bacbacc,bacbbaa,bacbbac,bacbbba,bacbbbb,baccbaa,baccbac,baccbba,baccbbb,bacccba,bacccbb,baccccb,baccccc,bbaaaaa,bbaaaac,bbaaacb,bbaaacc,bbaacba,bbaacbb,bbaaccb,bbaaccc,bbacbaa,bbacbac,bbacbba,bbacbbb,bbaccba,bbaccbb,bbacccb,bbacccc,bbbaaaa,bbbaaac,bbbaacb,bbbaacc,bbbacba,bbbacbb,bbbaccb,bbbaccc,bbbbaaa,bbbbaac,bbbbacb,bbbbacc,bbbbbaa,bbbbbac,bbbbbba,bbbbbbb,cbaaaaa,cbaaaac,cbaaacb,cbaaacc,cbaacba,cbaacbb,cbaaccb,cbaaccc,cbacbaa,cbacbac,cbacbba,cbacbbb,cbaccba,cbaccbb,cbacccb,cbacccc,cbbaaaa,cbbaaac,cbbaacb,cbbaacc,cbbacba,cbbacbb,cbbaccb,cbbaccc,cbbbaaa,cbbbaac,cbbbacb,cbbbacc,cbbbbaa,cbbbbac,cbbbbba,cbbbbbb,ccbaaaa,ccbaaac,ccbaacb,ccbaacc,ccbacba,ccbacbb,ccbaccb,ccbaccc,ccbbaaa,ccbbaac,ccbbacb,ccbbacc,ccbbbaa,ccbbbac,ccbbbba,ccbbbbb,cccbaaa,cccbaac,cccbacb,cccbacc,cccbbaa,cccbbac,cccbbba,cccbbbb,ccccbaa,ccccbac,ccccbba,ccccbbb,cccccba,cccccbb,ccccccb,ccccccc] % len = 192 % go5 :- S = new_list(7), All = findall(S, (s5(S,[]), not nextto('a','b',S), not nextto('b','c',S), not nextto('c','a',S))), println(all=All), println(len=All.len), nl. s5 --> "a",s5. s5 --> "b",s5. s5 --> "c",s5. s5 --> []. % % Another approach using DCG, removing bad patterns. % % len = 192 % go6 :- S = new_list(7), All = findall(S, (s5(S,[]), remove_bad_pattern(S))), println(all=All), println(len=All.len), nl. remove_bad_pattern([]). remove_bad_pattern([_]). remove_bad_pattern([X,Y|Rest]) :- not ((X='a',Y='b') ; (X='b',Y='c') ; (X='c',Y='a')), remove_bad_pattern([Y|Rest]). % % Using DCG, accepts good patterns. % % len = 192 % go7 :- S = new_list(7), All = findall(S, (s5(S,[]), ok_pattern(S))), println(all=All), println(len=All.len), nl. ok_pattern([]). ok_pattern([_]). ok_pattern([X,Y|Rest]) :- ( (X='a',Y='a') ; (X='a',Y='c') ; (X='b',Y='a') ; (X='b',Y='b') ; (X='c',Y='b') ; (X='c',Y='c') ), ok_pattern([Y|Rest]).