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  |
+----------------------+--------+
Sisyphus
quelle
21
Willkommen bei PPCG! Herzlichen Glückwunsch zu Ihrer ersten Frage. Dieser sieht wirklich gut aus!
Mego
6
Und wie viele Armeen bekomme ich in meiner nächsten Runde, um ein Land zu umzingeln?
ThisSuitIsBlackNot

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.

xnor
quelle
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.

Martin Ender
quelle
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])
xnor
quelle
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.

Jason Evans
quelle
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
ETHproductions
quelle
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.

Neil
quelle
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;}}
Minimal
quelle
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)
Tim Pederick
quelle