대본
패턴 일치 잠금 화면을 사용하고 있으며 슬프게도 패턴을 잊었습니다. 잠금을 해제하는 데 얼마나 많은 시간이 필요한지 알고 싶습니다. 이 도전에 사용할 Google 잠금 화면의 사양은 다음과 같습니다.
- 5 개의 잘못된 코드마다, 사용자는
30 seconds
더 이상 들어가기 전에 기다려야 합니다. -
패턴은 최소한 다음으로 구성되어야합니다
4 points
(아래 참조). -
포인트는 한 번만 사용할 수 있지만 여러 번 넘어갈 수 있습니다 (아래 이미지 참조).
이 특정 패턴에 대해 다시 넘어가더라도 중심점은 한 번만 사용됩니다.
가설 및 사실
우리는 슈퍼 히어로라고 가정하고에 패턴을 그릴 수 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
- 더 쉽게하기 위해 포인트에 식별자를 부여했습니다.
허용되는 직접 연결은 다음과 같습니다.
코너 포인트 :
중간 점 :
중심점 :
그러나 steveverrill이 지적한대로 “중심이 사용되면 (따라서 사용할 수 없게 됨) 왼쪽 하단과 오른쪽 상단 모서리 사이의 직접 연결이 명확 해 지므로 가능합니다”. 예를 들어 B 지점이 이미 계산 된 경우 “중간 지점”마다 동일하게 적용되며 A와 C 사이의 직접 연결이 가능합니다. 예를 들어 F가 이미 계산 된 경우 C와 I를 직접 연결할 수 있습니다. 기타…
규칙
- 이 도전의 요점은이 망할 전화의 잠금을 해제하는 데 필요한 시간 (사람이 읽을 수있는 형태, 일 년 / 일 / 월 / 시간 / 시간 / 시간)을 반환하는 것입니다.
- 유효한 패턴의 수를 하드 코딩 할 수 없으며 (Google조차도 바보가 아닙니다) 계산하십시오 (실제로는 재미있는 부분입니까?)
- 가장 짧은 코드 승리
- 행운을 빕니다 !
답변
Rebmu : 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 초가 걸렸습니다. 4-9 포인트 조합의 조합 수를 계산하기 위해 누가 이것을 실행하는지에 따라 ~ 24 시간 이상이 걸릴 수 있습니다.