Các nước xung quanh


54

Các quốc gia sở hữu một loạt các lãnh thổ trên thế giới 1D. Mỗi quốc gia được xác định duy nhất bởi một số. Quyền sở hữu các lãnh thổ có thể được thể hiện bằng một danh sách như sau:

1 1 2 2 1 3 3 2 4

Chúng tôi xác định các lãnh thổ edgemost của một quốc gia là hai lãnh thổ gần nhất với một trong hai cạnh. Nếu danh sách trên không được lập chỉ mục, 1các lãnh thổ edgemost của quốc gia xảy ra tại vị trí 04.

Một quốc gia bao quanh một quốc gia khác nếu danh sách phụ giữa hai lãnh thổ của quốc gia đó chứa tất cả các lãnh thổ của quốc gia khác. Trong ví dụ trên, danh sách con giữa 2các lãnh thổ edgemost của quốc gia là:

2 2 1 3 3 2

Và chúng ta thấy rằng tất cả các lãnh thổ của đất nước 3nằm giữa các lãnh thổ quốc gia 2, vì vậy đất nước 2bao quanh đất nước 3.

Một đất nước chỉ có một yếu tố sẽ không bao giờ bao quanh một quốc gia khác.

Thử thách

Đi một danh sách các số nguyên như là đầu vào (ở định dạng bất kỳ) và đầu ra một truthy giá trị nếu bất cứ nước nào được bao quanh bởi một, và một falsy giá trị khác.

Bạn có thể giả sử rằng danh sách đầu vào là không trống, chỉ chứa các số nguyên dương và không 'bỏ qua' bất kỳ số nào: ví dụ: 1 2 1 5sẽ là đầu vào không hợp lệ.

Các trường hợp thử nghiệm

+----------------------+--------+
|        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
Chào mừng đến với PPCG! Chúc mừng câu hỏi đầu tiên của bạn; cái này nhìn rất tốt
Mego

Câu trả lời:


33

Bình thường, 7 byte

n{Q_{_Q

Chạy mã trên các trường hợp thử nghiệm.

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)

Cách duy nhất để tránh xung quanh là các lãnh thổ ngoài cùng bên trái của các quốc gia được sắp xếp theo thứ tự giống như các lãnh thổ ngoài cùng bên phải của họ. Nếu hai quốc gia được hoán đổi theo thứ tự này, một quốc gia có một lãnh thổ cả bên trái và bên phải hơn so với quốc gia khác, và do đó bao quanh nó.

Để có được các quốc gia duy nhất theo thứ tự lãnh thổ ngoài cùng bên trái, chúng tôi chỉ cần lặp lại, duy trì thứ tự này. Điều tương tự được thực hiện cho lãnh thổ ngoài cùng bên phải bằng cách đảo ngược, lặp lại, sau đó đảo ngược lại. Nếu những kết quả này cho kết quả khác nhau, thì một quốc gia được bao quanh.


12

Võng mạc , 61 60 byte

Lâu hơn tôi muốn ...

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

In số lượng quốc gia bao quanh ít nhất một quốc gia khác.

Hãy thử trực tuyến.

Đó là một thực hiện rất đơn giản của spec: chúng ta tìm kiếm các mô hình A...B...Anhư vậy mà Bdường như không phải trước hoặc sau trận đấu.


11

Python, 64 byte

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

Cách duy nhất để tránh xung quanh là các lãnh thổ ngoài cùng bên trái của các quốc gia được sắp xếp theo thứ tự giống như các lãnh thổ ngoài cùng bên phải của họ. Nếu hai quốc gia được hoán đổi theo thứ tự này, một quốc gia có một lãnh thổ cả bên trái và bên phải hơn so với quốc gia khác, và do đó bao quanh nó.

Hàm kiểm tra việc sắp xếp các lãnh thổ theo diện mạo ngoài cùng bên trái và diện mạo ngoài cùng bên phải cho kết quả tương tự. Thật không may, danh sách Python không rindextương tự rfind, vì vậy chúng tôi đảo ngược danh sách, sau đó đảo ngược đầu ra được sắp xếp.

Cùng chiều dài (64) với chức năng phụ trợ:

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

6

C #, 113 byte

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

Ung dung:

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

    return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}

Sử dụng một LINQcách tiếp cận súc tích .


1
Chào mừng đến với PPCG. Đây là một rất tốt ungolfed giải pháp; Tôi thường phải thông báo cho người dùng mới rằng mọi người thường thích xem các phiên bản không mã hóa (có thể đọc, nhận xét) về mã của họ. Tuy nhiên, bạn đã quên bao gồm một phiên bản golf! Có một số thủ thuật bạn có thể sử dụng, bao gồm tên biến 1ar, loại bỏ khoảng trắng và "biến được giả sử là inttrừ khi bạn nói khác". +1 cho thuật toán và thực hiện.
wizzwizz4

2
À, tôi hiểu rồi. Yup, tôi mới biết điều này. Sẽ cắt một chút chất béo và thử lại. Cảm ơn vì lời khuyên.
Jason Evans

Bạn thực sự có thể lưu hai byte bằng cách sử dụng tên biến một ký tự, thực tế, bạn có thể tiết kiệm nhiều hơn bằng cách không sử dụng biến nào cả và chỉ cần biến nó thành một biểu thức.
Doorknob

Tôi nghi ngờ bạn có thể bỏ qua .ToArray().
Vlad

1
Tôi biết đã gần 2,5 năm, nhưng bạn có thể đánh golf xuống còn 82 byte : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(việc nhập Linq không may là bắt buộc). Hãy thử trực tuyến. Câu trả lời hay, +1 từ tôi!
Kevin Cruijssen


4

Japt, 12 byte

Uâ ¬¦Uw â ¬w

Hãy thử trực tuyến!

Cảm ơn @xnor đã tìm ra thuật toán. Mảng đầu vào được tự động lưu trữ trong U, âlà uniqify, wlà đảo ngược và ¦!=. ¬tham gia với chuỗi rỗng ( [1,2,3] => "123"); điều này là cần thiết bởi vì phần tổng hợp của JavaScript tính hai mảng là không bằng nhau trừ khi chúng là cùng một đối tượng. Ví dụ: (mã JS, không phải Japt):

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

Nếu đây không phải là trường hợp, chúng ta có thể loại bỏ hai byte bằng cách không tham gia mỗi mảng:

Uâ ¦Uw â w

Âm thanh như Japt có thể muốn thực hiện bình đẳng giá trị.
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)

Cổng đơn giản của câu trả lời của @ xnor.

Chỉnh sửa: Đã lưu 1 byte bằng cách thay thế a.lastIndexOf(x)==ibằng a.indexOf(x,i+1)<0.

Chỉnh sửa: Đã lưu 10 byte nhờ @ user81655.

Chỉnh sửa: Đã lưu 1 byte bằng cách thay thế r||ibằng r|i.


2
65 byte sử dụng chức năng:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655

sử dụng ~ thay vì <0.
Mama Fun Roll

@ Không, tôi muốn nó là -1. ~cũng giống như >=0.
Neil

Oh chờ đợi không bao giờ: P
Mama Fun Roll

@ user81655 Xin lỗi tôi không nhận thấy bình luận của bạn trước đây vì một số lý do. Thủ đoạn, nhưng tôi thích nó!
Neil


1

Java, 281 ký tự

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 byte

Hàm này lấy đầu vào là danh sách Python. Đáng buồn thay, danh sách Python không hỗ trợ trực tiếp tìm kiếm từ cuối như các chuỗi làm với rindex(), nhưng ồ.

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.