Keith 번호 인 경우 주어진 숫자인지 테스트


14

피보나치 숫자와 시퀀스는 코드 골프의 인기있는 주제처럼 보이기 때문에 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 숫자이면 참입니다. 그렇지 않으면 거짓 ..


엄밀히 말하면, "정수"는 0 또는 음수를 포함 할 수 있습니다. 나는 Keith Number가 될 수 없다고 확신한다. 이것을 설명해야합니까?
Iszi

솔루션에 따라 한 자리 숫자가 true로 표시 될 수 있습니다. 따라서 입력 오류 가능성을 확인해야합니다.
Smetad Anarkist

그것은 출력이 있나요 true/ false또는 아무것도 할 수있다 truthy / falsey ?
Cyoce

답변:


7

GolfScript ( 31 25 자)

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

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


와 좋은 아이디어 0>. 불행히도 한 번만 +1 할 수 있습니다.
Howard

7

파이썬 ( 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.


n[0]대신에 비교하면 두 문자를 저장할 수 있습니다 n[-1].
Howard

로 5 개 더 절약하십시오 print 9<a==n[0].
res

n=n[1:]+[sum(n)]될 수 있습니다n=n[1:]+sum(n),
Cyoce

6

GolfScript, 32 29 자

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

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


@PeterTaylor 내가 정확히 한 곳에서 제공 한 링크를보십시오. 작동합니다.
Howard

@PeterTaylor 솔루션을 살펴보면 접근 방식에서 문자 수를 더 줄일 수 있습니다.
Howard

내 의견이 버전 1에 적용되기 때문에 새로 고침하지 않았어야합니다.
Peter Taylor

4

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←⎕

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


1
이 문자를 24 자로 줄일 수 있습니다 x∊{1↓⍵,+/⍵}⍣{x≤⊃⍺}⍎¨⍕x←⎕. 전력 함수 에서 "후"값입니다.
marinus

2

커먼 리스프, 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)

1

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

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


:)
beary605

귀하의 솔루션은 n <10에 대해 true를 반환합니다.
Howard

네 말이 맞아 나는 그것을 조사해야한다.
Smetad Anarkist

1

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

1

PowerShell을 : 120 128 123 111 110 97

$j=($i=read-host)-split''|?{$_};While($x-lt$i){$x=0;$j|%{$x+=$_};$null,$j=$j+$x}$x-eq$i-and$x-gt9

$i=read-host 사용자로부터 입력을 받아 $ i에 저장합니다.

$j=(... )-split''|?{$_}i를 $ i에서 배열로 나누고 $ j에 저장합니다.

불필요하다고 지적한 Rynant 에게 감사드립니다 -ne''.

While($x-lt$i) 합계 변수 $ x가 $ i에 도달하거나 초과 할 때까지 다음 Fibonnaci 유사 루프가 실행되도록 설정합니다.

$x=0 $ x를 0으로하므로 합산에 사용할 준비가되었습니다 (루프가 돌아올 때 필요함).

$j|%{$x+=$_} ForEach-Object 루프를 사용하여 $ j에서 $ x로 값을 더합니다.

$null,$j=$j+$x $ j의 값을 왼쪽으로 이동하고 $ x를 추가하는 동안 첫 번째를 버립니다.

예이! 마지막으로 shift-and-add를 수행하는 더 짧은 방법을 찾아서이 스크립트를 100 미만으로 받았습니다!

$x-eq$i while 루프가 완료된 후 합계 값 $ x가 초기 값 $ i와 같은지 테스트합니다. 일반적으로 Keith Number를 나타냅니다.

-and$x-gt9 Keith 숫자가 될 수없는 한 자리 숫자, 0 및 음수를 무효화합니다.

이 스크립트는 약간 "지저분하다". 남은 $ i와 $ j를 정상적으로 처리 할 수 ​​있지만 실행 사이에 $ x를 지워야합니다.

이 스크립트의 이전 버전에서 사용되었던 숫자를 숫자로 나누는 몇 가지 방법에 대해 Keith Hillmjolinor 에게 감사합니다 . 그들은 최종 버전이 아니지만 훌륭한 학습 경험을 제공했습니다.


-ne''그냥 제거 할 수 있습니다 ?{$_}.
Rynant

@Rynant에게 감사드립니다. 로 교체 $i=read-host;$j=$i-split''|?{$_}'하여 한 번 더 정리할 수 있는 것 같습니다 $j=($i=read-host)-split''|?{$_}.
Iszi

0

루비, 82

def keith?(x)
  l="#{x}".chars.map &:to_i
  0while(l<<(s=l.inject :+)).shift&&s<x
  (s==x)&l[1]
end

의심스러운 파이썬은 이것에 대한 더 나은 도구입니다.


0

C, 123

k(v){
    int g[9],i,n,s,t=v;
    for(n=s=0;t;t/=10)s+=g[n++]=t%10;
    for(i=n;s<v;){
        i=(i+n-1)%n;
        t=g[i];g[i]=s;s=s*2-t;
    }
    return n>1&&s==v;
}

하네스를 통한 테스트 :

main(i){
    for(i=0;i<20000;i++)
        if(k(i)) printf("%d ",i);
}

제공합니다 :

14 19 28 47 61 75 197 742 1104 1537 2208 2580 3684 4788 7385 7647 7909

당신은 대체 할 수 i=(i+n-1)%n;t=g[i];g[i]=s;s=s*2-t;와 함께 i+=n-1;t=g[i%n];g[i%n]=s;s+=s-t;두 개의 문자 저장합니다.
schnaader

0

R, 116

파이썬 립 오프 :

a=scan();n=as.numeric(strsplit(as.character(a),"")[[1]]);while(a>n[1])n=c(n[-1],sum(n));if((n[1]==a)&&(a>9))T else F

0

펄, 90

sub k{$-=shift;$==@$=split//,$-;push@$,eval join'+',@$[-$=..-1]while@$[-1]<$-;grep/$-/,@$}

재미있는 운동! 나는 그것이 오래된 게시물이라는 것을 알고 있지만 펄이 빠져 있음을 알았습니다!

다른 응답을 더 철저하게 소화하지 못하도록 빌드 방식을 개선 할 수 있으므로 다시 방문 할 것입니다.


0

스몰 토크-136 자

 [:n|s:=n asString collect:[:c|c digitValue]as:OrderedCollection.w:=s size.[n>s last]whileTrue:[s add:(s last:w)sum].^(s last=n and:n>9)]

이 블록 보내기 value:


0

자바-1437

import java.io.*;
class keith
{
    public int reverse(int n)
    {
        int i,c=0;
        while(n>0)
        {
            c=(c*10)+(n%10);
            n/=10;
        }
        return(c);
    }
    public int countdigit(int n)
    {
        int i,c=0;
        while(n>0)
        {
            c++;
            n/=10;
        }
        return(c);
    }
    public void keith_chk()throws IOException
    {
        BufferedReader br=new BufferedReader(
        new InputStreamReader(System.in));
        int n,digi,r,p=0,a,tot=0,i;
        System.out.print("Enter number :-");
        n=Integer.parseInt(br.readLine());
        digi=countdigit(n);

        int ar[]=new int[digi+1];
        r=reverse(n);
        while(r>0)
        {
            a=r%10;
            ar[p++]=a;
            tot=tot+a;
            r/=10;
        }
        ar[p]=tot;
        while(true)
        {
            for(i=0;i<=p;i++)
            System.out.print(ar[i]+"\t");
            System.out.println(); 
            if(tot == n)
            {
                System.out.print("Keith Number....");
                break;
            }
            else if(tot > n)
            {
                System.out.print("Not Keith Number.....");
                break;
            }
            tot=0;
            for(i=1;i<=p;i++)
            {
                ar[i-1]=ar[i];
                tot=tot+ar[i];
            }
            ar[p]=tot;
        }
    }
}

3
CodeGolf.SE에 오신 것을 환영합니다! 이 질문은 code-golf 이므로 코드골프화 해야합니다 (공백 제거, 줄 바꿈 ...)
Vereos

0

파이썬 3 104

#BEGIN_CODE
def k(z):
 c=str(z);a=list(map(int,c));b=sum(a)
 while b<z:a=a[1:]+[b];b=sum(a)
 return(b==z)&(len(c)>1)
#END_CODE score: 104

print([i for i in filter(k, range(1,101))])  #[14, 19, 28, 47, 61, 75]

그리고 그것은 기능입니다;)


0

파이썬-116 자

실제로 codegolf의 전문가는 아니므로 첫 번째 시도가 있습니다.

x=input();n=`x`;d=[int(i)for i in n];f=d[-1]
while f<x:d+=[sum(d[-len(n):])];f=d[-1]
if f==x>13:print 1
else:print 0

함수를 2 번 변경하십시오.

  • 변경 printreturn
  • x매개 변수로 지정

PS I second @ beary605- 숫자 / 문자 / 무엇을 구분하기 위해 내장 기능을 추가하십시오.


0

루비 (OOP 포함)

class Recreationalmathematics
def Check_KeithSequence(digit) 
    sequence,sum=digit.to_s.split(//).to_a,0
    while(sum<digit) do
        sum=0
        sequence.last(digit.to_s.size).each{|v|  sum=sum+v.to_i}
        sequence<<sum
    end 
    return (sum==digit)?"true":"false" 
end
end
test = Recreationalmathematics.new
puts test.Check_KeithSequence(197)
puts test.Check_KeithSequence(198)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.