Idź do przeciwległego rogu prostokąta we wszystkich kierunkach - trudniej

17

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 Xdo 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!

ericw31415
źródło
7
Nie jest, rozwiązania będą wymagać DUŻEJ edycji
Blue
4
To wyzwanie, podobnie jak sugerowany duplikat, jest banalnie prostym problemem, który nie jest trywialny dla golfa, co jest świetną kombinacją. Pomimo podobieństwa to wyzwanie wymaga innego podejścia i nie można w trywialny sposób poprawić rozwiązań z poprzedniego golfa, aby były konkurencyjne.
trichoplax
Mógłby to zrobić z bardziej wyróżniającym się tytułem ...
trichoplax
tak, jakieś pomysły?
ericw31415
1
@LuisMendo Minimum to najmniejsza możliwa siatka; 1 do 1.
ericw31415

Odpowiedzi:

1

MATL , 38 bajtów

'.#X'!iSPXytf0)Jh1w(tzqDQI1()Gd0<?!]XP

Wypróbuj online!

Wyjaśnienie

Pozwolić mi nbyć posortowanymi danymi wejściowymi, takimi, które msą większe lub równe n. Kod początkowo tworzy macierz mx nw następujący sposób:

  • Wartość 2 wzdłuż głównej przekątnej i w dolnej części ostatniej kolumny. To odpowiada postaci #. Liczba tych wpisów minus 1 to liczba ruchów.
  • Wartość 3 na wejściu (1,1), odpowiadająca X.
  • Pozostałe wpisy zawierają 1, odpowiadający znakowi .

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 Xpojawia 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.

'.#X'    % push this string
!        % transpose into a column
i        % input array
SP       % sort it in non-increasing order
Xy       % identity matrix with that size: fill diagonal with 1, rest entries are 0
tf0)     % linear index of last 1
Jh       % append 1j (imaginary unit): linear index of lowest part of last column
1w(      % fill those entries with 1
tzq      % duplicate. Number of nonzero entries minus 1: this is the move count
D        % display move count (and remove it from the stack)
Q        % add 1. Matrix now contains values 1 and 2
I1(      % set first entry (in linear order) to value 3
)        % use matrix as index into the initial string. Gives 2D char array
Gd0<     % push input array again. Is it decreasing?
?        % if so
  !      %   transpose char array
]        % end
XP       % flip upside down. Implicitly display
Luis Mendo
źródło
1
To nie mówi, że ruch się liczy ...?
ericw31415
@ ericw31415 Przepraszamy. Rozwiązany teraz
Luis Mendo
5

Pyth, 46 45 44 bajtów

eSKtMQjsM_mm?sJ,kd?q#J.umtWbbNeSKK\#\.\XhQeQ

Wypróbuj tutaj.

Wyjaśnienie:

move-count-printing:

  K     assign K to...
     Q  the input, a 2-length array...
   tM   with each element decremented
eS      take the max and output it (this is the number of moves)


main path-finding logic:

    mm                     hQeQ  map over x-values and y-values...
        J,kd                     assign J to [x,y]
      ?s                         if both x and y are NOT zero (sum is truthy)...
            ?q#J[...]              if [x,y] is present in [...] (see below)...
                     \#            ... put a # at this position in the output
                       \.          ... else, put a . at this position
                         \X      ... else, put the X here (at [0,0])
jsM_                             reverse and output in the proper format


the [...] part in the code above, which finds positions where #s go:

.u      eSKK  cumulative reduce on <number of moves> elements, starting at K,
                which is [max_x, max_y] as assigned at the beginning
  m    N      map over x and y...
   tWbb       decrement, only if the value is > 0
Klamka
źródło
2

JavaScript (ES6), 132

Edytuj 2 bajty zapisane thx @ Neil

(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

Test

f=(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

function test() {
  var w,h
  [w,h]=I.value.match(/\d+/g)
  O.textContent=f(w,h)
}  

test()
Test <input id=I value="4 5"><button onclick="test()">-></button>
<pre id=O></pre>

edc65
źródło
Zaoszczędź 2 bajty, przenosząc w--,R=... do map().
Neil
0

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

(x,y)=>{r=x-1;s=y-1;m=Math.max(r,s);n=Math.min(r,s);l=_.RangeDown(s,y).WriteLine(z=>_.Range(0,x).Write("",w=>z==0&&w==0?"X":(z==w||(z==s&&w>=n)||(w==r&&z>=n))?"#":"."));return l+"\r\nMove count: "+(l.length-l.split("#").join("").length)}

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 ...

wprowadź opis zdjęcia tutaj

applejacks01
źródło
0

Python 3, 161 156 bajtów

def f(w,h):
 x=[['.']*w for i in[0]*h];i=0
 while i<w or i<h:x[~min(i,h-1)][min(i,w-1)]=['#','X'][i<1];i+=1
 for i in x:print(''.join(i))
 print(max(w,h)-1)

Funkcja, 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 indeksem ii 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

TheBikingViking
źródło