Android (système d’exploitation) : combien de combinaisons le déverrouillage en 9 points d’Android comporte-t-il ?


(EDIT : Merci à Yoyo Zhou pour avoir signalé une faille dans ce modèle -- Anders a le résultat final de la discussion dans la nouvelle version de sa réponse.)

J'ai aimé le Haskell dans la réponse d'Anders&apos ; mais l'écran de déverrouillage d'Android (au moins sur mon téléphone exécutant Froyo) est encore plus permissif qu'il ne l'a supposé. En fait, il est également possible de suivre un point avec un point situé à un mouvement de chevalier, sans avoir touché aucun autre point. Le nombre de motifs disponibles devient 766752.


Il'est facile de démontrer le mouvement du chevalier's si vous le faites lentement -- il suffit de rester loin du disque sombre autour de chaque point proche.

En revanche, si je fais un mouvement de la tour's ou du fou's de longueur 2, il remplit le point intermédiaire comme si je'l'avais touché. (Avec le retour tactile, il est clair que je n'ai pas réellement touché le point, donc je ne pense pas qu'un toucher plus habile permettrait d'éviter cela). So those are the only unavailable moves.

This variant of Anders's code computes the result:

  1. import qualified Data.Set as S 
  2. import Control.Monad(guard) 
  3. points = [(row, col) | row <- [0..2], col <- [0..2]] 
  4. adjacentButtons (x, y) = do (x', y') <- points 
  5. guard $ 1 `elem` [abs $ x' - x, abs $ y' - y] 
  6. return (x', y') 
  7. extensions pattern = 
  8. map (: pattern) . S.toList $ 
  9. S.difference (S.fromList $ adjacentButtons =<< pattern) (S.fromList pattern) 
  10. search pattern found = foldr search (pattern : found) $ extensions pattern 
  11. valid pattern = length pattern >= 4 
  12. main = print . length . filter valid . foldr search [] $ map (:[]) points 

This compares to the number of patterns of length >= 4 that you could make from 9 points with no restrictions on which you can reach from where:

  1. > sum . drop 4 $ scanl (*) 1 [9,8..1] 
  2. 985824 

so in fact exactly 2/9 of that class of patterns are unavailable.

Anders' answer is a better upper bound on how many patterns could be practical to use, though -- I find that the knight's-move takes far too much care to execute when I just want to unlock my phone.