Keith 번호 인 경우 주어진 숫자인지 테스트 true 또는 false를

피보나치 숫자와 시퀀스는 코드 골프의 인기있는 주제처럼 보이기 때문에 Keith 숫자로 골프를 코딩하는 것은 재미있는 도전이라고 생각했습니다 .

따라서 정수를 가져 와서 숫자가 Keith 숫자인지 아닌지에 따라 true 또는 false를 반환하는 함수를 만드는 것이 과제입니다.

키이스 번호에 대한 추가 정보

레크리에이션 수학에서 Keith 숫자 또는 repfigit 숫자 (반복적 인 피보나치 유사 자릿수의 줄임말)는 14, 19, 28, 47, 61, 75, 197, 742, 1104, 1537, 2208, 2580,…

Numberphile 에는 Keith 숫자를 계산하는 방법을 설명하는 비디오가 있습니다. 그러나 기본적으로 숫자의 숫자를 사용합니다. 그것들을 합한 다음 원래 숫자의 마지막 숫자를 가져 와서 계산의 합계에 헹구고 반복하십시오. 그리고 명확하게하기위한 예입니다.

14
1 + 4 = 5
4 + 5 = 9
5 + 9 = 14

입력

정수

산출

숫자가 Keith 숫자이면 참입니다. 그렇지 않으면 거짓 ..



답변

GolfScript ( 31 25 자)

..[10base{.{+}*+(\}@*]?0>

스택 맨 위에 정수로 입력하십시오. 출력은 0 (거짓) 또는 1 (참)입니다. Keith 숫자를 최대 100까지 나열하는 온라인 데모 .


답변

파이썬 ( 78 75)

a=input()
n=map(int,`a`)
while a>n[0]:n=n[1:]+[sum(n)]
print(a==n[0])&(a>9)

n=n[1:]+[sum(n)]모든 마법을 수행합니다. 의 첫 번째 항목을 제외한 모든 항목을 취하고 (첫 번째 항목과 n의) 합계를 고수 n한 다음로 설정합니다 n.

list정수를 호출 하고 숫자를 분리 할 수 있기를 바랍니다 .

반환 값 False이 반환하는 경우 (10) 아래의 모든 입력에 8 자 짧아 질 수 있습니다 True.


답변

GolfScript, 32 29 자

...[10base\{.{+}*+(\}*]&,\9>&

온라인 으로 테스트 할 수있는 GolfScript 구현 . 입력은 스택에서 최상위 요소로 제공되며 각각 0 (즉, false) 또는 1을 반환합니다.


답변

APL, 36 34 39 36 33 29 27

*+/x={(∇⍣(⊃x>¯1↑⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕

1Keith 인 0경우 출력

GolfScript가 다시 공격합니다 !!


편집하다

+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕

⊢/빼기 1 ( ) 대신 오른쪽 축소 ( )를 사용하여 ¯1↑1자를 직접 저장하고 1을 Disclose ( ) 에서 간접적으로 저장

설명

⍎¨⍕x←⎕평가 된 입력 (숫자로 취급)을 가져 와서에 할당합니다 x. 문자 배열 (다른 언어에서는 “문자열”)로 변환하고 각 문자 (숫자)를 반복하여 숫자로 변환합니다. 따라서 이것은 숫자의 숫자 배열입니다.

{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}주요 “루프”함수입니다. 배열 에서
+/⍵↑⍨-⍴⍕x마지막 ⍴⍕x숫자 ( x)를 가져와 합산합니다.
⍵,배열의 끝에 연결합니다.
(x>⊢/⍵)배열의 마지막 숫자 ( +/⍵↑⍨-⍴⍕x아직 연결되지 않은)가 새 배열 보다 작고 여러 번이 함수를 x반환 1하거나 0
∇⍣실행하는지 확인하십시오. 따라서 마지막 숫자가보다 작 으면 x이 함수가 반복됩니다. 그렇지 않으면 새 배열을 반환

함수를 실행 한 후, 배열에는 숫자 중 2 개 이상 x(예 : 14생성 1 4 5 9 14 23, 13생성 1 3 4 7 11 18 29) 이 발생 하는 지점까지의 합이 포함 됩니다.
마지막으로 각 숫자가 같은지 확인 x하고 결과 이진의 합을 출력합니다 정렬.


편집하다

1=+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕

0입력이 한 자리이면 출력을 만들기 위해 2 문자를 추가했습니다 🙁


또 다른 편집

+/x=¯1↓{(∇⍣(x>⊢/⍵))1↓⍵,+/⍵}⍎¨⍕x←⎕

설명

함수는 이제 1↓마지막 ⍴⍕x( ↑⍨-⍴⍕x) 을 취하는 대신 배열에서 첫 번째 숫자 ( )를 삭제합니다 .
그러나이 방법은 1=한 자리 숫자를 처리하기에 적합하지 않습니다. 따라서 이제는 동등성을 확인하기 전에 배열에서 마지막 숫자를 삭제하고 x1 문자를 추가합니다.


당신은 그것을 추측 : 편집

+/x=1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕

x이전 마지막 항목 대신 새로 추가 된 항목과 비교 하므로 동등성을 확인하기 전에 첫 번째 (마지막 대신) 항목을 삭제하는 x것으로 충분하며 빼기 기호가 저장됩니다. 다른 형태의 Power 연산자 ( ) 를 사용하여 다른 3 개를 저장합니다

그리고 25 문자 gs 답변이 나타납니다 (Orz)


마지막 편집

x∊1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕

내가 그것을 놓쳤다는 것을 믿을 수 없다.
더 이상 골프를 칠 수 없습니다.


답변

커먼 리스프, 134

CL은 때때로 읽을 수 없습니다.

(defun k(n)(do((a(map'list #'digit-char-p(prin1-to-string n))(cdr(nconc a(list(apply'+ a))))))((>=(car a)n)(and(> n 9)(=(car a)n)))))

가로 스크롤을 피하기위한 형식 :

(defun k(n)
  (do
    ((a(map'list #'digit-char-p(prin1-to-string n))(cdr(nconc a(list(apply'+ a))))))
    ((>=(car a)n)(and(> n 9)(=(car a)n)))))

테스트:

(loop for i from 10 to 1000
      if (k i)
      collect i)

=> (14 19 28 47 61 75 197 742)

답변

F #-184 자

나는 내 도전에 참여할 수 있으면 좋겠다.

let K n=
let rec l x=if n<10 then false else match Seq.sum x with|v when v=n->true|v when v<n->l(Seq.append(Seq.skip 1 x)[Seq.sum x])|_->false
string n|>Seq.map(fun c->int c-48)|>l

편집 작은 숫자와 관련된 버그를 수정했습니다.


답변

K, 55

{(x>9)&x=*|a:{(1_x),+/x}/[{~(x~*|y)|(+/y)>x}x;"I"$'$x]}

.

k)&{(x>9)&x=*|a:{(1_x),+/x}/[{~(x~*|y)|(+/y)>x}x;"I"$'$x]}'!100000
14 19 28 47 61 75 197 742 1104 1537 2208 2580 3684 4788 7385 7647 7909 31331 34285 34348 55604 62662 86935 93993