Ile czasu potrzeba na odblokowanie telefonu z Androidem?

12

Scenariusz

Używam ekranu blokady pasującego do wzoru i niestety zapomniałem o swoim wzorze. Chciałbym wiedzieć, ile czasu będę potrzebował, aby go odblokować. Oto specyfikacje ekranu blokady Google, którego użyjemy do tego wyzwania.

  • Co 5 złych kodów użytkownik musi czekać 30 secondsprzed dalszym wprowadzaniem.
  • Wzór musi przynajmniej składać się 4 points(patrz poniżej)

  • Punktu można użyć tylko raz, ale można go kilkakrotnie przejść (patrz zdjęcie poniżej): dziwne

Tutaj punkt środkowy jest używany tylko raz, nawet jeśli przejdziemy go ponownie dla tego konkretnego wzoru.

Hipoteza i fakty

Zakładamy, że jesteśmy superbohaterami i że możemy narysować dowolny wzór 1 second, nigdy nie musimy jeść ani spać. Tak, jesteśmy nadludzkimi.

Jestem bardzo pechową osobą. „Scenariusz najgorszego przypadku” to moje codzienne życie, więc wzór, który spróbuję wykonać jako ostatni, będzie właściwy.

Co mamy do powiedzenia?

Dla tych, którzy go nie znają, Android (i inne telefony teraz) oferuje możliwość odblokowania telefonu poprzez narysowanie wzoru na 9-punktowej matrycy. Macierz tę można opisać następująco:

C(A)  M(B)  C(C)
M(D)  X(E)  M(F)
C(G)  M(H)  C(I)
  • C oznacza „punkt narożny”
  • M dla „punktu środkowego”
  • X dla „punktu środkowego”
  • Podałem identyfikatory punktów, aby ułatwić

Dopuszczalne połączenia bezpośrednie są następujące:

Punkt narożny:

Kąt

Środkowy punkt:

Środkowy

Środek :

Centrum

Jednak, jak zauważył Steveverrill, „gdy środek zostanie wykorzystany (a zatem stanie się niedostępny), bezpośrednie połączenie między lewym dolnym a prawym górnym rogiem staje się jednoznaczne i dlatego możliwe”. To samo dotyczy każdego „punktu środkowego”, jeśli np. Punkt B został już policzony, możliwe jest bezpośrednie połączenie między A i C. Jeśli np. F został już policzony, możliwe jest bezpośrednie połączenie między C i I. Itp...

Zasady

  • Celem tego wyzwania jest zwrócenie ile czasu (w postaci czytelnej dla człowieka, czyli rok / dzień / miesiąc / godzina / cokolwiek znajdziesz) będę musiał odblokować ten cholerny telefon.
  • Nie możesz zakodować na stałe liczby możliwych prawidłowych wzorców (nawet go nie Google, oszukasz), obliczyć (to właściwie jest fajna część, prawda?)
  • Najkrótszy fragment kodu wygrywa
  • Powodzenia !
Choroba
źródło
2
Nie mam Androida, ale chciałbym zauważyć, że twój przykład narusza dozwolone bezpośrednie połączenia. Domyślam się, że po użyciu centrum (i dlatego stanie się niedostępne) bezpośrednie połączenie między lewym dolnym a prawym górnym rogiem staje się jednoznaczne i dlatego możliwe.
Level River St
1
Jako użytkownik tego ekranu blokady jestem prawie całkowicie pewien, że przy wystarczającej precyzji palca możesz połączyć dowolne dwa nieużywane punkty.
Οurous
4
@Ourous: Przynajmniej na moim telefonie, jeśli przesuniesz palcem po kropce, aby połączyć kropki po obu jej stronach, kropka pomiędzy nimi zostanie wstawiona do sekwencji i i tak liczona jako wykorzystana.
user2357112 obsługuje Monikę
1
@steveverrill: Masz rację, dodałem wskazówkę na ten temat. Mam nadzieję, że nie masz nic przeciwko, że zacytowałem cię bezpośrednio, ponieważ uważałem, że to dobre wytłumaczenie.
1
„Nie można zakodować na stałe liczby możliwych prawidłowych wzorców” nie jest wymaganiem obserwowalnym.
Ad Hoc Garf Hunter

Odpowiedzi:

2

Rebmu : 197 175 168 167 znaków

Generuje kombinacje jako ciąg liczb (np. 12369 jest od lewego górnego do prawego górnego do prawego dolnego rogu), sprawdza, czy kombinacja jest poprawna, i zwiększa licznik, jeśli tak jest. Uruchomienie może trochę potrwać * . Zwraca liczbę sekund potrzebną do odblokowania telefonu.

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

Usunięto i skomentowano:

; 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

Program zapętla od 1 do (987654321-1233), sprawdzając licznik pętli 1233 + (a zatem sprawdzając 1234 do 987654321).

Jeśli liczba 987653088zostanie zastąpiona przez, 9876-1233lub 8643, wówczas program znajdzie czas zajęty dla wszystkich kombinacji 4-punktowych.

Dane wyjściowe dla 9876-1233=8643(kombinacje 4-punktowe):

>> rebmu %combinations.rebmu
== 11344

Dane wyjściowe dla 98765-1233=97532(kombinacji 4 i 5-punktowych):

>> rebmu %combinations.rebmu
== 61426

Dane wyjściowe dla 987654-1233=986421(kombinacji 4,5,6-punktowych):

>> rebmu %combinations.rebmu
== 243532

* Uruchomienie 4/5 punktu zajęło mi około 8 sekund; 4-6 zajęło około 77 sekund. Obliczenie liczby kombinacji dla kombinacji 4-9 punktów może potrwać ~ 24 godziny lub dłużej.

es1024
źródło