Quanto tempo precisarei para desbloquear meu telefone Android?

12

Cenário

Estou usando a tela de bloqueio de correspondência de padrões e, infelizmente, esqueci meu padrão. Gostaria de saber quanto tempo precisarei para desbloqueá-lo. Aqui estão as especificações da tela de bloqueio do Google, que usaremos para esse desafio.

  • A cada 5 códigos incorretos, o usuário precisa aguardar 30 secondsantes de qualquer entrada adicional.
  • Um padrão deve, pelo menos, consistir em 4 points(veja abaixo)

  • Um ponto pode ser usado apenas uma vez, mas você pode examiná-lo várias vezes (veja a imagem abaixo): estranho

Aqui, o ponto central é usado apenas uma vez, mesmo se formos examiná-lo novamente para esse padrão específico.

Hipótese e Fatos

Vamos assumir que somos super-heróis e que podemos desenhar qualquer padrão 1 second, nunca precisamos comer ou dormir. Sim, somos sobre-humanos.

Eu sou uma pessoa muito azarada. "O pior cenário possível" é minha vida diária, portanto o padrão que tentarei por último será o correto.

O que temos que lançar?

Para quem não conhece, o Android (e outros telefones agora) oferece a capacidade de desbloquear o telefone desenhando um padrão em uma matriz de 9 pontos. Essa matriz pode ser descrita da seguinte maneira:

C(A)  M(B)  C(C)
M(D)  X(E)  M(F)
C(G)  M(H)  C(I)
  • C em pé para "ponto de canto"
  • M para "ponto médio"
  • X para "ponto central"
  • Eu dei identificadores aos pontos para facilitar

As conexões diretas permitidas são as seguintes:

Ponto de canto:

Canto

Ponto do meio:

Meio

Ponto central :

Centro

No entanto, como apontado por steveverrill, "uma vez que o centro foi usado (e, portanto, fica indisponível), uma conexão direta entre o canto inferior esquerdo e o canto superior direito torna-se inequívoca e, portanto, possível". O mesmo vale para cada "ponto do meio", se, por exemplo, o ponto B já tiver sido contado, é possível uma conexão direta entre A e C. Se, por exemplo, F já foi contado, é possível uma conexão direta entre C e I. Etc ...

Regras

  • O objetivo desse desafio é retornar quanto tempo (em forma legível por humanos, também conhecido como ano / dia / mês / hora / qualquer que seja o tempo que você encontrar), precisarei desbloquear esse maldito telefone.
  • Você não pode codificar o número possível de padrões válidos (nem mesmo o Google, seu tolo), calculá-lo (essa é realmente a parte divertida, não é?)
  • Menor pedaço de código vence
  • Boa sorte !
Doença
fonte
2
Não tenho o Android, mas gostaria de ressaltar que seu exemplo parece violar as conexões diretas permitidas. Suponho que, uma vez que o centro tenha sido usado (e, portanto, fique indisponível), uma conexão direta entre o canto inferior esquerdo e o canto superior direito se torne inequívoca e, portanto, possível.
Level River St
1
Como usuário dessa tela de bloqueio, tenho quase certeza de que, com precisão suficiente dos dedos, você pode conectar dois pontos não utilizados.
Οurous
4
@Ourous: Pelo menos no meu telefone, se você mover o dedo em torno de um ponto para conectar pontos em ambos os lados, o ponto intermediário será inserido na sequência e contado como usado de qualquer maneira.
User2357112 suporta Monica
1
@ steveverrill: Você está certo, eu adicionei uma dica sobre isso. Espero que você não se importe de ter citado você diretamente, pois achei que era uma boa explicação.
1
"Você não pode codificar o número possível de padrões válidos" não é um requisito observável.
Post Rock Garf Hunter

Respostas:

2

Rebmu : 197 175 168 167 caracteres

Gera combinações como uma série de números (por exemplo, 12369 é do canto superior esquerdo para o canto superior direito para o canto inferior direito), verifica se a combinação é válida e, se for, incrementa um contador. Isso pode demorar um pouco * para ser executado. Retorna o número de segundos necessários para desbloquear o telefone.

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

Não silencioso e comentou:

; 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

O programa faz um loop de 1 a (987654321-1233), verificando 1233 + contador de loop (verificando 1234 a 987654321).

Se o número 987653088for substituído por, 9876-1233ou 8643, o programa encontrará o tempo necessário para todas as combinações de 4 pontos.

Saída para 9876-1233=8643(combinações de 4 pontos):

>> rebmu %combinations.rebmu
== 11344

Saída para 98765-1233=97532(combinações de 4 e 5 pontos):

>> rebmu %combinations.rebmu
== 61426

Saída para 987654-1233=986421(combinações de 4,5,6 pontos):

>> rebmu %combinations.rebmu
== 243532

* 4/5 pontos levei cerca de 8 segundos para ser executado; 4-6 levou cerca de 77 segundos. Pode demorar cerca de 24 horas ou mais, dependendo de quem executa isso para calcular o número de combinações para combinações de 4-9 pontos.

es1024
fonte