Merge remote-tracking branch '2018/master'
This commit is contained in:
		
						commit
						2e1614a5dc
					
				|  | @ -0,0 +1,31 @@ | |||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| import sys | ||||
| 
 | ||||
| def delta_frequency(f = sys.stdin): | ||||
|     df = 0 | ||||
|     frequency_count = {0: 1} | ||||
|     frequency_list = [] | ||||
|     for l in f.readlines(): | ||||
|         frequency_list.append(l) | ||||
|     first = None | ||||
|     iteration = 1 | ||||
|     df_first_iteration = None | ||||
|     while first is None: | ||||
|         for l in frequency_list: | ||||
|             df += int(l) | ||||
|             if df not in frequency_count: | ||||
|                 frequency_count[df] = 1 | ||||
|             else: | ||||
|                 frequency_count[df] = frequency_count[df] + 1 | ||||
|             if not first: | ||||
|                 if frequency_count[df] >= 2: | ||||
|                     first = df | ||||
|         if df_first_iteration is None: | ||||
|             df_first_iteration = df | ||||
|     print(df_first_iteration) | ||||
|     if first is not None: | ||||
|         print("First duplicate frequency: {}".format(first)) | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     delta_frequency() | ||||
|  | @ -0,0 +1,957 @@ | |||
| -5 | ||||
| -2 | ||||
| +1 | ||||
| +14 | ||||
| +7 | ||||
| +5 | ||||
| -14 | ||||
| -4 | ||||
| -5 | ||||
| -12 | ||||
| +7 | ||||
| -5 | ||||
| +17 | ||||
| +5 | ||||
| -13 | ||||
| -12 | ||||
| +15 | ||||
| +22 | ||||
| -5 | ||||
| -6 | ||||
| -12 | ||||
| +20 | ||||
| +4 | ||||
| +2 | ||||
| +17 | ||||
| -1 | ||||
| +18 | ||||
| -7 | ||||
| -1 | ||||
| -17 | ||||
| +11 | ||||
| -12 | ||||
| -5 | ||||
| -2 | ||||
| +9 | ||||
| +2 | ||||
| -6 | ||||
| -17 | ||||
| -1 | ||||
| +2 | ||||
| -3 | ||||
| +15 | ||||
| +19 | ||||
| +9 | ||||
| -8 | ||||
| +13 | ||||
| +1 | ||||
| +11 | ||||
| +16 | ||||
| +3 | ||||
| -16 | ||||
| -7 | ||||
| -15 | ||||
| -15 | ||||
| +12 | ||||
| +16 | ||||
| +18 | ||||
| +1 | ||||
| -9 | ||||
| +16 | ||||
| -9 | ||||
| -19 | ||||
| +17 | ||||
| +1 | ||||
| -15 | ||||
| +13 | ||||
| -9 | ||||
| -8 | ||||
| -1 | ||||
| +7 | ||||
| +17 | ||||
| +13 | ||||
| +15 | ||||
| -17 | ||||
| -3 | ||||
| +12 | ||||
| -10 | ||||
| +5 | ||||
| +4 | ||||
| -16 | ||||
| +15 | ||||
| +3 | ||||
| +19 | ||||
| +1 | ||||
| -2 | ||||
| +19 | ||||
| -16 | ||||
| -11 | ||||
| +4 | ||||
| -10 | ||||
| -8 | ||||
| +13 | ||||
| +13 | ||||
| +19 | ||||
| -6 | ||||
| -19 | ||||
| +1 | ||||
| -4 | ||||
| +18 | ||||
| +15 | ||||
| +16 | ||||
| -18 | ||||
| +12 | ||||
| +3 | ||||
| -9 | ||||
| +8 | ||||
| +3 | ||||
| -9 | ||||
| +11 | ||||
| +4 | ||||
| +8 | ||||
| +1 | ||||
| +6 | ||||
| -10 | ||||
| -3 | ||||
| +15 | ||||
| +16 | ||||
| +15 | ||||
| +12 | ||||
| -14 | ||||
| +4 | ||||
| -14 | ||||
| -7 | ||||
| -3 | ||||
| +14 | ||||
| +4 | ||||
| +3 | ||||
| -6 | ||||
| -7 | ||||
| +11 | ||||
| -2 | ||||
| -18 | ||||
| +17 | ||||
| -3 | ||||
| +14 | ||||
| +18 | ||||
| +6 | ||||
| +8 | ||||
| +18 | ||||
| -13 | ||||
| -7 | ||||
| +17 | ||||
| -18 | ||||
| -10 | ||||
| -15 | ||||
| +13 | ||||
| -16 | ||||
| +5 | ||||
| -10 | ||||
| +15 | ||||
| -8 | ||||
| -4 | ||||
| +14 | ||||
| +13 | ||||
| -10 | ||||
| -14 | ||||
| +7 | ||||
| +5 | ||||
| +13 | ||||
| -4 | ||||
| +12 | ||||
| +3 | ||||
| +14 | ||||
| -7 | ||||
| +6 | ||||
| +12 | ||||
| +17 | ||||
| -18 | ||||
| +3 | ||||
| -6 | ||||
| -3 | ||||
| -14 | ||||
| -1 | ||||
| +13 | ||||
| +19 | ||||
| +3 | ||||
| +9 | ||||
| +4 | ||||
| +11 | ||||
| +12 | ||||
| +3 | ||||
| +1 | ||||
| +14 | ||||
| +7 | ||||
| -17 | ||||
| +12 | ||||
| +11 | ||||
| +6 | ||||
| -7 | ||||
| +4 | ||||
| -11 | ||||
| -1 | ||||
| +6 | ||||
| -19 | ||||
| -10 | ||||
| -16 | ||||
| -2 | ||||
| -19 | ||||
| +7 | ||||
| +9 | ||||
| -3 | ||||
| +5 | ||||
| +12 | ||||
| +15 | ||||
| +8 | ||||
| +11 | ||||
| +1 | ||||
| +8 | ||||
| +15 | ||||
| -9 | ||||
| -9 | ||||
| -8 | ||||
| -10 | ||||
| -3 | ||||
| -16 | ||||
| +7 | ||||
| -17 | ||||
| +9 | ||||
| -5 | ||||
| +16 | ||||
| -15 | ||||
| -4 | ||||
| +15 | ||||
| -5 | ||||
| -25 | ||||
| -6 | ||||
| +1 | ||||
| +4 | ||||
| +17 | ||||
| +19 | ||||
| -13 | ||||
| +17 | ||||
| +7 | ||||
| +19 | ||||
| +2 | ||||
| +4 | ||||
| +10 | ||||
| +16 | ||||
| -9 | ||||
| +19 | ||||
| +13 | ||||
| +3 | ||||
| -10 | ||||
| +9 | ||||
| +5 | ||||
| +1 | ||||
| +18 | ||||
| -11 | ||||
| -14 | ||||
| -4 | ||||
| -5 | ||||
| -13 | ||||
| -7 | ||||
| -12 | ||||
| +2 | ||||
| +3 | ||||
| +6 | ||||
| -16 | ||||
| -1 | ||||
| +13 | ||||
| -10 | ||||
| -4 | ||||
| -1 | ||||
| -3 | ||||
| +9 | ||||
| +22 | ||||
| +4 | ||||
| -18 | ||||
| +17 | ||||
| +11 | ||||
| -21 | ||||
| -17 | ||||
| -18 | ||||
| -8 | ||||
| +12 | ||||
| +6 | ||||
| +15 | ||||
| +12 | ||||
| +10 | ||||
| -7 | ||||
| +18 | ||||
| +10 | ||||
| -8 | ||||
| -10 | ||||
| -18 | ||||
| +11 | ||||
| -17 | ||||
| +25 | ||||
| +15 | ||||
| -9 | ||||
| -19 | ||||
| +38 | ||||
| -3 | ||||
| -6 | ||||
| -23 | ||||
| +34 | ||||
| -25 | ||||
| -5 | ||||
| -12 | ||||
| +25 | ||||
| +14 | ||||
| +17 | ||||
| +30 | ||||
| +3 | ||||
| +9 | ||||
| -8 | ||||
| +16 | ||||
| +21 | ||||
| +21 | ||||
| +4 | ||||
| -12 | ||||
| +23 | ||||
| -13 | ||||
| +9 | ||||
| +3 | ||||
| +6 | ||||
| +13 | ||||
| +15 | ||||
| +6 | ||||
| -7 | ||||
| +15 | ||||
| +12 | ||||
| -10 | ||||
| +13 | ||||
| +12 | ||||
| -7 | ||||
| +13 | ||||
| +4 | ||||
| -9 | ||||
| +18 | ||||
| -10 | ||||
| +5 | ||||
| +8 | ||||
| -7 | ||||
| +2 | ||||
| -14 | ||||
| -12 | ||||
| -1 | ||||
| -6 | ||||
| -16 | ||||
| -18 | ||||
| -3 | ||||
| +1 | ||||
| +12 | ||||
| -6 | ||||
| +15 | ||||
| -17 | ||||
| +15 | ||||
| +13 | ||||
| +6 | ||||
| -15 | ||||
| +26 | ||||
| +1 | ||||
| -21 | ||||
| -3 | ||||
| -21 | ||||
| -4 | ||||
| +14 | ||||
| -1 | ||||
| -19 | ||||
| -11 | ||||
| +13 | ||||
| -10 | ||||
| -14 | ||||
| +2 | ||||
| -17 | ||||
| -23 | ||||
| +25 | ||||
| -16 | ||||
| +8 | ||||
| -30 | ||||
| +17 | ||||
| -44 | ||||
| +13 | ||||
| -19 | ||||
| +5 | ||||
| -9 | ||||
| -12 | ||||
| +10 | ||||
| +14 | ||||
| +17 | ||||
| +24 | ||||
| -15 | ||||
| +7 | ||||
| -61 | ||||
| -103 | ||||
| -18 | ||||
| +21 | ||||
| -22 | ||||
| -6 | ||||
| -9 | ||||
| -6 | ||||
| -9 | ||||
| -7 | ||||
| -15 | ||||
| -17 | ||||
| +4 | ||||
| -1 | ||||
| +10 | ||||
| +8 | ||||
| +14 | ||||
| -4 | ||||
| +15 | ||||
| -16 | ||||
| -6 | ||||
| -16 | ||||
| -15 | ||||
| -12 | ||||
| +15 | ||||
| +10 | ||||
| -15 | ||||
| +3 | ||||
| +15 | ||||
| -10 | ||||
| -17 | ||||
| +3 | ||||
| -5 | ||||
| -12 | ||||
| +4 | ||||
| +3 | ||||
| -37 | ||||
| -7 | ||||
| +14 | ||||
| -18 | ||||
| -8 | ||||
| +6 | ||||
| -11 | ||||
| +14 | ||||
| +30 | ||||
| +7 | ||||
| +23 | ||||
| +39 | ||||
| -12 | ||||
| +11 | ||||
| -8 | ||||
| +11 | ||||
| -1 | ||||
| +56 | ||||
| -28 | ||||
| -12 | ||||
| +7 | ||||
| +34 | ||||
| +47 | ||||
| +21 | ||||
| +88 | ||||
| +61 | ||||
| +18 | ||||
| +10 | ||||
| -99 | ||||
| -287 | ||||
| +26 | ||||
| -858 | ||||
| -209 | ||||
| -61255 | ||||
| +2 | ||||
| -7 | ||||
| -8 | ||||
| +12 | ||||
| +18 | ||||
| +17 | ||||
| -14 | ||||
| -2 | ||||
| +14 | ||||
| +4 | ||||
| +3 | ||||
| +3 | ||||
| -15 | ||||
| +21 | ||||
| +3 | ||||
| +20 | ||||
| +1 | ||||
| +3 | ||||
| -1 | ||||
| -25 | ||||
| -2 | ||||
| +7 | ||||
| -9 | ||||
| +17 | ||||
| -19 | ||||
| -6 | ||||
| -13 | ||||
| +2 | ||||
| -4 | ||||
| -3 | ||||
| -14 | ||||
| -8 | ||||
| +12 | ||||
| -20 | ||||
| +17 | ||||
| -40 | ||||
| +11 | ||||
| +3 | ||||
| -20 | ||||
| -16 | ||||
| -18 | ||||
| -3 | ||||
| -6 | ||||
| -10 | ||||
| +4 | ||||
| +20 | ||||
| -12 | ||||
| -3 | ||||
| +11 | ||||
| +16 | ||||
| -2 | ||||
| +4 | ||||
| -9 | ||||
| +28 | ||||
| -12 | ||||
| +5 | ||||
| +17 | ||||
| -13 | ||||
| +35 | ||||
| +25 | ||||
| +2 | ||||
| +35 | ||||
| -17 | ||||
| -8 | ||||
| +31 | ||||
| +3 | ||||
| -39 | ||||
| -46 | ||||
| +3 | ||||
| -96 | ||||
| -18 | ||||
| -14 | ||||
| -14 | ||||
| -12 | ||||
| +9 | ||||
| +15 | ||||
| +3 | ||||
| +18 | ||||
| -8 | ||||
| +1 | ||||
| -2 | ||||
| -15 | ||||
| +13 | ||||
| +14 | ||||
| -13 | ||||
| -3 | ||||
| +7 | ||||
| -11 | ||||
| -15 | ||||
| -17 | ||||
| -12 | ||||
| -15 | ||||
| -17 | ||||
| +9 | ||||
| +7 | ||||
| -10 | ||||
| -8 | ||||
| -3 | ||||
| +9 | ||||
| +16 | ||||
| +3 | ||||
| +15 | ||||
| -14 | ||||
| -5 | ||||
| -9 | ||||
| +1 | ||||
| -3 | ||||
| +10 | ||||
| +3 | ||||
| -18 | ||||
| -21 | ||||
| -11 | ||||
| +2 | ||||
| -17 | ||||
| -17 | ||||
| -7 | ||||
| -11 | ||||
| +8 | ||||
| +11 | ||||
| -2 | ||||
| -7 | ||||
| -1 | ||||
| -19 | ||||
| -2 | ||||
| -16 | ||||
| +1 | ||||
| +5 | ||||
| +11 | ||||
| +18 | ||||
| +5 | ||||
| +17 | ||||
| +2 | ||||
| -5 | ||||
| -2 | ||||
| +19 | ||||
| -4 | ||||
| +12 | ||||
| +2 | ||||
| +20 | ||||
| -13 | ||||
| -20 | ||||
| -12 | ||||
| +10 | ||||
| +4 | ||||
| +14 | ||||
| -1 | ||||
| +12 | ||||
| +13 | ||||
| -10 | ||||
| -13 | ||||
| -8 | ||||
| -1 | ||||
| +14 | ||||
| +16 | ||||
| +6 | ||||
| +10 | ||||
| +18 | ||||
| +19 | ||||
| +14 | ||||
| -1 | ||||
| +6 | ||||
| -13 | ||||
| -9 | ||||
| +10 | ||||
| -20 | ||||
| +1 | ||||
| +1 | ||||
| -12 | ||||
| +6 | ||||
| +7 | ||||
| -15 | ||||
| -13 | ||||
| -2 | ||||
| +14 | ||||
| -19 | ||||
| -5 | ||||
| -10 | ||||
| -17 | ||||
| +15 | ||||
| -5 | ||||
| +8 | ||||
| +20 | ||||
| +9 | ||||
| +14 | ||||
| -6 | ||||
| +4 | ||||
| -3 | ||||
| +19 | ||||
| +18 | ||||
| -14 | ||||
| -3 | ||||
| -8 | ||||
| +4 | ||||
| +16 | ||||
| +7 | ||||
| -3 | ||||
| -5 | ||||
| +19 | ||||
| -2 | ||||
| +12 | ||||
| +19 | ||||
| +12 | ||||
| -10 | ||||
| -17 | ||||
| -40 | ||||
| +1 | ||||
| -11 | ||||
| +19 | ||||
| -27 | ||||
| -9 | ||||
| +45 | ||||
| -27 | ||||
| +31 | ||||
| +1 | ||||
| -25 | ||||
| +41 | ||||
| +58 | ||||
| -5 | ||||
| -39 | ||||
| -112 | ||||
| +1 | ||||
| -8 | ||||
| -3 | ||||
| -6 | ||||
| -15 | ||||
| -3 | ||||
| -9 | ||||
| +13 | ||||
| +13 | ||||
| -24 | ||||
| +3 | ||||
| -4 | ||||
| +13 | ||||
| -19 | ||||
| -21 | ||||
| +16 | ||||
| -20 | ||||
| -10 | ||||
| -15 | ||||
| -16 | ||||
| -1 | ||||
| -13 | ||||
| -12 | ||||
| -17 | ||||
| +16 | ||||
| +17 | ||||
| +16 | ||||
| -2 | ||||
| -9 | ||||
| -1 | ||||
| -19 | ||||
| +8 | ||||
| +5 | ||||
| -18 | ||||
| +17 | ||||
| -19 | ||||
| -19 | ||||
| -12 | ||||
| +14 | ||||
| -18 | ||||
| -12 | ||||
| +10 | ||||
| +9 | ||||
| -13 | ||||
| -8 | ||||
| +19 | ||||
| +16 | ||||
| +13 | ||||
| -5 | ||||
| +2 | ||||
| +16 | ||||
| -15 | ||||
| +17 | ||||
| +9 | ||||
| +10 | ||||
| +2 | ||||
| -5 | ||||
| +20 | ||||
| +16 | ||||
| -8 | ||||
| -4 | ||||
| +16 | ||||
| +6 | ||||
| -7 | ||||
| -2 | ||||
| -11 | ||||
| +18 | ||||
| +11 | ||||
| -1 | ||||
| +2 | ||||
| +5 | ||||
| +3 | ||||
| +40 | ||||
| -38 | ||||
| +22 | ||||
| -11 | ||||
| -15 | ||||
| -27 | ||||
| +7 | ||||
| -25 | ||||
| +4 | ||||
| -11 | ||||
| -15 | ||||
| -12 | ||||
| +15 | ||||
| -20 | ||||
| -13 | ||||
| +9 | ||||
| -13 | ||||
| +7 | ||||
| -5 | ||||
| +10 | ||||
| +18 | ||||
| +24 | ||||
| +8 | ||||
| +15 | ||||
| -6 | ||||
| -10 | ||||
| -10 | ||||
| -1 | ||||
| -4 | ||||
| -3 | ||||
| -17 | ||||
| +7 | ||||
| -15 | ||||
| +20 | ||||
| -19 | ||||
| -18 | ||||
| -14 | ||||
| -4 | ||||
| -26 | ||||
| -22 | ||||
| -5 | ||||
| +17 | ||||
| +6 | ||||
| +13 | ||||
| +9 | ||||
| +7 | ||||
| +28 | ||||
| -11 | ||||
| -8 | ||||
| +57 | ||||
| -23 | ||||
| -37 | ||||
| -11 | ||||
| -43 | ||||
| +3 | ||||
| -14 | ||||
| +3 | ||||
| -14 | ||||
| +13 | ||||
| -15 | ||||
| +6 | ||||
| -23 | ||||
| +8 | ||||
| +12 | ||||
| -8 | ||||
| +15 | ||||
| +16 | ||||
| +2 | ||||
| -9 | ||||
| -14 | ||||
| +18 | ||||
| +19 | ||||
| -1 | ||||
| -43 | ||||
| -2 | ||||
| -3 | ||||
| -13 | ||||
| +5 | ||||
| -6 | ||||
| -13 | ||||
| -20 | ||||
| +15 | ||||
| +13 | ||||
| -12 | ||||
| +3 | ||||
| +2 | ||||
| +3 | ||||
| +11 | ||||
| +7 | ||||
| -17 | ||||
| -8 | ||||
| -13 | ||||
| +18 | ||||
| -17 | ||||
| -2 | ||||
| -13 | ||||
| +5 | ||||
| +3 | ||||
| +1 | ||||
| -11 | ||||
| +20 | ||||
| +4 | ||||
| +2 | ||||
| -1 | ||||
| -19 | ||||
| -8 | ||||
| -19 | ||||
| +1 | ||||
| -6 | ||||
| -12 | ||||
| +8 | ||||
| -6 | ||||
| -5 | ||||
| +1 | ||||
| +6 | ||||
| +9 | ||||
| -12 | ||||
| +13 | ||||
| +10 | ||||
| -14 | ||||
| +20 | ||||
| -11 | ||||
| +9 | ||||
| +9 | ||||
| -3 | ||||
| -18 | ||||
| +9 | ||||
| -5 | ||||
| +9 | ||||
| +2 | ||||
| -9 | ||||
| -19 | ||||
| -4 | ||||
| -10 | ||||
| +7 | ||||
| -8 | ||||
| +68 | ||||
| +30 | ||||
| +2 | ||||
| -9 | ||||
| +12 | ||||
| -65 | ||||
| +15 | ||||
| -26 | ||||
| -9 | ||||
| -15 | ||||
| -67 | ||||
| -38 | ||||
| -36 | ||||
| -37 | ||||
| -7 | ||||
| +18 | ||||
| -20 | ||||
| -44 | ||||
| +35 | ||||
| -70 | ||||
| -85 | ||||
| +14 | ||||
| +18 | ||||
| -499 | ||||
| +209 | ||||
| -61690 | ||||
| -5 | ||||
| +15 | ||||
| -4 | ||||
| +3 | ||||
| +5 | ||||
| +6 | ||||
| +15 | ||||
| +16 | ||||
| +3 | ||||
| -4 | ||||
| +12 | ||||
| -14 | ||||
| -7 | ||||
| -9 | ||||
| -15 | ||||
| +2 | ||||
| -1 | ||||
| -11 | ||||
| -21 | ||||
| -8 | ||||
| -2 | ||||
| -15 | ||||
| +19 | ||||
| +7 | ||||
| -10 | ||||
| -19 | ||||
| -3 | ||||
| -14 | ||||
| +4 | ||||
| +9 | ||||
| +13 | ||||
| -16 | ||||
| -14 | ||||
| +2 | ||||
| +10 | ||||
| -19 | ||||
| +6 | ||||
| +16 | ||||
| +11 | ||||
| +7 | ||||
| -14 | ||||
| -9 | ||||
| -21 | ||||
| -7 | ||||
| -12 | ||||
| +2 | ||||
| +12 | ||||
| -6 | ||||
| +125503 | ||||
|  | @ -0,0 +1,65 @@ | |||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| import sys | ||||
| def checksum(l): | ||||
|     double = 0 | ||||
|     triple = 0 | ||||
|     for item in l: | ||||
|         d, t = count_duplicate(item) | ||||
|         double += d | ||||
|         triple += t | ||||
|     return double * triple | ||||
| 
 | ||||
| def count_duplicate(item): | ||||
|     double = 0 | ||||
|     triple = 0 | ||||
|     c = dict() | ||||
|     for i in item: | ||||
|         if i in c: | ||||
|             c[i] += 1 | ||||
|         else: | ||||
|             c[i] = 1 | ||||
|     for k,v in c.items(): | ||||
|         if v == 2: | ||||
|             double = 1 | ||||
|         if v == 3: | ||||
|             triple = 1 | ||||
|     #print(c) | ||||
|     #print("{}: {}, {}".format(item, double, triple)) | ||||
|     return (double, triple) | ||||
| 
 | ||||
| def compare(item, l): | ||||
|     for candidate in l: | ||||
|         if candidate == item: | ||||
|             continue | ||||
|         diff = 0 | ||||
|         x = 0 | ||||
|         while x < len(item): | ||||
|             if item[x] != candidate[x]: | ||||
|                 diff += 1 | ||||
|             x += 1 | ||||
|             if diff > 1: | ||||
|                 break | ||||
|         #if diff > 1: | ||||
|         #    print("{} does not match {}: {} different".format(item, candidate, diff)) | ||||
|         if diff == 1: | ||||
|             return candidate | ||||
| 
 | ||||
| def common(x, y): | ||||
|     i = 0 | ||||
|     common = "" | ||||
|     while i < len(x): | ||||
|         if x[i] == y[i]: | ||||
|             common += x[i] | ||||
|         i += 1 | ||||
|     return common | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     l = sys.stdin.readlines() | ||||
|     print(checksum(l)) | ||||
|     for item in l: | ||||
|         z = compare(item, l) | ||||
|         if z is not None: | ||||
|             print("{} / {}".format(item, z)) | ||||
|             print(common(item, z)) | ||||
|             break | ||||
|  | @ -0,0 +1,250 @@ | |||
| qywzphxoiseldjrbaoagvkmanu | ||||
| qywzphxeisulpjrbtfcgvkmanu | ||||
| qywzxhooiseldjrbtfcgvcmanu | ||||
| qywzphjojseldjubtfcgvkmanu | ||||
| qtwzphxoieeldjrbtfcgvrmanu | ||||
| tywzphzoiseldjritfcgvkmanu | ||||
| qyuzphxoiseldjrbtfcgykbanu | ||||
| qswzmhxoiseldjrbtfcgvkaanu | ||||
| qyczqhxoiseldjrbtfcgvkbanu | ||||
| qybzpqxooseldjrbtfcgvkmanu | ||||
| qywzpoxoxseldjrbtfcgvpmanu | ||||
| qywzphxbipeldjrbtfcgvkmaru | ||||
| qywzpmxoiseldjrutqcgvkmanu | ||||
| qywzphxoisesdjrrtfchvkmanu | ||||
| qywzphxoiseldhrbtfcgukyanu | ||||
| jywzphyoiseldjrbtfclvkmanu | ||||
| qywzvhxoiselrjrbtfcgvkmanl | ||||
| qywzplxojseldjrbtfcgvkmamu | ||||
| qywzphxoiseldjrbtacgvkmvnd | ||||
| qywpphxoiseldjrbtfcgvkvenu | ||||
| qqazphxoiselqjrbtfcgvkmanu | ||||
| qyozvhxoiseldjrbtfcgvkmadu | ||||
| xywzphxliseldjhbtfcgvkmanu | ||||
| qdwzphioiseldqrbtfcgvkmanu | ||||
| qswyphxoiseldjrbtfcgvkmanx | ||||
| qowzshxoiseldjrbtfigvkmanu | ||||
| qywzphxoiseldjjbtfcgvkmawq | ||||
| qyhzphxoiseldjrbtfvgvkmynu | ||||
| qxwzphxoiselmjrbtfcgvqmanu | ||||
| qywzphxoiceldjrbtfcgikmgnu | ||||
| qywephxoiseldjrbthcgvkmane | ||||
| yywzphxoisejdjrotfcgvkmanu | ||||
| qywzxhxoisyldyrbtfcgvkmanu | ||||
| qywzpjxoiseqdjrbtfcgvwmanu | ||||
| qywzphxoqweldprbtfcgvkmanu | ||||
| qywzphnoiseldjrbtfcamkmanu | ||||
| qylgphxoiseldjrbtfcgvkmauu | ||||
| qysdphxomseldjrbtfcgvkmanu | ||||
| lywzpoxoikeldjrbtfcgvkmanu | ||||
| qywzphxgiseldjrbtfeqvkmanu | ||||
| qywzdhxozseldjcbtfcgvkmanu | ||||
| qywzphxeiskedjrbtfcgvkmanu | ||||
| qmwzphxoispldjrbtfcgvkmany | ||||
| qywzphxoiselzcrbtfcgvkmanz | ||||
| qywzphxoisxodjrbtscgvkmanu | ||||
| qywzphxoiseldjrrtfcgmkmaeu | ||||
| aywzphxoiseldjrbtfmjvkmanu | ||||
| qywzthxoiiewdjrbtfcgvkmanu | ||||
| qywzpsxoisrzdjrbtfcgvkmanu | ||||
| qywzphxoiseldjkbtqcgvkmank | ||||
| tywzphxoisewdjkbtfcgvkmanu | ||||
| qywkchxoiseldjrbtfcghkmanu | ||||
| qywzphxoiseldjoftfrgvkmanu | ||||
| qywzpixoisehdjrbtfcgvkmacu | ||||
| qywzchooiseldarbtfcgvkmanu | ||||
| qywyphtoaseldjrbtfcgvkmanu | ||||
| qywyphxotsbldjrbtfcgvkmanu | ||||
| qywzphxoiseldjrbhsggvkmanu | ||||
| dywzphxoiseldjrktfegvkmanu | ||||
| qywzphxoiseldjrmtfcgvkcenu | ||||
| qywcphxjiseldjybtfcgvkmanu | ||||
| qywzphxoiseldhrbsfogvkmanu | ||||
| qmwzpheoiseldjrrtfcgvkmanu | ||||
| qywzrhxoiselpjrbtfcgvemanu | ||||
| qyezphpoiseldjrbtfcgvdmanu | ||||
| qywzphxvisewdjrbtfcgvkmdnu | ||||
| qywzphkoiseldjrbtfcgvkmdnh | ||||
| qywzehxoiseldfrbtpcgvkmanu | ||||
| qywzphxoiseldjrrtfcgvrdanu | ||||
| qpwzphxoizeldjqbtfcgvkmanu | ||||
| qywzphxojseldjrbtmcgvkmvnu | ||||
| vywzphxoiseldjrbtfcgvkmaop | ||||
| sywzphxoiselbjrttfcgvkmanu | ||||
| qywwphkoiseldjrbtfcivkmanu | ||||
| qlwkpcxoiseldjrbtfcgvkmanu | ||||
| qywzphxoiyesdjrbtfcgvkmvnu | ||||
| qywzphxoiseldjrbofcgrkmrnu | ||||
| qywzphxyiseldjrstfcgvkmjnu | ||||
| qywzphaoiseldtrbnfcgvkmanu | ||||
| qywzphxhisuldurbtfcgvkmanu | ||||
| qywzphxdiseldjrbtvugvkmanu | ||||
| qywzpzxbiseldjrbtfcgukmanu | ||||
| qyrzphxoixeldjrbtfcgvumanu | ||||
| qywzphxoiberdjrptfcgvkmanu | ||||
| qywzphxfiskldjrbtfcgvkmdnu | ||||
| qyxzphxoiseldjrdhfcgvkmanu | ||||
| qywzphrqiseldjrbtfcgvbmanu | ||||
| qyezphxviseldjrbtfcgvkmani | ||||
| qywgphxoiseldgkbtfcgvkmanu | ||||
| qywzphxoileldjrbtgcgvkdanu | ||||
| qywzphxoiseldnrbtfcwvkmpnu | ||||
| qywzphxoiseidjrbmfcqvkmanu | ||||
| qywzpkxoiselijrbtfcgvlmanu | ||||
| mywzphxoiveldjrbtfcgvkmunu | ||||
| qywzphxooseddjrbtfcgpkmanu | ||||
| qywzphxokseldjritfcyvkmanu | ||||
| qywzxhxoiseldjrbtfqgvcmanu | ||||
| qywzphxoisfldjrbpfcgvkmaju | ||||
| qywuphxgiseldjrbffcgvkmanu | ||||
| qywzphociseldjrbtfcgvkuanu | ||||
| qywzphxoiseldvrbtftgckmanu | ||||
| qywzpbxoisrldjrbtfngvkmanu | ||||
| qywzphxoiseldjrntfygvdmanu | ||||
| qywzphxviseldkrbtfcgvkianu | ||||
| qywpphxgiseldjrbtfctvkmanu | ||||
| qywzphxoicewdjrbtfcgvsmanu | ||||
| qywzpcxoiseldjmbtfcgvcmanu | ||||
| qrwzphxoiseldjrbtfcgjumanu | ||||
| qywzphxoiselojrbtfcgxkmaau | ||||
| qywzphxojsbldjrbtfcgykmanu | ||||
| oywzphxoiseldjrbtfqgvkmvnu | ||||
| qywfphxpiseldjrbtfckvkmanu | ||||
| qyyzwhxwiseldjrbtfcgvkmanu | ||||
| qywzphxgiseldjrbtfchvkmabu | ||||
| qywzphxfiseldjrbtfcgukoanu | ||||
| qywzpdxoisyldjrbtfcgvkxanu | ||||
| dyuzphxoiseldjrbtfcgvkmamu | ||||
| qywzphxoiseldjrbifcgvkmnnp | ||||
| qywzpyxoiseldjrbtfcgvklano | ||||
| dywzphxoiieldjrbtfcgvwmanu | ||||
| qywzphxoihemdjrbtfcgvdmanu | ||||
| gywzphxoxseldvrbtfcgvkmanu | ||||
| qywzqhxoissldjwbtfcgvkmanu | ||||
| eywzphxoiieldjrbtfcgekmanu | ||||
| qyizprxciseldjrbtfcgvkmanu | ||||
| qywjphxoiseldjrbtfcgckmano | ||||
| qywznhxoiseldjrbrfcgvkmagu | ||||
| qywzphxoisrldjdbvfcgvkmanu | ||||
| qyyxphxoiseldjrbtwcgvkmanu | ||||
| qywzphxoiseldjdbtfcpvkmjnu | ||||
| qywzvhxqiseldjrbofcgvkmanu | ||||
| vywzphxoiseldjrbtfcgckwanu | ||||
| qywzphgbiseldjrbtfcgvkmazu | ||||
| qcwzphxoiseldjrbqfcgvkmdnu | ||||
| qywzphxoismldjrbtfcgkkmznu | ||||
| qywhphxoiseldjrbtccgvkmane | ||||
| qywzphzoiseldjrbtfcgvqmauu | ||||
| hywzphxoiseldjrbtfcuvkmanc | ||||
| qywzphxozsejdgrbtfcgvkmanu | ||||
| qyszphxoiseldjrntfygvdmanu | ||||
| qywzphxoisgldjrbtfcgvklaru | ||||
| qywzhhxoiseldjrbtscgvkmqnu | ||||
| qywjphxpiqeldjrbtfcgvkmanu | ||||
| qywzphxoiseldxrptfclvkmanu | ||||
| qywlphxoisehdjrbtfcgvkmanc | ||||
| qydzpfxoiseldjrwtfcgvkmanu | ||||
| qywzphxoiseldjrbtxcgqkfanu | ||||
| qywophxoiselfjrbtfcgvkmani | ||||
| qywzyhxoiszldtrbtfcgvkmanu | ||||
| qywzphxoxseldfrntfcgvkmanu | ||||
| qywzphloiseldjqbtfcgvkmtnu | ||||
| qywzpuxoiseldorbtfcgvkeanu | ||||
| qywzphxoiueldjrwdfcgvkmanu | ||||
| qgwzphxoiseldjmbtncgvkmanu | ||||
| qywzphtggseldjrbtfcgvkmanu | ||||
| qywzphxoisrldjrbtfmgvhmanu | ||||
| qfszphxoiseldjqbtfcgvkmanu | ||||
| qywzphxpisjldjrbxfcgvkmanu | ||||
| qywznhxoisepdjrbtfqgvkmanu | ||||
| qywzphioiseldjabtfcgxkmanu | ||||
| qyizphxaiseldjrbtfcgvkmaxu | ||||
| xywzphxoiqelvjrbtfcgvkmanu | ||||
| quwzphxoiseldjretfcgvkmaau | ||||
| bywzphxoiseldjrbtucgckmanu | ||||
| jywzphxoiseldjrbofcgvkmani | ||||
| qywzphxoiseltjkbtfcgvkmabu | ||||
| eywzphxoiselgjrbtfkgvkmanu | ||||
| qywzphxoisengjrttfcgvkmanu | ||||
| qywzphzoiseldjrbtfcgvkmknk | ||||
| quwdphxoiseldjrbtfcxvkmanu | ||||
| qcwzzhxoiseldjrgtfcgvkmanu | ||||
| qywgphxdiseldjrbtfcgjkmanu | ||||
| qywzpdxoivefdjrbtfcgvkmanu | ||||
| qywzphxoiseldjrbtfdgvjmpnu | ||||
| qfwzphxoiseydkrbtfcgvkmanu | ||||
| qywzphxdiqelqjrbtfcgvkmanu | ||||
| qywzvhxoiseldjrbtfognkmanu | ||||
| qywzphgoiseldjrbcfcgvtmanu | ||||
| qywophxoiseldjrbtpcgvkmank | ||||
| qywzphxoiszldjretfcgvkmabu | ||||
| qywzphxoiseldjhbtfcgvxmawu | ||||
| qcgzphxoiselejrbtfcgvkmanu | ||||
| qywzphxoisepdjrbtfcfvkcanu | ||||
| qivzphxniseldjrbtfcgvkmanu | ||||
| qywzhhxoiseldjrftxcgvkmanu | ||||
| qyazphxciseldjrbtfcgskmanu | ||||
| qywzphxoisoldgrbtfczvkmanu | ||||
| qywzmhxoiseldurbwfcgvkmanu | ||||
| qywzphxoistldjrbwfcgvkranu | ||||
| qywzphxoistedjrbtfcgokmanu | ||||
| qywzqhxodsecdjrbtfcgvkmanu | ||||
| qywzphxtisxldjrbtfcgvkhanu | ||||
| qywzphxoeseldjrtrfcgvkmanu | ||||
| qdwzphxoioeldjrbtfigvkmanu | ||||
| qjwzphxoisbldjrbtfcgvkmanz | ||||
| qywzphxoiseldbrbtfdgvlmanu | ||||
| qywzphxoiselddrbhvcgvkmanu | ||||
| zywzppxoiseldjrdtfcgvkmanu | ||||
| qywzppxqiselkjrbtfcgvkmanu | ||||
| qywzphxoihelbjrbtfcgvkmabu | ||||
| qywzphxoiseldjreyfcgvknanu | ||||
| qywzphxxrseldjrbtfcgvkmagu | ||||
| qywhpfxoiseldjrbtfdgvkmanu | ||||
| qywzphxoisxldjrdtfagvkmanu | ||||
| oywzphxxiseldjrbtfcgvkmaeu | ||||
| qywzphxoiselqirbtfvgvkmanu | ||||
| qywzphxoqseldhrbtfcgvkhanu | ||||
| qywzphxokseldjrbtfxgvkmaju | ||||
| qywzphtoiseldurbtfcfvkmanu | ||||
| qywzphxoiheudjrrtfcgvkmanu | ||||
| qrwzphxzigeldjrbtfcgvkmanu | ||||
| qywzphxoiseldorbtfcgvxmvnu | ||||
| qywzphxoisaldjpbqfcgvkmanu | ||||
| qywuphxoiselljrbtfchvkmanu | ||||
| qywzphxoisaldjrbefcgvkmsnu | ||||
| qywzphxoiteldjrbnfcgvkmanp | ||||
| qywhphxoiselqjrbtfcgvkmagu | ||||
| qywzjhxoisejdjrbtfcgvkmanr | ||||
| qywephaoiseldjrbtfcavkmanu | ||||
| qywcphxoireldjqbtfcgvkmanu | ||||
| qywzphxoiseldirbuicgvkmanu | ||||
| qywzphxoisecvnrbtfcgvkmanu | ||||
| qcwzphxoiseldjrbtfcgvrmaiu | ||||
| qywnphxoiseldjrntftgvkmanu | ||||
| qywzphxhisyldjrbtfcgvkmafu | ||||
| qyhzphxoiseldjrytfcgvkmanq | ||||
| vjwzbhxoiseldjrbtfcgvkmanu | ||||
| qyvzpsxoisuldjrbtfcgvkmanu | ||||
| qywzphxaiseldcrbefcgvkmanu | ||||
| qywzphxoiseldjgbtfsgvkfanu | ||||
| oiwzphxoiseldjrbtfcgvkmcnu | ||||
| qyezphxoiseldjrbtfcqvkmjnu | ||||
| tywzphxriseldzrbtfcgvkmanu | ||||
| yywzphxoiseldjbbtfugvkmanu | ||||
| qywzpfxviseldjrbttcgvkmanu | ||||
| qywzphxoiceldcrbtfugvkmanu | ||||
| qymzphxoiseldjratfcsvkmanu | ||||
| qywzphxoiselxjrbdfcgvkpanu | ||||
| qywzphxoiselujrbtfkgvimanu | ||||
| qywzshyoiseldjrbtfcgpkmanu | ||||
| qywzphxoiselfjrbtfsgvkmant | ||||
| qywpphxoiseldjxbtfcyvkmanu | ||||
| qywzfhxoiselqjrptfcgvkmanu | ||||
| qewzphxoiseldprbtfcgvkmand | ||||
| qywfphxoiseldlrbtfcgvkmgnu | ||||
| qywzphxoiseldjhbtqcovkmanu | ||||
| fywzphxoiseldlrbtfcgvkjanu | ||||
| sywzphxoiseldjrbhfccvkmanu | ||||
| qywzphxoiseldjfbtfcrvkmpnu | ||||
| sywzphxoisrldjrbtfczvkmanu | ||||
|  | @ -0,0 +1,145 @@ | |||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| import collections | ||||
| import numpy | ||||
| import re | ||||
| import sys | ||||
| 
 | ||||
| matrix_size = [1000, 1000] | ||||
| 
 | ||||
| class Claim: | ||||
|     id = None | ||||
|     # Vector2 ish | ||||
|     origin = None | ||||
|     # Vector2 ish | ||||
|     size = None | ||||
|     matrix = None | ||||
|     def __init__(self, id, origin, size): | ||||
|         self.id = id | ||||
|         self.origin = origin | ||||
|         self.size = size | ||||
|         # Not great to stop the matrix for the entire field in memory, | ||||
|         # but it's small enough in this case. | ||||
|         self.matrix = numpy.zeros(matrix_size, dtype = numpy.bool_) | ||||
|         # Set '1' for all positions of | ||||
|         x_offset = 0 | ||||
|         while x_offset < int(size[0]): | ||||
|             y_offset = 0 | ||||
|             while y_offset < int(size[1]): | ||||
|                 position = (int(origin[0]) + x_offset, int(origin[1]) + y_offset) | ||||
|                 #print(position) | ||||
|                 self.matrix.itemset(position, True) | ||||
|                 y_offset += 1 | ||||
|             x_offset += 1 | ||||
| 
 | ||||
|     def all_points(self): | ||||
|         d = {} | ||||
|         x = int(self.origin[0]) | ||||
|         x_max = x + int(self.size[0]) | ||||
|         y_max = int(self.origin[1]) + int(self.size[1]) | ||||
|         while x < x_max: | ||||
|             y = int(self.origin[1]) | ||||
|             while y < y_max: | ||||
|                 d[(x,y)] = 1 | ||||
|                 y += 1 | ||||
|             x += 1 | ||||
|         return d | ||||
| 
 | ||||
|     def does_overlap(self, other): | ||||
|         other_start = other.vertices()[0] | ||||
|         other_end = other.vertices()[3] | ||||
|         # If any vertice is in the area defined by the other start and end, | ||||
|         # the claims overlap in some way. | ||||
|         for v in self.vertices(): | ||||
|             #print("Checking if {} is inside {}, {}".format(v, other_start, other_end)) | ||||
|             if (v[0] >= other_start[0] and v[0] <= other_end[0]) and (v[1] >= other_start[1] and v[1] <= other_end[1]): | ||||
|                 return True | ||||
|         return False | ||||
| 
 | ||||
|     def vertices(self): | ||||
|         return [ | ||||
|             [self.origin[0], self.origin[1]], | ||||
|             [self.origin[0], self.origin[1] + self.size[1]], | ||||
|             [self.origin[0] + self.size[0], self.origin[1]], | ||||
|             [self.origin[0] + self.size[0], self.origin[1] + self.size[1]] | ||||
|         ] | ||||
| 
 | ||||
|     def overlap(self, other): | ||||
|         return numpy.transpose(numpy.nonzero(numpy.logical_and(self.matrix, other.matrix))) | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return "#{} {},{}: {}x{}".format(self.id, int(self.origin[0]), | ||||
|                                          int(self.origin[1]), int(self.size[0]), | ||||
|                                          int(self.size[1])) | ||||
| 
 | ||||
| def read_input(lines, pattern): | ||||
|     r = [] | ||||
|     for l in lines: | ||||
|         m = pattern.match(l) | ||||
|         if m is None: | ||||
|             print('Warning: did not match line "{}"'.format(l)) | ||||
|             continue | ||||
|         r.append( | ||||
|             Claim(m.group('id'), | ||||
|                   numpy.array([m.group('origin_x'), m.group('origin_y')], dtype = int), | ||||
|                   numpy.array([m.group('size_x'), m.group('size_y')], dtype = int) | ||||
|                   ) | ||||
|         ) | ||||
|     return r | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     p = re.compile('^#(?P<id>\d+) @ (?P<origin_x>\d+),(?P<origin_y>\d+): (?P<size_x>\d+)x(?P<size_y>\d+)') | ||||
|     lines = sys.stdin.readlines() | ||||
|     claims = read_input(lines, p) | ||||
|     print("{} claims".format(len(claims))) | ||||
|     other_claims = claims.copy() | ||||
|     checked = 0 | ||||
|     check_count = len(claims) * ((len(claims)-1)/2) | ||||
|     overlapping_points = set() | ||||
|     single_points = set() | ||||
|     counter = collections.Counter() | ||||
|     claimPoints = {} | ||||
|     for claim in claims: | ||||
|         #print(claim.all_points()) | ||||
|         p = set(claim.all_points()) | ||||
|         claimPoints[claim] = p | ||||
|         counter.update(p) | ||||
|     for k, v in counter.items(): | ||||
|         if v >= 2: | ||||
|             overlapping_points.add(k) | ||||
|         else: | ||||
|             single_points.add(k) | ||||
|     print("{} overlapping points, {} single points".format(len(overlapping_points), len(single_points))) | ||||
|     potential_claims = set() | ||||
|     for claim in claims: | ||||
|         pts = claimPoints[claim].intersection(overlapping_points) | ||||
|         print("{}: {} intersecting points".format(claim, len(pts))) | ||||
|         if len(pts) == 0: | ||||
|             potential_claims.add(claim) | ||||
|     for c in potential_claims: | ||||
|         print(c) | ||||
|     #overlaps = {} | ||||
|     #for claim in claims: | ||||
|     #    other_claims.remove(claim) | ||||
|     #    if claim in overlaps.keys(): | ||||
|     #        continue | ||||
|     #    for other in other_claims: | ||||
|     #        if claim in overlaps.keys(): | ||||
|     #            break | ||||
|     #        if other in overlaps.keys(): | ||||
|     #            continue | ||||
|     #        print("Checking {} vs {} ({} current overlaps)".format(claim, other, len(overlaps.keys()))) | ||||
|     #        if numpy.any(claim.overlap(other)): | ||||
|     #            if claim in overlaps: | ||||
|     #                overlaps[claim].append(other) | ||||
|     #            else: | ||||
|     #                overlaps[claim] = [other] | ||||
|     #            if other in overlaps: | ||||
|     #                overlaps[other].append(claim) | ||||
|     #            else: | ||||
|     #                overlaps[other] = [claim] | ||||
|     #for claim in claims: | ||||
|     #    if claim not in overlaps.keys(): | ||||
|     #        print(claim) | ||||
|     #    #unOverlapped = [x for x in claims and x not in overlaps.keys()] | ||||
|     #    #print(unOverlapped) | ||||
|  | @ -0,0 +1,118 @@ | |||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| import collections | ||||
| import datetime | ||||
| import re | ||||
| import sys | ||||
| 
 | ||||
| class Event: | ||||
| 
 | ||||
|     def __init__(self, date, event): | ||||
|         m = re.match('(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2}) (?P<hour>\d{2}):(?P<minute>\d{2})', date) | ||||
|         self.date = datetime.datetime(int(m.group('year')), int(m.group('month')), | ||||
|                                       int(m.group('day')), int(m.group('hour')), | ||||
|                                       int(m.group('minute'))) | ||||
|         self.event = event | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return "[{}] {}".format(self.date, self.event) | ||||
| 
 | ||||
| class Guard: | ||||
| 
 | ||||
|     def __init__(self, id): | ||||
|         self.id = id | ||||
|         self.midnight_sleep = collections.Counter() | ||||
|         self.on_shift = False | ||||
|         self.sleep = False | ||||
| 
 | ||||
|     def start_shift(self, date): | ||||
|         self.on_shift = date | ||||
| 
 | ||||
|     def end_shift(self, date): | ||||
|         self.on_shift = False | ||||
|         if self.sleep: | ||||
|             self.wake_up(date) | ||||
| 
 | ||||
|     def fall_asleep(self, date): | ||||
|         self.sleep = date | ||||
| 
 | ||||
|     def wake_up(self, date): | ||||
|         self.process_sleep(self.sleep, date) | ||||
|         self.sleep = False | ||||
| 
 | ||||
|     def process_sleep(self, start, end): | ||||
|         current_datetime = start | ||||
|         # If the end is outside the start hour, clip it | ||||
|         clip_end = datetime.datetime(start.year, start.month, start.day, start.hour + 1, 0) | ||||
|         clip = False | ||||
|         if clip_end < end: | ||||
|             clip = True | ||||
|             end = clip_end | ||||
|         #print("Processing sleep for guard {} from {} to {} ({})".format( | ||||
|         #    self.id, start, end, clip)) | ||||
|         #print(self.midnight_sleep) | ||||
|         while current_datetime < end: | ||||
|             if current_datetime.hour != 0: | ||||
|                 current_datetime += datetime.timedelta(minutes = 1) | ||||
|                 continue | ||||
|             self.midnight_sleep.update({current_datetime.minute: 1}) | ||||
|             current_datetime += datetime.timedelta(minutes = 1) | ||||
|         #print(self.midnight_sleep) | ||||
| 
 | ||||
|     def total_sleep(self): | ||||
|         return sum(self.midnight_sleep.values()) | ||||
| 
 | ||||
|     def common_minute(self): | ||||
|         r = self.midnight_sleep.most_common(1) | ||||
|         if not r: | ||||
|             r = [(-1, -1)] | ||||
|         return r | ||||
| 
 | ||||
| def replay(events): | ||||
|     guards = {} | ||||
|     current_guard = None | ||||
|     p = re.compile('Guard #(?P<id>\d+) begins shift') | ||||
|     for e in events: | ||||
|         m = p.match(e.event) | ||||
|         if m: | ||||
|             if current_guard: | ||||
|                 current_guard.end_shift(e.date) | ||||
|             # Guard is coming on shift | ||||
|             if m.group('id') in guards.keys(): | ||||
|                 current_guard = guards[m.group('id')] | ||||
|             else: | ||||
|                 current_guard = Guard(m.group('id')) | ||||
|                 guards[m.group('id')] = current_guard | ||||
|             current_guard.start_shift(e.date) | ||||
|             continue | ||||
|         if e.event == 'falls asleep': | ||||
|             current_guard.fall_asleep(e.date) | ||||
|         if e.event == 'wakes up': | ||||
|             current_guard.wake_up(e.date) | ||||
|     return guards | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     lines = sys.stdin.readlines() | ||||
|     p = re.compile('\[(?P<date>\d{4}-\d{2}-\d{2} \d{2}:\d{2})\] (?P<event>.*)') | ||||
|     events = [] | ||||
|     for line in lines: | ||||
|         m = p.match(line) | ||||
|         if not m: | ||||
|             print("Warning line '{}' did not match".format(line)) | ||||
|         else: | ||||
|             events.append(Event(m.group('date'), m.group('event'))) | ||||
|     events.sort(key=lambda e: e.date) | ||||
|     guards = list(replay(events).values()) | ||||
|     #print(guards) | ||||
|     guards.sort(key=lambda g: g.total_sleep()) | ||||
|     for g in guards: | ||||
|         print("{}: {} minutes asleep, most common minute {}".format( | ||||
|             g.id, g.total_sleep(), g.common_minute())) | ||||
|     print('------------------------------------') | ||||
|     guards.sort(key=lambda g: g.common_minute()[0][1] if g.common_minute() else 0) | ||||
|     for g in guards: | ||||
|         print("{}: {} minutes asleep, most common minute {}".format( | ||||
|             g.id, g.total_sleep(), g.common_minute())) | ||||
|     #print(guards[-1].id * guards[-1].common_minute()[0]) | ||||
|     #for e in events: | ||||
|     #    print(e) | ||||
|  | @ -0,0 +1,68 @@ | |||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| import string | ||||
| import sys | ||||
| 
 | ||||
| def react(code, offset = 0): | ||||
|     reacted = False | ||||
|     current = None | ||||
|     previous = None | ||||
|     index = 0 | ||||
|     for c in code[offset:]: | ||||
|         if index < 1: | ||||
|             index += 1 | ||||
|             continue | ||||
|         try: | ||||
|             current = code[index] | ||||
|         except IndexError: | ||||
|             break | ||||
|         previous = code[index-1] | ||||
|         #print("Checking {} & {}".format(previous, current)) | ||||
|         if previous.upper() == current.upper(): | ||||
|             if previous != current: | ||||
|                 #print("{} and {} reacted around index {} ({})".format(previous, current, index, code[index-2:index+2])) | ||||
|                 reacted = True | ||||
|                 break | ||||
|         index += 1 | ||||
|     if reacted: | ||||
|         #start = index - 10 | ||||
|         #if start < 0: | ||||
|         start = 0 | ||||
|         return (True, start, code[:index-1] + code[index+1:]) | ||||
|     else: | ||||
|         return (False, index, code) | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     lines = sys.stdin.readlines() | ||||
|     # Part 1 | ||||
|     #for l in lines: | ||||
|     #    reacted = True | ||||
|     #    code = l.strip() | ||||
|     #    index = 0 | ||||
|     #    iteration = 0 | ||||
|     #    while reacted: | ||||
|     #        (reacted, index, code) = react(code, index) | ||||
|     #        #print("{}, {}, iteration {}".format(reacted, index, iteration)) | ||||
|     #        iteration += 1 | ||||
|     #    print("Resulting code: '{}' ({} iterations) has {} units".format(code, iteration, len(code))) | ||||
|     permutations = {} | ||||
|     for l in lines: | ||||
|         for character in string.ascii_lowercase: | ||||
|             reacted = True | ||||
|             code = l.strip() | ||||
|             code = code.replace(character, '') | ||||
|             code = code.replace(character.upper(), '') | ||||
|             index = 0 | ||||
|             iteration = 0 | ||||
|             while reacted: | ||||
|                 (reacted, index, code) = react(code, index) | ||||
|                 iteration += 1 | ||||
|             permutations[character] = { | ||||
|                 'code': code, | ||||
|                 'size': len(code), | ||||
|                 'iterations': iteration, | ||||
|             } | ||||
|         for character in string.ascii_lowercase: | ||||
|             print("Option {}{} result in code length {} ({} iterations)".format( | ||||
|                 character, character.upper(), permutations[character]['size'], | ||||
|                 permutations[character]['iterations'])) | ||||
		Loading…
	
		Reference in New Issue