Wstęp dla dzieci
Ilekroć zabieram moje dzieci do wesołego miasteczka, dzieci denerwują się bardziej, gdy jesteśmy bliżej parku, ze szczytem nerwowym, kiedy jesteśmy na parkingu i nie znajdujemy miejsca do parkowania. Zdecydowałem więc, że potrzebuję metody znalezienia najbliższego bezpłatnego miejsca parkingowego, aby zminimalizować czas spędzony na parkowaniu.
Wprowadzenie techniczne
Wyobraź sobie reprezentację parkingu takiego jak ten:
*****************
* *
* ··CC··C··CC·· *
* ************* *
* ··CCCCCCCCC·· *
* *
**********E******
W tym przedstawieniu *
oznacza ścianę, ·
bezpłatne miejsce parkingowe, E
punkt wjazdu i C
już zaparkowany samochód. Każda biała spacja to pozycja, którą może zaparkować samochód, aby poruszać się po parkingu. Teraz rozszerzmy tę koncepcję na 3D, aby stworzyć parking wielopoziomowy:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Liczby 1
, 2
i 3
reprezentują połączenia między poziomami. 1
Od pierwszych Łéczy podłogowych z 1
na drugim piętrze więc stepping samochód na 1
miejscu w pierwszym piętrze pojawia się w 1
pozycji na drugim piętrze.
Wyzwanie
Podając schemat parkingu, jak pokazano wcześniej, napisz najkrótszy program, który oblicza odległość do najbliższego wolnego miejsca parkingowego, zgodnie z poniższym
Zasady
- Dane wejściowe to tablica znaków 3D lub tablica ciągów 2D lub równoważna, a wynikiem będzie pojedyncza liczba całkowita reprezentująca liczbę kroków, jakie samochód musi wykonać, aby dostać się do najbliższego wolnego miejsca parkingowego. Jeśli otrzymasz tablicę znaków 3D, pierwszy indeks może reprezentować numer piętra, a drugi i trzeci indeks pozycji (x, y) dla każdego piętra, ale to zależy od ciebie.
- Nie będzie więcej niż 9 ramp, reprezentowanych przez
[1-9]
. - Samochód startuje z
E
pozycji (na mapie będzie tylko jeden punkt wejścia) i za każdym razem porusza się za pomocą białych znaków w jednym z czterech kierunków: w górę, w dół, w lewo, w prawo. Samochód może również wchodzić na·
pozycje i[1-9]
pozycje. - Każda zmiana pozycji (kroku) liczy się jako 1, a za każdym razem, gdy samochód jedzie z jednej podłogi na drugą, liczy się jako 3, ponieważ samochód musi wjechać na rampę. W tym przypadku ruch z białego miejsca obok znaku
1
do1
samego liczy się jako 3 kroki, ponieważ w wyniku tego ruchu samochód pojawia się w1
pozycji na drugiej podłodze. - Samochód nie może przekroczyć limitów matrycy.
- Liczenie zakończy się, gdy samochód, który ma być zaparkowany, znajduje się w tej samej pozycji co
·
. Jeśli nie ma dostępnych wolnych miejsc parkingowych, możesz zwrócić zero, ujemną liczbę całkowitą, wartość zerową lub błąd.
Przykłady
W powyższym przykładzie wynik wyniósłby 32, ponieważ taniej jest przejść na czwarte piętro i zaparkować na najbliższym miejscu parkingowym w pobliżu 3
. Najbliższe bezpłatne miejsca parkingowe na trzecim piętrze znajdują się w odległości 33 i 34.
Inne przykłady:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Answer: 28 (now the parking space in the 2nd floor is closer)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 4 2 5 3 6 *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
4 * 5 1 6 2 * 3
**********E****** ***************** ***************** *****************
Answer: 24 (now it's better to go to ramp 4 and then to ramp 5 to the third floor)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * * * 3 * 2
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 3 * 2 * 1
**********E****** ***************** ***************** *****************
Answer: 16 (now the parking space in the 4th floor is closer)
1st floor 2nd floor 3rd floor 4th floor 5th floor
************ ************ ************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC 3 *·CCCCCCCC 4 *········C *
* * * * * * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2 *··CCCCCCC 3 *·······CC 4
************ ************ ************ ************ ************
Answer: 29 (both the nearest parking spaces at the 4th and 5th floors are at the same distance)
1st floor 2nd floor 3rd floor
************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC *
* * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2
************ ************ ************
Answer: -1 (no free parking space)
1st floor
************
* *
* *
* E*
************
Answer: -1 (no parking space at all)
1st floor
************
* ····· *
*· ****
* ····· * E
*********
Answer: -1 (the parking lot designer was a genius)
Alternatywy
- Możesz użyć dowolnych znaków, które chcesz reprezentować mapę parkingu, po prostu określ w odpowiedzi, które są wybranymi postaciami i co oznaczają.
To jest golf golfowy , więc może wygrać najkrótszy program / metoda / lambda / cokolwiek dla każdego języka!
Jeśli potrzebujesz pomocy z algorytmem, sprawdź moją (nie golfową) implementację w C # .
Odpowiedzi:
JavaScript (ES6), 199 bajtów
Wypróbuj online!
W jaki sposób?
Funkcja rekurencyjna g () przyjmuje jako dane wejściowe:
Jeśli f jest określona, możemy po prostu skopiować go do bieżącego podłogi F . W przeciwnym razie musimy szukać nowej podłogi i nowych współrzędnych, iterując po każdej podłodze i nad każdym rzędem, aż znajdziemy punkt wejścia c :
Definiujemy r jako bieżący wiersz w bieżącym piętrze:
Następnym krokiem jest upewnienie się, że bieżąca komórka c w (x, y) jest zdefiniowana:
Jeśli tak, oznaczamy go jako odwiedzony, ustawiając go na g , wartość, która nie wyzwala żadnego z nadchodzących testów:
Jeśli c to bezpłatne miejsce parkingowe, zatrzymujemy rekurencję. A jeżeli łączna liczba ruchów jest niższy niż nasz poprzedni najlepszy wynik, aktualizujemy m odpowiednio:
Jeśli właśnie osiągnęliśmy nową podłogę ( f jest niezdefiniowany ) lub c jest spacją, przetwarzamy wywołanie rekurencyjne dla każdej otaczającej komórki:
W przeciwnym razie, jeśli c jest znacznikiem rampy (tj. Niezerową cyfrą), przetwarzamy pojedyncze wywołanie rekurencyjne, aby osiągnąć nowy poziom:
Na koniec przywracamy bieżącą komórkę do jej wartości początkowej, aby można ją było ponownie odwiedzić na innych ścieżkach rekurencji:
źródło
Kotlin , 768 bajtów
używany okres. zamiast ·. Chciałbym zrozumieć odpowiedź Arnaulda, ponieważ utrata 500 bajtów byłaby miła.
Wypróbuj online!
źródło
PowerShell,
299292 bajtówZakłada się, że mapa jest prostokątna .
x
Zamiast tego używa·
. Aby uzyskać·
, musisz zapisać skrypt jako ASCII (nie UTF-8) i zastąpićx
go·
.Skrypt niepoznany i testowy:
Wynik:
Rozszerzona moc do parkowania z 16 krokami:
Wyjaśnienie
To rodzaj algorytmu wyszukiwania ścieżki Lee . Tylko jedna mądra rzecz: 3 kroki na rampie są realizowane jako stany pozorne
H->G->F->E
PowerShell dla genialnego projektanta parkingów,
377369 bajtówProjekt parkingowy jest
2D string array
. Brak założeń dotyczących mapy: dowolne ciągi długości, podłogi bez ścian, parking bez punktu wejścia, rampy z wieloma piętrami i wieloma zjazdami. Koszt rodzaju wynosi + 26%.Skrypt niepoznany i testowy:
źródło