Kraje Otoczone


54

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, 1najbardziej położone terytoria kraju występują na pozycji 0i 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 2największymi terytoriami kraju jest:

2 2 1 3 3 2

I widzimy, że wszystkie terytoria kraju 3znajdują się między najbardziej oddalonymi terytoriami kraju 2, więc kraj 2otacza 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 5był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  |
+----------------------+--------+

21
Witamy w PPCG! Gratuluję pierwszego pytania; ten wygląda naprawdę dobrze!
Mego

Odpowiedzi:


33

Pyth, 7 bajtów

n{Q_{_Q

Uruchom kod w przypadkach testowych.

n      Check whether the following are not equal:
 {Q     The unique elements in order of first appearance
 _{_Q   The unique elements in order of last appearance
         (done by reversing, taking unique elts, then reversing again)

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.


12

Siatkówka , 61 60 bajtów

Znacznie dłużej niż chciałbym ...

(\b(\d+)\b.* (?!\2 )(\d+) .*\b\2\b)(?!.* \3\b)(?<!\b\3 .*\1)

Drukuje liczbę krajów, które otaczają co najmniej jeden inny kraj.

Wypróbuj online.

Jest to bardzo prosta implementacja specyfikacji: szukamy A...B...Atakiego wzoru , który Bnie pojawi się ani przed, ani po meczu.


11

Python, 64 bajty

lambda l,S=sorted:S(l,key=l.index)!=S(l,key=l[::-1].index)[::-1]

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ą rindexanalogii do rfind, więc odwracamy listę, a następnie odwracamy posortowane dane wyjściowe.

Ta sama długość (64) z funkcją pomocniczą:

g=lambda l:sorted(l,key=l.index)
lambda l:g(l)[::-1]!=g(l[::-1])

6

C #, 113 bajtów

public bool V(int[] n){var u1=n.Distinct();var u2=n.Reverse().Distinct().Reverse();return !u1.SequenceEqual(u2);}

Nie golfowany:

public bool ContainsSurroundedCountry(int[] numbers)
{
    int[] uniqueLeftmost = numbers.Distinct().ToArray();
    int[] uniqueRightmost = numbers.Reverse().Distinct().Reverse().ToArray();

    return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}

Stosując zwięzłe LINQpodejście.


1
Witamy w PPCG. To jest bardzo dobre rozwiązanie bez golfa ; Często muszę informować nowych użytkowników, że ludzie często lubią oglądać niepolecane (czytelne, komentowane) wersje swojego kodu. Jednak zapomniałeś dołączyć wersję golfową! Istnieje kilka sztuczek, których możesz użyć, w tym nazwy zmiennych 1char, usuwanie białych znaków i „zakładane zmienne, intchyba że powiesz inaczej”. +1 za algorytm i implementację.
wizzwizz4,

2
Ach, rozumiem. Tak, jestem nowy w tym. Odetnie trochę tłuszczu i spróbuje ponownie. Dzięki za radę.
Jason Evans

Możesz zapisać dwa bajty, używając jednoznakowych nazw zmiennych - w rzeczywistości możesz zaoszczędzić więcej, w ogóle nie używając zmiennych i czyniąc je pojedynczym wyrażeniem.
Klamka

Podejrzewam, że możesz to pominąć .ToArray().
Vlad

1
Wiem, że minęło prawie 2,5 roku, ale możesz zagrać w golfa do 82 bajtów : 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!
Kevin Cruijssen


4

Japt, 12 bajtów

Uâ ¬¦Uw â ¬w

Wypróbuj online!

Dzięki @xnor za zrozumienie algorytmu. Tablica wejściowa jest automatycznie przechowywana w U, âjest uniqify, wjest 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):

var a = [1], b = [1]; alert(a==b); // false
var a = [1], b = a;   alert(a==b); // true

Gdyby tak nie było, moglibyśmy usunąć dwa bajty, po prostu nie dołączając do każdej tablicy:

Uâ ¦Uw â w

Wygląda na to, że Japt może chcieć wprowadzić równość wartości.
isaacg

4

ES6, 76 75 65 64 bajtów

 a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r|i))+a)()!=f(-1)

Prosty port odpowiedzi @ xnor.

Edycja: Zapisano 1 bajt, zastępując a.lastIndexOf(x)==igo a.indexOf(x,i+1)<0.

Edycja: Zapisano 10 bajtów dzięki @ user81655.

Edycja: Zapisano 1 bajt, zastępując r||igo r|i.


2
65 bajtów przy użyciu funkcji:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655 11.01.16

użyj ~ zamiast <0.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ Nie, chcę, żeby było -1. ~jest taki sam jak >=0.
Neil

Och, czekaj nie ważne: P
Mama Fun Roll

@ user81655 Niestety z jakiegoś powodu nie zauważyłem Twojego komentarza. Tricksy, ale lubię to!
Neil,


1

Java, 281 znaków

class K{public static void main(String[]a){System.out.println(!k(a[0]).equals(new StringBuffer(k(new StringBuffer(a[0]).reverse().toString())).reverse().toString()));}static String k(String k){for(char i=49;i<58;i++){k=k.replaceFirst(""+i,""+(i-9)).replaceAll(""+i,"");}return k;}}

1

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

def t(c):i,I=c.index,c[::-1].index;return any(i(n)<i(m)and I(n)<I(m)for m in c for n in c)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.