그 것들을 최소화 [폐쇄]


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*9가 55이상이면 그 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.