Skip to content

Instantly share code, notes, and snippets.

@sudhackar
Last active June 15, 2023 12:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sudhackar/32e61ae4add3c2ce68af14f7095377fd to your computer and use it in GitHub Desktop.
Save sudhackar/32e61ae4add3c2ce68af14f7095377fd to your computer and use it in GitHub Desktop.
puzzling se
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <numeric>
#include <set>
#include <vector>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
#define forup(i, a, b) for (int i = (a); i < (b); ++i)
#define fordn(i, a, b) for (int i = (a); i > (b); --i)
#define rep(i, a) for (int i = 0; i < (a); ++i)
#define gi(x) scanf("%d", &x)
#define gl(x) cin >> x
#define gd(x) scanf("%lf", &x)
#define gs(x) scanf(" %s", x)
#define fs first
#define sc second
#define pb push_back
#define mp make_pair
const int inf = numeric_limits<int>::max();
const LL linf = numeric_limits<LL>::max();
const LL nlinf = numeric_limits<LL>::min();
const int max_n = 100010;
int arr[max_n];
vector<int> prime;
bool is_composite[max_n];
void sieve(int n) {
fill(is_composite, is_composite + n, false);
for (int i = 2; i < n; ++i) {
if (!is_composite[i])
prime.pb(i);
for (int j = 0; j < prime.size() && i * prime[j] < n; ++j) {
is_composite[i * prime[j]] = true;
if (i % prime[j] == 0)
break;
}
}
}
bool is_prime(int n) { return !is_composite[n]; }
bool is_topexp(int n, int x) {
int base = 0;
for (auto &i : prime) {
if (x % i == 0) {
base = i;
break;
}
}
int y = 1;
while (y*base <= n) {
y *= base;
};
if (x == y)
return true;
y /= base;
if (x == y)
return true;
return false;
}
bool sat(int n, vector<int> a, vector<int> b) {
for (auto &i : a) {
// printf("%d:", i);
int c = 0;
for (auto &j : a) {
if (i != j && gcd(i, j) > 1) {
c++;
if (c > 2) {
printf("A %d\n", i);
return false;
}
}
}
}
// putchar(0xa);
for (auto &i : b) {
int c = 0;
for (auto &j : a) {
if (gcd(i, j) > 1) {
c++;
}
}
if (c < 3) {
printf("B %d\n", i);
return false;
}
}
return true;
}
bool check(int n) {
vector<int> a, b;
forup(i, 1, n + 1) {
if (i == 1 || is_prime(i) || is_topexp(n, i))
a.pb(i);
else
b.pb(i);
}
return sat(n, a, b);
}
int main() {
sieve(max_n);
assert(is_topexp(36, 25));
assert(is_topexp(9, 9));
assert(is_topexp(8, 4));
forup(i, 1, max_n) {
// printf("%d\n", i);
assert(check(i));
}
}
:- use_module(library(clpfd)).
list_allperms(L, Ps) :- bagof(P, permutation(L,P), Ps).
f(X,Y,Z,R) :- R #= 10 * X + 11 * Y + 12 * Z.
fit(X,Y,Z) :- f(X,Y,Z,R), R #< 51.
fit_limit(L) :- nth0(0,L,X),nth0(1,L,Y),nth0(2,L,Z),fit(X,Y,Z).
fit_unique(L,R) :- nth0(0,L,X),nth0(1,L,Y),nth0(2,L,Z),f(X,Y,Z,R).
solution(X,Y,Z) :-
X #>=0,
Y #>=0,
Z #>=0,
list_allperms([X,Y,Z],L),
maplist(fit_limit, L),
maplist(fit_unique,L,R),
all_distinct(R),
label([X,Y,Z]),
write(R).
:- use_module(library(clpfd)).
fit(X) :- X #>= 1, X #=< 7 .
n_fit(L,V) :- nth0(X1,L,V),nth0(Y1,L,V),X1 #\= Y1, abs(X1-Y1) #= (V+1).
n_six_fit(L,Base,Idx,Val) :- Y #= Base+Idx, nth0(Y,L,X), X #= Val.
count_fit(L) :- maplist(n_fit(L),[1,2,3,4,5,6,7]).
six_fit(L) :- nth0(X6,L,6),nth0(Y6,L,6), Y6 #> X6, Y6 #=< 13, X6 #=< 6,
maplist(n_six_fit(L,X6),[1,2,3,4,5,6],N),
is_set(N).
num([],0).
num([L|Ns],X) :- num(Ns,Y),length(Ns,P),X is L*(10**P) + Y.
solution(Num) :-
maplist(fit,[M,N,O,P,Q,R,S,T,U,V,W,X,Y,S]),
count_fit([M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]),
six_fit([M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]),
num([M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],Num).
?- distinct(X,solution(X)).
:- use_module(library(clpfd)).
sudoku(Rows) :-
length(Rows, 9), maplist(same_length(Rows), Rows),
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [As,Bs,Cs,Ds,Es,Fs,Gs,Hs,Is],
blocks(As, Bs, Cs),
blocks(Ds, Es, Fs),
blocks(Gs, Hs, Is),
nth0(0,As,D1),nth0(1,Bs,D2),nth0(2,Cs,D3),nth0(3,Ds,D4),nth0(4,Es,D5),nth0(5,Fs,D6),nth0(6,Gs,D7),nth0(7,Hs,D8),nth0(8,Is,D9),
nth0(8,As,E1),nth0(7,Bs,E2),nth0(6,Cs,E3),nth0(5,Ds,E4),nth0(4,Es,E5),nth0(3,Fs,E6),nth0(2,Gs,E7),nth0(1,Hs,E8),nth0(0,Is,E9),
nth0(1,Bs,F1),nth0(4,Bs,F2),nth0(7,Bs,F3),nth0(1,Es,F4),nth0(4,Es,F5),nth0(7,Es,F6),nth0(1,Hs,F7),nth0(4,Hs,F8),nth0(7,Hs,F9),
all_distinct([D1,D2,D3,D4,D5,D6,D7,D8,D9]),
all_distinct([E1,E2,E3,E4,E5,E6,E7,E8,E9]),
all_distinct([F1,F2,F3,F4,F5,F6,F7,F8,F9]),
nth0(3,As,K1_1),nth0(3,Cs,K1_2),nth0(0,Ds,K1_3),nth0(2,Ds,K1_4),K1_1 #\= F1,K1_2 #\= F1,K1_3 #\= F1,K1_4 #\= F1,
nth0(2,As,K2_1),nth0(2,Cs,K2_2),nth0(6,As,K2_3),nth0(6,Cs,K2_4),nth0(3,Ds,K2_5),nth0(5,Ds,K2_6),K2_1 #\= F2,K2_2 #\= F2,K2_3 #\= F2,K2_4 #\= F2,K2_5 #\= F2,K2_6 #\= F2,
nth0(6,As,K3_1),nth0(6,Cs,K3_2),nth0(6,Ds,K3_3),nth0(8,Ds,K3_4),K3_1 #\= F3,K3_2 #\= F3,K3_3 #\= F3,K3_4 #\= F3,
nth0(3,Ds,K4_1),nth0(3,Fs,K4_2),nth0(0,Gs,K4_3),nth0(2,Gs,K4_4),nth0(0,Cs,K4_5),nth0(2,Cs,K4_6),K4_1 #\= F4,K4_2 #\= F4,K4_3 #\= F4,K4_4 #\= F4,K4_5 #\= F4,K4_6 #\= F4,
nth0(3,Cs,K5_1),nth0(5,Cs,K5_2),nth0(2,Ds,K5_3),nth0(2,Fs,K5_4),nth0(6,Ds,K5_5),nth0(6,Fs,K5_6),nth0(3,Gs,K5_7),nth0(5,Fs,K5_8),K5_1 #\= F5,K5_2 #\= F5,K5_3 #\= F5,K5_4 #\= F5,K5_5 #\= F5,K5_6 #\= F5,K5_7 #\= F5,K5_8 #\= F5,
nth0(5,Ds,K6_1),nth0(5,Fs,K6_2),nth0(6,Gs,K6_3),nth0(8,Gs,K6_4),nth0(6,Cs,K6_5),nth0(8,Cs,K6_6),K6_1 #\= F6,K6_2 #\= F6,K6_3 #\= F6,K6_4 #\= F6,K6_5 #\= F6,K6_6 #\= F6,
nth0(0,Fs,K7_1),nth0(2,Fs,K7_2),nth0(3,Is,K7_3),nth0(3,Gs,K7_4),K7_1 #\= F7,K7_2 #\= F7,K7_3 #\= F7,K7_4 #\= F7,
nth0(2,Gs,K8_1),nth0(2,Is,K8_2),nth0(6,Gs,K8_3),nth0(6,Is,K8_4),nth0(3,Fs,K8_5),nth0(5,Fs,K8_6),K8_1 #\= F8,K8_2 #\= F8,K8_3 #\= F8,K8_4 #\= F8,K8_5 #\= F8,K8_6 #\= F8,
nth0(8,Fs,K9_1),nth0(6,Fs,K9_2),nth0(5,Gs,K9_3),nth0(5,Is,K9_4),K9_1 #\= F9,K9_2 #\= F9,K9_3 #\= F9,K9_4 #\= F9.
blocks([], [], []).
blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :-
all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]),
blocks(Ns1, Ns2, Ns3).
problem(1, [[8,2,1,4,7,9,_,_,6],
[_,9,4,_,_,3,_,_,_],
[_,_,3,_,_,_,9,1,_],
[_,_,_,_,2,_,_,_,9],
[_,_,9,3,_,_,_,_,_],
[_,_,_,_,9,_,_,_,_],
[_,_,_,9,_,7,_,_,_],
[9,_,_,6,3,_,4,_,_],
[3,_,_,_,_,_,1,9,_]]).
:- use_module(library(clpfd)).
sudoku(Rows) :-
length(Rows, 9), maplist(same_length(Rows), Rows),
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [As,Bs,Cs,Ds,Es,Fs,Gs,Hs,Is],
blocks(As, Bs, Cs),
blocks(Ds, Es, Fs),
blocks(Gs, Hs, Is),
nth0(0,As,D1),nth0(1,Bs,D2),nth0(2,Cs,D3),nth0(3,Ds,D4),nth0(4,Es,D5),nth0(5,Fs,D6),nth0(6,Gs,D7),nth0(7,Hs,D8),nth0(8,Is,D9),
nth0(8,As,E1),nth0(7,Bs,E2),nth0(6,Cs,E3),nth0(5,Ds,E4),nth0(4,Es,E5),nth0(3,Fs,E6),nth0(2,Gs,E7),nth0(1,Hs,E8),nth0(0,Is,E9),
nth0(1,Bs,F1),nth0(4,Bs,F2),nth0(7,Bs,F3),nth0(1,Es,F4),nth0(4,Es,F5),nth0(7,Es,F6),nth0(1,Hs,F7),nth0(4,Hs,F8),nth0(7,Hs,F9),
all_distinct([D1,D2,D3,D4,D5,D6,D7,D8,D9]),
all_distinct([E1,E2,E3,E4,E5,E6,E7,E8,E9]),
all_distinct([F1,F2,F3,F4,F5,F6,F7,F8,F9]),
F3 #< F2,
F2 #< F1,
F1 #< F4,
F4 #< F7,
F7 #< F8,
F8 #< F9,
% F9 #< F6,
F6 #< F3.
% write(done).
blocks([], [], []).
blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :-
all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]),
blocks(Ns1, Ns2, Ns3).
problem(1, [[5,7,2,_,_,9,_,3,1],
[6,4,8,_,3,1,_,2,_],
[9,1,3,_,_,_,_,_,_],
[_,3,7,1,5,_,_,_,_],
[_,5,6,_,9,_,3,1,8],
[8,9,1,3,_,6,_,7,5],
[1,2,5,9,_,_,7,6,3],
[3,6,9,_,7,_,1,8,4],
[7,8,4,6,1,3,_,_,2]]).
from random import randint, sample
from collections import defaultdict
def cals():
start_set = set()
start_set.add(1)
buf = ""
rank = {}
rank[1] = 1
# rank[0] = 2
while len(start_set) < 100:
a = sample(start_set, 1)
b = sample(start_set, 1)
# print(a,b)
# if a[0] > 5000 or b[0] > 5000:
# continue
if 2020 in start_set:
break
start_set.add(a[0] + b[0])
start_set.add(abs(a[0] - b[0]))
start_set.add(a[0] * b[0])
buf += "%d + %d = %d\n%d - %d = %d\n%d * %d = %d\n" % (a[0],b[0],a[0]+b[0],a[0],b[0],abs(a[0]-b[0]),a[0],b[0],a[0]*b[0])
if (a[0] + b[0]) not in rank:
rank[a[0] + b[0]] = max(rank[a[0]],rank[b[0]]) + 1
if (a[0] * b[0]) not in rank:
rank[a[0] * b[0]] = max(rank[a[0]],rank[b[0]]) + 1
if abs(a[0] - b[0]) not in rank:
rank[abs(a[0] - b[0])] = max(rank[a[0]],rank[b[0]]) + 1
if 2020 in start_set:
# print(start_set)
# print(buf)
# print(rank[2020])
return (rank[2020],buf)
else:
return (None,None)
while True:
x,y = cals()
if x:
print(x)
if x < 8:
print(y)
:- use_module(library(clpfd)).
forward(you, 240).
forward(jacky, 360).
forward(chris, 420).
forward(martha, 600).
backward(you, 120).
backward(jacky, 60).
backward(chris, 45).
backward(martha, 30).
moves(Ms) :- phrase(moves(state(0,[you,jacky,chris,martha],[])), Ms).
moves(state(T0,Ls0,Rs0)) -->
{ select(Player1, Ls0, Ls1), select(Player2, Ls1, Ls2),
Player1 @< Player2,
forward(Player1, Time1), forward(Player2, Time2),
T1 #= T0 + max(Time1,Time2), T1 #< 1500 },
[together(Player1,Player2,T1)],
moves_(state(T1,Ls2,[Player1,Player2|Rs0])).
moves_(state(_,[],_)) --> [].
moves_(state(T0,Ls0,Rs0)) -->
{ select(Player, Rs0, Rs1),
backward(Player, Time),
T1 #= T0 + Time, T1 #< 1500 },
[alone(Player,T1)],
moves(state(T1,[Player|Ls0],Rs1)).
from graphviz import Graph
from fractions import gcd
p1 = [9, 15, 21, 10, 7, 70]
G1 = Graph('G1', filename="Graph1")
edges = []
for i in p1:
for j in p1:
if i != j and gcd(i, j) > 1:
edges.append((i, j))
edges = set([tuple(sorted(i)) for i in edges])
for edge in edges:
G1.edge(str(edge[0]), str(edge[1]))
G1.view()
G1.save("G1.dot")
p2 = [9, 42, 21, 20, 35, 5]
G2 = Graph('G2', filename="Graph2")
edges = []
for i in p2:
for j in p2:
if i != j and gcd(i, j) > 1:
edges.append((i, j))
edges = set([tuple(sorted(i)) for i in edges])
for edge in edges:
G2.edge(str(edge[0]), str(edge[1]))
G2.view()
G2.save("G2.dot")
:- use_module(library(clpfd)).
median(Row, X) :-
msort(Row, Sorted),
nth0(1, Sorted, X).
solution(Rows) :-
length(Rows, 3),
maplist(same_length(Rows), Rows),
append(Rows, Vs),
permutation(Vs, [1, 2, 3, 4, 5, 6, 7, 8, 9]),
transpose(Rows, Columns),
maplist(median, Rows, RMedians),
maplist(median, Columns, CMedians),
append([RMedians, CMedians], AllMedians),
all_distinct(AllMedians), writeln(Rows), writeln(CMedians), writeln(RMedians).
solve(1, [[_, _, _], [_, _, _], [_, _, _]]).
?-solve(1, X), solution(X), maplist(portray_clause, X).
:- use_rendering(table,
[header(h('Name','Surname','L1','L2'))]).
interpreters(Is) :-
length(Is,6),
member(h(fran,french,_,_), Is),
member(h(geraldine,german,_,_), Is),
member(h(dudley,dutch,_,_), Is),
member(h(spike,spanish,_,_), Is),
member(h(polly,polish,_,_), Is),
member(h(ron,romanian,_,_), Is),
member(h(_,_,french,_), Is),member(h(_,_,_,french), Is),
member(h(_,_,german,_), Is),member(h(_,_,_,german), Is),
member(h(_,_,dutch,_), Is),member(h(_,_,_,dutch), Is),
member(h(_,_,spanish,_), Is),member(h(_,_,_,spanish), Is),
member(h(_,_,polish,_), Is),member(h(_,_,_,polish), Is),
member(h(_,_,romanian,_), Is),member(h(_,_,_,romanian), Is),
\+member(h(_,X,X,_), Is),
\+member(h(_,Y,_,Y), Is),
(member(h(spike,spanish,dutch,german), Is);member(h(spike,spanish,german,dutch), Is)),
(member(h(_,_,dutch,polish), Is);member(h(_,_,polish,dutch), Is)),
member(h(fran,french,E,F), Is),member(h(dudley,dutch,G,H), Is),E \= G, F \= G, E \= H, F \= H,
member(h(dudley,dutch,I,J), Is), (member(h(_,I,_,french), Is);member(h(_,I,french,_), Is)), (member(h(_,J,_,french), Is);member(h(_,J,french,_), Is)),
\+member(h(_,_,german,polish), Is),
\+member(h(_,_,polish,german), Is),
\+member(h(_,_,K,K), Is).
:- use_module(library(clpfd)).
% Of the shrine in Uchida and the temple built in 1645, one is sama takako and the other is okabe honzo.
% The temple in Funai was built before takahashi
% The temple in toyagi was built 120 years before the temple in usui
% Hori takesi wasa built after sama takako
temples(Ts):-
length(Ts,4),
member(h(hori_takesi, _, _), Ts),
member(h(okabe_honzo, _, _), Ts),
member(h(sama_takako, _, _), Ts),
member(h(takahashi, _, _), Ts),
member(h(_, funai, _), Ts),
member(h(_, toyagi, _), Ts),
member(h(_, uchida, _), Ts),
member(h(_, usui, _), Ts),
member(h(_, _, 1525), Ts),
member(h(_, _, 1585), Ts),
member(h(_, _, 1645), Ts),
member(h(_, _, 1705), Ts),
member(h(takahashi, _, X), Ts), member(h(_, funai, Y), Ts), Y #< X,
member(h(_, toyagi, Z), Ts), member(h(_, usui, W), Ts), Z + 120 #= W,
member(h(sama_takako, _, U), Ts), member(h(hori_takesi, _, V), Ts), V #> U,
(member(h(sama_takako,uchida,_), Ts),member(h(okabe_honzo,_,1645), Ts),\+member(h(okabe_honzo,uchida,_),Ts),\+member(h(sama_takako,_,1645), Ts));(\+member(h(sama_takako,uchida,_), Ts),\+member(h(okabe_honzo,_,1645), Ts),member(h(okabe_honzo,uchida,_),Ts),member(h(sama_takako,_,1645), Ts)).
day(X) :- member(X,[m,t,w,thu,f,sat,sun]).
lie(m).
lie(t).
lie(w).
truth(X) :- \+lie(X).
next(A, B, Ls) :- append(_, [A,B|_], Ls).
next_day(sun,m).
next_day(X,Y) :- next(X,Y,[m,t,w,thu,f,sat,sun]).
solve(X) :-
day(X),
(truth(X),next_day(Y,X),lie(Y),next_day(X,T),next_day(T,U),next_day(U,V),lie(U),lie(V));
(lie(X),next_day(Y,X),truth(Y),next_day(X,T),next_day(T,U),next_day(U,V),(truth(U);truth(V))).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment