ประเทศโดยรอบ


54

ประเทศต่าง ๆ เป็นเจ้าของอาณาเขตบนโลก 1D แต่ละประเทศมีการระบุหมายเลขที่ไม่ซ้ำกัน ความเป็นเจ้าของอาณาเขตสามารถแสดงโดยรายการดังนี้:

1 1 2 2 1 3 3 2 4

เรากำหนดเขตแดนทางประเทศที่เป็นดินแดนสองแห่งที่อยู่ใกล้กับขอบทั้งสอง หากรายการดังกล่าวข้างต้นได้รับการศูนย์การจัดทำดัชนีประเทศ1ของดินแดน edgemost เกิดขึ้นที่ตำแหน่งและ04

ประเทศล้อมรอบอีกรายการหนึ่งหากรายการย่อยระหว่างสองภูมิภาค edgemost มีอาณาเขตทั้งหมดของประเทศอื่น ในตัวอย่างข้างต้นรายการย่อยระหว่าง2ดินแดน edgemost ของประเทศคือ:

2 2 1 3 3 2

และเราจะเห็นว่าทุกภูมิภาคของประเทศ3อยู่ระหว่างดินแดน edgemost ของประเทศ2เพื่อให้ประเทศล้อมรอบประเทศ23

ประเทศที่มีองค์ประกอบเดียวเท่านั้นจะไม่มีทางล้อมรอบอีก

ท้าทาย

รับรายการของจำนวนเต็มเป็น input (ในรูปแบบใด ๆ ) และการส่งออกที่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! ขอแสดงความยินดีกับคำถามแรกของคุณ อันนี้ดูดีจริงๆ!
Mego

6
และฉันจะได้กองทัพในรอบต่อไปของฉันสำหรับรอบประเทศ?
ThisSuitIsBlackNot

คำตอบ:


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)

วิธีเดียวที่จะหลีกเลี่ยงสภาพแวดล้อมคือดินแดนทางซ้ายสุดของประเทศที่จะถูกจัดเรียงในลำดับเดียวกับเขตแดนที่ถูกต้องที่สุด หากมีการแลกเปลี่ยนสองประเทศในคำสั่งนี้ประเทศหนึ่งจะมีอาณาเขตทั้งด้านซ้ายและด้านขวามากกว่าอีกประเทศหนึ่งและล้อมรอบอยู่

ในการรับประเทศที่ไม่เหมือนใครตามลำดับเขตแดนที่เหลือเราเพียงแค่ขจัดความซ้ำซ้อนซึ่งรักษาคำสั่งนี้เอาไว้ เช่นเดียวกันสำหรับดินแดนที่ถูกต้องที่สุดโดยการกลับรายการซ้ำซ้อนจากนั้นกลับรายการอีกครั้ง หากสิ่งเหล่านี้ให้ผลลัพธ์ที่แตกต่างกันแสดงว่าประเทศนั้นรายล้อมไปด้วย


12

เรติน่า61 61ไบต์

นานกว่าที่ฉันต้องการ ...

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

พิมพ์จำนวนประเทศที่ล้อมรอบประเทศอื่นอย่างน้อยหนึ่งแห่ง

ลองออนไลน์

เป็นการใช้งานสเปคที่ตรงไปตรงมามาก: เรามองหารูปแบบA...B...Aที่Bไม่ปรากฏก่อนหรือหลังการแข่งขัน


11

Python ขนาด 64 ไบต์

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

วิธีเดียวที่จะหลีกเลี่ยงสภาพแวดล้อมคือดินแดนทางซ้ายสุดของประเทศที่จะถูกจัดเรียงในลำดับเดียวกับเขตแดนที่ถูกต้องที่สุด หากมีการแลกเปลี่ยนสองประเทศในคำสั่งนี้ประเทศหนึ่งจะมีอาณาเขตทั้งด้านซ้ายและด้านขวามากกว่าอีกประเทศหนึ่งและล้อมรอบอยู่

ฟังก์ชั่นตรวจสอบว่าการเรียงลำดับอาณาเขตตามลักษณะที่ปรากฏซ้ายสุดและรูปลักษณ์ที่อยู่ขวาสุดให้ผลลัพธ์เดียวกัน น่าเสียดายที่รายการ 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);}

Ungolfed:

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แก้ปัญหา; ฉันมักจะต้องแจ้งผู้ใช้ใหม่ว่าคนมักชอบดูรหัสรุ่นที่อ่านไม่ออก (อ่านได้และแสดงความคิดเห็น) อย่างไรก็ตามคุณลืมที่จะรวมรุ่น golfed! มีเทคนิคหลายอย่างที่คุณสามารถใช้ได้รวมถึงชื่อตัวแปร 1char การลบช่องว่างและ "ตัวแปรที่สันนิษฐานว่าเป็นintเว้นแต่คุณจะพูดอย่างอื่น" การเล่นโวหาร +1 สำหรับอัลกอริทึมและการใช้งาน
wizzwizz4

2
Ahhhh ฉันเห็น ใช่ฉันยังใหม่กับสิ่งนี้ จะตัดแต่งไขมันเล็กน้อยแล้วลองอีกครั้ง ขอบคุณสำหรับคำแนะนำ.
Jason Evans

คุณสามารถบันทึกสองไบต์โดยใช้ชื่อตัวแปรหนึ่งตัวอักษร - ที่จริงแล้วคุณสามารถบันทึกได้มากขึ้นโดยไม่ใช้ตัวแปรเลยและทำให้เป็นนิพจน์เดียว
Doorknob

.ToArray()ฉันสงสัยว่าคุณสามารถละเว้น
Vlad

1
ฉันรู้ว่ามันเกือบ 2.5 ปีแล้ว แต่คุณสามารถตีมันลงไปที่82 ไบต์ : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(การนำเข้า Linq นั้นเป็นสิ่งที่น่าเสียดายมาก) ลองออนไลน์ คำตอบที่ดี +1 จากฉัน!
Kevin Cruijssen


4

Japt, 12 ไบต์

Uâ ¬¦Uw â ¬w

ลองออนไลน์!

ขอบคุณ @xnor สำหรับการหาอัลกอริทึม อาร์เรย์การป้อนข้อมูลจะถูกเก็บไว้โดยอัตโนมัติU, âเป็น uniqify, wเป็นสิ่งที่ตรงกันข้ามและเป็น¦ เข้าร่วมกับสตริงที่ว่างเปล่า ( ); สิ่งนี้จำเป็นเนื่องจากการรวบรวมของ JavaScript จะนับสองอาร์เรย์ไม่เท่ากันยกเว้นว่าเป็นวัตถุเดียวกัน ตัวอย่างเช่น (รหัส JS ไม่ใช่ Japt):!=¬[1,2,3] => "123"

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

หากไม่ใช่กรณีนี้เราสามารถลบสองไบต์ได้โดยไม่ต้องเข้าร่วมแต่ละอาร์เรย์:

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

แก้ไข: บันทึก 1 ไบต์โดยการแทนที่ด้วยa.lastIndexOf(x)==ia.indexOf(x,i+1)<0

แก้ไข: บันทึก 10 ไบต์ด้วย @ user81655

แก้ไข: บันทึก 1 ไบต์โดยการแทนที่ด้วยr||ir|i


2
65 ไบต์โดยใช้ฟังก์ชั่น:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
81655

ใช้ ~ แทน <0
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼไม่ฉันต้องการให้เป็น -1 เป็นเช่นเดียวกับ~ >=0
Neil

โอ้รอไม่เป็นไร: P
Mama Fun Roll

@ user81655 ขออภัยฉันไม่ได้สังเกตเห็นความคิดเห็นของคุณมาก่อนด้วยเหตุผลบางอย่าง เล่ห์เหลี่ยม แต่ฉันชอบมัน!
Neil


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 ไม่รองรับการค้นหาโดยตรงจากจุดสิ้นสุดเช่นเดียวกับสตริง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.