Etraftaki Ülkeler


54

Ülkeler 1B dünyasında bir dizi bölgeye sahipler. Her ülke benzersiz bir sayı ile tanımlanır. Bölgelerin mülkiyeti aşağıdaki gibi bir liste ile temsil edilebilir:

1 1 2 2 1 3 3 2 4

Bir ülkenin en uç bölgelerini her iki kenara en yakın iki bölge olarak tanımlıyoruz. Yukarıdaki liste sıfır endeksli ise, ülkenin 1en dar bölgeleri 0ve konumunda bulunur 4.

Bir ülke çevreleyen iki edgemost toprakları arasındaki alt liste başka bir ülkenin tüm bölgeleri içeriyorsa başka. Yukarıdaki örnekte, ülkenin 2en uç bölgeleri arasındaki alt liste:

2 2 1 3 3 2

Ve ülkenin bütün bölgelerinin ülkenin 3en uç bölgeleri arasında olduğunu görüyoruz 2, bu nedenle ülke ülkeyi 2çevreliyor 3.

Sadece bir elemente sahip bir ülke asla bir başkasını kuşatmaz.

Meydan okuma

Girdi olarak herhangi bir tamsayı listesini alın (herhangi bir formatta) ve herhangi bir ülke bir başkasıyla çevrelenmişse bir gerçeğe uygun değer, aksi takdirde sahte bir değer verin.

Giriş listesinin boş olmadığını, yalnızca pozitif tamsayılar içerdiğini ve herhangi bir sayıyı 'atlamadığını' varsayabilirsiniz: örneğin, 1 2 1 5geçersiz giriş olur.

Test Kılıfları

+----------------------+--------+
|        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'ye Hoşgeldiniz! İlk sorunuz için tebrikler; bu gerçekten iyi görünüyor!
Mego

Yanıtlar:


33

Pyth, 7 bayt

n{Q_{_Q

Kodu, test durumlarında çalıştırın.

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)

Çevrelemeden kaçınmanın tek yolu, ülkelerin en soldaki bölgelerinin, en sağdaki bölgeleriyle aynı sıraya göre sıralanmasıdır. İki ülke bu sıraya göre değiştirilirse, birinin diğerinden hem sağa hem de sağa doğru bir bölgesi vardır ve bu nedenle onu çevreler.

En soldaki bölgelere göre eşsiz ülkeleri elde etmek için, bu sırayı koruyan basitçe tekilleştirdik. Aynısı en sağdaki bölge için tersine çevirerek, veri tekilleştirerek, sonra tekrar ters çevirerek yapılır. Bunlar farklı sonuçlar verirse, o zaman ülke kuşatılır.


12

Retina , 61 60 bayt

İstediğimden çok daha uzun ...

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

En az bir başka ülkeyi çevreleyen ülke sayısını yazdırır.

Çevrimiçi deneyin.

Bu spec çok düz bir uygulama var: Biz desen bakmak A...B...Aböyle Bönce veya maçtan sonra ne görünür.


11

Python, 64 bayt

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

Çevrelemeden kaçınmanın tek yolu, ülkelerin en soldaki bölgelerinin, en sağdaki bölgeleriyle aynı sıraya göre sıralanmasıdır. İki ülke bu sıraya göre değiştirilirse, birinin diğerinden hem sağa hem de sağa doğru bir bölgesi vardır ve bu nedenle onu çevreler.

İşlev, bölgeleri en soldaki görünüme ve en sağdaki görünüme göre sıralamanın aynı sonuçları verdiğini denetler. Maalesef, Python listelerininkine rindexbenzemez rfind, bu yüzden listeyi tersine çeviririz, sonra sıralanan çıkışı tersine çeviririz.

Yardımcı fonksiyon ile aynı uzunluk (64):

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

6

C #, 113 bayt

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);
}

Kısa bir LINQyaklaşım kullanmak .


1
PPCG'ye Hoşgeldiniz. Bu çok iyi bir unungolfed çözümdür; Yeni kullanıcıları, çoğu zaman kodlarının işaretsiz (okunabilir, yorumlu) sürümlerini görmekten hoşlandıklarını bildirmek zorundayım. Ancak, golf versiyonunu eklemeyi unutmuşsun! 1 karakter değişken isimleri, boşlukları silmeyi ve " intaksi belirtilmediği sürece varsayılan değişkenleri" de dahil olmak üzere kullanabileceğiniz birkaç püf noktası vardır . Algoritma ve uygulama için +1.
wizzwizz4

2
Ahhhh, anlıyorum. Evet, bunun için yeniyim. Biraz yağ keser ve tekrar deneyin. Tavsiye için teşekkürler.
Jason Evans,

Tek karakterli değişken adlarını kullanarak iki bayt kaydedebilirsiniz; aslında, değişkenleri hiç kullanmama ve yalnızca tek bir ifade haline getirerek daha fazla tasarruf edebilirsiniz.
Doorknob

İhmal edebileceğinden şüpheleniyorum .ToArray().
Vlad

1
Neredeyse 2,5 yıl geçtiğini biliyorum, ancak 82 byte'a kadar golf oynayabiliyorsunuz : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(Linq ithalatı maalesef zorunludur). Çevrimiçi deneyin. Güzel cevap, benden +1!
Kevin Cruijssen


4

Japt, 12 bayt

Uâ ¬¦Uw â ¬w

Çevrimiçi deneyin!

Algoritmayı bulmak için @ xnor'a teşekkür ederiz. Girdi dizisi otomatik olarak depolanır U, âuniqify olup, wters ve ¦bir !=. ¬boş dizeyle ( [1,2,3] => "123") birleşir ; bu gereklidir, çünkü JavaScript'in karşılaştırması, aynı nesne olmadıkça, iki diziyi eşit olmadığı şeklinde sayar. Örneğin (JS kodu, Japt değil):

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

Böyle olmasaydı, her diziye katılmadan iki baytı kaldırabiliriz:

Uâ ¦Uw â w

Japt, değer eşitliği uygulamak isteyebilir.
isaacg,

4

ES6, 76 75 65 64 bayt

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

@ Xnor'ın cevaplarının basit bağlantı noktası.

Düzenleme: a.lastIndexOf(x)==iile değiştirerek 1 bayt kaydedildi a.indexOf(x,i+1)<0.

Düzenleme: @ user81655 sayesinde 10 bayt kaydedildi.

Düzenleme: r||iile değiştirerek 1 bayt kaydedildi r|i.


2
Bir işlevi kullanarak 65 bayt:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655

<0 yerine ~ kullanın.
Mama Fun Roll

@ Hayır, -1 olmasını istiyorum. ~aynıdır >=0.
Neil

Bekle, boşver: P
Mama Fun Roll

@ user81655 Üzgünüm, daha önce nedense yorumunuzu görmedim. Tricksy, ama hoşuma gitti!
Neil


1

Java, 281 Karakterler

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 bayt

Girişi bir Python listesi olarak alan bu fonksiyon. Ne yazık ki, Python listeleri, dizelerin yaptığı gibi sondan itibaren aramayı doğrudan desteklemiyor rindex(), ama ah evet.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.