Le tableau peut-il être désorganisé?


15

Contexte

Les gestionnaires de cartes très qualifiés sont capables d'une technique par laquelle ils coupent un paquet parfaitement en deux, puis entrelacent parfaitement les cartes. S'ils commencent avec un jeu trié et exécutent cette technique sans problème 52 fois de suite, le jeu sera restauré dans l'ordre trié. Votre défi est de prendre un jeu de cartes dans un tableau d'entiers et de déterminer s'il peut être trié en utilisant uniquement des shuffles Faro.

Définition

Mathématiquement, un shuffle de Faro est une permutation sur 2 n éléments (pour tout entier positif n ) qui amène l'élément en position i (indexé 1) à la position 2 i (mod 2 n +1). Nous aimerions également pouvoir gérer des listes de longueur impaire, alors dans ce cas, ajoutez simplement un élément à la fin de la liste (un Joker, si vous en avez un à portée de main) et Faro mélangez la nouvelle liste comme ci-dessus, mais ignorez l'élément factice ajouté lors de la vérification de l'ordre de la liste.

Objectif

Écrivez un programme ou une fonction qui prend une liste d'entiers et retourne ou génère une vérité si un certain nombre de shuffles Faro entraînerait le tri de cette liste dans un ordre non décroissant (même si ce nombre est nul - les petites listes devraient donner une vérité). Sinon, retournez ou sortez une fausse.

Exemples

[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

Notation

C'est le donc la source la plus courte en octets gagne.


Pour éviter toute confusion avec les autres gestionnaires de cartes, il convient de noter qu'il existe deux types de mélange de Faro. Un shuffle en entrée et un shuffle en sortie . La méthode décrite ici est un shuffle. Fait intéressant, il ne faut que 8 shuffles pour remettre un deck dans son ordre d'origine. Plus d'infos
BrainSteel

N'est-ce pas juste "mélanger N + 1 fois et voir si certaines des listes en cours de route sont triées"?
lirtosiast

En fait, n fois est suffisant, car le faire 2n fois est garanti pour trouver toutes les permutations possibles, mais vous obtiendrez au moins un ordre croissant ou décroissant dans le premier n.
quintopie


1
le premier élément ne reste-t-il pas toujours en première position?
Eumel

Réponses:


3

Pyth - 26 25 24 octets

Utilise la réduction cumulative pour appliquer plusieurs fois le mélange Faro et conserver tous les résultats. Ensuite, il le mappe et vérifie s'ils sont invariants lors du tri, puis utilise la somme pour vérifier si tous sont vrais. Renvoie un positif ou un zéro.

smSI-db.usC_c2NQsC.tc2Qb

Suite de tests .


3

MATL , 41 octets

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

La sortie est 1ou 0.

Explication

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

Exemple

>> matl itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx
> [1,1,2,3,5,8,13,21]
1
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.