innerhtml(puzzle_generating_indicator,"generating") :- puzzle_generating innerhtml(puzzle_generating_indicator,"not_generating") :- ~puzzle_generating style(loading_container,"display",flex) :- puzzle_generating style(loading_container,"display",none) :- ~puzzle_generating innerhtml(cell_header(Column), ColumnName) :- ~puzzle_generating & column_name(Column, ColumnName) innerhtml(cell_title(Row),Category) :- ~puzzle_generating & listpair(Row,Category) % For every clue besides `is_at_certain_location`. innerhtml(clue_ui_content(Index),Content) :- ~puzzle_generating & ordered_clue(Index,A,B) & distinct(B, is_at_certain_location) & decomposeRule(clue(A,B),Content) % For `is_at_certain_location` clues. innerhtml(clue_ui_content(Index),Content) :- ~puzzle_generating & ordered_clue(Index,[Emoji, Column],is_at_certain_location) & column_name(Column, ColumnName) & decomposeRule(clue([Emoji, ColumnName],is_at_certain_location),Content) style(clue_ui_line(Index),"display",none) :- ~puzzle_generating & ~ordered_clue(Index,_,_) style(clue_ui_line(Index),"display",block) :- ~puzzle_generating & ordered_clue(Index,_,_) click(add_hint_button) & evaluate(choose(hidden_clue([Item,I2],ClueType),hidden_clue([Item,I2],ClueType)),hidden_clue([Item,I2],ClueType)) & clue_count(ClueCount) & evaluate(plus(ClueCount,1),ClueCountPlusOne) ==> ~hidden_clue([Item,I2],ClueType) & ordered_clue(ClueCount,[Item,I2],ClueType) & ~clue_count(ClueCount) & clue_count(ClueCountPlusOne) value(picked(Row,Column), Emoji) :- ~puzzle_generating & emoji_title_picked(Row,Column,Emoji) select(picked(Row,Column), Emoji) & distinct(Emoji, unselect) ==> emoji_title_picked(Row,Column,Emoji) select(picked(Row,Column), Emoji) & emoji_title_picked(Row,Column,Emoji2) ==> ~emoji_title_picked(Row,Column,Emoji2) innerhtml(canpick(Row,Col,Option),Emoji) :- ~puzzle_generating & category(All,Row) & puzzle_size(M,N) & number_list(NList,N) & member(Col,NList) & member(Option,NList) & getNthElement(All,Emoji,Option) attribute(canpick(Row,Col,Option),"value",Title) :- ~puzzle_generating & category(All,Row) & puzzle_size(M,N) & number_list(NList,N) & member(Col,NList) & member(Option,NList) & getNthElement(All,Emoji,Option) & item(Category,Title,Emoji) attribute(canpick(Row,Col,-1),"value",unselect) :- category(All,Row) & puzzle_size(M,N) & number_list(NList,N) & member(Col,NList) innerhtml(titleemoji(Row,Option),Emoji) :- innerhtml(canpick(Row,0,Option),Emoji) picked(Row,Column,Emoji) :- emoji_title_picked(Row,Column,EmojiTitle) & item(_,EmojiTitle,Emoji) style(picked(Row,Column), "background-color", "#B1040E") :- conflict(Row,Column,_,_) style(picked(Row,Column), "background-color", transparent) :- ~conflict(Row,Column,_,_) style(cell_cell(Row,Column), "background-color", BackgroundColor) :- style(picked(Row,Column), "background-color", BackgroundColor) conflict(Row, Column, Emoji, ConflictClue) :- ~puzzle_generating & ((picked(Row, Column, Emoji) & picked(Row,Column2,Emoji) & distinct(Column,Column2) & same(Emoji,Emoji) & same(ConflictClue, clue([], no_same_emoji_on_same_row))) | conflict_left(Row,Column,Emoji, is_to_left_of, ConflictClue) | conflict_right(Row, Column, Emoji, is_to_right_of, ConflictClue) | conflict_left_right(Row, Column, Emoji, ConflictClue) | conflict_location(Row, Column, Emoji, ConflictClue) | conflict_is(Row, Column, Emoji, ConflictClue)) conflict_left(Row, Column, Emoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row,Column,Emoji) & clue([Emoji, OtherEmoji], Rule_kind) & ((getPuzzleSizeZeroIndexed(_, NMinusOne) & same(Column,NMinusOne)) | (evaluate(plus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji2, OtherEmoji) & item(Category, _, OtherEmoji) & listpair(Row2,Category))) conflict_left(Row, Column, OtherEmoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,OtherEmoji) & clue([Emoji, OtherEmoji], Rule_kind) & (same(Column, 0) | (evaluate(minus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji, Emoji2) & item(Category, _, Emoji) & listpair(Row2,Category))) conflict_right(Row, Column, Emoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,Emoji) & clue([Emoji, OtherEmoji], Rule_kind) & (same(Column, 0) | (evaluate(minus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji2, OtherEmoji) & item(Category, _, OtherEmoji) & listpair(Row2,Category))) conflict_right(Row, Column, OtherEmoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,OtherEmoji) & clue([Emoji, OtherEmoji], Rule_kind) & ((getPuzzleSizeZeroIndexed(_, NMinusOne) & same(Column,NMinusOne)) | (evaluate(plus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji2, Emoji) & item(Category, _, Emoji) & listpair(Row2,Category))) conflict_left_right(Row, Column, Emoji, ConflictClue) :- conflict_left(Row, Column, Emoji, is_to_either_side_of, ConflictClue) & conflict_right(Row, Column, Emoji, is_to_either_side_of, ConflictClue) conflict_location(Row, Column, Emoji, clue([Emoji, Rule_location], is_at_certain_location)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row,Column,Emoji) & clue([Emoji, Rule_location], is_at_certain_location) & distinct(Column, Rule_location) conflict_is(Row, Column, Emoji, clue([Emoji, OtherEmoji], is)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,Emoji) & clue([Emoji, OtherEmoji], is) & item(Category, _, OtherEmoji) & listpair(Row2, Category) & picked(Row2, Column, Emoji2) & distinct(Emoji2, OtherEmoji) conflict_is(Row, Column, OtherEmoji, clue([Emoji, OtherEmoji], is)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,OtherEmoji) & clue([Emoji, OtherEmoji], is) & item(Category, _, Emoji) & listpair(Row2, Category) & member(Row2,MList) & picked(Row2, Column, Emoji2) & distinct(Emoji2, Emoji) % Highlight conflicted rules rule_conflict(ConflictClue) :- ~puzzle_generating & puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & number_list(NList,N) & member(Column,NList) & conflict(Row, Column, Emoji, ConflictClue) style(clue_ui_content(Index), "color", "red") :- ~puzzle_generating & ordered_clue(Index,A,B) & rule_conflict(clue(A, B)) style(clue_ui_content(Index), "color", "inherit") :- ~puzzle_generating & ordered_clue(Index,A,B) & ~rule_conflict(clue(A, B)) is_one_cell_not_picked() :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & number_list(NList,N) & member(Column,NList) & ~picked(Row, Column, Emoji) is_one_cell_conflicted() :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & number_list(NList,N) & member(Column,NList) & conflict(Row, Column, Emoji, _) style(puzzle_solved_div, "display", "block") :- ~is_one_cell_not_picked() & ~is_one_cell_conflicted() style(puzzle_solved_div, "display", "none") :- is_one_cell_not_picked() | is_one_cell_conflicted()