태그 보관물: combinatorics

combinatorics

Android 휴대 전화의 잠금을 해제하는 데 시간이 얼마나 걸립니까? 화면을 사용하고

대본

패턴 일치 잠금 화면을 사용하고 있으며 슬프게도 패턴을 잊었습니다. 잠금을 해제하는 데 얼마나 많은 시간이 필요한지 알고 싶습니다. 이 도전에 사용할 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까지 확인).

숫자 9876530889876-1233또는 로 대체 8643되면 프로그램은 모든 4 점 조합에 걸린 시간을 찾습니다.

9876-1233=8643(4 점 조합)에 대한 출력 :

>> rebmu %combinations.rebmu
== 11344

98765-1233=975324 점 및 5 점 조합의 출력 :

>> rebmu %combinations.rebmu
== 61426

987654-1233=986421(4,5,6 점 조합)에 대한 출력 :

>> rebmu %combinations.rebmu
== 243532

* 4 / 5 포인트는 실행하는 데 약 8 초가 걸렸습니다. 4-6 시간은 약 77 초가 걸렸습니다. 4-9 포인트 조합의 조합 수를 계산하기 위해 누가 이것을 실행하는지에 따라 ~ 24 시간 이상이 걸릴 수 있습니다.


답변