Скільки часу мені знадобиться, щоб розблокувати телефон Android?


12

Сценарій

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

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

  • Точку можна використовувати лише один раз, але ви можете перейти її декілька разів (див. Зображення праворуч нижче): wierd

Тут центральна точка використовується лише один раз, навіть якщо ми повторимо її знову для цього конкретного малюнка.

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

Ми будемо вважати, що ми супергерої, і що ми можемо малювати будь-який візерунок 1 second, нам ніколи не потрібно їсти чи спати. Так, ми нелюди.

Я дуже нещаслива людина. "Найгірший сценарій" - це моє повсякденне життя, тому модель, яку я спробую останньою, буде правильною.

Що ми маємо затримати?

Для тих, хто цього не знає, Android (та інші телефони зараз) пропонує можливість розблокувати телефон, намалювавши візерунок на 9-бальній матриці. Цю матрицю можна описати так:

C(A)  M(B)  C(C)
M(D)  X(E)  M(F)
C(G)  M(H)  C(I)
  • C стоїть на "кутовій точці"
  • M для "середня точка"
  • X для "центральної точки"
  • Я дав ідентифікатори точкам, щоб було простіше

Дозволені прямі з'єднання:

Кутова точка:

Куточок

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

Середній

Центр:

Центр

Однак, як зазначає Стівеверрілл, "щойно центр буде використано (і, отже, стає недоступним), прямий зв'язок між лівим нижнім та правим верхнім кутом стає однозначним і, отже, можливим". Те саме стосується кожної "середньої точки", якщо, наприклад, точка B вже була підрахована, то можливий прямий зв'язок між A і C. Якщо, наприклад, F вже підраховано, можливий прямий зв'язок між C і I. І т.д. ...

Правила

  • Сенс цього виклику полягає в тому, щоб повернути скільки часу (у читаній людиною формі, він же рік / день / місяць / годину / незалежно від часу, який ви знайдете) мені потрібно буде розблокувати цей проклятий телефон.
  • Ви не можете твердо кодувати кількість можливих дійсних шаблонів (навіть не Google це, дурню), обчислити це (це насправді найцікавіша частина, чи не так?)
  • Виграє найкоротший фрагмент коду
  • Удачі !

2
У мене немає Android, але я хотів би зазначити, що ваш приклад порушує дозволені прямі з'єднання. Я здогадуюсь, що після використання центру (і, отже, стає недоступним) прямий зв'язок між лівим нижнім та правим верхнім кутом стає однозначним і тому можливим.
Рівень р. Св.

1
Як користувач цього заблокованого екрану, я майже повністю впевнений, що з достатньою точністю пальця можна підключити будь-які дві невикористані точки.
Οurous

4
@Ourous: Принаймні на моєму телефоні, якщо ви перемістите пальцем навколо точки, щоб з'єднати точки з обох боків від неї, точка між ними вставляється в послідовність і рахується як використана в будь-якому випадку.
user2357112 підтримує Моніку

1
@steveverrill: Ти маєш рацію, я додав підказку з цього приводу. Сподіваюся, ви не заперечуєте, що я цитував вас безпосередньо, оскільки я вважав, що це хороше пояснення.

1
"Ви не можете жорстко кодувати кількість можливих дійсних шаблонів" - це не помітна вимога.
Ad Hoc Hunter Hunter

Відповіді:


2

Ребму : 197 175 168 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 точкових комбінацій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.