¿Cuánto tiempo necesitaré para desbloquear mi teléfono Android?

12

Guión

Estoy usando la pantalla de bloqueo de coincidencia de patrones y lamentablemente olvidé mi patrón. Me gustaría saber cuánto tiempo necesitaré para desbloquearlo. Aquí están las especificaciones de la pantalla de bloqueo de Google, que utilizaremos para este desafío.

  • Cada 5 códigos incorrectos, el usuario tiene que esperar 30 secondsantes de cualquier entrada adicional.
  • Un patrón debe, al menos, consistir en 4 points(ver más abajo)

  • Un punto solo se puede usar una vez, pero puede repasarlo varias veces (vea la imagen a continuación): extraño

Aquí, el punto central solo se usa una vez, incluso si lo revisamos nuevamente para este patrón particular.

Hipótesis y hechos

Asumiremos que somos superhéroes y que podemos dibujar cualquier patrón 1 second, nunca necesitamos comer ni dormir. Sí, somos superhumanos.

Soy una persona muy desafortunada. El "peor de los casos" es mi vida diaria, por lo que el patrón que intentaré al final será el correcto.

¿Qué tenemos que empeñar?

Para aquellos que no lo saben, Android (y otros teléfonos ahora) ofrece la capacidad de desbloquear el teléfono dibujando un patrón en una matriz de 9 puntos. Esta matriz se puede describir de la siguiente manera:

C(A)  M(B)  C(C)
M(D)  X(E)  M(F)
C(G)  M(H)  C(I)
  • C significa "punto de esquina"
  • M para "punto medio"
  • X para "punto central"
  • He dado identificadores a los puntos para que sea más fácil.

Las conexiones directas permitidas son las siguientes:

Punto de esquina:

Esquina

Punto Medio :

Medio

Punto central :

Centrar

Sin embargo, como señaló steveverrill, "una vez que se ha utilizado el centro (y, por lo tanto, no está disponible), una conexión directa entre la esquina inferior izquierda y la superior derecha se vuelve inequívoca y, por lo tanto, posible". Lo mismo ocurre con cada "punto medio", si, por ejemplo, el punto B ya ha sido contado, entonces es posible una conexión directa entre A y C. Si, por ejemplo, F ya se ha contado, entonces es posible una conexión directa entre C e I. Etc ...

Reglas

  • El objetivo de este desafío es devolver la cantidad de tiempo (en forma legible para humanos, también conocido como año / día / mes / hora / cualquier hora que encuentre) que necesitaré para desbloquear este maldito teléfono.
  • No puede codificar el número de posibles patrones válidos (ni siquiera Google, tonto), calcularlo (esa es la parte divertida, ¿no?)
  • La pieza de código más corta gana
  • Buena suerte !
Enfermedad
fuente
2
No tengo Android, pero me gustaría señalar que su ejemplo parece violar las conexiones directas permitidas. Supongo que una vez que se ha utilizado el centro (y, por lo tanto, no está disponible), una conexión directa entre la esquina inferior izquierda y la superior derecha se vuelve inequívoca y, por lo tanto, posible.
Level River St
1
Como usuario de esta pantalla de bloqueo, estoy casi completamente seguro de que con suficiente precisión de dedo, puede conectar dos puntos no utilizados.
Agradable
44
@Ourous: Al menos en mi teléfono, si mueve el dedo alrededor de un punto para conectar puntos a cada lado, el punto intermedio se inserta en la secuencia y se cuenta como se usa de todos modos.
user2357112 es compatible con Monica el
1
@steveverrill: Tienes razón, agregué un consejo sobre eso. Espero que no te importe que te haya citado directamente, ya que pensé que era una buena explicación.
1
"No se puede codificar el número de posibles patrones válidos" no es un requisito observable.
Ad Hoc Garf Hunter

Respuestas:

2

Rebmu : 197 175 168 167 caracteres

Genera combinaciones como una serie de números (por ejemplo, 12369 es de arriba a la izquierda a arriba a la derecha a abajo a la derecha), comprueba si la combinación es válida e incrementa un contador si lo es. Esto puede tardar un tiempo * en ejecutarse. Devuelve el número de segundos necesarios para desbloquear el teléfono.

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

Desquiciado y comentado:

; 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

El programa realiza un bucle de 1 a (987654321-1233), verificando el contador de bucles 1233 + (por lo tanto, verificando 1234 a 987654321).

Si el número 987653088se reemplaza con, 9876-1233o 8643, entonces el programa encontrará el tiempo necesario para todas las combinaciones de 4 puntos.

Salida para 9876-1233=8643(combinaciones de 4 puntos):

>> rebmu %combinations.rebmu
== 11344

Salida para 98765-1233=97532(combinaciones de 4 y 5 puntos):

>> rebmu %combinations.rebmu
== 61426

Salida para 987654-1233=986421(combinaciones de 4,5,6 puntos):

>> rebmu %combinations.rebmu
== 243532

* 4/5 puntos me tomó alrededor de 8 segundos para correr; 4-6 tomó alrededor de 77 segundos. Puede tomar ~ 24 horas o más dependiendo de quién ejecuta esto para calcular el número de combinaciones para combinaciones de 4-9 puntos.

es1024
fuente