Сколько времени мне понадобится, чтобы разблокировать мой телефон Android?

12

сценарий

Я использую локскрин для сопоставления с образцом и, к сожалению, забыл свой шаблон. Я хотел бы знать, сколько времени мне потребуется, чтобы разблокировать его. Вот спецификации экрана блокировки Google, которые мы будем использовать для этой задачи.

  • Каждые 5 неправильных кодов пользователь должен ждать 30 secondsперед дальнейшим вводом.
  • Шаблон должен, по крайней мере, состоять в 4 points(см. Ниже)

  • Точку можно использовать только один раз, но вы можете пройти через нее несколько раз (см. Изображение справа ниже): странно

Здесь центральная точка используется только один раз, даже если мы повторим ее снова для этого конкретного шаблона.

Гипотеза и факты

Мы предположим, что мы супергерои и что мы можем нарисовать любой шаблон 1 second, нам никогда не нужно есть или спать. Да, мы сверхчеловеки.

Я очень неудачливый человек. «Наихудший сценарий» - это моя повседневная жизнь, поэтому шаблон, который я попробую в последний раз, будет правильным.

Что мы должны pwn?

Для тех, кто этого не знает, Android (и другие телефоны сейчас) предлагает возможность разблокировать телефон путем рисования рисунка на 9-точечной матрице. Эта матрица может быть описана следующим образом:

C(A)  M(B)  C(C)
M(D)  X(E)  M(F)
C(G)  M(H)  C(I)
  • C означает «угловая точка»
  • М для "средней точки"
  • X для "центральной точки"
  • Я дал идентификаторы точкам, чтобы было легче

Разрешенные прямые подключения:

Угловой пункт:

угол

Средняя точка:

средний

Центральная точка :

Центр

Однако, как указал Steveverrill, «как только центр используется (и, следовательно, становится недоступным), прямое соединение между нижним левым и верхним правым углом становится однозначным и, следовательно, возможным». То же самое касается любой «средней точки», если, например, точка B уже подсчитана, то возможна прямая связь между A и C. Если, например, F уже подсчитано, то возможна прямая связь между C и I. И т.д...

правила

  • Суть этой задачи заключается в том, чтобы узнать, сколько времени (в удобочитаемой форме, т.е. год / день / месяц / час / независимо от того, сколько времени вы найдете) мне потребуется, чтобы разблокировать этот чертов телефон.
  • Вы не можете жестко закодировать количество возможных действительных шаблонов (даже не Google, вы дурак), рассчитать его (это на самом деле забавная часть, не так ли?)
  • Самый короткий кусок кода выигрывает
  • Удачи !
болезнь
источник
2
У меня нет Android, но я хотел бы отметить, что ваш пример нарушает разрешенные прямые подключения. Я предполагаю, что как только центр будет использован (и, следовательно, станет недоступен), прямая связь между нижним левым и верхним правым углом станет однозначной и, следовательно, возможной.
Уровень Река Сент
1
Как пользователь этого экрана блокировки, я почти полностью уверен, что с достаточной точностью пальцев вы можете соединить любые две неиспользуемые точки.
Οurous
4
@Ourous: По крайней мере, на моем телефоне, если вы проведете пальцем по точке, чтобы соединить точки по обе стороны от нее, промежуточная точка будет вставлена ​​в последовательность и засчитана как использованная в любом случае.
user2357112 поддерживает Монику
1
@steveverrill: Вы правы, я добавил совет об этом. Надеюсь, вы не возражаете, я прямо процитировал вас, так как думал, что это хорошее объяснение.
1
«Вы не можете жестко закодировать количество возможных действительных шаблонов» - не наблюдаемое требование.
Специальный охотник за

Ответы:

2

Ребму : 197 175 168 167 знаков

Создает комбинации в виде последовательности чисел (например, 12369 сверху вниз, справа вверху и справа внизу), проверяет, является ли комбинация действительной, и увеличивает счетчик, если она есть. Это может занять некоторое время * для запуска. Возвращает количество секунд, необходимое для разблокировки телефона.

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

Немедленно и прокомментировал:

; 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

Программа зацикливается от 1 до (987654321-1233), проверяя 1233 + счетчик цикла (следовательно, проверяя 1234 до 987654321).

Если число 987653088заменено на, 9876-1233или 8643, то программа найдет время, необходимое для всех 4-точечных комбинаций.

Выход для 9876-1233=8643(4-точечные комбинации):

>> rebmu %combinations.rebmu
== 11344

Выход для 98765-1233=97532(4-х и 5-ти точечных комбинаций):

>> rebmu %combinations.rebmu
== 61426

Выход для 987654-1233=986421(4,5,6-балльные комбинации):

>> rebmu %combinations.rebmu
== 243532

* 4/5 баллов заняли у меня около 8 секунд, чтобы бежать; 4-6 заняло около 77 секунд. Это может занять ~ 24 часа или дольше в зависимости от того, кто запускает это, чтобы рассчитать количество комбинаций для комбинаций 4-9 баллов.

es1024
источник