안드로이드 잠금 화면


25

소개

긴 테이블 끝에있는 회의실에 앉아 있습니다. Apple 이사회, Steve Jobs의 유령, Jack Donaghy 등의 팀 쿡을 둘러 보았습니다. 애플은 안드로이드 잠금 화면이 얼마나 멋진 지 깨닫고 1-UP을 원하기 때문에이 회의에 전화했다. 고스트 스티브가 울부 짖는 것처럼 방에있는 모든 사람들이 당신을 응시합니다.

문제

Android 잠금 화면은 손가락을 한 점에서 다음 점으로 스 와이프하여 연결하여 경로를 만들 수있는 3 x 3 격자 형 점입니다. 암호는 여러 개의 점을 포함하고 여러 개의 점을 제외하는 가능한 경로로 간주됩니다. (실제 전화의 경우 경로의 길이는 4 도트 이상이어야합니다.이 문제를 해결하려면 해당 제한을 무시하십시오.) Apple은 3 x 3 그리드를 M x N 그리드 (M * N) / 9로 교체 할 계획입니다. 더 나은 시간!

규칙 :

  • 제로 도트 경로는 암호가 아니지만 1 도트 경로는
  • 길은 스스로 교차 할 수 있습니다
  • 경로는 해당 점을 포함하지 않고 점 위로 직접 교차 할 수 없습니다
  • 점은 한 번만 사용할 수 있습니다
  • 회전에 의해 동일한 경로는 동일한 암호가 아닙니다
  • 동일하지만 역순 인 경로는 동일한 비밀번호가 아닙니다.
  • 예를 들어 1에서 9까지의 숫자로 된 점이있는 3x3 격자에서

    1 2 3
    4 5 6
    7 8 9
    

    유효한 경로는 다음과 같습니다.

    1
    3
    7,2,3
    1,5,9,2
    1,8,6,5,4
    4,2,3,5,6,7,8,9
    5,9,6,4
    

    그리고 잘못된 경로는 다음과 같습니다.

    1,3
    1,9,5
    7,5,4,7
    4,6
    

    입력 한 숫자는 3 자리입니다.

    (M,N,d)
    

    그리드는 M x N이고 d는 경로의 길이입니다.

    1 <= M <= 16
    1 <= N <= 16
    1 <= d <= M * N
    

    프로그램 또는 함수는 입력을 쉼표로 구분 된 문자열로 제공하며 해당 길이의 가능한 암호 수를 리턴해야합니다. 예를 들면 다음과 같습니다.

    Input:  2,2,1 
    Output: 4
    Input:  2,2,2
    Output: 12
    Input:  7,4,1
    Output: 28
    

    표준 코드 골프 규칙 적용, 최단 코드 승리!

    //If I've made a mistake or the rules are unclear, please correct me!
    

    2
    입력이 쉼표로 구분 된 문자열입니까 아니면 세 개의 별도 매개 변수입니까?
    user80551

    1
    @ user80551 컨텍스트에 따라 프로그램에 입력되면 문자열이거나 함수를 호출하는 데 사용되는 경우 별도의 매개 변수가 될 것이라고 생각합니다.
    user12205

    1
    @Platatat 코드를 디자인하는 것이 정말 중요하므로 user80551의 질문에 대답 해 주시겠습니까?
    RononDex

    3
    주어진 솔루션의 컴파일 및 실행 시간 모두에 시간 제한이 있는지 결정해야합니다. 이러한 제한이 없으면 이론적으로 256!16 x 16 그리드 의 모든 점 순열 중 유효한 잠금 해제 패턴을 나타내는 프로그램을 쉽게 작성할 수 있습니다 . 실제로 이러한 프로그램은 절대 종료되지 않습니다.
    Dennis

    3
    그러나 나는 문제가 안드로이드 잠금 시스템을 기반으로한다고 말했다 ... 왜 안드로이드 잠금 시스템과 동일한 규칙을 사용해서는 안됩니까?
    Platatat

    답변:


    14

    파이썬-170 바이트

    from fractions import*
    p=lambda m,n,d,l=0,s=set():d<1or sum([p(m,n,d-1,i,s|{i})for i in range(m*n)if not(s and(s&{i}or set(range(l,i,abs(i-l)/gcd(i%n-l%n,i/n-l/n)))-s))])
    

    내부의 괄호 sum([...])가 꼭 필요한 것은 아니지만이를 포함하지 않으면 성능이 크게 저하됩니다.

    모든 3x3에 대한 출력 :

    for i in range(4, 10):
      print p(3, 3, i)
    

    생산 :

    1624
    7152
    26016
    72912
    140704
    140704
    

    테스트 / 확인을 위해 4x5 보드의 처음 6 개 값 :

    20
    262
    3280
    39644
    459764
    5101232
    

    4x5는 2x2, 3x3 및 2x4 페그 점프가 있기 때문에 확인하기에 흥미로운 경우입니다.


    간단한 설명

    일반적으로 누적 정리 기능을 갖춘 철저한 검색입니다. 예를 들어, p(3, 3, 4)1624 이므로 p(3, 3, 5)15120을 모두 순진하게 검사하지 않고 8120 개의 가능성 만 검사합니다. 대부분의 논리는 조건에 포함됩니다.

    if not(s and(s&{i}or set(range(l,i,abs(i-l)/gcd(i%n-l%n,i/n-l/n)))-s))
    

    일반 영어로, 이것은 다음과 같이 이해 될 수 있습니다 :

    If no pegs have been used yet
         OR
       the target peg has not yet been used
         AND
       each of the pegs directly between the target peg and the
       current peg (a.k.a. "jumped over") have already been used
    

    2
    세계에서 무슨 일이 일어나고 있는지 설명해 주시겠습니까?
    ɐɔıʇǝɥʇuʎs

    1
    s목록 대신 세트가 되어 몇 바이트를 절약 할 수 있습니다 . 대괄호를 떨어 뜨릴 때 큰 성능 저하가 보이지 않습니다. 왜 그런 형벌이 있을까요?
    user2357112는 Monica

    1
    @ user2357112 하나는 Generator 위에 있고 다른 하나는 List 위에 있습니다. CPython을 사용하면 맞습니다. 큰 차이는 없습니다 (약 20 % 느림). PyPy를 사용하면 5 배 이상 느립니다.
    primo

    1
    @ user2357112 마지막으로 s세트 로 정의 하여 의미를 알 수 있습니다 . 오늘의 파이썬 수업 :로 {i}평가됩니다 set([i]). 구문 오류가 예상되었을 것입니다. 항목을 세트에 추가 s|{i}하면이 i in s되고로 교체 될 수 있습니다 s&{i}.
    primo
    당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
    Licensed under cc by-sa 3.0 with attribution required.