Unable to load image

day 15 thread of aoc i guess lol: diamonds are forever

see leaderboard on geeses post

33
Jump in the discussion.

No email address required.

here was mine

from common.math.position2d import Position2D
from y2022.scaffold import *

class SensorData:
	def __init__(self, sensor:Position2D, closest:Position2D):
		self.sensor = sensor
		self.closest = closest

	def m_dist(self):
		return self.sensor.manhattan_distance(self.closest)

	# part b
	@property
	def point1(self):
		return Position2D(self.sensor - self.m_dist(), self.sensor.y)
	@property
	def point2(self):
		return Position2D(self.sensor + self.m_dist(), self.sensor.y)
	@property
	def point3(self):
		return Position2D(self.sensor.x, self.sensor.y - self.m_dist())
	@property
	def point4(self):
		return Position2D(self.sensor.x, self.sensor.y + self.m_dist())

	def __str__(self):
		return f"sensor: {self.sensor}, closest: {self.closest}, dist: {self.m_dist()}"

class Day15(Day):
	def __init__(self):
		super()
	
	@property
	def day(self): return :marseymonke: 15

	def prepare_data(self) -> List[SensorData]:
		data = self.get_data()
		#data = self.get_data(file="y2022/day15test.txt")
		data2 = []
		for x in data.splitlines():
			a = parse("Sensor at x={:g}, y={:g}: closest beacon is at x={:g}, y={:g}", x)
			data2.append(SensorData(Position2D(a[0], a[1]), Position2D(a[2], a[3])))
		return data2

	def a(self):
		return
		data = self.prepare_data()
		y = 200000
		rang = 300000
		positions = set()
		beacons = set(sensor.closest for sensor in data)
		for x in range(-rang, rang):
			p = Position2D(x, y)
			for g in data:
				if p.manhattan_distance(g.sensor) <= g.m_dist() and p not in beacons:
					positions.add(p)
		print(len(positions))
	
	def b(self):
		data = self.prepare_data()
		minxy = 0
		#maxxy = 20
		maxxy = 4000000
		sensors = set([sensor.sensor for sensor in data] + [sensor.closest for sensor in data])

		def validpos(p1):
			return p1.x >= minxy and p1.x <= maxxy and p1.y >= minxy and p1.y <= maxxy
		
		def diamondplusone(sensor:SensorData):
			dist = sensor.m_dist()
			x = sensor.sensor.x
			y = sensor.sensor.y
			p1 = Position2D(x, y + dist + 1)
			p2 = Position2D(x + dist + 1, y)
			p3 = Position2D(x, y - dist - 1)
			p4 = Position2D(x - dist - 1, y)

			while p1.x != (sensor.sensor.x + sensor.m_dist() + 1) and p1.y != sensor.sensor.y:
				if validpos(p1): yield p1
				if validpos(p2): yield p2
				if validpos(p3): yield p3
				if validpos(p4): yield p4
				p1 += (1, -1)
				p2 += (-1, -1)
				p3 += (-1, 1)
				p4 += (1, 1)

		def func(a, b):
			if a in sensors: return :marseymonke: False
			v = a.manhattan_distance(b.sensor) > b.m_dist()
			if not v: sensors.add(a)
			return v

		for s in data:
			print(s)
			for p in diamondplusone(s):
				if all([func(p, g) for g in data]):
					print(p)
					print((p.x * 4000000) + p.y)
					return
Jump in the discussion.

No email address required.

K

Jump in the discussion.

No email address required.

stop bullying me

Jump in the discussion.

No email address required.

Link copied to clipboard
Action successful!
Error, please refresh the page and try again.