Compare commits
	
		
			2 Commits
		
	
	
		
			c97fd6e8af
			...
			03063514a5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 03063514a5 | |||
| 52a253c1ea | 
| @@ -1,4 +1,5 @@ | |||||||
| #import "/src/utils.typ": * | #import "/src/utils.typ": * | ||||||
|  | #import "@preview/cetz:0.3.1": canvas, draw | ||||||
|  |  | ||||||
| #let solveable(values, target) = { | #let solveable(values, target) = { | ||||||
|   if values.len() == 1 { |   if values.len() == 1 { | ||||||
| @@ -35,8 +36,125 @@ | |||||||
|   return total |   return total | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #let visualize(input) = { | ||||||
|  |   let get-solution(values, target) = { | ||||||
|  |     if values.len() == 1 { | ||||||
|  |       return (values.last() == target, (target,)) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let values = values | ||||||
|  |     let v = values.pop() | ||||||
|  |     if calc.rem(target, v) == 0 { | ||||||
|  |       let r = get-solution(values, target / v) | ||||||
|  |       if r.first() { | ||||||
|  |         return (true, r.last() + ("*", v)) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if v > target { | ||||||
|  |       return (false, ()) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let r = get-solution(values, target - v) | ||||||
|  |     if r.first() { | ||||||
|  |       return (true, r.last() + ("+", v)) | ||||||
|  |     } | ||||||
|  |     return (false, ()) | ||||||
|  |   } | ||||||
|  |   let num(v, x, y, name) = { | ||||||
|  |     draw.circle( | ||||||
|  |       (x, y), | ||||||
|  |       radius: 0.4, | ||||||
|  |       fill: gray.lighten(60%), | ||||||
|  |       name: name | ||||||
|  |     ) | ||||||
|  |     draw.content((x, y), str(v)) | ||||||
|  |   } | ||||||
|  |   let ope(o, x, y, name) = { | ||||||
|  |     let s = ( | ||||||
|  |       "+": sym.plus, | ||||||
|  |       "*": sym.times | ||||||
|  |     ).at(o) | ||||||
|  |     draw.circle( | ||||||
|  |       (x, y), | ||||||
|  |       radius: 0.3, | ||||||
|  |       fill: orange.lighten(60%), | ||||||
|  |       name: name | ||||||
|  |     ) | ||||||
|  |     draw.content((x, y), s) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   let equations = input.split("\n") | ||||||
|  |   let diags = () | ||||||
|  |   for equation in equations { | ||||||
|  |     let (target, values) = equation.split(": ") | ||||||
|  |     target = int(target) | ||||||
|  |     values = values.split(" ").map(int) | ||||||
|  |  | ||||||
|  |     let r = get-solution(values, target) | ||||||
|  |     if not r.first() { | ||||||
|  |       continue | ||||||
|  |     } | ||||||
|  |     let diag = canvas({ | ||||||
|  |       let lvl = 0 | ||||||
|  |       let steps = r.last() | ||||||
|  |       let prev = none | ||||||
|  |       let v = steps.remove(0) | ||||||
|  |  | ||||||
|  |       while true { | ||||||
|  |         num(v, lvl, -lvl, str(lvl) + "-0") | ||||||
|  |  | ||||||
|  |         if lvl != 0 { | ||||||
|  |           draw.line( | ||||||
|  |             str(lvl - 1) + "-1", | ||||||
|  |             str(lvl) + "-0" | ||||||
|  |           ) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if steps.len() == 0 { | ||||||
|  |           break | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         let op = steps.remove(0) | ||||||
|  |         let v2 = steps.remove(0) | ||||||
|  |  | ||||||
|  |         ope(op, lvl + 1, -lvl, str(lvl) + "-1") | ||||||
|  |         num(v2, lvl + 2, -lvl, str(lvl) + "-2") | ||||||
|  |         draw.line( | ||||||
|  |           str(lvl) + "-0", | ||||||
|  |           str(lvl) + "-1" | ||||||
|  |         ) | ||||||
|  |         draw.line( | ||||||
|  |           str(lvl) + "-2", | ||||||
|  |           str(lvl) + "-1" | ||||||
|  |         ) | ||||||
|  |         if op == "+" { | ||||||
|  |           v += v2 | ||||||
|  |         } else if op == "*" { | ||||||
|  |           v *= v2 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         lvl += 1 | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     diags.push(diag) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if calc.rem(diags.len(), 2) == 1 { | ||||||
|  |     diags.last() = grid.cell(colspan: 2, diags.last()) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   grid( | ||||||
|  |     columns: 2, | ||||||
|  |     stroke: (paint: black, dash: "dashed"), | ||||||
|  |     align: center + horizon, | ||||||
|  |     inset: 0.4em, | ||||||
|  |     ..diags | ||||||
|  |   ) | ||||||
|  | } | ||||||
|  |  | ||||||
| #show-puzzle( | #show-puzzle( | ||||||
|   7, 1, |   7, 1, | ||||||
|   solve, |   solve, | ||||||
|   example: 3749 |   example: 3749, | ||||||
|  |   visualize: visualize | ||||||
| ) | ) | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| #import "/src/utils.typ": * | #import "/src/utils.typ": * | ||||||
|  | #import "@preview/cetz:0.3.1": canvas, draw | ||||||
|  |  | ||||||
| #let concat(a, b) = { | #let concat(a, b) = { | ||||||
|   return int(str(a) + str(b)) |   return int(str(a) + str(b)) | ||||||
| @@ -53,8 +54,144 @@ | |||||||
|   return total |   return total | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #let visualize(input) = { | ||||||
|  |   let get-solution(values, target) = { | ||||||
|  |     if values.len() == 1 { | ||||||
|  |       return (values.last() == target, (target,)) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let values = values | ||||||
|  |     let v = values.pop() | ||||||
|  |     if calc.rem(target, v) == 0 { | ||||||
|  |       let r = get-solution(values, target / v) | ||||||
|  |       if r.first() { | ||||||
|  |         return (true, r.last() + ("*", v)) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     let str-target = str(target) | ||||||
|  |     let str-v = str(v) | ||||||
|  |     if str-target == str-v { | ||||||
|  |       return (false, ()) | ||||||
|  |     } | ||||||
|  |     if str-target.ends-with(str-v) { | ||||||
|  |       let target2 = str-target.slice( | ||||||
|  |         0, | ||||||
|  |         str-target.len() - str-v.len() | ||||||
|  |       ) | ||||||
|  |       let r = get-solution(values, int(target2)) | ||||||
|  |       if r.first() { | ||||||
|  |         return (true, r.last() + ("||", v)) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if v > target { | ||||||
|  |       return (false, ()) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let r = get-solution(values, target - v) | ||||||
|  |     if r.first() { | ||||||
|  |       return (true, r.last() + ("+", v)) | ||||||
|  |     } | ||||||
|  |     return (false, ()) | ||||||
|  |   } | ||||||
|  |   let num(v, x, y, name) = { | ||||||
|  |     draw.circle( | ||||||
|  |       (x, y), | ||||||
|  |       radius: 0.4, | ||||||
|  |       fill: gray.lighten(60%), | ||||||
|  |       name: name | ||||||
|  |     ) | ||||||
|  |     draw.content((x, y), str(v)) | ||||||
|  |   } | ||||||
|  |   let ope(o, x, y, name) = { | ||||||
|  |     let s = ( | ||||||
|  |       "+": sym.plus, | ||||||
|  |       "*": sym.times, | ||||||
|  |       "||": sym.bar + sym.bar | ||||||
|  |     ).at(o) | ||||||
|  |     draw.circle( | ||||||
|  |       (x, y), | ||||||
|  |       radius: 0.3, | ||||||
|  |       fill: orange.lighten(60%), | ||||||
|  |       name: name | ||||||
|  |     ) | ||||||
|  |     draw.content((x, y), s) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   let equations = input.split("\n") | ||||||
|  |   let diags = () | ||||||
|  |   for equation in equations { | ||||||
|  |     let (target, values) = equation.split(": ") | ||||||
|  |     target = int(target) | ||||||
|  |     values = values.split(" ").map(int) | ||||||
|  |  | ||||||
|  |     let r = get-solution(values, target) | ||||||
|  |     if not r.first() { | ||||||
|  |       continue | ||||||
|  |     } | ||||||
|  |     let diag = canvas({ | ||||||
|  |       let lvl = 0 | ||||||
|  |       let steps = r.last() | ||||||
|  |       let prev = none | ||||||
|  |       let v = steps.remove(0) | ||||||
|  |  | ||||||
|  |       while true { | ||||||
|  |         num(v, lvl, -lvl, str(lvl) + "-0") | ||||||
|  |  | ||||||
|  |         if lvl != 0 { | ||||||
|  |           draw.line( | ||||||
|  |             str(lvl - 1) + "-1", | ||||||
|  |             str(lvl) + "-0" | ||||||
|  |           ) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if steps.len() == 0 { | ||||||
|  |           break | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         let op = steps.remove(0) | ||||||
|  |         let v2 = steps.remove(0) | ||||||
|  |  | ||||||
|  |         ope(op, lvl + 1, -lvl, str(lvl) + "-1") | ||||||
|  |         num(v2, lvl + 2, -lvl, str(lvl) + "-2") | ||||||
|  |         draw.line( | ||||||
|  |           str(lvl) + "-0", | ||||||
|  |           str(lvl) + "-1" | ||||||
|  |         ) | ||||||
|  |         draw.line( | ||||||
|  |           str(lvl) + "-2", | ||||||
|  |           str(lvl) + "-1" | ||||||
|  |         ) | ||||||
|  |         if op == "+" { | ||||||
|  |           v += v2 | ||||||
|  |         } else if op == "*" { | ||||||
|  |           v *= v2 | ||||||
|  |         } else if op == "||" { | ||||||
|  |           v = int(str(v) + str(v2)) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         lvl += 1 | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     diags.push(diag) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   diags.last() = grid.cell( | ||||||
|  |     colspan: 3 - calc.rem(diags.len() - 1, 3), | ||||||
|  |     diags.last() | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   grid( | ||||||
|  |     columns: 3, | ||||||
|  |     stroke: (paint: black, dash: "dashed"), | ||||||
|  |     align: center + horizon, | ||||||
|  |     inset: 0.4em, | ||||||
|  |     ..diags | ||||||
|  |   ) | ||||||
|  | } | ||||||
|  |  | ||||||
| #show-puzzle( | #show-puzzle( | ||||||
|   7, 2, |   7, 2, | ||||||
|   solve, |   solve, | ||||||
|   example: 11387 |   example: 11387, | ||||||
|  |   visualize: visualize | ||||||
| ) | ) | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/main.pdf
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/main.pdf
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user