L'array può essere mischiato?


15

sfondo

I gestori di carte molto abili sono capaci di una tecnica in base alla quale tagliano perfettamente un mazzo a metà, quindi intercalano perfettamente le carte. Se iniziano con un mazzo ordinato ed eseguono questa tecnica in modo impeccabile 52 volte di seguito, il mazzo verrà ripristinato in ordine. La tua sfida è quella di prendere un mazzo di carte un array intero e determinare se può essere ordinato usando solo shuffle di Faro.

Definizione

Matematicamente, un shuffle Faro è una permutazione su 2 n elementi (per qualsiasi numero intero positivo n ) che porta l'elemento in posizione i (1-indicizzato) in posizione 2 i (mod 2 n +1). Vorremmo anche essere in grado di gestire elenchi di lunghezza dispari, quindi in quel caso, aggiungi un elemento alla fine dell'elenco (un Joker, se ne hai uno utile) e Faro mescola il nuovo elenco come sopra, ma ignora l'elemento fittizio aggiunto quando si controlla l'ordine dell'elenco.

Obbiettivo

Scrivi un programma o una funzione che prende un elenco di numeri interi e restituisce o restituisce un valore vero se un certo numero di riordini Faro fa sì che tale elenco venga ordinato in ordine non crescente (anche se quel numero è zero - i piccoli elenchi dovrebbero dare un valore). In caso contrario, restituisce o genera un falso.

Esempi

[1,1,2,3,5,8,13,21]  => True
[5,1,8,1,13,2,21,3] => True
[9,36,5,34,2,10,1] => True
[1,0] => True
[0] => True
[] => True
[3,2,1] => True
[3,1,2] => False
[9,8,7,6,5,4,3,2,1,0] => True
[9,8,7,6,5,4,3,2,0,1] => False
[3,1,4,1,5,9,2,6,9] => False
[-1,-1,-1,-2] => True

punteggio

Questo è il quindi vince la fonte più breve in byte.


Per evitare confusione con gli altri gestori di carte, è necessario notare che esistono due tipi di mescolatori Faro. Un in-shuffle e un out-shuffle . Il metodo qui descritto è un riordino. È interessante notare che ci vogliono solo 8 mischiate per riportare un mazzo nel suo ordine originale. Ulteriori informazioni
BrainSteel,

Non è solo "in-shuffle N + 1 volte e vedi se una delle liste lungo la strada è ordinata"?
lirtosiast,

In realtà n volte è sufficiente, perché farlo 2n volte è garantito per trovare tutte le possibili permutazioni, ma otterrai almeno uno di ordine crescente o decrescente nel primo n.
Quintopia,


1
il primo elemento non rimane sempre nella prima posizione?
Eumel,

Risposte:


3

Pyth - 26 25 24 byte

Utilizza la riduzione cumulativa per applicare Faro shuffle più volte e mantenere tutti i risultati. Quindi, esegue il mapping attraverso di esso e verifica se sono invarianti nell'ordinamento, quindi utilizza la somma per verificare se tutti sono veri. Restituisce un positivo o uno zero.

smSI-db.usC_c2NQsC.tc2Qb

Test Suite .


3

MATL , 41 byte

itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx

L'output è 1o 0.

Spiegazione

i              % get input array
tn2\           % is size odd?
?              % if that's the case
  YNh          % concat NaN at the end
]              % end if
tn             % get size of input array
t1+:           % vector 1:n+1, where n is input size, so loop will be entered even with []
"              % for loop
  x[]2e!PY)    % delete result from previous iteration and do the shuffling
  ttZN~)       % remove NaN, if there's any
  tS=A         % check if array is sorted
  t.           % copy the result. If true, break loop
]              % end for
wx             % remove unwanted intermediate result

Esempio

>> matl itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx
> [1,1,2,3,5,8,13,21]
1
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.