ล็อคหน้าจอ Android


25

Intro

คุณกำลังนั่งอยู่ในห้องประชุมที่ท้ายตารางยาว คุณมองไปรอบ ๆ และเห็น Tim Cook, คณะกรรมการ Apple, ผีของ Steve Jobs และ Jack Donaghy Apple เรียกการประชุมนี้เพราะพวกเขาตระหนักดีว่าหน้าจอล็อคของ Android นั้นเย็นลงเพียงใดและพวกเขาต้องการ 1-UP พวกเขา ทุกคนในห้องจ้องมองคุณในขณะที่ Ghost Steve ร้องว่า "ช่วยฉันด้วย CodeGolf Man! คุณเป็นความหวังเดียวของฉัน!"

ปัญหา

หน้าจอล็อค Android เป็นตารางจุดขนาด 3 x 3 ที่สามารถเชื่อมต่อได้ด้วยการปัดนิ้วจากจุดหนึ่งไปยังจุดถัดไปเพื่อสร้างเส้นทาง รหัสผ่านถือเป็นเส้นทางที่เป็นไปได้ที่มีจำนวนจุดใด ๆ และไม่รวมจำนวนจุดใด ๆ (บนโทรศัพท์จริงเส้นทางต้องมีความยาวอย่างน้อย 4 จุดสำหรับความท้าทายนี้ให้ละเว้นข้อ จำกัด นั้น) Apple วางแผนที่จะแทนที่ตาราง 3 x 3 ด้วยตาราง M x N ซึ่งคือ (M * N) / 9 เวลาที่ดีกว่า!

กฎ:

  • เส้นทางศูนย์จุดไม่ใช่รหัสผ่าน แต่เส้นทาง 1 จุดคือ
  • เส้นทางสามารถข้ามตัวมันเองได้
  • เส้นทางไม่สามารถข้ามผ่านจุดได้โดยตรงโดยไม่รวมจุดนั้น
  • สามารถใช้จุดได้เพียงครั้งเดียว
  • เส้นทางที่เหมือนกันด้วยการหมุนไม่ใช่รหัสผ่านเดียวกัน
  • เส้นทางที่เหมือนกัน แต่เรียงกลับกันไม่ใช่รหัสผ่านเดียวกัน
  • ตัวอย่างเช่นในตาราง 3x3 ที่มีจุดที่มีจำนวนตั้งแต่ 1 ถึง 9:

    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
    

    ข้อมูลที่คุณป้อนจะเป็นตัวเลขสามตัว:

    (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
    แต่ฉันบอกว่าปัญหานั้นเป็นไปตามระบบล็อคของ android ... ดังนั้นทำไมฉันไม่ควรใช้กฎเดียวกันกับระบบล็อคของ android
    Platatat

    คำตอบ:


    14

    Python - 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
    

    สำหรับการทดสอบ / การยืนยันค่า 6 ค่าแรกสำหรับบอร์ด 4x5:

    20
    262
    3280
    39644
    459764
    5101232
    

    4x5 เป็นกรณีที่น่าสนใจในการตรวจสอบเนื่องจากมีการกระโดดหมุด 2x2, 3x3 และ 2x4


    คำอธิบายสั้น ๆ

    โดยทั่วไปนี่เป็นการค้นหาที่ละเอียดถี่ถ้วนพร้อมการตัดแต่งกิ่ง ตัวอย่างเช่นเนื่องจากp(3, 3, 4)1624 p(3, 3, 5)จะตรวจสอบความเป็นไปได้ 8120 เท่านั้นแทนที่จะตรวจสอบทั้งหมด 15120 ตรรกะส่วนใหญ่อยู่ในเงื่อนไข:

    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
    คุณช่วยอธิบายสิ่งที่เกิดขึ้นในโลกนี้ได้ไหม?
    Aprıʇǝɥʇuʎs

    1
    คุณสามารถบันทึกไม่กี่ไบต์โดยsให้เป็นชุดแทนที่จะเป็นรายการ ฉันไม่เห็นการลงโทษที่มีประสิทธิภาพมากในการทิ้งวงเล็บ ทำไมถึงมีการลงโทษเช่นนี้?
    user2357112 รองรับ Monica

    1
    @ user2357112 อันที่หนึ่งรวมกับตัวสร้างส่วนอีกตัวหนึ่งของรายการ ด้วย 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.