그 것들을 최소화 [폐쇄]


12

당신의 작업은 그들 만 사업자 가장 적은 수의 사용 자연수 구축하는 것입니다 +또는 -. 예를 들어 숫자 7은 쓸 수 있지만로 쓸 1+1+1+1+1+1+1=7수도 있습니다 11-1-1-1-1=7. 첫 번째는 하나를 사용 7하고 후자는을 사용합니다 6. 당신의 임무는 일부 자연수의 입력이 주어질 때 사용될 수있는 최소 수를 반환하는 것입니다 n.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 유효한 코드가 이깁니다.

테스트 사례

입력 => 출력

0 => 2 (since 1-1=0)
7 => 6
121 => 6
72 => 15
1000 => 7
2016 => 21

좋은 첫 번째 도전. 더 많은 테스트 사례를 포함시키는 것이 좋습니다. 단일 출력이있는 경우 "VALID OUTPUTS"가 실수입니까? 또한 0은 유효한 입력이며, 그렇다면 어떤 것을 출력해야합니까?
xnor

이것은 흥미로운 도전이다. 출력에 대한 설명을 추가하고 싶을 수도 있습니다 VALID OUTPUTS. 그것은 당신의 선택이지만, 같은 일반적으로 사람들 굵게 또는 기울임 꼴 대신 대문자로의는 (그들은 대신 강조의 소리처럼 보이게). 굵은 체는 **bold text**이탤릭체입니다 *italics text*. ### Text더 굵은 글씨로 도 사용할 수 있습니다 . 어쨌든 PPCG에 오신 것을 환영합니다!
NoOneIsHere 여기

사람들이 코드를 실행할 수있는 컴퓨터 판독 가능 테이블 또는 테스트 사례 목록을 만들어야합니다. 이 팁을 참조하십시오 .
xnor

6
이 질문은 codefights.com/challenges 의 현재 (능동적 인!) 골프 도전과 중복되기 때문에이 질문을 닫으 려고 합니다. OP가 Codefights에 대한 최초의 도전자이기도하더라도 (의문의 여지가 있음) Codefights에 대한 도전이 더 이상 활성화되지 않을 때까지 질문을 닫아야합니다.
Jakube

1
@Jakube 직접 링크 가 도움이 될 수는 있지만 동의합니다. 투표 마감합니다.
NoOneIsHere 여기

답변:


3

자바 스크립트 (ES6), 127 (126) 87 바이트

f=(n,z=2,m=n*9+'',r=m.replace(/./g,1))=>n?m.length+(m<'55'?f(n- --r/10,0)-1:f(r-n,0)):z
Input: <input type="number" oninput="result.textContent=f(this.value)"> Result: <span id="result"></span>

JavaScript의 정수 한계에 도달하기 시작하는 약 10 14 15 까지 작동해야 합니다. 설명:

f=(                             Recursive function
 n,                             Parameter
 z=2,                           Zero workaround
 m=n*9+'',                      Magic
 r=m.replace(/./g,1)            Find repunit not less than than n
)=>n?                           Nothing to do if n is zero
 m.length+                      Assume subtracting from repunit
 (m<'55'?                       Should we subtract from repunit?
  f(n- --r/10,0)                No, so subtract previous repuint
   -1:                          Which is one 1 shorter
  f(r-n,0)):                    Subtract from repunit
 z                              Return special case if n is zero

이것은 n*9마법을 두 번 사용합니다 . 첫째, 그것은 다음 파충류의 길이를 제공합니다. 둘째, 첫 번째 두 자리수 n*955이상이면 그 n다음 파충류에서 빼야합니다. 그렇지 않으면 이전의 파문 단위를 빼야합니다 (1과 10으로 나눔). 이것은 최대 10 15 까지 작동합니다 .


2

Pyth, 19 16 바이트

ffqQvs+R1Y^c3"+-

테스트 스위트

무차별 대입 알고리즘. 필요한 문자열은 요소 ['+', '-', '']의 길이가 테스트중인 1의 수와 동일한 모든 목록을 가져 와서 각각에 1을 추가하고 단일 문자열에 연결하여 생성됩니다. 그런 다음이 문자열을 평가하고 입력과 비교합니다. 성공적인 문자열을 찾을 때까지이 과정이 반복됩니다.

행간이 +있거나 -테스트 된 일부 문자열 은 문제가되지 않습니다. 입력이 음수 인 경우입니다.

너무 느리게되기 전에 길이 9까지 실행할 수 있습니다.

설명:

ffqQvs+R1Y^c3"+-
ffqQvs+R1Y^c3"+-"T    Implicit variable introduction
                      Q = eval(input())
f                     Starting with T = 1 and counting upwards, repeat until true.
                      The value of T where the result is first true is output.
           c3"+-"     Chop "+-" into thirds, giving ['+', '-', '']
          ^      T    Form every list with those elements of length T.
 f                    Filter over those lists, lambda var Y.
      +R1Y            Append a 1 to each element of the list.
     s                Concatenate.
    v                 Eval.
  qQ                  Compare for equality with the input.
                      The inner filter will let through the successful cases.
                      The outer filter will stop when there is a successful case.

2

자바 스크립트 (ES6), 92 바이트

f=(n,i=3)=>eval([...s=i.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n?f(n,i+1):s.length-1
n = <input type="number" oninput="R.textContent=f(this.value)" /><pre id="R"></pre>

설명

재귀 기능. 이것은 모든 가능한 순열 생성 1들 중 어느 하나에 의해 분리 +, -또는 아무것도. 각 디지트를 변환, 숫자의 배열로 돌려베이스 -3- 수가 증가하여 수행 0-, 1+2함께 그것들을 접합 한 후, 빈 문자열 1S. 결과 문자열은 eval방정식의 결과를 반환하는 JavaScript 문으로 d입니다.

연산자는 1사이에 (와 같은 +1+1+1+) s를 사용하므로 length - 1 1s가 있습니다. 첫 번째 연산자 (때문에 무시 +1= 1, <nothing>1= 1선도적 인 존재하지 않습니다 그래서 그것은 숫자입니다 0에 대한 -최종 사업자도 (추가 무시) .0방정식에).

더 높은 출력 버전, 96 바이트

다른 버전은 재귀 호출 스택 제한으로 인해 ~ 10보다 높은 출력을 반환 할 수 없습니다. 이 버전은 재귀 대신 for 루프를 사용하므로 최대 ~ 33의 출력을 반환 할 수 있습니다. 필요한 시간은 기하 급수적으로 증가하므로 테스트하지 않는 것이 좋습니다.

n=>eval('for(a=3;eval([...s=a.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n;)a++;s.length-1')

너무 복잡하게 들립니다. 마음에 듭니다.
Bálint
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.