Keybore của tôi là khóa làm tôi chán! Giúp tôi tìm một tổ hợp phím tối thiểu


13

Tín dụng cho @ Agawa001 để đưa ra câu hỏi này.

Giải trình

"Keybore" mới của tôi chỉ có 2 nút, cụ thể là +-.

Số trong bộ nhớ bắt đầu từ 0.

Mỗi lần nhấn liên tiếp +hoặc -sẽ tăng / giảm bộ nhớ trong chính xác bao nhiêu lần nó đã được nhấn liên tiếp.

Do đó, nếu bạn nhấn +4 lần, lần đầu tiên nó thêm 1, lần thứ hai thêm 2 lần, lần thứ ba thêm 3, lần thứ tư thêm 4 lần, cho bạn 10(mười).

Bây giờ, nếu bạn nhấn -3 lần, lần đầu tiên nó trừ 1, lần thứ hai 2, lần thứ ba 3, để lại cho bạn 4(bốn).

TL; DR

Cho một chuỗi + và -, chia nó cho mỗi lần thay đổi ký tự. Sau đó, mỗi chuỗi kết quả của +các ký hiệu m sẽ thêm số tam giác thứ m và mỗi chuỗi của -các ký hiệu n sẽ trừ đi số tam giác thứ n.

Đi qua

Bây giờ, nếu bạn vẫn không hiểu, tôi sẽ chỉ cho bạn cách +++--+--tạo 1.

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

Bài tập

  • Bạn sẽ lấy một số nguyên dương làm đầu vào, làm đối số chức năng hoặc từ STDIN.
  • Sau đó, bạn sẽ xuất / in số lượng tổ hợp phím tối thiểu cần thiết để tạo số đó bằng phương pháp trên.

Tủ thử

Vì sắp xếp lại các lần chạy +hoặc -cho cùng một số, đối với mỗi nhóm như vậy, chỉ có trình tự sớm nhất về mặt từ vựng được liệt kê.

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

Tài nguyên bổ sung

Chấm điểm

Đây là . Giải pháp ngắn nhất trong byte thắng.


9
Điều đó có nghĩa là ... bạn đang bị khóa?
busukxuan

Tôi nghĩ bây giờ bạn ổn với 10 trường hợp thử nghiệm (bao gồm cả của tôi).
Erik the Outgolfer

@ ΈρικΚωνσταντόπουλος Trường hợp 12 thử nghiệm đã được thêm vào, với một sửa đổi nhỏ (vì +++++--cũng là một thay thế, nhưng tôi loại bỏ ++-++++vì đó là tương đương với ++++-++). Tôi vẫn còn một trường hợp nữa tôi muốn thêm vào sau này trong trường hợp bất kỳ ai đưa ra giải pháp hiệu quả, nếu tôi quản lý tạo ra nó.
Sp3000

@ Sp3000 Tôi không muốn ++-++++xóa. Ngoài ra, đây là chỉnh sửa CỦA TÔI, không phải CỦA BẠN.
Erik the Outgolfer

@ ΈρκΚω Tôi xin lỗi nếu ý định đó không rõ ràng. Ngoài ra, bạn đã bị thiếu +++++--(hoặc, tương đương, --+++++), đó là lý do tại sao tôi cảm thấy cần phải chỉnh sửa ngay từ đầu.
Sp3000

Câu trả lời:


2

Python 2, 119 byte

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:])

Cách tiếp cận vũ phu rất chậm. Dòng thứ ba tính điểm của một chuỗi x; các dòng khác lặp trên tất cả các chuỗi nhị phân có thể cho đến khi một chuỗi có điểm bằng với đối số được tìm thấy.

@Leaky đã lưu ba byte!


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

Nó có thể tiết kiệm một số byte để loại bỏ svà chỉ sử dụng phép chia lặp đi lặp lại, như thế này:def f(n): \n while n>0:print n%2;n/=2
Leaky Nun

2

Bình thường, 25 byte

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

Hãy thử trực tuyến.

Điều này cực kỳ không hiệu quả và hết bộ nhớ trong f(n)≥ 11. Nó tính toán f(22)= 10 trong khoảng 10 giây trên máy tính xách tay của tôi.

Giải trình

  • Bắt đầu từ 1, lặp qua các số T. ( f)
    • Tạo tất cả các phân vùng của T. ( ./T)
    • Tạo ra tất cả các hoán vị của những người. ( .pM)
    • Làm phẳng danh sách. ( s)
    • Xác định danh sách. ( {) Bước này có thể được gỡ bỏ, nhưng nó làm cho mã nhanh hơn nhiều.
    • Lọc các hoán vị kết quả của các phân vùng: ( f)
      • Nhân mỗi số dcủa phân vùng ( *R) với chính nó cộng với một ( hd). Điều này cho phép nhân đôi số để cộng / trừ kết quả.
      • Chặt danh sách thành các phần có độ dài 2. ( cBắn 2)
      • Trừ đi bất kỳ số thứ hai trong các phần đó từ số thứ hai. ( -M)
      • Tổng hợp kết quả. Điều này cho phép nhân đôi số kết quả nếu hoán vị phân vùng được hiểu là số lần cộng, sau đó trừ, v.v.
      • Lấy giá trị tuyệt đối. ( .a) Nếu kết quả là âm tính, việc hoán đổi các phép cộng và phép trừ sẽ có kết quả dương tính.
      • Kiểm tra nếu kết quả bằng gấp đôi đầu vào. ( qyQ) Trong trường hợp này hoán vị phân vùng là chính xác, trả lại nó.
    • Nếu bộ lọc trả về bất kỳ kết quả nào, có một giải pháp về độ dài T. Trả lại và in T.

2

MATL , 43 29 byte

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

Đây là bộ nhớ và thời gian không hiệu quả. Trình biên dịch trực tuyến có thể xử lý tối đa 45chỉ đầu vào .

Hãy thử trực tuyến!

Đây là một phiên bản sửa đổi với tất cả các trường hợp thử nghiệm lên đến 40(mất gần một phút trong trình biên dịch trực tuyến).

Giải trình

Điều này kiểm tra tất cả các trình tự bấm phím có thể có của mỗi độ dài, theo thứ tự độ dài tăng dần, cho đến khi tìm thấy một chuỗi hợp lệ.

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 Tôi cũng đã thêm một cái, vì vậy, để tham khảo, 4, 6, 9 và 19 là các trường hợp thử nghiệm được đề cập theo thứ tự.
Erik the Outgolfer

1

Python, 105 100 byte

Sử dụng một tìm kiếm đầu tiên không hiệu quả.

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 là một danh sách được sử dụng như một hàng đợi
  • m là giá trị của chuỗi ở đầu danh sách
  • t là số cuối cùng được thêm vào m
  • l là độ dài của chuỗi đã tạo m
  • o là +/- 1, dấu hiệu ngược lại với dấu hiệu của t

Chỉnh sửa: Leaky Nun cạo năm byte.


s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
Nữ tu bị rò rỉ

s/while m!=n/while m-n/
Nữ tu bị rò rỉ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.