mirror of
https://github.com/RussellChamp/advent-of-code-2022.git
synced 2026-10-27 21:52:30 +00:00
day06 solution
This commit is contained in:
1 parent
dfe8eaf2ab
commit
90aad38e16
2 files changed
+105
No files matched your search
@@ -0,0 +1,69 @@
|
||||
# Day 06: Tuning Trouble
|
||||
|
||||
import os
|
||||
|
||||
def get_path():
|
||||
return os.path.join(os.path.dirname(__file__), 'data.txt')
|
||||
|
||||
def all_same(arr):
|
||||
if len(arr) is 0:
|
||||
return False
|
||||
elif len(arr) is 1:
|
||||
return True
|
||||
else:
|
||||
for value in arr:
|
||||
if value is not arr[0]:
|
||||
return False
|
||||
return True
|
||||
|
||||
def all_different(arr):
|
||||
if len(arr) <= 1:
|
||||
return True
|
||||
else:
|
||||
for idx in range(len(arr)):
|
||||
for idz in range(idx+1, len(arr)):
|
||||
# print('%s is %s ? %s ' % (arr[idx], arr[idz], arr[idx][0] is arr[idz][0]))
|
||||
if arr[idx] is arr[idz]:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_unique_straight(size):
|
||||
total = size
|
||||
|
||||
with open(get_path()) as fp:
|
||||
# technically this has a bug if the first set of n characters match it will not detect it
|
||||
# but i'm done working on this puzzle...
|
||||
set = list(fp.read(size))
|
||||
while True:
|
||||
char = fp.read(1)
|
||||
if not char:
|
||||
print('Read entire input file :(')
|
||||
break
|
||||
total += 1
|
||||
# ok i don't understand the black magic happening here but when you call read(1) it will read a single character from input
|
||||
# however, if you compare these characters you'll find that equality is borked
|
||||
# eg comparing `'a' is 'a'` will return False. Why? I don't know! But calling 'a'[0] will return a non-compare borked char instead
|
||||
set = set[1:] + [char[0]]
|
||||
# print('#%d: %s' % (total, set))
|
||||
if total > size -1 and all_different(set):
|
||||
break
|
||||
return total
|
||||
|
||||
def solve_part1():
|
||||
|
||||
total = get_unique_straight(4)
|
||||
|
||||
print ('GOAL: Find the the first start-of-packet marker')
|
||||
print('ANSWER: How many characters need to be processed before the first start-of-packet marker is detected?')
|
||||
print('Total: %d' % (total))
|
||||
|
||||
def solve_part2():
|
||||
total = get_unique_straight(14)
|
||||
|
||||
print('GOAL: Find the start-of-message marker')
|
||||
print('ANSWER: How many characters need to be processed before the first start-of-message marker is detected?')
|
||||
print('Total: %d' % (total))
|
||||
|
||||
if __name__ == '__main__':
|
||||
solve_part1()
|
||||
solve_part2()
|
||||
@@ -0,0 +1,36 @@
|
||||
import unittest
|
||||
import solve
|
||||
|
||||
class Day06TestMethods(unittest.TestCase):
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def test_all_same(self):
|
||||
test_cases = [
|
||||
[False, []],
|
||||
[True, [111]],
|
||||
[True, [1,1,1,1]],
|
||||
[False, [1,2,3,4]],
|
||||
[True, ['a','a','a','a']],
|
||||
[False, ['z', 'd', 'z', 'z']],
|
||||
]
|
||||
for [expected, arr] in test_cases:
|
||||
self.assertEqual(solve.all_same(arr), expected, 'expected %s to be %s' % (arr, expected))
|
||||
|
||||
def test_all_different(self):
|
||||
test_cases = [
|
||||
[True, []],
|
||||
[True, [111]],
|
||||
[False, [1,2,3,1]],
|
||||
[False, [1,1,1,1]],
|
||||
[True, [1,2,3,4]],
|
||||
[False, ['a','a','a','a']],
|
||||
[False, ['p', 'q', 'f', 'f']],
|
||||
[False, ['z', 'd', 'z', 'z']],
|
||||
[True, ['a', 'z', 'd', 'f']]
|
||||
]
|
||||
for [expected, arr] in test_cases:
|
||||
self.assertEqual(solve.all_different(arr), expected, 'expected %s to be %s' % (arr, expected))
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user