Gatunki gęsi znane jako Alex A znane są z przebywania w trójkątnych siatkach składających się z 64 komórek:
(Zdjęcie pochodzi z tego niezwiązanego problemu Euler projektu .)
Będziemy oznaczyć każdą komórkę z numerami 0
, aby 63
począwszy od górnego rzędu, a następnie porusza się od lewej do prawej w każdym wierszu poniżej tego. Tak więc górna komórka jest, 0
a dolna prawa komórka jest 63
.
Każda komórka ma trzy granice. Możemy oznaczyć każdą ramkę w formie, a,b
gdzie a
i gdzie b
są numery komórek, które dzielą tę granicę. Na przykład zostanie wywołana granica między komórką 0
a lub (nie ma znaczenia, w jakiej kolejności je umieścisz).2
0,2
2,0
System etykietowania granic na samej krawędzi siatki jest inny, ponieważ komórki na krawędzi siatki mają granicę, której nie dzielą z innymi komórkami. Jeśli ramka jest tylko częścią jednej komórki, użyjemy litery X
. Na przykład, trzy granice komórki 0
są 0,2
, 0,X
, i 0,X
.
Niektóre komórki zawierają gęsi . Jednak te gęsi zostaną zabite przez złe lisy (które pochodzą spoza granic sieci), jeśli ich nie ochronicie. A jeśli wszystkie gęsi zginą, BrainSteel będzie smutny. Dlatego napiszemy program, który buduje ogrodzenia wokół gęsi, aby chronić je przed lisami. Gęsi powinny istnieć w jednym całkowicie zamkniętym wielokącie ogrodzenia. Nasz budżet na ogrodzenie jest dość niski, więc używaj możliwie najmniejszej liczby ogrodzeń.
Opis wejścia
Lista liczb, oddzielonych przecinkami, od 0
do 63
, reprezentujących komórki zawierające gęsi. Przykład:
6,12
Opis wyjścia
Lista granic, na których trzeba zbudować ogrodzenia, aby skutecznie chronić gęsi. Powinna to być jak najmniejsza liczba ogrodzeń. Przykład:
5,6 6,7 11,12 12,13
Odpowiedzi:
C #, 530 bajtów
Kompletny program w języku C #, pobiera dane wejściowe jako jeden wiersz ze STDIN i wysyła pojedynczy wiersz do STDOUT, z końcowym „”.
To jest dość długie ... i ma zbyt wiele powtórzeń x / y / z, ale do tej pory nie byłem w stanie zredukować go do niczego sensownego, a egzamin za 2 godziny może wrócić do jutra.
Ten schemat wyjaśnia większość tego, co się dzieje.
Zauważ, że ponieważ nie możemy mieć sekcji o szerokości 0, „sześciokąt” zawsze będzie najtańszym kształtem (i ma tę zaletę, że daje gęsi maksymalną przestrzeń do poruszania się).
Program działa najpierw poprzez przetłumaczenie wszystkich indeksów komórek wejściowych na współrzędne x / y / z i znalezienie min / max każdego z x / y / z.
Następnie przechodzi przez indeks każdej komórki i sprawdza, czy pasuje do opisanego powyżej sześciokąta. Jeśli tak, to sprawdza, czy znajduje się na którejś z ekstremalnych krawędzi granic (tj. X = xmin lub y = ymax) i dodaje odpowiednie krawędzie, jeśli tak jest. Musi obliczyć indeks krawędzi obok. W przypadku xiz zwiększamy / zmniejszamy je w dowolny sposób, a następnie stosujemy następującą formułę:
Zauważ, że „parzystość” zawsze się zmienia i że y nie jest zaangażowany. Dla y, nie musimy nic zmieniać, ale kod jest trochę bałaganu, ponieważ musi wykonać granice „trójkąta”, aby sprawdzić, czy komórka obok powinna być „X”, czy nie.
Przykładowe rozwiązanie (Komórki z gęsiami tylko z trzech rogów):
Kod Tidier z komentarzami:
źródło
using System;
.using Q=System.Console;Q.Write();Q.ReadLine()
(45 bajtów) w porównaniu z twoją sugestiąusing System;Console.Write();Console.ReadLine()
(47 bajtów).i
,x
,y
,z
, ip
do 0.