Umgebene Länder


54

Länder besitzen eine Reihe von Gebieten in einer 1D-Welt. Jedes Land ist eindeutig durch eine Nummer gekennzeichnet. Das Eigentum an den Gebieten kann durch eine Liste wie folgt dargestellt werden:

1 1 2 2 1 3 3 2 4

Wir definieren die kantigsten Gebiete eines Landes als die beiden Gebiete, die an beiden Rändern am nächsten liegen. Wenn die obige Liste mit Null indexiert wurde, 1treten die kantesten Territorien des Landes an Position 0und auf 4.

Ein Land umgibt ein anderes, wenn die Unterliste zwischen den beiden Randgebieten alle Gebiete eines anderen Landes enthält. Im obigen Beispiel lautet die Unterliste zwischen den Randgebieten des Landes 2:

2 2 1 3 3 2

Und wir sehen, dass alle Territorien des Landes 3zwischen den kantigsten Territorien des Landes liegen 2, also Land 2um Land 3.

Ein Land mit nur einem Element wird niemals ein anderes umgeben.

Herausforderung

Nehmen Sie eine Liste von Ganzzahlen als Eingabe (in einem beliebigen Format) und geben Sie einen Wahrheitswert aus , wenn ein Land von einem anderen umgeben ist, und ansonsten einen falschen Wert.

Sie können davon ausgehen, dass die Eingabeliste nicht leer ist, nur positive Ganzzahlen enthält und keine Zahlen 'überspringt': Dies 1 2 1 5wäre beispielsweise eine ungültige Eingabe.

Testfälle

+----------------------+--------+
|        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
Willkommen bei PPCG! Herzlichen Glückwunsch zu Ihrer ersten Frage. Dieser sieht wirklich gut aus!
Mego

Antworten:


33

Pyth, 7 Bytes

n{Q_{_Q

Führen Sie den Code für Testfälle aus.

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)

Die einzige Möglichkeit, die Umgebung zu vermeiden, besteht darin, die am weitesten links gelegenen Gebiete der Länder in derselben Reihenfolge wie die am weitesten rechts gelegenen Gebiete zu sortieren. Wenn zwei Länder in dieser Reihenfolge vertauscht werden, hat eines ein Territorium, das weiter links und weiter rechts liegt als das andere, und umgibt es daher.

Um die eindeutigen Länder in der Reihenfolge der am weitesten links liegenden Gebiete zu erhalten, deduplizieren wir einfach, wodurch diese Reihenfolge erhalten bleibt. Dasselbe geschieht für das Gebiet ganz rechts durch Umkehren, Deduplizieren und erneutes Umkehren. Wenn diese unterschiedliche Ergebnisse liefern, ist ein Land umgeben.


12

Retina , 61-60 Bytes

Viel länger als ich möchte ...

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

Gibt die Anzahl der Länder aus, die mindestens ein anderes Land umgeben.

Probieren Sie es online aus.

Es ist eine sehr einfache Implementierung der Spezifikation: Wir suchen nach dem Muster A...B...A, Bdas weder vor noch nach dem Spiel erscheint.


11

Python, 64 Bytes

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

Die einzige Möglichkeit, die Umgebung zu vermeiden, besteht darin, die am weitesten links gelegenen Gebiete der Länder in derselben Reihenfolge wie die am weitesten rechts gelegenen Gebiete zu sortieren. Wenn zwei Länder in dieser Reihenfolge vertauscht werden, hat eines ein Territorium, das weiter links und weiter rechts liegt als das andere, und umgibt es daher.

Die Funktion überprüft, ob das Sortieren der Gebiete nach äußerster linker und äußerster rechter Position zu denselben Ergebnissen führt. Leider haben Python-Listen keine rindexAnalogie zu rfind, daher kehren wir die Liste um und kehren dann die sortierte Ausgabe um.

Gleiche Länge (64) mit einer Hilfsfunktion:

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

6

C #, 113 Bytes

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

Ungolfed:

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

    return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}

Mit einem prägnanten LINQAnsatz.


1
Willkommen bei PPCG. Dies ist eine sehr gute ungolfed Lösung; Ich muss neue Benutzer oft darüber informieren, dass Leute häufig ungolfed (lesbare, kommentierte) Versionen ihres Codes sehen möchten. Sie haben jedoch vergessen, eine Golfversion beizufügen! Es gibt mehrere Tricks, die Sie verwenden können, einschließlich der Namen von 1char-Variablen, das Entfernen von Leerzeichen und der "Variablen, die angenommen werden, intwenn Sie nichts anderes sagen" -Marke. +1 für den Algorithmus und die Implementierung.
wizzwizz4

2
Ahhhh, ich verstehe. Ja, das ist mir neu. Trimmt ein bisschen Fett und versucht es erneut. Danke für den Hinweis.
Jason Evans

Sie können zwei Bytes sparen, indem Sie einen einstelligen Variablennamen verwenden. Tatsächlich können Sie mehr sparen, indem Sie überhaupt keine Variablen verwenden und es einfach zu einem einzelnen Ausdruck machen.
Türklinke

Ich vermute, Sie könnten weglassen .ToArray().
Vlad

1
Ich weiß, es sind fast 2,5 Jahre vergangen, aber Sie können bis zu 82 Bytes Golf spielen : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(der Linq-Import ist leider obligatorisch). Probieren Sie es online aus. Schöne Antwort, +1 von mir!
Kevin Cruijssen


4

Japt, 12 Bytes

Uâ ¬¦Uw â ¬w

Probieren Sie es online!

Vielen Dank an @xnor für das Herausfinden des Algorithmus. Das Eingabearray wird automatisch in gespeichert U, âist eindeutig, wist umgekehrt und ¦ist !=. ¬verbindet sich mit der leeren Zeichenkette ( [1,2,3] => "123"); Dies ist erforderlich, da der JavaScript-Vergleich zwei Arrays als nicht gleich ansieht, es sei denn, sie sind dasselbe Objekt. Zum Beispiel (JS-Code, nicht Japt):

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

Wenn dies nicht der Fall wäre, könnten wir zwei Bytes entfernen, indem wir einfach nicht jedes Array verbinden:

Uâ ¦Uw â w

Klingt so, als ob Japt Wertegleichheit implementieren möchte.
Isaacg

4

ES6, 76 75 65 64 Bytes

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

Einfache Portierung von @ xnors Antworten.

Edit: Gespeichert 1 Byte durch den Ersatz a.lastIndexOf(x)==imit a.indexOf(x,i+1)<0.

Bearbeiten: 10 Bytes dank @ user81655 gespeichert.

Edit: Gespeichert 1 Byte durch den Ersatz r||imit r|i.


2
65 Bytes mit einer Funktion:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655

benutze ~ anstelle von <0.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ Nein, ich möchte, dass es -1 ist. ~ist das gleiche wie >=0.
Neil

Oh, warte mal: P
Mama Fun Roll

@ user81655 Entschuldigung, ich habe Ihren Kommentar aus irgendeinem Grund vorher nicht bemerkt. Tricky, aber ich mag es!
Neil


1

Java, 281 Zeichen

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 Bytes

Diese Funktion übernimmt die Eingabe als Python-Liste. Leider unterstützen Python-Listen nicht direkt die Suche am Ende wie Strings rindex(), aber na ja .

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.