"keybore" ของฉันคือกุญแจสำคัญสำหรับฉัน! ช่วยฉันค้นหาการกดแป้นที่น้อยที่สุด


13

เครดิตให้กับ@ Agawa001สำหรับการถามคำถามนี้

คำอธิบาย

ใหม่ของฉัน "keybore" มีเพียง 2 ปุ่มคือและ+-

0ตัวเลขที่อยู่ในหน่วยความจำเริ่มต้นที่

ติดต่อกันแต่ละกด+หรือ-จะเพิ่มขึ้น / ลดลงหน่วยความจำสำหรับว่ากี่ครั้งก็ถูกกดอย่างต่อเนื่อง

ดังนั้นหากคุณกด+4 ครั้งครั้งแรกที่มันเพิ่ม 1 ครั้งที่สองจะเพิ่ม 2 ครั้งที่สามเพิ่ม 3 ครั้งที่สี่เพิ่ม 4 ให้คุณ10(สิบ)

ทีนี้ถ้าคุณกด-3 ครั้งครั้งแรกที่มันลบ 1 ครั้งที่สอง 2 ครั้งที่สามครั้งที่ 3 ปล่อยคุณด้วย4(สี่)

TL; DR

รับสตริง + และ - ให้แบ่งแต่ละการเปลี่ยนแปลงของตัวละคร จากนั้นแต่ละสตริงผลลัพธ์ของ+สัญลักษณ์m จะเพิ่มหมายเลขสามเหลี่ยม m-th และแต่ละสตริงของ-สัญลักษณ์n จะลบหมายเลขสามเหลี่ยม n-th

เดินผ่าน

ตอนนี้ถ้าคุณยังไม่เข้าใจผมจะแสดงวิธีการสร้าง+++--+--1

Program   | Counter | Memory
----------------------------
          |  0      | 0
+         | +1      | 1
++        | +2      | 3
+++       | +3      | 6
+++-      | -1      | 5
+++--     | -2      | 3
+++--+    | +1      | 4
+++--+-   | -1      | 3
+++--+--  | -2      | 1

งาน

  • คุณจะใช้จำนวนเต็มบวกเป็นอินพุตไม่ว่าจะเป็นอาร์กิวเมนต์การทำงานหรือจาก STDIN
  • จากนั้นคุณจะส่งออก / พิมพ์จำนวนขั้นต่ำของการกดแป้นที่จำเป็นในการสร้างหมายเลขนั้นโดยใช้วิธีการด้านบน

Testcases

เนื่องจากการจัดเรียง+หรือการ-รันใหม่ให้หมายเลขเท่ากันสำหรับแต่ละกลุ่มดังกล่าวจะมีการแสดงรายการลำดับต้นสุดของพจนานุกรมเท่านั้น

Input | Output | Possible corresponding sequences
-------------------------------------------------
    4 |      5 | -+++-
    6 |      3 | +++
    9 |      5 | ++++-
   11 |      7 | +++-+++
   12 |      7 | +++++--, ++++-++
   19 |      8 | -++++++-
   39 |     12 | +++++++++---
   40 |     13 | +++++++++---+, ++++++++-+++-
   45 |      9 | +++++++++
   97 |     20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
  361 |     34 | ++++++++++++++++++++++++++-+++-+++

ทรัพยากรเพิ่มเติม

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟทางออกที่สั้นที่สุดในหน่วยไบต์ชนะ


9
หมายความว่า ... คุณกำลังเซ็นสัญญาอยู่ใช่ไหม
busukxuan

ฉันคิดว่าคุณโอเคกับ 10 กรณีทดสอบตอนนี้ (รวมถึงของฉัน)
Erik the Outgolfer

@ ΈρικΚωνσταντόπουλος 12 กรณีทดสอบได้รับการเพิ่มด้วยการปรับเปลี่ยนเล็กน้อย (เนื่องจาก+++++--เป็นทางเลือก แต่ฉันลบ++-++++เพราะมันเทียบเท่า++++-++) ฉันยังมีอีกกรณีที่ฉันต้องการเพิ่มในภายหลังในกรณีที่ทุกคนคิดวิธีแก้ปัญหาที่มีประสิทธิภาพถ้าฉันจัดการสร้างมันขึ้นมา
Sp3000

@ Sp3000 ฉันไม่ต้องการ++-++++ลบ นี่คือการแก้ไขของฉันไม่ใช่ของคุณ
Erik the Outgolfer

@ ςαντόπουλοςโซลูชั่นเดียวที่มีอยู่ในรายการโซลูชั่นที่เทียบเท่าแต่ละรายการ - ฉันคิดว่าถ้ามีการแก้ปัญหาขั้นต่ำทั้งหมดอยู่ในรายการกรณีทดสอบจะยาวโดยไม่จำเป็น (มี 6 โซลูชั่นสำหรับ 40 และ 17 โซลูชั่นสำหรับ 97) ฉันขอโทษถ้าความตั้งใจนั้นไม่ชัดเจน นอกจากนี้คุณยังขาดหายไป+++++--(หรือเท่ากัน--+++++) ซึ่งเป็นสาเหตุที่ฉันรู้สึกว่าต้องแก้ไขตั้งแต่แรก
Sp3000

คำตอบ:


2

Python 2, 119 ไบต์

def g(n,i=0,s=''):
 c=x=t=0
 for d in s:C=int(d)*2-1;t=(c==C)*t+1;c=C;x+=c*t
 return(x==n)*len(s)or g(n,i+1,bin(i)[3:])

วิธีการเดรัจฉานบังคับช้ามาก บรรทัดที่สามคำนวณคะแนนของสตริงx; บรรทัดอื่น ๆ วนซ้ำไปตามสตริงไบนารี่ที่เป็นไปได้ทั้งหมดจนกระทั่งมีคะแนนเท่ากับอาร์กิวเมนต์ที่พบ

@Leaky บันทึกสามไบต์!


s/x==n and len/(x==n)*len/
Leaky Nun

มันอาจจะช่วยลดขนาดบางอย่างเพื่อกำจัดsและใช้เพียงส่วนทำซ้ำเช่นนี้def f(n): \n while n>0:print n%2;n/=2
รั่วนูน

2

Pyth, 25 ไบต์

ffqyQ.as-Mc*RhdY2{s.pM./T

ลองออนไลน์

มันไม่มีประสิทธิภาพมากและหน่วยความจำไม่เพียงพอสำหรับf(n)≥ 11 มันคำนวณf(22)= 10 ในเวลาประมาณ 10 วินาทีบนแล็ปท็อปของฉัน

คำอธิบาย

  • ตั้งแต่วันที่ 1 Tห่วงผ่านตัวเลข ( f)
    • Tสร้างพาร์ทิชันทั้งหมดของ ( ./T)
    • สร้างการเรียงสับเปลี่ยนทั้งหมดของสิ่งเหล่านั้น ( .pM)
    • แผ่รายการ ( s)
    • Uniquify รายการ ( {) ขั้นตอนนี้สามารถลบออกได้ แต่มันทำให้โค้ดเร็วขึ้นมาก
    • กรองพีชคณิตผลลัพธ์ของพาร์ติชัน: ( f)
      • คูณแต่ละหมายเลขdของพาร์ติชัน ( *R) ด้วยตัวเองบวกหนึ่ง ( hd) สิ่งนี้จะเพิ่มจำนวนสองเท่าในการเพิ่ม / ลบกับผลลัพธ์
      • ตัดส่วนของความยาว 2 ( c2)
      • ลบหมายเลขที่สองในส่วนเหล่านั้นจากหมายเลขที่สอง ( -M)
      • สรุปผล สิ่งนี้จะเพิ่มจำนวนผลลัพธ์เป็นสองเท่าหากการเปลี่ยนแปลงการแบ่งพาร์ติชันถูกตีความว่าเป็นจำนวนการเพิ่มเติมจากนั้นจึงลบออกเป็นต้น
      • รับค่าสัมบูรณ์ ( .a) หากผลลัพธ์เป็นลบการสลับการบวกและลบออกจะได้ผลลัพธ์ที่เป็นบวก
      • ตรวจสอบว่าผลลัพธ์เท่ากับอินพุตสองเท่าหรือไม่ ( qyQ) ในกรณีนี้การเปลี่ยนพาร์ติชั่นถูกต้องให้ส่งคืน
    • ถ้ากรองผลลัพธ์ใด ๆ Tที่มีการแก้ปัญหาของความยาว Tย้อนกลับและการพิมพ์

2

MATL , 43 29 ไบต์

E:"@TFEqZ^!"@Y'tQ**s]vGE=a?@.

นี่คือหน่วยความจำ - และไม่มีประสิทธิภาพเวลา คอมไพเลอร์ออนไลน์สามารถจัดการได้ถึงอินพุต45เท่านั้น

ลองออนไลน์!

ต่อไปนี้เป็นรุ่นที่ได้รับการแก้ไขพร้อมกรณีทดสอบทั้งหมดจนถึง40(ใช้เวลาเกือบหนึ่งนาทีในคอมไพเลอร์ออนไลน์)

คำอธิบาย

สิ่งนี้ทดสอบลำดับการกดปุ่มที่เป็นไปได้ทั้งหมดของแต่ละความยาวตามลำดับความยาวที่เพิ่มขึ้นจนกระทั่งพบลำดับที่ถูกต้อง

E:       % Range [1 2 ... 2*N] where N is implicit input. The required sequence length is
         % less than 2*N, so this is enough
"        % For each
  @      %   Push current value: length of sequence
  TFEq   %   Push array [1 -1]
  Z^     %   Cartesian power. Gives all possible sequences of 1, -1 of that length
  !      %   Transpose. Each sequence is now a row
  "      %   For each sequence
    @    %     Push current sequence
    Y'   %     Run-length decoding: Pushes an array of values 1 and -1, and then an
         %     array of run-lengths
    tQ*  %     Duplicate, add 1, multiply. Gives twice the triangular number for each run
    *    %     Multiply element-wise by 1 or -1 to produce correct sign
    s    %     Sum of array. This is the number produced by the current sequence
  ]      %   End for
  v      %   Concatenate all numbers into an array
  GE=a   %   True if any of those numbers equals twice the input
  ?      %   If so
    @    %     Push current sequence length. This is the final result
    .    %     Break loop
         %   End if
         % End for
         % Implicit display

@ Sp3000 ฉันได้เพิ่มหนึ่งรายการด้วยดังนั้นสำหรับการอ้างอิง 4, 6, 9 และ 19 เป็นกรณีทดสอบตามลำดับที่อ้างถึง
Erik the Outgolfer

1

Python 105 100 ไบต์

ใช้การค้นหาแบบกว้างแรกที่ไม่มีประสิทธิภาพ

def k(n):
 m=t=l=0;h=[]
 while m-n:o=1-2*(t>0);(m,t,l),*h=h+[(m+t-o,t-o,l+1),(m+o,o,l+1)]
 return l
  • h เป็นรายการที่ใช้เป็นคิว
  • m คือค่าของลำดับที่ส่วนหัวของรายการ
  • t เป็นหมายเลขสุดท้ายที่ถูกเพิ่มเข้าไป m
  • l คือความยาวของลำดับที่สร้างขึ้น m
  • o คือ +/- 1 เครื่องหมายตรงข้ามกับเครื่องหมาย t

แก้ไข: Leaky Nun โกนห้าไบต์


s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
Leun Nun

s/while m!=n/while m-n/
Leun Nun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.