Países vizinhos

54

Os países possuem uma série de territórios em um mundo 1D. Cada país é identificado exclusivamente por um número. A propriedade dos territórios pode ser representada por uma lista da seguinte maneira:

1 1 2 2 1 3 3 2 4

Definimos os territórios de edgemost de um país como os dois territórios mais próximos de uma das extremidades. Se a lista acima não tiver sido indexada em zero, 1os territórios de edgemost do país ocorrerão na posição 0e 4.

Um país circunda outro se a sub-lista entre seus dois territórios edgemost contiver todos os territórios de outro país. No exemplo acima, a 2sub- lista entre os territórios de edgemost do país é:

2 2 1 3 3 2

E vemos que todos os territórios do país 3estão entre os territórios edgemost do país 2, então país 2circunda o país 3.

Um país com apenas um elemento nunca cercará outro.

Desafio

Dê uma lista de inteiros como entrada (em qualquer formato) e saída de um truthy valor se qualquer país é cercado por uma outra, e uma Falsas valor de outra forma.

Você pode assumir que a lista de entrada não é vazia, contém apenas números inteiros positivos e não ignora nenhum número: por exemplo, 1 2 1 5seria uma entrada inválida.

Casos de teste

+----------------------+--------+
|        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  |
+----------------------+--------+
Sísifo
fonte
21
Bem-vindo ao PPCG! Parabéns pela sua primeira pergunta; este parece realmente bom!
Mego
6
E quantos exércitos recebo no meu próximo turno por cercar um país?
precisa saber é o seguinte

Respostas:

33

Pitão, 7 bytes

n{Q_{_Q

Execute o código nos casos de teste.

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)

A única maneira de evitar o entorno é que os territórios mais à esquerda dos países sejam classificados na mesma ordem que seus territórios mais à direita. Se dois países são trocados nessa ordem, um tem um território mais à esquerda e mais à direita do que o outro, e o rodeia.

Para obter os países únicos em ordem do território mais à esquerda, simplesmente desduplicamos, o que preserva essa ordem. O mesmo é feito para o território mais à direita revertendo, desduplicando e revertendo novamente. Se estes dão resultados diferentes, então um país está cercado.

xnor
fonte
12

Retina , 61 60 bytes

Muito mais tempo do que eu gostaria ...

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

Imprime o número de países que cercam pelo menos um outro país.

Experimente online.

É uma implementação muito direta das especificações: procuramos o padrão A...B...Atal que Bapareça nem antes nem depois da partida.

Martin Ender
fonte
11

Python, 64 bytes

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

A única maneira de evitar o entorno é que os territórios mais à esquerda dos países sejam classificados na mesma ordem que seus territórios mais à direita. Se dois países são trocados nessa ordem, um tem um território mais à esquerda e mais à direita do que o outro, e o rodeia.

A função verifica se a classificação dos territórios por aparência mais à esquerda e aparência mais à direita fornece os mesmos resultados. Infelizmente, as listas Python não são rindexanálogas rfind; portanto, revertemos a lista e, em seguida, revertemos a saída classificada.

Mesmo comprimento (64) com função auxiliar:

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

C #, 113 bytes

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

Usando uma LINQabordagem concisa .

Jason Evans
fonte
11
Bem-vindo ao PPCG. Esta é uma solução muito boa e não destruída ; Frequentemente, tenho que informar aos novos usuários que as pessoas gostam de ver versões não golfadas (legíveis, comentadas) de seus códigos. No entanto, você esqueceu de incluir uma versão para golfe! Existem vários truques que você pode usar, incluindo nomes de variáveis ​​1char, removendo o espaço em branco e as "variáveis ​​assumidas, a intmenos que você diga o contrário". +1 para o algoritmo e implementação.
precisa saber é o seguinte
2
Ahhhh, entendo. Sim, eu sou novo nisso. Aparará um pouco de gordura e tentará novamente. Obrigado pelo conselho.
21416 Jason Jason
Você pode salvar dois bytes usando nomes de variáveis ​​de um caractere - na verdade, você pode economizar mais não utilizando variáveis ​​e transformando-a em uma única expressão.
Maçaneta
Eu suspeito que você poderia omitir .ToArray().
Vlad
11
Eu sei que já faz quase 2,5 anos, mas você pode jogar até 82 bytes : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(infelizmente a importação do Linq é obrigatória). Experimente online. Boa resposta, +1 de mim!
Kevin Cruijssen
4

Japonês, 12 bytes

Uâ ¬¦Uw â ¬w

Experimente online!

Agradecemos ao @xnor por descobrir o algoritmo. A matriz de entrada é automaticamente armazenada U, âé uniqify, wé reversa e ¦é !=. ¬junta-se à string vazia ( [1,2,3] => "123"); isso é necessário porque a comparsa do JavaScript conta duas matrizes como não iguais, a menos que sejam o mesmo objeto. Por exemplo (código JS, não Japt):

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

Se não fosse esse o caso, poderíamos remover dois bytes simplesmente não unindo cada matriz:

Uâ ¦Uw â w
ETHproductions
fonte
Parece que Japt pode querer implementar a igualdade de valor.
Isaacg
4

ES6, 76 75 65 64 bytes

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

Porta direta das respostas do @ xnor.

Editar: salvou 1 byte substituindo a.lastIndexOf(x)==ipor a.indexOf(x,i+1)<0.

Editar: salvou 10 bytes graças a @ user81655.

Editar: salvou 1 byte substituindo r||ipor r|i.

Neil
fonte
2
65 bytes usando uma função:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655
use ~ em vez de <0.
Mama Fun Roll
@ ՊՓԼՃՐՊՃՈԲՍԼ Não, eu quero que seja -1. ~é o mesmo que >=0.
Neil
Oh wait nevermind: P
Mama Fun Roll
@ user81655 Desculpe, mas por algum motivo não notei seu comentário antes. Complicado, mas eu gosto!
Neil
1

Java, 281 caracteres

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;}}
Mínimo
fonte
1

Python 3, 90 bytes

Esta função que recebe a entrada como uma lista Python. Infelizmente, as listas Python não suportam diretamente a pesquisa a partir do final, como fazem as strings rindex(), mas tudo bem.

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
fonte