day 6 tcl solution
This commit is contained in:
		
							parent
							
								
									ed146f7fe1
								
							
						
					
					
						commit
						905dee030f
					
				
							
								
								
									
										43
									
								
								day06/sol.tcl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										43
									
								
								day06/sol.tcl
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | #!/usr/bin/env tclsh | ||||||
|  | package require Tcl 8.6 | ||||||
|  | set input stdin | ||||||
|  | regexp {Time: (.*)}     [gets $input] _ time | ||||||
|  | regexp {Distance: (.*)} [gets $input] _ dist | ||||||
|  | 
 | ||||||
|  | proc solve {t d} { | ||||||
|  |     # the distance traveled if the boat is released at time i  | ||||||
|  |     # is equal to (t-i)*i | ||||||
|  |     # we want to know the range of values of i for which this | ||||||
|  |     # exceeds the best time (d) | ||||||
|  |     #   (t-i)*i > d | ||||||
|  |     # a little rearranging gets us the quadratic equation | ||||||
|  |     #   i^2 - ti + d <= 0 | ||||||
|  |     # which we can determine the crossing points for | ||||||
|  |     # using the quadratic formula (the good one, not the | ||||||
|  |     # one you learned in school) | ||||||
|  |     #puts "solve $t $d" | ||||||
|  |     set h [expr {$t / 2.0}] | ||||||
|  |     set s [expr {sqrt($h*$h - $d)}] | ||||||
|  |     set a [expr {int($h-$s)}] | ||||||
|  |     set b [expr {int($h+$s)}] | ||||||
|  |     # in general these will not be at integer values, | ||||||
|  |     # so we probe the floor and ceiling of each crossing | ||||||
|  |     # point to determine exactly where the condition is met | ||||||
|  |     if {($t-$a)*$a <= $d} { incr a } | ||||||
|  |     if {($t-$b)*$b > $d}  { incr b } | ||||||
|  |     #puts "a=$a b=$b" | ||||||
|  |     return [expr {$b - $a}] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | proc product {list} { | ||||||
|  |     set p 1 | ||||||
|  |     foreach x $list { | ||||||
|  |         set p [expr {$p * $x}] | ||||||
|  |     } | ||||||
|  |     return $p | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | proc smush {x} { return [join $x ""] } | ||||||
|  | 
 | ||||||
|  | puts "Part 1: [product [lmap t $time d $dist {solve $t $d}]]" | ||||||
|  | puts "Part 2: [solve [smush $time] [smush $dist]]" | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user