d13p1 and d13p2
This commit is contained in:
		
							
								
								
									
										1339
									
								
								13/input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1339
									
								
								13/input.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										45
									
								
								13/part1.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								13/part1.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | :- use_module(library(pio)). | ||||||
|  | :- use_module(library(clpfd)). | ||||||
|  | :- initialization(main, main). | ||||||
|  |  | ||||||
|  | main([FileName|_]) :- | ||||||
|  |     input(FileName, Blocks), | ||||||
|  |     convlist(vert_reflect, Blocks, Vs), | ||||||
|  |     convlist(horz_reflect, Blocks, Hs), | ||||||
|  |     sum_list(Vs, V), | ||||||
|  |     sum_list(Hs, H), | ||||||
|  |     Answer is 100*V + H, | ||||||
|  |     writef('Answer=%t\n', [Answer]). | ||||||
|  |  | ||||||
|  | vert_reflect(Block, N) :- reflect(Block, N). | ||||||
|  | horz_reflect(Block, N) :- maplist({N}/[Row]>>(reflect(Row, N)), Block). | ||||||
|  |  | ||||||
|  | reflect(Items, N) :- perfect_reflect(Items, N). | ||||||
|  | reflect(Items, N) :- | ||||||
|  |     append(SubItems, [_|_], Items), | ||||||
|  |     perfect_reflect(SubItems, N). | ||||||
|  | reflect(Items, N) :- | ||||||
|  |     append(Prefix, SubItems, Items), | ||||||
|  |     perfect_reflect(SubItems, SubN), | ||||||
|  |     length(Prefix, Len), N is SubN + Len. | ||||||
|  |  | ||||||
|  | % reflect right down the middle. N is half list length. | ||||||
|  | perfect_reflect([A, A], 1). | ||||||
|  | perfect_reflect(Items, N) :- | ||||||
|  |     append([[Item], OtherItems, [Item]], Items), | ||||||
|  |     perfect_reflect(OtherItems, N_sub1), | ||||||
|  |     N is N_sub1 + 1. | ||||||
|  |  | ||||||
|  | input(FileName, Blocks) :- phrase_from_file(blocks(Blocks), FileName). | ||||||
|  |  | ||||||
|  | blocks([]) --> eos, !. | ||||||
|  | blocks([Block|Blocks]) --> block(Block), blocks(Blocks). | ||||||
|  |  | ||||||
|  | block([Line]) --> line(Line), ("\n"; eos), !. | ||||||
|  | block([Line|Lines]) --> line(Line), block(Lines). | ||||||
|  |  | ||||||
|  | line([]) --> ("\n"; eos), !. | ||||||
|  | line([#|Chars]) --> "#", line(Chars). | ||||||
|  | line([o|Chars]) --> ".", line(Chars). | ||||||
|  |  | ||||||
|  | eos([], []). | ||||||
							
								
								
									
										64
									
								
								13/part2.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								13/part2.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | :- use_module(library(pio)). | ||||||
|  | :- use_module(library(clpfd)). | ||||||
|  | :- initialization(main, main). | ||||||
|  |  | ||||||
|  | main([FileName|_]) :- | ||||||
|  |     input(FileName, Blocks), | ||||||
|  |     convlist(almost_reflect, Blocks, Vs), sum_list(Vs, V), | ||||||
|  |     maplist(transpose, Blocks, TBlocks), | ||||||
|  |     convlist(almost_reflect, TBlocks, Hs), sum_list(Hs, H), | ||||||
|  |     Answer is 100*V + H, | ||||||
|  |     writef('Answer=%t\n', [Answer]). | ||||||
|  |  | ||||||
|  | almost_reflect(Items, N) :- almost_perfect_reflect(Items, N). | ||||||
|  | almost_reflect(Items, N) :- | ||||||
|  |     append(SubItems, [_|_], Items), | ||||||
|  |     almost_perfect_reflect(SubItems, N). | ||||||
|  | almost_reflect(Items, N) :- | ||||||
|  |     append(Prefix, SubItems, Items), | ||||||
|  |     almost_perfect_reflect(SubItems, SubN), | ||||||
|  |     length(Prefix, Len), N is SubN + Len. | ||||||
|  |  | ||||||
|  | reflect(Items, N) :- perfect_reflect(Items, N). | ||||||
|  | reflect(Items, N) :- | ||||||
|  |     append(SubItems, [_|_], Items), | ||||||
|  |     perfect_reflect(SubItems, N). | ||||||
|  | reflect(Items, N) :- | ||||||
|  |     append(Prefix, SubItems, Items), | ||||||
|  |     perfect_reflect(SubItems, SubN), | ||||||
|  |     length(Prefix, Len), N is SubN + Len. | ||||||
|  |  | ||||||
|  | almost_perfect_reflect([A, B], 1) :- diff(A, B, 1). | ||||||
|  | almost_perfect_reflect(Items, N) :- | ||||||
|  |     append([[A], OtherItems, [A]], Items), | ||||||
|  |     almost_perfect_reflect(OtherItems, N_sub1), | ||||||
|  |     N is N_sub1 + 1. | ||||||
|  | almost_perfect_reflect(Items, N) :- | ||||||
|  |     append([[A], OtherItems, [B]], Items), | ||||||
|  |     diff(A, B, 1), | ||||||
|  |     perfect_reflect(OtherItems, N_sub1), | ||||||
|  |     N is N_sub1 + 1. | ||||||
|  |  | ||||||
|  | % reflect right down the middle. N is half list length. | ||||||
|  | perfect_reflect([A, A], 1). | ||||||
|  | perfect_reflect(Items, N) :- | ||||||
|  |     append([[Item], OtherItems, [Item]], Items), | ||||||
|  |     perfect_reflect(OtherItems, N_sub1), | ||||||
|  |     N is N_sub1 + 1. | ||||||
|  |  | ||||||
|  | diff(L1, L2, N) :- | ||||||
|  |     foldl([A, B, Prev, Curr]>>(Curr is Prev + abs(A - B)), L1, L2, 0, N). | ||||||
|  |  | ||||||
|  | input(FileName, Blocks) :- phrase_from_file(blocks(Blocks), FileName). | ||||||
|  |  | ||||||
|  | blocks([]) --> eos, !. | ||||||
|  | blocks([Block|Blocks]) --> block(Block), blocks(Blocks). | ||||||
|  |  | ||||||
|  | block([Line]) --> line(Line), ("\n"; eos), !. | ||||||
|  | block([Line|Lines]) --> line(Line), block(Lines). | ||||||
|  |  | ||||||
|  | line([]) --> ("\n"; eos), !. | ||||||
|  | line([1|Chars]) --> "#", line(Chars). | ||||||
|  | line([0|Chars]) --> ".", line(Chars). | ||||||
|  |  | ||||||
|  | eos([], []). | ||||||
							
								
								
									
										15
									
								
								13/test.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								13/test.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | #.##..##. | ||||||
|  | ..#.##.#. | ||||||
|  | ##......# | ||||||
|  | ##......# | ||||||
|  | ..#.##.#. | ||||||
|  | ..##..##. | ||||||
|  | #.#.##.#. | ||||||
|  |  | ||||||
|  | #...##..# | ||||||
|  | #....#..# | ||||||
|  | ..##..### | ||||||
|  | #####.##. | ||||||
|  | #####.##. | ||||||
|  | ..##..### | ||||||
|  | #....#..# | ||||||
		Reference in New Issue
	
	Block a user