Wyzwanie
Wyzwanie to będzie można napisać program, który odbywa się w dwóch liczb całkowitych n
a m
i wysyła liczbę pętli niekrzyżujące sprawie n
przez m
torus dokonanych przez zaczynając (0,0)
a jedynie podjęcie kroków w górę i w prawo. Możesz myśleć o torusie jak o siatce z zawijaniem u góry iu dołu oraz po bokach.
To jest golf golfowy, więc wygrywa najmniej bajtów.
Przykład
Na przykład, jeśli dane wejściowe to n=m=5
, jeden prawidłowy spacer to
(0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> (2,3) -> (2,4) ->
(2,0) -> (3,0) -> (4,0) -> (4,1) -> (4,2) -> (4,3) ->
(0,3) -> (1,3) -> (1,4) ->
(1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3) -> (3,4) -> (4,4) ->
(0,4) -> (0,0)
jak pokazano na grafice.
Niektóre przykładowe wejścia / wyjścia
f(1,1) = 2 (up or right)
f(1,2) = 2 (up or right-right)
f(2,2) = 4 (up-up, up-right-up-right, right-right, right-up-right-up)
f(2,3) = 7
f(3,3) = 22
f(2,4) = 13
f(3,4) = 66
f(4,4) = 258
code-golf
combinatorics
grid
topology
Peter Kagey
źródło
źródło
Odpowiedzi:
Galaretka , 28 bajtów
Monadyczny link akceptujący listę
[m,n]
, co daje wynik.TIO-jt1qe1v9 ... chociaż nie ma to większego sensu, jest to zbyt mało wydajne.
(Nie mogę nawet uruchomić
[2,3]
lokalnie z 16 GB RAM)!W jaki sposób?
Brute force - tworzy współrzędne wersji kafelkowej wystarczająco duże, następnie filtruje zestaw mocy tych punktów do tych ścieżek, w których sąsiedzi zwiększają się tylko o jeden w jednym kierunku, a następnie filtruje do tych zaczynających się od minimalnej współrzędnej (tj. Początku) i, jednocześnie usuwa tę współrzędną początkową z każdego. Następnie wykorzystuje arytmetykę modulo, aby zawinąć z powrotem do torusa i odfiltrowuje wszelkie zawierające zduplikowane współrzędne (tj. Zawierające przecięcia), a na koniec filtruje do tych o minimalnych współrzędnych końcowych (tj. Kończących się na początku) i zwraca długość wyniku.
źródło
Python 2 , 87 bajtów
Wypróbuj online!
Interesującą rzeczą jest tutaj użycie liczby zespolonej
z
do przechowywania współrzędnych aktualnej pozycji. Możemy przejść w górę, dodając1
i przejść w prawo, dodając1j
. Ku mojemu zaskoczeniu, modulo działa na liczbach zespolonych w sposób, który pozwala nam osobno obsługiwać zawijanie dla każdego wymiaru: wykonując%m
czynności na części rzeczywistej i%(n*1j)
działając na części urojonej.źródło
k:=x+y*m
. Zastanawiam się, czy byłoby to krótsze użyciek
bezpośrednio(x,y)
,x+y*m
zamiast używaćx+y*1j
. Szkoda, że Python 3 nie pozwala na skomplikowany moduł.JavaScript (ES6), 67 bajtów
Pobiera dane wejściowe jako
(m)(n)
.Wypróbuj online!
Aby działało dla dowolnego wejścia, moglibyśmy użyć BigInts dla 73 bajtów :
Wypróbuj online!
JavaScript (ES6),
76 7372 bajtyPobiera dane wejściowe jako
(m)(n)
.Wypróbuj online!
Skomentował
źródło
Haskell,
8880 bajtówWypróbuj online!
Prosta brutalna siła: wypróbuj wszystkie kombinacje góra / prawo, upuszczając te, które się przecinają (utrzymujemy wszystkie pozycje, które odwiedziliśmy na liście
a
) i licząc te, które ostatecznie osiągną pozycję(0,0)
.Podstawowy przypadek rekurencji ma miejsce, gdy odwiedzamy pozycję po raz drugi (
elem(x,y)a
). Wynikiem jest0^0
=1
kiedy pozycja jest(0,0)
i liczy się do liczby pętli lub0
(0^x
zx
niezerową) w przeciwnym razie i nie zwiększa liczby pętli.Edycja: -8 bajtów dzięki @xnor.
źródło
|elem(x,y)a=0^(x+y)
i(0!0)[]
można je łączyć0!0$[]
.Galaretka , 44 bajty
Wypróbuj online!
źródło
Java 8, 120 bajtów
Wypróbuj online.
źródło
CJam (50 znaków)
Demo online . Jest to program, który pobiera dwa wejścia ze standardowego wejścia.
Wreszcie mamy odpowiedź na pytanie
Sekcja
źródło
Galaretka ,
5439 bajtówWypróbuj online!
Opublikowałem to jako osobną odpowiedź na moją drugą galaretkę, ponieważ jest to zupełnie inna metoda. Jest to zasadniczo bliższe odpowiedzi @ Arnauld. Używa funkcji rekurencyjnej, która działa przez każdą możliwą ścieżkę, aż osiągnie punkt, do którego już dotarła, a następnie zwraca wynik sprawdzenia, czy jest z powrotem na początku. Podejrzewam, że kilka innych bajtów można by ogolić. Teraz zmieniono na używanie operatora wycinania. Działa dobrze do 5x5. Głębokość rekurencji powinna wynosić co najwyżej mx n.
źródło