囲まれた国


54

国は1Dの世界で一連の領域を所有しています。各国は番号によって一意に識別されます。テリトリーの所有権は、次のリストで表すことができます。

1 1 2 2 1 3 3 2 4

国の最端の領土を、どちらかの端に最も近い2つの領土と定義します。上記のリストのインデックスがゼロであった場合、国1の最端部の地域は0およびで発生し4ます

ある国は、その最端の2つのテリトリー間のサブリストに別の国のすべてのテリトリーが含まれている場合、別の国を囲みます。上記の例では、国2の最端地域間のサブリストは次のとおりです。

2 2 1 3 3 2

そして、国のすべての領土は国3の最端の領土の間にある2ので、国は国を2囲みます3

要素が1つだけの国は、別の要素を囲むことはありません。

チャレンジ

(任意の形式で)入力および出力として整数のリストを取るtruthyどの国が他に囲まれている場合は、値を、そしてfalsyそうでない場合、値。

入力リストは空ではなく、正の整数のみを含み、数字を「スキップ」しないと仮定でき1 2 1 5ます。たとえば、無効な入力になります。

テストケース

+----------------------+--------+
|        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
PPCGへようこそ!最初の質問おめでとうございます。これは本当によさそうです!
メゴ

回答:


33

Pyth、7バイト

n{Q_{_Q

テストケースでコードを実行します。

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)

周囲を回避する唯一の方法は、国の左端の領域を右端の領域と同じ順序で並べ替えることです。2つの国がこの順序で交換された場合、一方の国は他方の国よりも左と右の両方に領土を持っているため、それを囲みます。

左端の領域の順序で一意の国を取得するには、単純に重複排除を行い、この順序を維持します。同じことは、右端の領域に対して、反転、重複排除、再度反転することにより行われます。これらの結果が異なる場合、国は囲まれています。


12

網膜61 60バイト

私が望むよりもはるかに長い...

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

少なくとも1つの他の国を囲む国の数を印刷します。

オンラインでお試しください。

これは、スペックの非常に簡単な実装です:私たちはパターンを探しA...B...A、そのようなB前や試合後にどちらも表示されます。


11

Python、64バイト

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

周囲を回避する唯一の方法は、国の左端の領域を右端の領域と同じ順序で並べ替えることです。2つの国がこの順序で交換された場合、一方の国は他方の国よりも左と右の両方に領土を持っているため、それを囲みます。

この関数は、左端の外観と右端の外観でテリトリーを並べ替えても同じ結果が得られることを確認します。残念ながら、Pythonリストはにrindex類似していないrfindため、リストを逆にしてから、ソートされた出力を逆にします。

補助機能を備えた同じ長さ(64):

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

6

C#、113バイト

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

ゴルフをしていない:

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

    return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}

簡潔なLINQアプローチを使用します。


1
PPCGへようこそ。これは非常に良いですungolfed溶液; 私は、多くの場合、人々がコードの無修正(読み取り可能、コメント付き)バージョンを見ることを好むことを新しいユーザーに通知する必要があります。ただし、ゴルフバージョンを含めるのを忘れています。使用できるいくつかのトリックがあります。1char変数名、空白の削除、「int特に断りのない限り想定される変数」の癖などです。アルゴリズムと実装については+1。
wizzwizz4

2
なるほど。うん、私はこれに新しいです。少し脂肪を刈り取り、再試行します。アドバイスをありがとう。
ジェイソンエヴァンス

1文字の変数名を使用して2バイトを節約できます。実際には、変数をまったく使用せず、単純に1つの式にすることでさらに節約できます。
ドアノブ

省略できると思います.ToArray()
Vlad

1
私はそれがほぼ2。5年だったことを知っていますが、あなたはそれを82バイトまでゴルフすることができますusing System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(残念ながらLinqのインポートは必須です)。オンラインでお試しください。いい答え、私からの+1!
ケビンCruijssen


4

Japt、12バイト

Uâ ¬¦Uw â ¬w

オンラインでお試しください!

アルゴリズムを理解してくれた@xnorに感謝します。入力配列はに自動的に保存されU、でâあり、一意でwあり、逆であり、¦です!=¬空の文字列([1,2,3] => "123")と結合します。JavaScriptの比較では、2つの配列が同じオブジェクトでない限り等しくないとカウントするため、これが必要です。例(JaptではなくJSコード):

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

そうでない場合は、単に各配列を結合しないことで2バイトを削除できます。

Uâ ¦Uw â w

Japtのようなサウンドは、値の平等を実装したいかもしれません。
isaacg

4

ES6、76の 75 65 64バイト

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

@xnorの回答の簡単な移植版。

編集:に置き換えa.lastIndexOf(x)==iて1バイトを保存しましたa.indexOf(x,i+1)<0

編集:@ user81655のおかげで10バイト保存されました。

編集:に置き換えr||iて1バイトを保存しましたr|i


2
関数を使用して65バイト:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655

<0の代わりに〜を使用します。
ママファンロール

@ՊՓԼՃՐՊՃՈԲՍԼいいえ、-1にしたいです。~はと同じ>=0です。
ニール

Oh wait nevermind:P
ママファンロール

@ user81655すみません、なんらかの理由で以前あなたのコメントに気付かなかった。トリッキーですが、私はそれが好きです!
ニール


1

Java、281文字

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バイト

入力をPythonリストとして受け取るこの関数。残念なことに、Pythonリストは、文字列がのように末尾からの検索を直接サポートしていませんがrindex()、そうです。

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.