Pewnego dnia budzisz się tylko, aby znaleźć się w tablicy. Próbujesz po prostu wyjść, biorąc jednocześnie jeden indeks, ale wydaje się, że istnieją inne zasady:
Tablica jest całkowicie wypełniona liczbami naturalnymi.
- Jeśli znajdziesz się w indeksie
n
, przejdź do indeksuarray[n]
, z wyjątkiem: - Jeśli znajdziesz się w indeksie,
n
który jest liczbą pierwszą,array[n]
cofnij się
Przykład: Zaczynasz od indeksu 4
w tej tablicy (indeks początkowy to 0):
array = [1,4,5,6,8,10,14,15,2,2,4,5,7];
-----------------^ you are here
Ponieważ wartość pola, w którym się znajdujesz 8
, to przejdziesz do indeksu 8
jako pierwszy krok. Pole, na którym wylądujesz, zawiera wartość 2
. Następnie przejdź do indeksu 2
jako drugi krok. Podobnie 2
jak liczba pierwsza, cofasz się o 5 kroków, co jest twoim trzecim krokiem. Ponieważ nie ma indeksu -3
, udało ci się uciec z tablicy w 3 krokach.
Twoim zadaniem jest:
Aby napisać program lub funkcję, która akceptuje tablicę i indeks początkowy jako parametr, i wyświetla liczbę kroków do ucieczki z tablicy. Jeśli nie możesz uciec przed tablicą (np. [2,0,2]
Przy pomocy start-index 2
=> ciągle przechodzisz od indeksu 2
do 0
), wypisz wartość fałszowania. Możesz użyć indeksowania opartego na jednym lub zerowania, ale określ, którego używasz.
Przypadki testowe
Wkład: [2,5,6,8,1,2,3], 3
Wydajność: 1
Wkład: [2, 0, 2], 2
Wydajność: false
Wkład: [14,1,2,5,1,3,51,5,12,3,4,41,15,4,12,243,51,2,14,51,12,11], 5
;
Wydajność: 6
Najkrótsza odpowiedź wygrywa.
źródło
Odpowiedzi:
Pyth, 31 bajtów
Przypadki testowe
Wykorzystuje zero, aby wskazać fałszywą wartość, w przeciwnym razie liczbę przeskoków.
źródło
Python,
161138 bajtówKredyty dla silni.
Ideone to!
Jak to działa
Twierdzenie Wilsona służy do sprawdzania liczby pierwszej.
Wykrywanie pętli poprzez przechowywanie widocznych indeksów w tablicy (
l
) i sprawdzanie, czy obecny jest bieżący indeksl
.źródło
Python, 107 bajtów
Zastosowanie:
f(list, start)
ex:f([2,5,6,8,1,2,3], 3)
Zwraca
0
pętle (wykryte, gdyn > len(a)
)źródło
Matlab, 138 bajtów
To proste podejście, oparte na indeksach 1, ponieważ Matlab domyślnie używa indeksów 1. Aby policzyć liczbę kroków, używamy
for
pętli zliczającej od 1 do nieskończoności (!). W przypadku, gdy nie możemy uciec z tablicy, używamy wektora,v
aby śledzić, które wpisy już odwiedziliśmy. Jeśli odwiedzimy wpis dwa razy, wiemy, że utknęliśmy w cyklu, którego nie można zmienić. Aby sprawdzić, czy jesteśmy poza tablicą, używamytry/catch
struktury, która również wychwytuje wyjątki poza granicami.źródło
05AB1E, 32 bajty
Wyjaśnienie
Wypróbuj online
źródło
JavaScript (ES6), 100
Baza indeksu 0. Uwaga: ta funkcja modyfikuje tablicę wejściową
Mniej golfa
Test
źródło
JAVA,
229218 bajtówDzięki Kevinowi 11 bajtów gryzie kurz.
źródło
Stack<Integer>i=new Stack<>();
można zmienić naStack i=new Stack();
ireturn 1==2;
można zmienić nareturn 0>1;
. Warto też wspomnieć, że jest to Java 7 zamiast ogólnie Java.a,b->{...}
zamiastObject e(int[]a,int b){...}
tego osobiście wspominam Java 7, aby poinformować ludzi, że celowo nie użyłem lambd Java 8, ale to zależy od ciebie.CJam, 44 bajty
Oczekuje
index array
na stos.Wypróbuj online!
Moja pierwsza odpowiedź CJam, dlatego jest tak straszna i bezwzględnie konieczna ...
(uważa się, że można zawiesić się po wydrukowaniu prawidłowego wyjścia, co właśnie robi ten program)
źródło
C, 121 bajtów
Funkcja
f
akceptuje tablicę, indeks początkowy (oparty na 0) i liczbę elementów w tablicy, ponieważ nie ma sposobu na przetestowanie końca tablicy w C (przynajmniej nie znam żadnego).Wypróbuj na ideone!
Uwaga:
function p(n)
sprawdza, czyn
jest pierwsza, czy nie. Podziękowania za to @Lynn i jego odpowiedź na Czy liczba ta jest liczbą pierwszą?źródło
c
aby ponownie wywołać funkcję.JavaScript,
121132 bajtówedycja 1: Ups, brakowało mi trochę o zwróceniu liczby kroków. naprawić już wkrótce.
edycja 2: naprawiono
źródło
Rakieta,
183156 bajtówPrawdopodobnie więcej bajtów do zapisania przy dalszym golfie, ale to wszystko dla mnie. :)
Kompletny moduł z pakietem testowym z funkcją czyszczenia:
Uruchom to jak
raco test e.rkt
Najważniejsze podziękowania dla @cat za odkrycie nieudokumentowanej
prime?
funkcji .źródło
Java,
163160 bajtówp(n)
służy do testowania wstępnego,f(a,n)
służy do funkcji ucieczki. Stosowanie:Wersja bez golfa:
źródło
Perl 6 , 85 bajtów
Wyjaśnienie:
Jest to leniwa sekwencja indeksów przemierzanych zgodnie z regułą. Jeśli indeks ostatecznie przekroczy granice tablicy wejściowej (
!(0 <= * < a)
warunek), sekwencja jest skończona; w przeciwnym razie indeksy będą się zmieniać bez końca.Ta sekwencja jest przekazywana do wewnętrznej funkcji anonimowej:
Jeśli sekwencja jest zdefiniowana na podstawie indeksu podanego przez rozmiar tablicy wejściowej, musi ona wejść w nieskończony cykl, więc
0
jest zwracana. W przeciwnym razie+$_
zwracany jest rozmiar sekwencji .źródło
Perl 5 , 107 + 1 (
-a
) = 108 bajtówWypróbuj online!
Lista oparta na 0. Zwraca false (puste), jeśli listy nie można przeszukiwać.
źródło