나의“keybore”는 나를 지루하게합니다! 최소한의 키 입력을 찾도록 도와주세요


13

크레딧 @ Agawa001 이 질문에 함께 올라오고합니다.

설명

나의 새로운 "keybore"은 2 개, 즉 버튼이 +-.

메모리의 숫자는에서 시작합니다 0.

각각의 연속을 누르 +거나 -의지 증가 / 감소가 연속적으로 눌렀는지 정확히 얼마나 많은 시간을 위해 메모리.

따라서 +4 번 을 누르면 1을 처음 추가 할 때, 2를 더할 때 2를 더할 때, 3을 더할 때 3을 더할 때, 4를 더할 때 4를 더할 때 10(10)가됩니다.

이제 -3 번 을 누르면 처음 1을 빼고, 2를 2, 3을 3으로 빼면 4(4)가 남습니다 .

TL; DR

+와-의 문자열이 주어질 때마다 문자를 변경할 때마다 나누십시오. 그런 다음 각 m +개의 결과 문자열은 m 번째 삼각형 숫자를 -더하고 n 개의 각 기호 문자열은 n 번째 삼각형 숫자를 뺍니다.

연습

당신은 여전히 이해하지 않는 경우에 지금, 나는 방법을 보여줍니다 +++--+--생성합니다 1.

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

직무

  • 함수 인수 또는 STDIN에서 양수를 입력으로 사용합니다.
  • 그런 다음 위의 방법을 사용하여 해당 수를 만드는 데 필요한 최소 키 입력 수를 출력 / 인쇄합니다.

테스트 케이스

+또는 -런을 재정렬하면 동일한 번호가 지정되므로 이러한 각 그룹에 대해 사전 사전 순서 만 나열됩니다.

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 가지 테스트 사례 (광산 포함)로 괜찮다고 생각합니다.
Outgolfer Erik

@ ΈρικΚωνσταντόπουλος (이후 12 테스트 케이스는 약간의 수정과 함께, 추가 된 +++++--또 다른,하지만 난 제거 ++-++++그와 동등 이후 ++++-++). 관리 솔루션을 사용하면 효율적인 솔루션을 제안 할 때를 대비하여 나중에 추가하고 싶은 사례가 하나 더 있습니다.
Sp3000

@ Sp3000 ++-++++제거 하고 싶지 않았습니다 . 또한 이것은 내 편집이 아닌 귀하의 편집입니다.
Outgolfer Erik

@ ΈρικΚωνσταντόπουλος 각 동등한 솔루션 세트에서 단 하나의 솔루션 만 나열됩니다. 모든 최소 솔루션이 나열되면 테스트 케이스가 불필요하게 길어질 것이라고 생각했습니다 (97의 경우 40 및 17 솔루션에 대한 6 개의 솔루션이 있음). 그 의도가 명확하지 않은 경우 사과드립니다. 또한 당신은 +++++--(또는 동등하게 --+++++) 누락되었으므로 처음부터 편집해야한다고 생각했습니다.
Sp3000

답변:


2

파이썬 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는 3 바이트를 절약했습니다!


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

다음과 같이 몇 바이트를 절약하고 s반복 분할을 사용할 수 있습니다.def f(n): \n while n>0:print n%2;n/=2
Leaky Nun

2

Pyth, 25 바이트

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

온라인으로 사용해보십시오.

이것은 매우 비효율적이며 f(n)≥ 11 동안 메모리가 부족합니다 f(22). 랩톱에서 약 10 초 동안 = 10을 계산 합니다.

설명

  • 1부터 시작하여 숫자를 반복합니다 T. ( f)
    • 의 모든 파티션을 생성하십시오 T. ( ./T)
    • 그것들의 모든 순열을 생성하십시오. ( .pM)
    • 목록을 평평하게하십시오. ( s)
    • 목록을 정리하십시오. ( {)는이 단계는 제거하지만, 훨씬 빠르게 코드를하게된다.
    • 파티션의 결과 순열을 필터링합니다. ( f)
      • d파티션의 각 숫자 ( *R)에 1을 더한 값 ( )을 곱하십시오 hd. 결과에 더하거나 빼기 위해 두 배의 숫자를줍니다.
      • 목록을 길이가 2 인 부분으로 자릅니다. ( c2)
      • 두 번째 숫자에서 해당 부분의 두 번째 숫자를 뺍니다. ( -M)
      • 결과를 합산하십시오. 분할 순열이 덧셈, 뺄셈 등으로 해석되면 결과 수의 두 배가됩니다.
      • 절대 값을 취하십시오. ( .a) 결과가 음수이면 덧셈과 뺄셈을 바꾸면 긍정적 인 결과를 얻습니다.
      • 결과가 입력의 두 배와 같은지 확인하십시오. ( qyQ)이 경우 파티션 순열이 올 바르면 반환하십시오.
    • 필터가 결과를 반환하면 길이가 솔루션입니다 T. 돌아가서 인쇄하십시오 T.

2

MATL , 43 29 바이트

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

이것은 메모리 및 시간 비효율적입니다. 온라인 컴파일러는 입력 45만 처리 할 수 ​​있습니다 .

온라인으로 사용해보십시오!

다음 은 모든 테스트 사례 가 수정 된 버전 입니다 40(온라인 컴파일러에서 거의 1 분이 소요됨).

설명

유효한 시퀀스를 찾을 때까지 길이가 증가하는 순서대로 각 길이의 가능한 모든 키 누름 시퀀스를 테스트합니다.

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가 순서대로 참조되는 테스트 사례입니다.
Outgolfer Erik

1

파이썬, 105100 바이트

비효율적 인 너비 우선 검색을 사용합니다.

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은 5 바이트를 면도했습니다.


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

s/while m!=n/while m-n/
Leaky Nun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.