De combien de temps ai-je besoin pour déverrouiller mon téléphone Android?

12

Scénario

J'utilise un écran de verrouillage correspondant à un motif et j'ai malheureusement oublié mon motif. Je voudrais savoir combien de temps il me faudra pour le déverrouiller. Voici les spécifications de l'écran de verrouillage de Google, que nous utiliserons pour ce défi.

  • Tous les 5 mauvais codes, l'utilisateur doit attendre 30 secondsavant toute nouvelle entrée.
  • Un modèle doit au moins consister en 4 points(voir ci-dessous)

  • Un point ne peut être utilisé qu'une seule fois, mais vous pouvez le parcourir plusieurs fois (voir l'image ci-dessous): bizarre

Ici, le point central n'est utilisé qu'une seule fois, même si nous le repassons pour ce motif particulier.

Hypothèse et faits

Nous supposerons que nous sommes des super-héros et que nous pouvons dessiner n'importe quel motif 1 second, nous n'avons jamais besoin de manger ou de dormir. Oui, nous sommes surhumains.

Je suis une personne très malchanceuse. "Le pire des cas" est ma vie quotidienne, donc le schéma que je vais essayer en dernier sera le bon.

Que devons-nous pwn?

Pour ceux qui ne le savent pas, Android (et d'autres téléphones maintenant) offre la possibilité de déverrouiller le téléphone en dessinant un motif sur une matrice à 9 points. Cette matrice peut être décrite comme suit:

C(A)  M(B)  C(C)
M(D)  X(E)  M(F)
C(G)  M(H)  C(I)
  • C signifie "point d'angle"
  • M pour "point médian"
  • X pour "point central"
  • J'ai donné des identifiants aux points pour le rendre plus facile

Les connexions directes autorisées sont les suivantes:

Point d'angle:

Coin

Point médian:

Milieu

Point central :

Centre

Cependant, comme l'a souligné steveverrill, "une fois que le centre a été utilisé (et devient donc indisponible), une connexion directe entre le coin inférieur gauche et le coin supérieur droit devient sans ambiguïté et donc possible". Il en va de même pour chaque "point médian", si par exemple le point B a déjà été compté, alors une connexion directe entre A et C est possible. Si par exemple F a déjà été compté, alors une connexion directe entre C et I est possible. Etc...

Règles

  • Le but de ce défi est de restituer combien de temps (sous forme lisible par l'homme, alias année / jour / mois / heure / quelle que soit l'heure que vous trouverez), j'aurai besoin de déverrouiller ce putain de téléphone.
  • Vous ne pouvez pas coder en dur le nombre de modèles valides possibles (ne le faites même pas sur Google, vous tromper), le calculer (c'est en fait la partie amusante, n'est-ce pas?)
  • Le morceau de code le plus court gagne
  • Bonne chance !
Maladie
la source
2
Je n'ai pas Android, mais je voudrais souligner que votre exemple semble violer les connexions directes autorisées. Je suppose qu'une fois que le centre a été utilisé (et devient donc indisponible), une connexion directe entre le coin inférieur gauche et le coin supérieur droit devient sans ambiguïté et donc possible.
Level River St
1
En tant qu'utilisateur de cet écran de verrouillage, je suis presque entièrement sûr qu'avec une précision de doigt suffisante, vous pouvez connecter deux points inutilisés.
Julurous
4
@Ourous: au moins sur mon téléphone, si vous déplacez votre doigt autour d'un point pour connecter des points de chaque côté de celui-ci, le point entre les deux est inséré dans la séquence et compte comme utilisé de toute façon.
user2357112 prend en charge Monica
1
@steveverrill: Vous avez raison, j'ai ajouté un conseil à ce sujet. J'espère que cela ne vous dérange pas que je vous ai cité directement, car je pensais que c'était une bonne explication.
1
"Vous ne pouvez pas coder en dur le nombre de modèles valides possibles" n'est pas une exigence observable.
Ad Hoc Garf Hunter

Réponses:

2

Rebmu : 197 175 168 167 caractères

Génère des combinaisons sous la forme d'une série de nombres (ex. 12369 est en haut à gauche à en haut à droite à en bas à droite), vérifie si la combinaison est valide et incrémente un compteur si elle l'est. L' exécution peut prendre un certain temps * . Renvoie le nombre de secondes nécessaires pour déverrouiller le téléphone.

B[[2 13][4 17][6 39][8 79][5 19][5 28][5 37][5 46][a 0]]Fdz[Q1feCb[st[a]paStsC/1 Qa^Qa^e?NNfiAtsC/2 e?NNfiArvTSc/2]]rpJ987653088[StsADj1233iA^e?SuqSf[++K]]adKmp30dvK 5

Imperturbable et commenté:

; for each subarray c: 
; the sequences c/2 and c/3 are invalid before the point c/1 is pressed
; a 0 - a is never in the sequence, therefore 0 is always invalid
b: [[2 13] [4 17] [6 39] [8 79] [5 19] [5 28] [5 37] [5 46] [a 0]]
; checks (most) conditions of validity
f: dz[
    ; set q to 1
    q: 1
    ; foreach array in b as c
    fe c b [
        ; set a to be portion of s before c/1
        st [a] pa s ts c/1
        ; q = q and (a does not contain c/2) and (a does not contain reverse of c/2)
        q: a^ q 
           a^ e? nn fi a ts c/2 
              e? nn fi a ts rv c/2
    ]
]
; repeat 98765308 times, with j = 1 to 98765308
; 987653088 = 987654321 (largest valid combination) - 1234 (smallest valid combination) + 1
rp j 987653088 [
    ; set s to j+1233 (smallest valid combination - 1) as a string
    s: ts ad j 1233 
    ; if f returns trues and s does not contain duplicates, increment k
    i a^ e? s uq s 
          f
     [++ k]
]
; print k (number of combinations) + 30 * (k/5) -> number of seconds needed
ad k mp 30 dv k 5

Le programme boucle de 1 à (987654321-1233), vérifiant 1233 + compteur de boucles (donc vérifiant 1234 à 987654321).

Si le numéro 987653088est remplacé par, 9876-1233ou 8643, le programme trouvera le temps nécessaire pour toutes les combinaisons de 4 points.

Sortie pour 9876-1233=8643(combinaisons à 4 points):

>> rebmu %combinations.rebmu
== 11344

Sortie pour 98765-1233=97532(combinaisons 4 et 5 points):

>> rebmu %combinations.rebmu
== 61426

Sortie pour 987654-1233=986421(combinaisons de 4,5,6 points):

>> rebmu %combinations.rebmu
== 243532

* 4/5 points m'a pris environ 8 secondes pour courir; 4-6 a pris environ 77 secondes. Cela peut prendre environ 24 heures ou plus, selon la personne qui l'exécute, pour calculer le nombre de combinaisons pour les combinaisons de 4 à 9 points.

es1024
la source