我需要多少时间才能解锁Android手机?


12

情境

我正在使用模式匹配锁屏,可惜我忘记了我的模式。我想知道解锁需要多少时间。以下是我们将用于此挑战的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),进行计算(实际上是有趣的部分,不是吗?)
  • 最短的代码胜出
  • 祝好运 !

2
我没有Android,但我想指出,您的示例似乎违反了允许的直接连接。我猜想一旦使用了中心(因此无法使用),则左下角和右上角之间的直接连接将变得明确无误,因此可能。
圣约翰河

1
作为此锁定屏幕的用户,我几乎完全可以确定,只要有足够的手指精确度,就可以连接任何两个未使用的点。
2011年

4
@Ourous:至少在我的手机上,如果您在一个点上移动手指以连接该点两侧的点,则中间的点将插入到序列中,并且无论如何都算作已使用。
user2357112支持Monica 2014年

1
@steveverrill:您是对的,我为此添加了一条提示。希望您不要介意直接引述您,因为我认为这是一个很好的解释。

1
“您不能对可能的有效模式的数量进行硬编码”不是可观察到的要求。
Ad Hoc Garf Hunter

Answers:


2

Rebmu197个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-12338643,则程序将找到所有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点组合的组合数量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.