Další upřesnění specifikace

This commit is contained in:
Jakub Pelc 2025-03-06 10:03:56 +01:00
parent 7592365228
commit 86afa8b332

View file

@ -42,6 +42,20 @@ class BoundingBox: # (okraj)
max_y: int
```
A tyto funkce:
```python
def distance_squared(x1, y1, x2=0, y2=0) -> int:
"""Squared Euclidean distance between two points."""
return (int(x1) - int(x2)) ** 2 + (int(y1) - int(y2)) ** 2
```
```python
def euclidean_distance(x1, y1, x2=0, y2=0):
"""Integer Euclidean distance between two points. Uses integer square root."""
return int(isqrt(distance_squared(x1, y1, x2, y2)))
```
## Simulace
Každý krok simulace lze rozdělit do následujících tří fází:
@ -104,10 +118,15 @@ Iterujeme přes všechny cíle `goal` a označíme je jako dosažené, pokud `eu
### Poznámky
Všimněte si, že simulace používá několik neintuitivních zjednodušení:
Všimněte si, že simulace má několik neintuitivních zjednodušení a vlastností:
- při úvodním posunu lodi o její rychlost **nekontrolujeme** kolize
- kolize kontrolujeme až jako průsečík finální pozice lodi s asteroidy či cíle
- při kolizi s asteroidem se loď **neodrazí**, tedy nezmění se směr její rychlosti
- při řešení kolizí loď pouze posouváme ven z asteroidů
- při kolizi nezáleží na tom, v jaké fázi řešení podkroků vydělíme rychlost lodi dvěma
- Při úvodním posunu lodi o její rychlost **nekontrolujeme** kolize.
- Kolize kontrolujeme až jako průsečík finální pozice lodi s asteroidy či cíle.
- Při kolizi s asteroidem se loď **neodrazí**, tedy nezmění se směr její rychlosti.
- Při řešení kolizí loď pouze posouváme ven z asteroidů.
- Při kolizi nezáleží na tom, v jaké fázi řešení podkroků vydělíme rychlost lodi dvěma.
Dále, pro detekci průsečíku lodi s asteroidem či cílem schválně používáme `euclidean_distance`, která má odmocninu zaokrouhlenou dolů.
Sice by kolize šly počítat exaktně pomocí druhých mocnin vzdálenosti, ale v okrajových případech bychom naráželi na limity velikosti čísel.
Naše rustová (vyhodnocovadlo) i typescriptová (webová vizualizace) implementace používá místo exaktní `isqrt` klasickou float64 odmocninu, kterou poté zaokrouhlíme dolů na celé číslo.