Negara-negara yang dikelilingi

54

Negara-negara memiliki serangkaian wilayah di dunia 1D. Setiap negara diidentifikasi secara unik oleh suatu angka. Kepemilikan wilayah dapat diwakili oleh daftar sebagai berikut:

1 1 2 2 1 3 3 2 4

Kami mendefinisikan teritori edgemost suatu negara sebagai dua teritori yang paling dekat dengan kedua sisi. Jika daftar di atas nol diindeks, 1wilayah edgemost negara terjadi di posisi 0dan 4.

Suatu negara mengelilingi yang lain jika sublist antara dua wilayah edgemost-nya berisi semua wilayah negara lain. Dalam contoh di atas, sublist antara 2wilayah edgemost negara adalah:

2 2 1 3 3 2

Dan kita melihat bahwa semua wilayah negara 3berada di antara wilayah negara yang paling tinggi 2, sehingga negara 2mengelilingi negara 3.

Negara dengan hanya satu elemen tidak akan pernah mengelilingi yang lain.

Tantangan

Ambil daftar bilangan bulat sebagai masukan (dalam format apapun) dan output truthy nilai jika negara manapun dikelilingi oleh yang lain, dan falsy nilai sebaliknya.

Anda dapat mengasumsikan bahwa daftar input tidak kosong, hanya berisi bilangan bulat positif, dan tidak 'melewatkan' angka apa pun: misalnya, 1 2 1 5akan menjadi input yang tidak valid.

Uji Kasus

+----------------------+--------+
|        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
sumber
21
Selamat datang di PPCG! Selamat atas pertanyaan pertama Anda; ini terlihat sangat bagus!
Mego
6
Dan berapa banyak tentara yang saya dapatkan pada giliran saya berikutnya untuk mengelilingi suatu negara?
ThisSuitIsBlackNot

Jawaban:

33

Pyth, 7 byte

n{Q_{_Q

Jalankan kode pada test case.

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)

Satu-satunya cara untuk menghindari sekitarnya adalah agar wilayah paling kiri negara itu diurutkan dalam urutan yang sama dengan wilayah paling kanan mereka. Jika dua negara ditukar dalam urutan ini, satu memiliki wilayah yang lebih kiri dan lebih jauh dari yang lain, dan sekitarnya.

Untuk mendapatkan negara unik dalam urutan wilayah paling kiri, kami cukup deduplicate, yang mempertahankan pesanan ini. Hal yang sama dilakukan untuk wilayah paling kanan dengan membalik, menduplikasi, lalu membalikkan lagi. Jika ini memberikan hasil yang berbeda, maka suatu negara dikelilingi.

Tidak
sumber
12

Retina , 61 60 byte

Lebih lama dari yang saya inginkan ...

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

Mencetak jumlah negara yang mengelilingi setidaknya satu negara lain.

Cobalah online.

Ini adalah implementasi yang sangat mudah dari spec: kami mencari pola A...B...Asedemikian rupa sehingga Btidak muncul sebelum atau setelah pertandingan.

Martin Ender
sumber
11

Python, 64 byte

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

Satu-satunya cara untuk menghindari sekitarnya adalah agar wilayah paling kiri negara itu diurutkan dalam urutan yang sama dengan wilayah paling kanan mereka. Jika dua negara ditukar dalam urutan ini, satu memiliki wilayah yang lebih kiri dan lebih jauh dari yang lain, dan sekitarnya.

Fungsi memeriksa bahwa mengurutkan wilayah berdasarkan tampilan paling kiri dan penampilan paling kanan memberikan hasil yang sama. Sayangnya, daftar Python tidak memiliki rindexanalog dengan rfind, jadi kami membalikkan daftar, lalu membalikkan output yang diurutkan.

Panjang yang sama (64) dengan fungsi bantu:

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

C #, 113 byte

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

Tidak Disatukan:

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

    return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}

Menggunakan LINQpendekatan ringkas .

Jason Evans
sumber
1
Selamat datang di PPCG. Ini adalah solusi tanpa bulu yang sangat baik ; Saya sering harus memberi tahu pengguna baru bahwa orang-orang sering suka melihat versi kode mereka yang tidak dikenali (dapat dibaca, dikomentari). Namun, Anda lupa menyertakan versi golf! Ada beberapa trik yang bisa Anda gunakan, termasuk nama variabel 1char, menghapus spasi dan "variabel diasumsikan intkecuali Anda mengatakan sebaliknya". +1 untuk algoritme dan implementasi.
wizzwizz4
2
Ahhhh, begitu. Yup, saya baru dalam hal ini. Akan memangkas sedikit lemak dan coba lagi. Terima kasih atas sarannya.
Jason Evans
Anda dapat menyimpan dua byte dengan menggunakan nama variabel satu karakter — sebenarnya, Anda dapat menyimpan lebih banyak dengan tidak menggunakan variabel sama sekali dan hanya membuatnya menjadi ekspresi tunggal.
Gagang Pintu
Saya curiga Anda bisa menghilangkan .ToArray().
Vlad
1
Saya tahu ini sudah hampir 2,5 tahun, tetapi Anda dapat mengubahnya menjadi 82 byte : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(sayangnya impor Linq wajib). Cobalah online. Jawaban yang bagus, +1 dari saya!
Kevin Cruijssen
4

Japt, 12 byte

Uâ ¬¦Uw â ¬w

Cobalah online!

Terima kasih kepada @xnor untuk mencari tahu algoritmenya. Array input disimpan secara otomatis U, âuniqify, wterbalik, dan ¦sedang !=. ¬bergabung dengan string kosong ( [1,2,3] => "123"); ini diperlukan karena perbandingan JavaScript menghitung dua array sebagai tidak sama kecuali mereka adalah objek yang sama. Misalnya (kode JS, bukan Japt):

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

Jika ini bukan masalahnya, kami dapat menghapus dua byte dengan tidak bergabung dengan setiap array:

Uâ ¦Uw â w
Produksi ETH
sumber
Kedengarannya seperti Japt mungkin ingin menerapkan kesetaraan nilai.
isaacg
4

ES6, 76 75 65 64 byte

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

Port langsung jawaban @ xnor.

Sunting: Disimpan 1 byte dengan mengganti a.lastIndexOf(x)==idengan a.indexOf(x,i+1)<0.

Sunting: Disimpan 10 byte berkat @ user81655.

Sunting: Disimpan 1 byte dengan mengganti r||idengan r|i.

Neil
sumber
2
65 byte menggunakan fungsi:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655
gunakan ~ alih-alih <0.
Mama Fun Roll
@ ՊՓԼՃՐՊՃՈԲՍԼ Tidak, saya ingin -1. ~sama dengan >=0.
Neil
Oh, tunggu, ingat: P
Mama Fun Roll
@ user81655 Maaf saya tidak melihat komentar Anda sebelumnya karena alasan tertentu. Trik, tapi aku suka itu!
Neil
1

Java, 281 Karakter

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
sumber
1

Python 3, 90 byte

Fungsi ini yang mengambil input sebagai daftar Python. Sayangnya, daftar Python tidak secara langsung mendukung pencarian dari akhir seperti halnya string rindex(), tetapi oh well.

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
sumber