Paesi Circondati


54

I paesi possiedono una serie di territori in un mondo 1D. Ogni paese è identificato in modo univoco da un numero. La proprietà dei territori può essere rappresentata da un elenco come segue:

1 1 2 2 1 3 3 2 4

Definiamo i territori più edgemost di un paese come i due territori più vicini ai bordi. Se l'elenco sopra è stato indicizzato zero, 1i territori più edgemost del paese si verificano in posizione 0e 4.

Un paese ne circonda un altro se l'elenco secondario tra i suoi due territori più edgemost contiene tutti i territori di un altro paese. Nell'esempio sopra, la 2lista secondaria tra i territori più edgemost del paese è:

2 2 1 3 3 2

E vediamo che tutti i territori del paese 3sono tra i territori più edgemostici del paese 2, quindi il paese 2circonda il paese 3.

Un paese con un solo elemento non circonderà mai un altro.

Sfida

Prendi un elenco di numeri interi come input (in qualsiasi formato) e genera un valore di verità se un paese è circondato da un altro e un valore di falsa in caso contrario.

Puoi presumere che l'elenco di input sia non vuoto, contenga solo numeri interi positivi e non "salti" alcun numero: ad esempio, 1 2 1 5sarebbe un input non valido.

Casi test

+----------------------+--------+
|        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
Benvenuti in PPCG! Congratulazioni per la tua prima domanda; questo sembra davvero buono!
Mego

Risposte:


33

Pyth, 7 byte

n{Q_{_Q

Esegui il codice su casi di test.

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)

L'unico modo per evitare i dintorni è che i territori più a sinistra dei paesi siano ordinati nello stesso ordine dei loro territori più a destra. Se due paesi vengono scambiati in questo ordine, uno ha un territorio sia più a sinistra che più a destra dell'altro, e quindi lo circonda.

Per ottenere i paesi unici in ordine di territorio più a sinistra, dedupliciamo semplicemente, che preserva questo ordine. Lo stesso viene fatto per il territorio più a destra invertendo, deduplicando, quindi invertendo di nuovo. Se questi danno risultati diversi, allora un paese è circondato.


12

Retina , 61 60 byte

Molto più a lungo di quanto vorrei ...

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

Stampa il numero di paesi che circondano almeno un altro paese.

Provalo online.

È un'implementazione molto semplice delle specifiche: cerchiamo il modello in A...B...Amodo che Bnon appaia né prima né dopo la partita.


11

Python, 64 byte

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

L'unico modo per evitare i dintorni è che i territori più a sinistra dei paesi siano ordinati nello stesso ordine dei loro territori più a destra. Se due paesi vengono scambiati in questo ordine, uno ha un territorio sia più a sinistra che più a destra dell'altro, e quindi lo circonda.

La funzione verifica che l'ordinamento dei territori per aspetto più a sinistra e aspetto più a destra dia gli stessi risultati. Sfortunatamente, gli elenchi di Python non sono rindexanaloghi a rfind, quindi invertiamo l'elenco, quindi invertiamo l'output ordinato.

Stessa lunghezza (64) con una funzione ausiliaria:

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

Ungolfed:

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

    return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}

Utilizzando un LINQapproccio conciso .


1
Benvenuti in PPCG. Questa è un'ottima soluzione non golfata ; Spesso devo informare i nuovi utenti che alla gente piace vedere spesso versioni non leggibili (leggibili, commentate) del loro codice. Tuttavia, hai dimenticato di includere una versione golf! Esistono diversi trucchi che è possibile utilizzare, tra cui i nomi delle variabili 1char, la rimozione di spazi bianchi e la intstranezza delle "variabili assunte a meno che non si dica diversamente". +1 per l'algoritmo e l'implementazione.
wizzwizz4,

2
Ahhhh, capisco. Sì, sono nuovo a questo. Ridurrà un po 'di grasso e riproverà. Grazie per il consiglio.
Jason Evans,

Puoi salvare due byte usando nomi di variabili di un carattere — in realtà, puoi risparmiare di più non usando le variabili e semplicemente trasformandola in una singola espressione.
Maniglia della porta

Sospetto che potresti ometterti .ToArray().
Vlad

1
So che sono passati quasi 2,5 anni, ma puoi giocarci fino a 82 byte : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(l'importazione di Linq è purtroppo obbligatoria). Provalo online. Bella risposta, +1 da parte mia!
Kevin Cruijssen,


4

Japt, 12 byte

Uâ ¬¦Uw â ¬w

Provalo online!

Grazie a @xnor per aver capito l'algoritmo. L'array di input viene automaticamente archiviato U, âè uniqify, wè inverso e lo ¦è !=. ¬si unisce con la stringa vuota ( [1,2,3] => "123"); questo è necessario perché la comparazione di JavaScript conta due matrici come non uguali a meno che non siano lo stesso oggetto. Ad esempio (codice JS, non Japt):

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

In caso contrario, potremmo rimuovere due byte semplicemente non unendo ciascun array:

Uâ ¦Uw â w

Sembra che Japt potrebbe voler implementare l'uguaglianza di valore.
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)

Porta semplice delle risposte di @ xnor.

Modifica: 1 byte salvato sostituendolo a.lastIndexOf(x)==icon a.indexOf(x,i+1)<0.

Modifica: salvato 10 byte grazie a @ user81655.

Modifica: 1 byte salvato sostituendolo r||icon r|i.


2
65 byte usando una funzione:a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655

usa ~ invece di <0.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ No, voglio che sia -1. ~è lo stesso di >=0.
Neil,

Oh aspetta non importa: P
Mama Fun Roll

@ user81655 Mi dispiace non aver notato il tuo commento prima per qualche motivo. Ingannevole, ma mi piace!
Neil,


1

Java, 281 caratteri

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

Questa funzione che accetta l'input come un elenco Python. Purtroppo, gli elenchi di Python non supportano direttamente la ricerca dalla fine come fanno le stringhe rindex(), ma vabbè.

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.