Pytanie
Zostajemy schwytani przez armię robotów na ich stacji kosmicznej. Nasz pilot statku kosmicznego znajduje się w więzieniu na poziomie 1. Istnieje tylko jeden sposób na ucieczkę i uratowanie pilota statku kosmicznego. Oznacza przejście z poziomu N na poziom 1. Jednak ponieważ jest bardzo ryzykowne, musisz dostać się do więzienia w jak najmniejszej liczbie kroków.
Warunki
Istnieją 4 sposoby poruszania się:
- Przejdź z poziomu N na poziom N - 1
e.g. from 12 to 11
- Przejdź z poziomu N na poziom N + 1
e.g. from 12 to 13
- Użyj teleportacji z poziomu 2k na poziom k
e.g. from 12 to 6
- Użyj teleportacji z poziomu 3k na poziom k
e.g. from 12 to 4
- Przejdź z poziomu N na poziom N - 1
Teleporty są tylko w jedną stronę (możesz dostać od 12 do 4, ale nie można dostać od 4 do 12)
- Każde działanie wymaga jednego kroku
Wejście
Dane wejściowe należy odczytać ze STDIN lub najbliższej alternatywy w języku programowania. Dane wejściowe składają się z liczby całkowitej, n
gdzie 1 <= n <= 10^8
.
Wynik
Wynikiem powinna być minimalna liczba kroków, które trzeba wykonać, aby przejść n
do poziomu 1.
Przykłady
Level Minimum number of steps
1 0
8 3
10 3
267 7
100,000,000 25
Spróbuj zaprogramować program, który pomoże nam jak najszybciej uratować naszego pilota statku kosmicznego przed więzieniem i wrócić do domu!
Najkrótszy kod wygra!
Odpowiedzi:
Pyth, 32 bajty
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
Trochę zmieniłem problem. Definiuję 4 nowe operacje, które zastępują 4 operacje pytania.
level / 2
(liczy się jako(level % 2) + 1
kroki, ponieważ w celu teleportacji może być konieczne najpierw przesunięcie poziomu w dół)(level + 1) / 2
(liczy się jako(level % 2) + 1
kroki)level / 3
(liczy się jako(level % 3) + 1
kroki)(level + 1) / 3
(liczy się jako(-level % 3) + 1
kroki)Zgodnie z projektem operacje te mogą być stosowane do każdego numeru, jeśli liczba jest
0 mod 2
,1 mod 2
,0 mod 3
,1 mod 3
lub2 mod 3
.Możesz łatwo pomyśleć, dlaczego to działa. Główną ideą jest to, że istnieje co najmniej jedno optymalne rozwiązanie, które nie ma dwóch (ruch w dół) lub dwóch (ruch w górę) ruchów z rzędu. Dowód: jeśli masz rozwiązanie, które ma dwa takie ruchy z rzędu, możesz je wymienić i sprawić, by rozwiązanie było mniejsze lub równe długości. Na przykład możesz zastąpić (przesuń w górę, przesuń w górę, teleportuj z 2k do k) przez (teleportuj z 2k do k, przesuń w górę) i podobnie we wszystkich innych przypadkach.
Funkcja
y
używa niejawnie zapamiętywania, dlatego środowisko wykonawcze nie eksploduje.źródło
Python, 176 bajtów
Brutalna siła przez całą drogę; lista wszystkich liczb
1 to 100,000,000
na komputerze 64-bitowym to ~ 800 MB pamięci.Indeks listy reprezentuje liczby, wartości reprezentują odległość od 1 w dozwolonych krokach ratunkowych.
1
)0,2,2,3
)Czas działania wynosi nieco ponad 10 minut. * ahem *.
Komentarze do kodu
Inny
źródło
Python 2 ... 1050
źle napisany, nieprzystosowany do gry, nieoptymalny.
Odczytuje poziom początkowy na stdin, drukuje minimalną liczbę kroków na stdout.
źródło
32-bitowy kod maszynowy x86, 59 bajtów
W hex:
Język maszyna per se nie ma pojęcia standardowego wejścia. Ponieważ wyzwanie jest czysto obliczeniowe, zdecydowałem się napisać funkcję przyjmującą parametr wejściowy
EAX
i zwracającą wynikAL
.Matematyka kryjąca się za kodem jest ładnie wyjaśniona przez @Jakube: wyszukiwanie odbywa się tylko wśród ścieżek z teleportacjami przeplatanymi nie więcej niż jednym ruchem o jeden poziom. Wydajność wynosi około 12000 przypadków testowych na sekundę w dolnym końcu zakresu wejściowego i 50 przypadków na sekundę w górnym końcu. Zużycie pamięci wynosi 12 bajtów miejsca na stosie na poziom rekurencji.
źródło