キース番号の場合、与えられた番号をテストします


14

フィボナッチ数とシーケンスは、コードゴルフの人気のあるテーマのように思えるので、キースの数でコードゴルフをするのは楽しいチャレンジになると思いました。

そこで、整数を取り、キース数であるかどうかに応じてtrueまたはfalseを返す関数を作成するという課題を提案します。

キース番号の詳細

レクリエーション数学では、キース数またはレフィギット数(フィボナッチのような数字の繰り返しの略)は、次の整数シーケンスの数です:14、19、28、47、61、75、197、742、1104、1537、2208、 2580、…

Numberphileには、キース数の計算方法を説明したビデオがあります。ただし、基本的には数字の数字を使用します。それらを一緒に追加してから、元の番号の最後の桁を取得し、計算の合計に追加して、すすぎ、繰り返します。そして、それを明確にするための例。

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

入力

整数。

出力

番号がキース番号の場合は真。そうでない場合はfalse。


厳密に言えば、「整数」にはゼロまたは負の数を含めることができます。どちらもキース・ナンバーになれないと確信しています。これを説明する必要がありますか?
イッツィー

ソリューションによっては、1桁の数字がtrueと表示される場合があります。したがって、入力の潜在的なエラーを確認する必要があります。
スメタッドアナキスト

それは、出力に持っていますtrue/ falseまたはそれは何もすることができますtruthy / falsey
チョイス

回答:


7

GolfScript(31 25文字)

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

スタックの先頭に整数として入力します。出力は0(偽)または1(真)です。キースの番号を100までリストするオンラインデモ


ニースのアイデア0>。残念ながら、1回しか+1できません。
ハワード

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整数を呼び出して、数字を区切ることができればいいのですが。

False10以下のすべての入力で返されます。返された場合、8文字短くすることができますTrue


n[0]代わりにと比較する場合、2つの文字を保存できますn[-1]
ハワード

でさらに5つ保存しますprint 9<a==n[0]
解像度

n=n[1:]+[sum(n)]になることができますn=n[1:]+sum(n),
チョイス

6

GolfScript、32 29文字

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

オンラインでテストできるGolfScript実装。入力はスタックの一番上の要素として与えられ、それぞれ0(つまりfalse)または1を返します。


そしてそれが動作... -私がいることを正確にやったところ提供されたリンクで@PeterTaylorルック
ハワード

@PeterTaylorあなたのソリューションを見ると、私のアプローチでさらに文字数を減らすことができました。
ハワード

私のコメントは、バージョン1にも適用可能であるため、私は、リフレッシュされていない必要があります
ピーター・テイラー

4

APL、36 34 39 36 33 29 27

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

1キースの場合は出力、0それ以外の場合は出力

GolfScriptが再びストライク!!


編集

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

⊢/Takeマイナス1 ()の代わりにRight-reduction()を使用して¯1↑、1文字を直接保存し、Disclose()から1を間接的に保存します

説明

⍎¨⍕x←⎕評価された入力(数値として扱われる)を受け取り、に割り当てxます。これを文字配列(他の言語では「文字列」)に変換し、各文字(数字)をループして、数値に変換します。したがって、これは数字の数値配列になります。

{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}は、メインの「ループ」関数です。配列から
+/⍵↑⍨-⍴⍕x最後の⍴⍕x(の桁x数)の数値を取得し、それらを合計します。
⍵,配列の末尾に連結します。
(x>⊢/⍵)配列の最後の数値(+/⍵↑⍨-⍴⍕xまだ連結されていない)がより小さいかどうかを確認し、新しい配列でこの関数を何度もx返す10
∇⍣実行します。したがって、最後の数値がより小さい場合x、この関数は繰り返します。それ以外の場合は、単に新しい配列を返します

関数の実行後、配列には2つの数値が等しいかそれ以上になるまでの合計が含まれますx(たとえば、14generate 1 4 5 9 14 2313willが生成されます1 3 4 7 11 18 29
最後に、各数値が等しいかどうかを確認しx、結果のバイナリの合計を出力しますアレイ。


編集

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

0入力が1桁の場合に出力するために2文字を追加しました:-(


さらに別の編集

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

説明

関数は1↓、最後の⍴⍕x↑⍨-⍴⍕x)を取る代わりに、配列から最初の番号()をドロップするようになりました。
ただし、このアプローチでは、1=1桁の数字を処理するには不十分です。そのためx、等しいことをチェックする前に配列から最後の数字を削除し、1文字を追加します


ご想像のとおり:編集

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

x古い最後のアイテムの代わりに新しく追加されたアイテムと比較するため、等しいことを確認する前に最初の(最後ではなく)アイテムをドロップするだけxで十分で、マイナス記号が保存されます。Power operator()の別の形式を使用して、別の3を保存します

25文字のgs回答が表示されます(Orz)


最終編集

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

私がそれを見逃したとは信じられない。
もうゴルフはできません。


1
これは24文字まで取得できますx∊{1↓⍵,+/⍵}⍣{x≤⊃⍺}⍎¨⍕x←⎕。べき乗関数では、「後」の値です。
マリヌス

2

Common Lisp、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を返しますが、これはfalseであると思います。
ハワード

あなたが正しいです。私はそれを調べる必要があります。
スメタッドアナキスト

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の数字を配列に分割し、$ jに格納します。

不要であることを指摘してくれたRynantに感謝し-ne''ます。

While($x-lt$i) 合計変数$ xが$ iに達するかそれを超えるまで、次のFibonnaciのようなループを実行するように設定します。

$x=0 $ xをゼロにするので、加算に使用する準備ができています(ループが戻ったときに必要です)。

$j|%{$x+=$_} ForEach-Objectループを使用して、$ jの値を$ xに加算します。

$null,$j=$j+$x $ jの値を左にシフトし、最初の値を破棄し、$ xを追加します。

わーい!最後に、シフトアンドアペンドを行うためのより短い方法を見つけ出し、このスクリプトを100未満にした!

$x-eq$i whileループが完了した後、合計値$ xが初期値$ iと等しいかどうかをテストします-通常はキース番号を示します。

-and$x-gt9 1桁の数字、ゼロ、および負の数字は無効になりますが、キースの数字にすることはできません。

このスクリプトは少し「乱雑」です。残りの$ iと$ jを適切に処理できますが、実行の間に$ xをクリアする必要があります。

このスクリプトの以前のバージョンで使用されていた数字を数字に分割するいくつかの方法について、Keith Hillmjolinorに感謝します。最終版ではありませんが、すばらしい学習体験を提供しました。


あなたは-ne''それがちょうどであるように削除することができ?{$_}ます。
リナント

ありがとう@Rynant。に置き換えること$i=read-host;$j=$i-split''|?{$_}'でもう1つ削除することもできます$j=($i=read-host)-split''|?{$_}
イスジ

0

ルビー、82

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

Pythonはこれに適したツールであると思われます。


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

2つの文字に置き換え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;保存できます。
シュナダー

0

R、116

Pythonの詐欺:

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

Perl、90

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

楽しいエクササイズ!古い投稿であることは知っていますが、perlが見つからないことに気付きました!

他の応答をより徹底的に消化することでこれを構築する方法を改善できると確信しているので、おそらくこれを再訪するでしょう!


0

Smalltalk-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

Java-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 14年

0

Python3 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

Python-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 2番目の@ beary605-組み込みを追加して、数字/文字/その他を分離します。


0

Ruby(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.