La plupart des smartphones Android permettent à l'utilisateur d'utiliser un motif de balayage pour ouvrir leur téléphone:
Certains modèles sont légitimes et d'autres sont impossibles. Avec un motif de balayage d’entrée, renvoyez une vérité ou une fausseté en indiquant si le motif d’entrée donné est légal ou non.
Contribution
La grille est libellée rangée de 1 à 9:
1 2 3
4 5 6
7 8 9
L'entrée est un nombre composé des nœuds visités du premier au dernier. Par exemple, le motif de balayage ci-dessus est 12357.
L'entrée peut être un nombre décimal, une chaîne ou une liste de nombres. Il ne contiendra pas 0 car il n'y a pas de noeud 0.
Amendement: l'indexation 0-8 est autorisée car de nombreuses langues indexent à partir de 0. Si vous utilisez 0-8, il sera nécessaire de l'indiquer au début de votre réponse et d'ajuster les cas de test en conséquence.
Règles
Chaque nœud commence comme non visité initialement et ne peut être visité qu'une seule fois. Toute régularité qui visite un noeud plusieurs fois est de la fausseté.
Un motif de vérité doit contenir au moins un balayage, donc au moins 2 nœuds.
Il n'est pas possible de passer directement sur un nœud non visité pour le rapprocher d'un autre. Par exemple, 13 est faux, car 2 n'est pas visité et est directement aligné.
Il est uniquement possible de sauter un nœud visité. 42631 en est un exemple.
Les lignes peuvent se croiser autrement. Par exemple, 1524 est la vérité.
Supposons que les largeurs de nœud ne sont pas significatives et ignorent les problèmes pratiques (épaisseur des doigts, etc.). Donc 16 est la vérité même si cela peut être un peu plus difficile à réaliser en réalité.
Cas de test
1 -> false
12 -> true
13 -> false
16 -> true
31 -> false
33 -> false
137 -> false
582 -> true
519 -> true
1541 -> false
12357 -> true
15782 -> true
19735 -> false
42631 -> true
157842 -> true
167294385 -> true
297381645 -> false
294381675 -> true
C'est du code-golf , donc le plus petit nombre d'octets gagne.
la source
Réponses:
JavaScript (ES6), 64 octets
Prend les entrées sous forme de tableau de nombres. Les valeurs de fausseté sont 0 ou NaN . Les valeurs de vérité sont des entiers strictement positifs.
Cas de test
Afficher l'extrait de code
Comment?
Préambule
Deux chiffres sont opposés verticalement, horizontalement ou en diagonale si:
OU ils sont tous les deux pairs et leur somme est 10 (figure 2)
De plus, le chiffre entre deux chiffres opposés n et p est égal à (n + p) / 2 .
Code source formaté
Garder une trace des chiffres précédents
Les drapeaux des chiffres visités sont stockés à des indices négatifs dans le tableau d'entrée a , afin qu'ils ne se heurtent pas à ses éléments d'origine.
Si p est défini sur -n :
Si le chiffre actuel n n’a pas été précédemment sélectionné,
a[-n] ^= -n
le drapeau est activé et laevery()
boucle continue à la prochaine itération. Sinon, cela effacera l'indicateur et forcera la boucle à échouer immédiatement.Si p est défini sur non défini :
a[undefined] ^= undefined
aboutit à 0 , ce qui force également la boucle à échouer.Détecter les chiffres opposés
L'expression suivante permet de vérifier si le chiffre actuel n et le chiffre précédent -p sont des chiffres opposés, tels que définis dans le préambule:
qui équivaut à:
Remarque: dans JS, le résultat du modulo a le même signe que le dividende.
Cela peut être interprété comme:
Par conséquent, cette expression renvoie 1 si et seulement si n et -p sont des chiffres opposés ou le même chiffre impair. Comme un chiffre ne peut pas être sélectionné deux fois, ce dernier cas est correctement pris en charge de toute façon.
Si cette expression renvoie 1 , nous testons a [p / 2] (où p est maintenant égal à la somme des chiffres niés) afin de savoir si le 'chiffre intermédiaire' a déjà été visité. Sinon, nous testons un [0] dont la véracité est garantie.
A propos de la première itération
La première itération est un cas particulier, car il n’ya pas de chiffre précédent et nous voulons qu’elle soit couronnée de succès sans condition.
Nous y parvenons en initialisant p sur 1 , car pour tout n dans [1. 9] :
(1 * n) % 5
ne peut pas être négatif~(1 - n)
ne peut pas être égal à 9Réponse originale, 90 octets
Supprimé de ce post pour qu'il ne soit pas trop bavard. Vous pouvez le voir ici .
la source
!!a[1]&
para[1]&&
, puisque toute valeur de vérité peut être retournéea[1]*
c'est encore plus court.)has a node directly in line
trouver une formule , je ne savais pas que ce serait si simple ...?a[-n]^=1:0
par&&a[-n]^=1
-1, vous ne pouvez pas tester (sur mobile)Code machine x86 32 bits,
62 à60 octetsHexdump:
Il reçoit la longueur de la liste
ecx
et un pointeur sur le premier élémentedx
et renvoie le résultat sous la formeal
:Il y a 8 lignes qui contiennent un nœud au milieu:
Je les ai regroupés en fonction de la différence entre le plus grand et le plus petit nombre.
Ensuite, j'ai converti cela en une table de recherche 2D indexée par demi-différence et par un nombre plus petit:
Cela fait un bitmap "magique" de 32 bits. Pour l'indexer, le code le pousse dans la pile. Ensuite, il extrait un octet en utilisant un index et à partir de cet octet, il extrait un bit en utilisant l'autre index. Tout cela en une seule instruction:
Si le bitmap indique qu'il y a un nœud au milieu, il est facile à calculer - ajoutez la moitié de la différence au nombre le plus petit.
Source d'assemblage:
la source
bt byte ptr [esp + eax], ebx
.cdq
au lieu dexor edx, edx
commeeax
c'est zéro. En outre, vous pouvez plier ledec eax
dansbt [esp + eax - 1], ebx
qui est la même longueur, mais vous permet ensuite de supprimer leinc ebx
plus tard. Cela devrait vous faire économiser deux octets.Python 2 ,
14013111410499 octets-2 octets grâce à Jonathan Frech
-5 octets grâce à Chas Brown
Essayez-le en ligne!
Explication:
Essayez-le en ligne!
Seules 8 paires de nœuds ont un nœud entre elles. Une paire de nœuds peut être représentée sous la forme d'un entier unique par la formule
2^a-2^b-1
. Ce nombre peut être raccourci par modulo répété:(2**n+~2**l)%21%15%9==5
vérifie d'abord si une telle paire est présente, puis vérifie siv-{l+n>>1}==v
le nœud situé entre, qui est donné par(a+b)/2
, n'a pas encore été visité etq
lève une erreur NameError. En utilisant une comparaison chaînée entre ces paires, la comparaison suivante n'est exécutée que lorsque la précédente est renvoyéeTrue
.la source
Jelly ,
24 22 1918 octets-2 puisqu'il n'est plus nécessaire de gérer une liste vide
-1 de passer de la jointure
j@
à la concaténation;
(l'élément manquant n'a pas besoin d'être rencontré au milieu pour la méthode utilisée, le début du trio convient parfaitement )-2 commutation de
P¬aSH
àoSH
(OK d'avoir deux résultats puisque nous aplatir la moitié de1
est0.5
que l' on filtre sur de toute façon, et ayant de multiples résultats égaux n'a aucun effet sur la méthode employée soit)-1 Merci à M. Xcoder (0-indexé l'entrée est autorisée)
Un lien monadique prenant une liste d'entiers dans
[0,8]
et renvoyant une valeur de vérité (1
) si légal et une valeur de falsey (0
) sinon.Essayez-le en ligne! ou voir une suite de tests .
Comment?
Examine chaque paire adjacente de nœuds à index 0 dans la liste d'entrée. Si la division entière par trois des deux diffère de 2, elle se trouve dans les rangées supérieure et inférieure, si le modulo par trois des deux diffère de 2, elle se trouve dans les colonnes de gauche et de droite. La somme de ces paires divisée par deux est soit le nœud milieu indexé par 0 d'une ligne à trois nœuds, soit une valeur non entière. Ces valeurs sont donc d'abord insérées devant la paire indexée par 0, puis toutes les valeurs suivantes. faux nœuds (comme
0.5
ou3.5
) sont supprimés, la liste de listes résultante est aplatie puis dédupliquée (pour obtenir des entrées uniques préservées dans l'ordre) et enfin comparée à l'entrée - pour un balayage légal, tout cela deviendra un no-op tant qu'il sera illégal ceux-ci ajouteront des noeuds intermédiaires manquants et / ou supprimeront des noeuds en double (notez qu'aucun casier spécial n'est requis pour une liste d'entrée de longueur 1, car elle n'a pas de paires adjacentes):Méthode précédente
Gelée ,
3635 octetsEssayez-le en ligne! ou voir une suite de tests .
Comment?
Semblable à ce qui précède, il construit toutes les possibilités de ligne à trois noeuds et effectue une recherche (plutôt que de vérifier au fur et à mesure qu'il utilise divmod pour tester et diviser par deux la somme du noeud moyen).
Tout d'abord la construction de la liste des lignes à trois nœuds:
Maintenant, la prise de décision:
la source
Stax , 28 octets
Exécuter
Il produit 0 pour faux et des entiers positifs pour vrai. La représentation ascii correspondante du même programme est la suivante.
L'idée générale est de calculer plusieurs conditions nécessaires pour les motifs de balayage légaux et de les multiplier tous ensemble.
la source
Y
registre.v
et l'inclure1
comme valeur de fausseté.2
et au-dessus sont la vérité.JavaScript, 112 octets
Peut-être que certains langages basés sur regex devraient être plus courts. Mais je ne sais pas.
Afficher l'extrait de code
Grâce à Neil, changez
)(?!
pour|
économiser 3 octets.la source
144
.Retina 0.8.2 , 98 octets
Influencé par la réponse de tsh . J'ai essayé de "reformuler" pour que ce soit l'inverse, en faisant correspondre les balayages non valides, puis Anti-grep.
Essayez-le en ligne
la source
Husk ,
25 à20 octetsPrend une liste d'entiers avec indexation basée sur 0. Renvoie 0 ou 1. Essayez-le en ligne!
Explication
J'ai volé des idées à la réponse de Jonathan Allan sur Jelly . L'idée est la même: insérer un nouveau "nœud moyen" entre chaque paire adjacente, filtrer ceux qui ne sont pas des nœuds réels, supprimer les doublons et les comparer à la liste d'origine. Si la liste d'origine contient des doublons, le résultat est faux. Si la liste ignore un nœud non visité, il est présent dans la liste traitée située entre la paire correspondante et le résultat est faux. Si l'entrée est un singleton, la liste traitée est vide et le résultat est faux. Sinon, c'est la vérité.
la source
C ++,
267256 octetsPour vérifier si le modèle ne passe pas sur un nœud non visité, il effectue plusieurs opérations:
d
oùd
est la différence numérique entre le nœud actuel et le dernier nœud.d
c'est étrange, alors il n'y a pas besoin de vérifier, il ne peut pas ignorer un nœud.d
est égal à4
ou8
, alors le saut est entre noeuds1-9
ou3-7
, alors vérifiez noeud5
d
est égal à 2 et si le nœud du milieu ((last_node + current_node)/2
) est 2,5 ou 8, vérifiez le nœud du milieud
est égal à 6, même vérification qu'auparavant mais avec4
,5
ou6
Les paramètres sont un
int[]
et c'est le nombre d'éléments. Il retourne unint
qui peut être interprété comme unbool
typela source
!(d%2)
=>d%2<1
devrait fonctionner.int s[]
=>int*s
. Je pense que ça va marcher.Perl, 135 octets (134 +
-n
)Version légèrement non-golfée
Sorties via le code de sortie.
0
est la vérité, toute autre valeur est la fausseté. Conformément au méta-consensus , la sortie de STDERR dans le cas de la défaillance est ignorée.Il existe probablement un moyen plus rapide de vérifier la règle "ne peut pas sauter par-dessus" simplement en listant toutes les possibilités.
la source
MATL ,
424139 octetsCela produit
Ici vous pouvez lire pourquoi ces sorties sont respectivement vérité et fausseté. Essayez-le en ligne!
Ou vérifiez tous les cas de test , avec un code de pied de page qui inclut le test standard de véracité / fausseté.
la source
Stax ,
73726665 octets CP43779 octets une fois décompressé,
Exécuter et déboguer en ligne!
ou exécutez le test par lots , où se
meX
trouve un en-tête afin que Stax puisse traiter les entrées multilignes.Mise en œuvre sans utiliser de hachage. Nombre de sorties strictement positif (en fait, nombre de tests ayant échoué) pour les cas de fausseté et les cas
0
de vérité .Explication
d
efface la pile d'entrée. L'entrée est dans variablex
quand même.4{cAs-5F
génère la première partie de la liste des nœuds intermédiaires.132396978714EE
code en dur la deuxième partie de la liste des nœuds du milieu.L3/
Collecte tous les éléments de la pile principale et les divise en parties contenant chacune 3 éléments. Le résultat est un tableaua
, qui est simplement le tableau de tous les groupes de 3 nœuds non valides.{xs:IBc0<A*++cEd:-1=sccHs|M=s{U>m|A**mE
Pour chaque liste de nœud non valide, effectuez les vérifications suivantes. Le résultat des résultats de contrôle estand
édité à l’aide de**
. Comme il existe 8 listes de nœuds non valides, le résultat de ce code sera un tableau de 8 éléments. La dernièreE
envoie le tableau à ses éléments individuels sur la pile principale.xs:I
obtenir l'index des éléments de la liste de noeuds dans le tableau d'entrée.Bc0<A*++
Si l'index de "nœud central" (par exemple5
dans l'ensemble de nœuds1,5,9
) est-1
(ce qui signifie qu'il n'existe pas dans le tableau d'entrée), remplacez l'index par9
.cEd:-1=
vérifier si les deux "nœuds terminaux" (par exemple1,5
dans l'ensemble de nœuds1,5,9
) sont adjacents dans le tableau d'entrée.sccHs|M=
teste si l'indice transformé du "nœud intermédiaire" est supérieur à ceux des deux "nœuds terminaux", ce qui inclut deux cas: le "nœud intermédiaire" est manquant ou le "nœud intermédiaire" vient après les deux "nœuds terminaux"s{U>m|A
teste si les deux index des "noeuds finaux" sont non négatifs. (c'est-à-dire qu'ils apparaissent tous les deux dans l'entrée).Deux tests supplémentaires sont effectués,
x%2<
teste si le tableau d'entrée est un singleton.xu%x%=!
teste si les nœuds ont été visités deux fois.Il y a 10 résultats de test sur la pile principale (un pour chaque liste de nœuds non valides, plus deux tests supplémentaires).
L|+
collecte les 10 éléments et les ajoute.|a
aurait également pu être utilisé pour vérifier s'il y a des éléments de vérité sur le tableau.Sortie implicite.
la source
Java,
375355 octets-20 octets grâce à Zacharý
Ceci est un port de cette réponse et il fonctionne sur les mêmes principes
la source
int v(int s[]){int[]m=new int[10];int i=1,p=s[0],d,n,l=s.length;if(l<2)return 0;for(;i<l;++i){m[p]=1;if(m[s[i]]!=0)return 0;d=(d=p-s[i])<0?-d:d;if(d%2==0){n=(p+s[i])/2;if((d==4||d==8)&&n==5&&m[5]==0)return 0;if((d==2)&&(n==2&&m[2]==0||n==5&&m[5]==0||n==8&&m[8]==0))return 0;if(d==6&&(n==4&&m[4]==0||n==5&&m[5]==0||n==6&&m[6]==0))return 0;}p=s[i];}return 1;}
devrait fonctionner (ordre des opérations)(d==2)
pour justed==2
, j'ai négligé cela avant.d%2==0
=>d%2<1
Pyth , 33 octets
Suite de tests.
Utilise l'indexation basée sur 0.
Explication
Approche alternative pour 34 octets :
la source
Japt , 35 octets
Essayez-le en ligne!
Légèrement non-golfé & comment ça marche
Porté l'idée de cette solution Jelly , avec une différence dans la détermination des sauts potentiels:
/3
ou%3
.%3
et vérifie si la différence est 0 ou 2. Si la différence est 0, les deux cellules sont alignées verticalement et les non-sauts partagent toujours la propriété de(X+Y)%2 != 0
.la source
Python 2 , 97 octets
Basé sur la réponse de ovs mais 2 octets plus court et moins crypté. Convertit simplement les index en coordonnées 2D et teste la parité. Suppose que 0 à 8 index.
Essayez-le en ligne!
la source