Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.72 KB | None | 0 0
  1. megoldase(Sudoku_feladat, Sudoku_megoldas) :-
  2. arg(1, Sudoku_feladat, M),
  3. arg(2, Sudoku_feladat, Sudoku),
  4. Meret_squared is M * M,
  5. Sikeres is 1,
  6. vegignez(0, 0, Meret_squared, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas),
  7. (Sikeres =:= 0 ->
  8. write('bukta')
  9. ;
  10. Asd is 2
  11. ),
  12. !.
  13.  
  14.  
  15. vegignez(Meret, Meret, Meret, _, Sikeres, _, Sudoku_megoldas) :- !. %visszatér ha az uolsó sorutolsó oszlopát is megnézte
  16. vegignez(Aktualis_sor, Meret, Meret, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas) :- %sor végére ért akkor kezdi a következo sort az elejérol
  17. Aktualis_sor1 is Aktualis_sor + 1,
  18. (Aktualis_sor1 = Meret ->
  19. vegignez(Aktualis_sor1, Meret, Meret, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas)
  20. ;
  21. vegignez(Aktualis_sor1, 0, Meret, Sudoku, Sikeres,Sudoku_feladat, Sudoku_megoldas)),
  22. !.
  23. vegignez(Aktualis_sor, Aktualis_oszlop, Meret, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas) :- %végignéz egy sort
  24. ertekek(Sudoku_feladat, Aktualis_sor - Aktualis_oszlop, Lista),
  25. cellabolSzam(Sudoku, Aktualis_sor, Aktualis_oszlop, Keresett_szam),
  26. (Keresett_szam \= [] ->
  27. (member(Keresett_szam, Lista) -> %teszteli, hogy benne van e a megengedett listában a már beírt szám
  28.  
  29. Lehet_jo is 1
  30.  
  31. ;
  32.  
  33. Sikeres is 0
  34.  
  35. )
  36. ;
  37.  
  38. Lehet_jo is 1
  39. ),
  40.  
  41.  
  42. megoldasbolSzam(Sudoku_megoldas, Aktualis_oszlop, Aktualis_sor, Megoldas_megfelelo_eleme),
  43. (member(Megoldas_megfelelo_eleme, Lista) -> %megnézi, hogy a megoldásban szereplo szám az benne van e a listában
  44.  
  45. Lehet_jo is 1
  46.  
  47.  
  48. %TODO: itt kell beleírni a sudoku_megoldas-ba a kivalasztott szamot. Ezzel tartja a sudoku szabalyait.
  49.  
  50. ;
  51.  
  52. Sikeres is 0
  53.  
  54. ),
  55.  
  56. nth0(Aktualis_sor,Sudoku,Egy_sor),
  57. nth0(Aktualis_oszlop, Egy_sor, Elem),
  58. checkItemSouth(Elem, South_Item),
  59. checkItemWest(Elem, West_Item),
  60. West_oszlop is Aktualis_oszlop - 1,
  61. South_sor is Aktualis_sor + 1,
  62.  
  63.  
  64. (West_Item = [w], South_Item = [s] ->
  65. megoldasbolSzam(Sudoku_megoldas, West_oszlop, Aktualis_sor, Megoldas_west_eleme),
  66. megoldasbolSzam(Sudoku_megoldas, Aktualis_oszlop, South_sor, Megoldas_south_eleme),
  67. Uj_valtozo_w is Megoldas_megfelelo_eleme + Megoldas_west_eleme,
  68. Uj_valtozo_s is Megoldas_megfelelo_eleme + Megoldas_south_eleme,
  69. ((Uj_valtozo_w rem 2) =\= 0 , (Uj_valtozo_s rem 2) =\= 0 ->
  70.  
  71. Lehet_jo is 1,
  72. Aktualis_oszlop1 is Aktualis_oszlop +1,
  73. vegignez(Aktualis_sor, Aktualis_oszlop1, Meret, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas)
  74.  
  75. ;
  76.  
  77. Sikeres is 0
  78.  
  79. )
  80. ;
  81. (West_Item = [w] ->
  82. megoldasbolSzam(Sudoku_megoldas, West_oszlop, Aktualis_sor, Megoldas_west_eleme),
  83. Uj_valtozo is Megoldas_megfelelo_eleme + Megoldas_west_eleme,
  84. ((Uj_valtozo rem 2) =:= 0 ->
  85.  
  86. Sikeres is 0
  87.  
  88. ;
  89.  
  90.  
  91. Aktualis_oszlop1 is Aktualis_oszlop +1,
  92. vegignez(Aktualis_sor, Aktualis_oszlop1, Meret, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas)
  93.  
  94. )
  95. ;
  96. (South_Item = [s] ->
  97. megoldasbolSzam(Sudoku_megoldas, Aktualis_oszlop, South_sor, Megoldas_south_eleme),
  98. Uj_valtozo is Megoldas_megfelelo_eleme + Megoldas_south_eleme,
  99. ((Uj_valtozo rem 2) =:= 0 ->
  100.  
  101. Sikeres is 0
  102.  
  103. ;
  104.  
  105. Lehet_jo is 1,
  106. Aktualis_oszlop1 is Aktualis_oszlop +1,
  107. vegignez(Aktualis_sor, Aktualis_oszlop1, Meret, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas)
  108. )
  109. ;
  110. Lehet_jo is 1
  111. ),
  112.  
  113. Aktualis_oszlop1 is Aktualis_oszlop +1,
  114. vegignez(Aktualis_sor, Aktualis_oszlop1, Meret, Sudoku, Sikeres, Sudoku_feladat, Sudoku_megoldas)
  115. )),
  116. !.
  117.  
  118.  
  119.  
  120. checkItemSouth([], []) :- !.
  121. checkItemSouth([H|T], Result) :-
  122. (H = 's' -> append([], [H], Result);
  123. checkItemSouth(T, Result)).
  124.  
  125. checkItemWest([], []) :- !.
  126. checkItemWest([H|T], Result) :-
  127. (H = 'w' -> append([], [H], Result);
  128. checkItemWest(T, Result)).
  129.  
  130.  
  131. megoldasbolSzam(Sudoku_megoldas, Oszlop, Sor, Keresett) :-
  132. Uj_oszlop is Oszlop + 1,
  133. nth0(Sor,Sudoku_megoldas,Egy_sor),
  134. nth1(Uj_oszlop,Egy_sor,Keresett).
  135.  
  136.  
  137. cellabolSzam(Sudoku, Aktualis_sor, Aktualis_oszlop, Keresett_szam) :-
  138. nth0(Aktualis_sor,Sudoku,Egy_sor),
  139. Uj_oszlop_szam is Aktualis_oszlop + 1,
  140. nth1(Uj_oszlop_szam,Egy_sor,Elem),
  141. checkItem(Elem, Keresett_szam).
  142.  
  143. ertekek(Sudoku_Full, Row1-Col1, Vals) :-
  144. % Extract and set parameters
  145. arg(1, Sudoku_Full, N),
  146. arg(2, Sudoku_Full, Sudoku),
  147. FromRow is Row1 - (Row1 rem N),
  148. FromCol is Col1 - (Col1 rem N),
  149.  
  150. % Get the Row
  151. nth0(Row1,Sudoku,Result_Row),
  152.  
  153. % Get the Column
  154. getColumn(Sudoku, Col1, Result_Column),
  155.  
  156. % Get the NxN Block
  157. getBlock(Sudoku, FromRow, FromCol, N, N, Result_Block),
  158.  
  159. % Get the Item
  160. nth0(Col1, Result_Row, Result_Item),
  161.  
  162. % Unify
  163. append(Result_Row, Result_Column, Temp_All),
  164. append(Temp_All, Result_Block, All),
  165. flatten2(All, All_Flatten),
  166. removeV(All_Flatten, [], All_Best),
  167.  
  168. % Create list of numbers
  169. N_Squared is N*N,
  170. num2list(N_Squared, Numbers),
  171.  
  172. % Extract number for Result_Item, if it's a number
  173. checkItem(Result_Item, Item_Number),
  174. checkItemOdd(Result_Item, Odd_Item),
  175. checkItemEven(Result_Item, Even_Item),
  176.  
  177. (number(Item_Number) ->
  178. % Check how many times is Item in Allitems
  179. countNumber(All_Best, Item_Number, 0, Occurrence),
  180. % If occurrence is more than 3, fuck it.
  181. (Occurrence > 3 ->
  182. Vals = [];
  183. %Else
  184. % Check if odd or even fucks it.
  185. (Odd_Item = [o], Even_Item = [e] ->
  186. Vals = [];
  187. Odd_Item = [o], (Item_Number rem 2) =:= 0 ->
  188. Vals = [];
  189. Even_Item = [e], (Item_Number rem 2) =:= 1 ->
  190. Vals = [];
  191. Vals = [Item_Number]
  192. )
  193. );
  194.  
  195. (Odd_Item = [o], Even_Item = [e] ->
  196. num2listOdd(N_Squared, OddNumbers),
  197. num2listEven(N_Squared, EvenNumbers),
  198. append(All_Best, OddNumbers, All_Final_Temp),
  199. append(All_Final_Temp, EvenNumbers, All_Final);
  200. Odd_Item = [o] ->
  201. num2listEven(N_Squared, OddNumbers),
  202. append(All_Best, OddNumbers, All_Final);
  203. Even_Item = [e] ->
  204. num2listOdd(N_Squared, EvenNumbers),
  205. append(All_Best, EvenNumbers, All_Final);
  206. All_Final = All_Best),
  207.  
  208. checkAllNumbers(Numbers, All_Final, [], Result_Final),
  209. (var(Result_Final) -> Vals = [];
  210. Vals = Result_Final)),
  211. !.
  212.  
  213. checkAllNumbers([], _, Acc, Result) :-
  214. Result = Acc,
  215. !.
  216. checkAllNumbers([H|T], All, Acc, Result) :-
  217. (\+ member(H, All) ->
  218. append(Acc, [H], Temp),
  219. checkAllNumbers(T, All, Temp, Result);
  220. checkAllNumbers(T, All, Acc, Result)).
  221.  
  222. getColumn([], _, []) :- !.
  223. getColumn([H|T], ColNum, Res):-
  224. getColumn(T, ColNum, Temp),
  225. nth0(ColNum, H, Col),
  226. append(Temp, [Col], Res).
  227.  
  228. getBlockCol(_, _, ToCol, ToCol, Acc, Result) :-
  229. Result = Acc,
  230. !.
  231. getBlockCol([H|T], FromCol, ToCol, Current, Acc, Result) :-
  232. NewCurr is Current + 1,
  233. (Current >= FromCol -> append(Acc, [H], Temp),
  234. getBlockCol(T, FromCol, ToCol, NewCurr, Temp, Result);
  235. getBlockCol(T, FromCol, ToCol, NewCurr, Acc, Result)).
  236.  
  237. getBlock(_, _, _, _, 0, _) :- !.
  238. getBlock(Sudoku, FromRow, FromCol, N, Current, Result) :-
  239. NewCurrent is Current - 1,
  240. getBlock(Sudoku, FromRow, FromCol, N, NewCurrent, Temp),
  241. RowToExtract is FromRow + Current - 1,
  242. nth0(RowToExtract,Sudoku,CurrentRow),
  243. ToCol is FromCol + N,
  244. getBlockCol(CurrentRow, FromCol, ToCol, 0, [], MyRes),
  245. append(Temp, MyRes, Result).
  246.  
  247. num2list(N, List) :-
  248. num2list(1, N, List).
  249. num2list(N, N, [N]) :- !.
  250. num2list(N0, N, [N0| List]) :-
  251. N0 < N,
  252. N1 is N0 + 1,
  253. num2list(N1, N, List).
  254.  
  255. num2listEven(N, List) :-
  256. num2listEven(2, N, List).
  257. num2listEven(N0, N, [N0| List]) :-
  258. N0 < N,
  259. N1 is N0 + 2,
  260. num2listEven(N1, N, List).
  261. num2listEven(_, _, []) :- !.
  262.  
  263. num2listOdd(N, List) :-
  264. num2listOdd(1, N, List).
  265. num2listOdd(N0, N, [N0| List]) :-
  266. N0 < N,
  267. N1 is N0 + 2,
  268. num2listOdd(N1, N, List).
  269. num2listOdd(M, _, [M]) :- !.
  270.  
  271.  
  272. checkItem([], []) :- !.
  273. checkItem([H|T], Result) :-
  274. eval(H, NewH),
  275. (number(NewH) -> append([], NewH, Result);
  276. checkItem(T, Result)).
  277.  
  278. checkItemOdd([], []) :- !.
  279. checkItemOdd([H|T], Result) :-
  280. (H = 'o' -> append([], [H], Result);
  281. checkItemOdd(T, Result)).
  282.  
  283. checkItemEven([], []) :- !.
  284. checkItemEven([H|T], Result) :-
  285. (H = 'e' -> append([], [H], Result);
  286. checkItemEven(T, Result)).
  287.  
  288. countNumber([], _, Count, Result) :-
  289. Result is Count,
  290. !.
  291. countNumber([H|T], Item, Count, Result) :-
  292. (number(H), H =:= Item ->
  293. Temp is Count + 1,
  294. countNumber(T, Item, Temp, Result);
  295. countNumber(T, Item, Count, Result)).
  296.  
  297. flatten2([], []) :- !.
  298. flatten2([L|Ls], FlatL) :-
  299. flatten2(L, NewL),
  300. flatten2(Ls, NewLs),
  301. append(NewL, NewLs, FlatL).
  302. flatten2(L, [L]).
  303.  
  304. removeV([], Acc, Result) :-
  305. Result = Acc,
  306. !.
  307. removeV([H|T], Acc, Result) :-
  308. eval(H, NewH),
  309. append(Acc, [NewH], Temp),
  310. removeV(T, Temp, Result).
  311.  
  312. eval(v(X), Result) :-
  313. Result = X.
  314.  
  315. eval(X, Result) :-
  316. Result = X.
  317.  
  318. nth0(0, [Head|_], Head) :- !.
  319.  
  320. nth0(N, [_|Tail], Elem) :-
  321. nonvar(N),
  322. M is N-1,
  323. nth0(M, Tail, Elem).
  324.  
  325. nth0(N,[_|T],Item) :- % Clause added KJ 4-5-87 to allow mode
  326. var(N), % nth0(-,+,+)
  327. nth0(M,T,Item),
  328. N is M + 1.
  329.  
  330.  
  331. nth1(1, [Head|_], Head) :- !.
  332.  
  333. nth1(N, [_|Tail], Elem) :-
  334. nonvar(N),
  335. M is N-1, % should be succ(M, N)
  336. nth1(M, Tail, Elem).
  337.  
  338. nth1(N,[_|T],Item) :- % Clause added KJ 4-5-87 to allow mode
  339. var(N), % nth1(-,+,+)
  340. nth1(M,T,Item),
  341. N is M + 1.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement