Оточені країни


54

Країни володіють низкою територій у 1D світі. Кожна країна однозначно ідентифікується числом. Власність на території може бути представлена ​​таким чином:

1 1 2 2 1 3 3 2 4

Ми визначаємо крайові території країни як дві території, найближчі до будь-якого краю. Якщо вищевказаний список був індексований нулем, то 1найпопулярніші країни країни відбуваються в положенні 0та 4.

Країна оточує іншу, якщо підпис у двох її регіональних територіях містить усі території іншої країни. У наведеному вище прикладі 2підпис під територією найвищої країни :

2 2 1 3 3 2

І ми бачимо, що всі території країни 3знаходяться між крайніми країнами країни 2, тому країна 2оточує країну 3.

Країна, що має лише один елемент, ніколи не оточить іншого.

Виклик

Візьміть список цілих чисел як вхідні (у будь-якому форматі) та виведіть триєдине значення, якщо будь-яка країна оточена іншою, а фальшиве значення - інакше.

Можна припустити, що список вводу не порожній, містить лише додатні цілі числа і не пропускає жодних чисел: наприклад, 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

Відповіді:


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 60 байт

Набагато довше, ніж я хотів би ...

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

Друкує кількість країн, що оточують принаймні одну іншу країну.

Спробуйте в Інтернеті.

Це дуже проста реалізація специфікації: ми шукаємо такий шаблон A...B...A, який Bне з’являється ні до, ні після матчу.


11

Пітон, 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);}

Безголівки:

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

    return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}

Використання стислого LINQпідходу.


1
Ласкаво просимо до PPCG. Це дуже гарне рішення, що не має волі ; Мені часто доводиться інформувати нових користувачів про те, що люди часто люблять бачити необорочені (читаються, коментовані) версії свого коду. Однак ви забули включити версію для гольфу! Ви можете скористатися декількома хитрощами, включаючи назви змінних 1char, видалення пробілів та химерність "змінних, які вважаються такими, intякщо ви не скажете інше". +1 для алгоритму та реалізації.
wizzwizz4

2
А-а-а, бачу. Так, я новачок у цьому. Викроїть трохи жиру і спробуйте ще раз. Дякую за пораду.
Джейсон Еванс

Ви можете зберегти два байти, скориставшись одноіменними іменами змінних - насправді ви можете заощадити більше, не використовуючи змінних і просто перетворивши їх у єдиний вираз.
Дверна ручка

Я підозрюю, що ви могли пропустити .ToArray().
Влад

1
Я знаю, що минуло майже 2,5 роки, але ви можете переграти його до 82 байт : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(імпорт Linq, на жаль, обов'язковий). Спробуйте в Інтернеті. Приємна відповідь, +1 від мене!
Кевін Круїссен


4

Japt, 12 байт

Uâ ¬¦Uw â ¬w

Спробуйте в Інтернеті!

Дякуємо @xnor, що розробив алгоритм. Вхідний масив автоматично зберігається у U, âє uniqify, wє зворотним та ¦є !=. ¬приєднується до порожнього рядка ( [1,2,3] => "123"); це необхідно, оскільки порівняння JavaScript вважає два масиви не рівними, якщо вони не є одним і тим же об'єктом. Наприклад (код JS, а не Japt):

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)==iна a.indexOf(x,i+1)<0.

Редагувати: Збережено 10 байт завдяки @ user81655.

Редагувати: збережено 1 байт, замінивши r||iна r|i.


2
65 байт за допомогою функції:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655

використовувати ~ замість <0.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ Ні, я хочу, щоб це було -1. ~те саме, що >=0.
Ніл

О, не чекайте нічого: P
Mama Fun Roll

@ user81655 Вибачте, я раніше чомусь не помітив ваш коментар. Хитрість, але мені це подобається!
Ніл


1

Ява, 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.