Jest to zasadniczo to samo co to pytanie, z wyjątkiem trudniejszych. Ponownie piszesz program, który przechodzi od lewego dolnego rogu prostokąta do prawego górnego rogu. Tym razem dozwolone są ruchy po przekątnej.
Program zaakceptuje uporządkowaną parę (width, height)
i użyje ich jako wymiarów prostokąta. Twój program utworzy następnie sztukę ASCII rozwiązania (użyj .
do pustego kwadratu, #
jako części rozwiązania i X
do kwadratu początkowego) i policz liczbę ruchów potrzebnych do osiągnięcia punktu końcowego.
Przykład
Wejście: (5, 6)
Wynik:
....#
....#
...#.
..#..
.#...
X....
Move count: 5
Najkrótsza odpowiedź w bajtach wygrywa!
Odpowiedzi:
MATL , 38 bajtów
Wypróbuj online!
Wyjaśnienie
Pozwolić
m
in
być posortowanymi danymi wejściowymi, takimi, którem
są większe lub równen
. Kod początkowo tworzy macierzm
xn
w następujący sposób:#
. Liczba tych wpisów minus 1 to liczba ruchów.X
..
W razie potrzeby matryca jest teraz transponowana, dzięki czemu ma pożądany kształt. Zauważ, że pierwszym wymiarem macierzy jest jej wysokość, a nie szerokość, więc odpowiada drugiemu wejściu.
Matryca jest następnie odwracana do góry nogami, tak że
X
pojawia się na dole pierwszej kolumny, a jej wpisy są używane jako indeksy w ciągu,'.#X'
aby utworzyć pożądaną tablicę znaków 2D.źródło
Pyth,
464544 bajtówWypróbuj tutaj.
Wyjaśnienie:
źródło
JavaScript (ES6), 132
Edytuj 2 bajty zapisane thx @ Neil
Test
źródło
w--,R=
... domap()
.JavaScript (przy użyciu zewnętrznej biblioteki) (235 bajtów)
Jezu, to było trudne! Cóż ... moja biblioteka nie była właściwie właściwym zadaniem dla tego haha. Ale podobało mi się wyzwanie
Link do lib: https://github.com/mvegh1/Enumerable
Objaśnienie kodu: Utwórz funkcję 2 zmiennych. Przechowuj x-1 i y-1 w zmiennych. Przechowuj maks. I min tych wartości w zmiennych. Utwórz pionowo malejący zakres liczb od (y-1) dla liczby y. Dla każdego elementu w zakresie pionowym napisz linię dla bieżącego elementu, zgodnie ze predykatem złożonym. Predykat tworzy rosnący zakres liczb całkowitych od 0, dla liczby x. Dla każdego elementu w tym zakresie należy połączyć w 1 łańcuch zgodnie ze złożonym predykatem. Ten predykat sprawdza, czy u dołu po lewej stronie, czy sprawdza, czy na przekątnej, w przeciwnym razie sprawdza, czy jesteśmy na granicy X lub Y. Wreszcie wszystko to zostało zapisane w zmiennej. Następnie, aby uzyskać liczbę ruchów, po prostu liczymy #. Następnie połącz to z przechowywaną zmienną i zwróć wynik
To była kęs haha. Zrzut ekranu ma niepoprawną liczbę bajtów, ponieważ podczas publikowania znalazłem sposób na zaoszczędzenie 4 bajtów
EDYCJA: Widzę, że inne odpowiedzi nie umieszczają w swoich wynikach „Liczba ruchów:”, ale moja jest. Jeśli nie jest to wymagane, goli się kilka bajtów ...
źródło
Python 3,
161156 bajtówFunkcja, która pobiera dane wejściowe poprzez argument i wypisuje ascii-art, a następnie liczbę ruchów do STDOUT.
Jak to działa
Najpierw program tworzy listę list, gdzie każda lista reprezentuje jeden wiersz siatki, a każdy element list komponentów to
.
. Każdy element, który powinien być,#
ma właściwość polegającą na tym, że gdyby siatka wyjściowa była kwadratowa, rzędne reprezentujące jej położenie byłyby równe; dlatego zamiast tego wstawiana jest pętla nad pewnym indeksemi
i wstawianie#
w miejscu . Następnie elementy w każdej linii są łączone, a każda linia jest drukowana do STDOUT. Liczba ruchów to maksymalna zmniejszona szerokość / wysokość; to jest również drukowane.(i, i)
dałoby pożądany wynik. Jednak siatka nie zawsze jest kwadratowa, a zatem indeksy są zaciśnięte na siatce, przyjmując minimum indeksu i szerokość / wysokość (zmniejszoną z powodu indeksowania zerowego) zgodnie z wymaganiami. Jeśli indeks wynosi zero, bieżąca pozycja musi być lewym dolnym wpisem, a zatemX
Wypróbuj na Ideone
źródło