tło
Stany Zjednoczone mają wyjątkową miłość do gerrymanderingu - celowej manipulacji okręgiem wyborczym w celu przewidzenia pewnych wyników głosowania. Niedawno przed Sądem Najwyższym została wniesiona sprawa przestępcza . Gerrymandering, szczególnie gdy jest związany z rasą, jest uznawany za nielegalny i powoduje konieczność przerysowania linii dystryktu.
Biorąc pod uwagę prostokątną mapę gminy (tablica 2d), narysujesz linie okręgów, aby pomóc twojej drużynie uzyskać jak najlepszą reprezentację. To znaczy, będziesz gerrymander. Każda gmina ma dwie strony 0
i 1
. Mapa będzie się składać z kwadratów z jednym 0
lub 1
na nich. Oto przykładowa mapa:
Wyzwanie
Zgrupujesz mapę w dzielnice, aby drużyna 1
otrzymała co najmniej liczbę okręgów określoną przez Wejście.
Wkład
Dane wejściowe będą składały się z mapy, liczby dzielnic do narysowania i minimalnej liczby dzielnic, które 1
partia musi wygrać (minimalny wynik).
Wydajność
Wynikiem będzie mapa dzielnic. Każda dzielnica będzie jednoznacznie składać się z dużej litery alfabetu. Tak, oznacza to, że nie będzie więcej niż 26 dzielnic.
Jeśli nie ma możliwości wyjścia, w przypadku gdy strona, którą wprowadzono, wygrywa wystarczającą liczbę okręgów, albo
- Drukuj „Próbowaliśmy ...”
- Błąd krytyczny, ponieważ partia została nieodwracalnie poszkodowana przez wyniki wyborów
- Lub obydwa
Zasady (również bardzo ważne)
- Wszystkie dzielnice muszą być ciągłe
- Dzielnice mogą nie mieć w sobie innych dzielnic
- Każda dzielnica musi mieć co najmniej cztery węzły. Dane wejściowe będą zgodne z regułami, co oznacza, że będą przynajmniej
number_of_districts * 4
węzły na mapie - Wynik każdej ze stron to liczba okręgów, w których ma większość
- Jeśli dzielnica ma taką samą liczbę
0
s i1
s, wówczas ani korzyści z podmiotami od niego - Normalne zasady oszukiwania
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Przypadki testowe
1. Input 1. Output 2. Input 2. Output 3. Input 3. Output
districts: 5 Image and map districts: 3 Image below districts: 3 fatal error
min wins: 3 min wins: 3 min wins: 3
map: map: map:
00000110000 AAAAAAAAAAA 101101 101101
10000010000 AAAAAAAAAAA 100000 100000
10010000011 AAAAAAAAAAA 011011 011011
11001110000 BBBBBBBAAAA 111111 100111
00111111000 BBBBBBBAAAA
01111111000 CCCCCDDDAAA
01111111001 CCCCCDDDAAA
01000111100 EEEEEDDDDDD
00000001000 EEEEEDDDDDD
Oczywiście twój program powinien działać dla każdego ważnego przypadku testowego, nie tylko tych.
źródło
Odpowiedzi:
R ,
938896858952 bajtówWypróbuj online!
Ogromne
> 900> 800(nie!)> 900 bajtów. Kod działa w następujący sposób. Niech N będzie liczbą okręgów wyborczych, a M minimalną liczbą okręgów, w których 1 chce mieć większość.Po pierwsze, kod losowo przypisuje N dzielnic do różnych grup. Następnie losowo je rozszerza, tzn. Dodaje dzielnicę do losowo wybranej grupy, zapewniając, że dzielnica znajduje się obok dzielnicy już należącej do tej grupy. W procesie ekspansji daje pierwszeństwo dystrykcie z 1 większością, jeśli grupa dystryktów nie ma jeszcze pełnej 1; jeśli grupa ma już pewną 1 większość, wówczas daje pierwszeństwo dzielnicy 0. Trwa do momentu przypisania wszystkich dzielnic.
Każda grupa, w której jest większość dla 1 drużyny, jest przechowywana, a jej dzielnice są zamknięte. Jeśli jest co najmniej M grup z przewagą 1, to wszystko jest dobrze i
możemy wydrukować wynik, możemy sprawdzić, czy w każdej grupie są co najmniej 4 dzielnice. Jeśli granica 4 dzielnic zostanie spełniona, możemy z przyjemnością wydrukować wynik. W przeciwnym razie kod próbuje ponownie przypisać dzielnice, które nie są zablokowane do tylu grup, ile jest dostępnych, tj. N - # przechowywanych grup.Kody próbują kilka razy (9 razy). Jeśli zawiedzie, resetuje wszystko i zaczyna od nowa. Robi to jeszcze 9 razy, zanim zrezygnował i wydrukował „próbowaliśmy ...”.
Jeśli kod początkowo się nie powiedzie, spróbuj ponownie kilka razy. Dostosowałem liczbę powtórzeń, aby można było uruchomić w TIO w ciągu minuty. Jeśli jednak istnieje rozwiązanie, ten kod może (ostatecznie) je znaleźć. Część losowości algorytmu daje niezerowe prawdopodobieństwo, że jeśli istnieje rozwiązanie, może je znaleźć. Ograniczona liczba prób jest jedynym czynnikiem ograniczającym sukces.
EDYCJA: dodano kontrolę, że żadna grupa okręgów nie może być w pełni otoczona przez inną, chyba że grupa okręgów ma dzielnice na skraju danego kwadratu. Myślę, że na początku mi tego brakowało.
źródło
==0
ze<1
gdy zmienna była ściśle całkowita i dodatnia.if...else
instrukcjami, zamianac
naas.vector
, zmienianie"\n"
dosłownych znaków nowej linii oraz korzystanie z faktu, że>
automatycznie przymuszą liczby do znaków w ciszy i porównują ich współrzędne kodowe. Prawdopodobnie zrobiłem kilka innych golfów, których nie pamiętam, ale to dopiero początek. Myślę, że jest jeszcze kilka rzeczy, które możemy ulepszyć, ale nie jestem w 100% pewien, że rozumiem kod ...