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.



Now playing: Gang-Plank Galleon remix (DKC).mp3

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