Kraje posiadają szereg terytoriów na świecie 1D. Każdy kraj jest jednoznacznie identyfikowany przez numer. Własność terytoriów może być reprezentowana przez następującą listę:
1 1 2 2 1 3 3 2 4
Definiujemy najbardziej krańcowe terytoria kraju jako dwa terytoria najbliższe którejkolwiek z krawędzi. Jeśli powyższa lista została zindeksowana zera, 1
najbardziej położone terytoria kraju występują na pozycji 0
i 4
.
Kraj otacza inny kraj, jeśli podlista między jego dwoma największymi terytoriami zawiera wszystkie terytoria innego kraju. W powyższym przykładzie podlistą między 2
największymi terytoriami kraju jest:
2 2 1 3 3 2
I widzimy, że wszystkie terytoria kraju 3
znajdują się między najbardziej oddalonymi terytoriami kraju 2
, więc kraj 2
otacza kraj 3
.
Kraj z tylko jednym elementem nigdy nie otoczy innego.
Wyzwanie
Weź listę liczb całkowitych jako dane wejściowe (w dowolnym formacie) i wyślij prawdziwą wartość, jeśli jakiś kraj jest otoczony przez inny kraj, a wartość fałsz w przeciwnym razie.
Możesz założyć, że lista wejściowa jest niepusta, zawiera tylko dodatnie liczby całkowite i nie „pomija” żadnych liczb: na przykład 1 2 1 5
byłoby niepoprawne.
Przypadki testowe
+----------------------+--------+
| Input | Output |
+----------------------+--------+
| 1 | False |
| 2 1 3 2 | True |
| 2 1 2 1 2 | True |
| 1 2 3 1 2 3 | False |
| 1 3 1 2 2 3 2 3 | True |
| 1 2 2 1 3 2 3 3 4 | False |
| 1 2 3 4 5 6 7 8 9 10 | False |
+----------------------+--------+
Odpowiedzi:
Pyth, 7 bajtów
Uruchom kod w przypadkach testowych.
Jedynym sposobem na uniknięcie otoczenia jest posortowanie najbardziej wysuniętych na lewo terytoriów krajów w tej samej kolejności, co ich najbardziej wysunięte na prawo terytorium. Jeśli dwa kraje zostaną zamienione w tej kolejności, jeden ma terytorium zarówno bardziej lewe, jak i bardziej prawe od drugiego, i otacza je.
Aby uzyskać unikalne kraje w kolejności od najbardziej wysuniętego na lewo terytorium, po prostu deduplikujemy, co zachowuje tę kolejność. To samo dzieje się w przypadku najbardziej wysuniętego na prawo terytorium, cofając, deduplikując, a następnie ponownie cofając. Jeśli dają one inne wyniki, kraj jest otoczony.
źródło
Siatkówka ,
6160 bajtówZnacznie dłużej niż chciałbym ...
Drukuje liczbę krajów, które otaczają co najmniej jeden inny kraj.
Wypróbuj online.
Jest to bardzo prosta implementacja specyfikacji: szukamy
A...B...A
takiego wzoru , któryB
nie pojawi się ani przed, ani po meczu.źródło
Python, 64 bajty
Jedynym sposobem na uniknięcie otoczenia jest posortowanie najbardziej wysuniętych na lewo terytoriów krajów w tej samej kolejności, co ich najbardziej wysunięte na prawo terytorium. Jeśli dwa kraje zostaną zamienione w tej kolejności, jeden ma terytorium zarówno bardziej lewe, jak i bardziej prawe od drugiego, i otacza je.
Funkcja sprawdza, czy sortowanie terytoriów według wyglądu po lewej i po prawej stronie daje te same wyniki. Niestety listy w języku Python nie mają
rindex
analogii dorfind
, więc odwracamy listę, a następnie odwracamy posortowane dane wyjściowe.Ta sama długość (64) z funkcją pomocniczą:
źródło
C #, 113 bajtów
Nie golfowany:
Stosując zwięzłe
LINQ
podejście.źródło
int
chyba że powiesz inaczej”. +1 za algorytm i implementację..ToArray()
.using System.Linq;
+n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())
(import Linq jest niestety obowiązkowy). Wypróbuj online. Dobra odpowiedź, +1 ode mnie!CJam (
1413 bajtów)Demo online
Podziękowania dla Martina Büttnera za jednoprocentową oszczędność.
źródło
Japt, 12 bajtów
Wypróbuj online!
Dzięki @xnor za zrozumienie algorytmu. Tablica wejściowa jest automatycznie przechowywana w
U
,â
jest uniqify,w
jest odwrotna i¦
jest!=
.¬
łączy się z pustym ciągiem ([1,2,3] => "123"
); jest to konieczne, ponieważ porównanie JavaScript liczy dwie tablice jako niejednakowe, chyba że są one tym samym obiektem. Na przykład (kod JS, a nie Japt):Gdyby tak nie było, moglibyśmy usunąć dwa bajty, po prostu nie dołączając do każdej tablicy:
źródło
ES6,
76756564 bajtówProsty port odpowiedzi @ xnor.
Edycja: Zapisano 1 bajt, zastępując
a.lastIndexOf(x)==i
goa.indexOf(x,i+1)<0
.Edycja: Zapisano 10 bajtów dzięki @ user81655.
Edycja: Zapisano 1 bajt, zastępując
r||i
gor|i
.źródło
a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
~
jest taki sam jak>=0
.05AB1E , 4 bajty
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Port odpowiedzi Pyth @xnor .
Wyjaśnienie:
źródło
Java, 281 znaków
źródło
Python 3, 90 bajtów
Ta funkcja przyjmuje dane wejściowe jako listę w języku Python. Niestety listy w języku Python nie obsługują bezpośrednio wyszukiwania od końca, podobnie jak łańcuchy
rindex()
, ale no cóż.źródło