Zgodnie z prośbą Luke'a i dodatkiem Petera Taylora do tego wyzwania.
Wprowadzenie
Wszyscy znają grę w kółko i krzyżyk, ale w tym wyzwaniu wprowadzimy mały zwrot akcji. Będziemy używać tylko krzyży . Pierwsza osoba, która stawia trzy krzyże z rzędu, przegrywa. Ciekawym faktem jest to, że maksymalna liczba krzyży, zanim ktoś straci, wynosi 6 :
X X -
X - X
- X X
Oznacza to, że dla planszy 3 x 3 maksymalna kwota wynosi 6 . Więc dla N = 3 musimy wyprowadzić 6.
Kolejny przykład, dla N = 4 lub płyty 4 x 4:
X X - X
X X - X
- - - -
X X - X
To optymalne rozwiązanie, widać, że maksymalna liczba krzyży wynosi 9 . Optymalne rozwiązanie dla płyty 12 x 12 to:
X - X - X - X X - X X -
X X - X X - - - X X - X
- X - X - X X - - - X X
X - - - X X - X X - X -
- X X - - - X - - - - X
X X - X X - X - X X - -
- - X X - X - X X - X X
X - - - - X - - - X X -
- X - X X - X X - - - X
X X - - - X X - X - X -
X - X X - - - X X - X X
- X X - X X - X - X - X
Daje to 74 .
Zadanie
Twoim zadaniem jest jak najszybsze obliczenie wyników. Uruchomię twój kod na przypadku testowym 13
. Zostanie to wykonane 5 razy, a następnie zostanie pobrana średnia z czasów pracy. To twój końcowy wynik. Im niższy, tym lepiej.
Przypadki testowe
N Output
1 1
2 4
3 6
4 9
5 16
6 20
7 26
8 36
9 42
10 52
11 64
12 74
13 86
14 100
15 114
Więcej informacji można znaleźć na https://oeis.org/A181018 .
Zasady
- Jest to najszybszy kod , więc najszybsze zgłoszenie wygrywa!
- Musisz podać pełny program .
- Podaj także, jak mam uruchomić program. Nie znam wszystkich języków programowania i sposobu ich działania, dlatego potrzebuję tutaj trochę pomocy.
- Oczywiście Twój kod musi obliczyć poprawny wynik dla każdego przypadku testowego.
Zgłoszenia:
- feersum (C ++ 11): 28s
- Peter Taylor (Java): 14m 31s
Odpowiedzi:
C ++ 11, 28s
Wykorzystuje to także dynamiczne podejście programistyczne oparte na wierszach. Uruchomienie argumentu 13 zajęło mi 28 sekund. Moją ulubioną sztuczką jest
next
funkcja, która używa nieco bashowania w celu znalezienia leksykograficznie uporządkowanego następnego wiersza spełniającego maskę i reguły „3 w jednym rzędzie”.Instrukcje
g++ -std=c++11 -march=native -O3 <filename>.cpp -o <executable name>
<executable name> <n>
źródło
Java, 14m 31s
Jest to zasadniczo program, który wysłałem do OEIS po użyciu go do przedłużenia sekwencji, więc jest to dobre odniesienie dla innych osób do pokonania. Poprawiłem go tak, aby przyjmował rozmiar tablicy jako pierwszy argument wiersza poleceń.
Zapisz do
A181018.java
; skompiluj jakojavac A181018.java
; uruchomić jakojava A181018 13
. Na moim komputerze wykonanie tego wejścia zajmuje około 20 minut. Prawdopodobnie warto by to zrównoważyć.źródło
n=16
; Ekstrapolowałem, że zajmie to około miesiącan=17
, więc nie próbowałem tego uruchomić. Wykorzystanie pamięci stało się również poważnym utrapieniem. (PS Obecnie używam 2 z 4 rdzeni do wyzwania programistycznego niezwiązanego z PPCG: azspcs.com/Contest/Tetrahedra/Standings )