nカプレカル数を計算する


12

A カプレカ数は、 N桁の番号であり、Kは、そのときに最初のnまたはn-1の 2秒に追加される^ kの桁N N ^ 2の桁、結果はNです。

例:

9^2 = 81.  8+1 = 9.
45^2 = 2025.  20+25 = 45.
297^2 = 88,209. 88+209 = 297

Kaprekarシーケンスは1から始まります。

計算とすることは、第1出力するプログラムを書くNカプレカ数でnは空白と何もして分離しなければならない範囲であるが、範囲には限定されない、1〜100の各カプレカ数のを。

プログラムをチェックするために、より多くのKaprekar番号をここで見つけることができますが、このリソースは計算を支援するために使用することはできません。方法-すべての数値はプログラムで生成する必要があります。

最短のコードが優先されます。


@devnullこれは良いですか?これは、プログラムがn少なくとも100までサポートする必要があることを意味します。

MathWorldの定義は、A006886と矛盾します(MathWorldは、mが元の数値の長さであることを指定し、A006886は、少なくともその大きさであることを指定します)。最初の段落の定義は、両方ともわずかに異なります。
— プリモ14

@primo OK、今すぐ入手できます。修正します。

ああ、あなたは正しい。それらは同等のステートメントです。ただし、2つの定義は同一ではないことに注意してください。4879は最初のカウンターの例です(正方形は4:4ではなく3:5に分割されます)。
— primo 14

@primoこれは良いですか?それで、二乗された数の長さは、数の長さの2倍、または数に1を加えた長さの2倍に等しくなければなりませんか?

回答:


5

Perl-63バイト

#!perl -l
map{1while$l=length++$_,$_**2=~/.{$l}$/,$`+$&^$_;print}($_)x<>

シバングを1バイトとしてカウントします。入力はから取得されstdinます。

これはのために許容されるランタイム有するN≤50を、それが遅いビットを取得した後、。

サンプル使用法:

$ echo 20 | perl kaprekar.pl
1
9
45
55
99
297
703
999
2223
2728
4950
5050
7272
7777
9999
17344
22222
77778
82656
95121

ランタイムについては問題ありません。これは単なるコードゴルフです。

4

C、109 106

long long i=1;x=10,n;main(){scanf("%d",&n);for(;n;x*=x<=++i?10:1)(i-i*i/x-i*i%x)||printf("%lld ",i,n--);}
  • でn17まで、それは削除しても大丈夫だろうlong long、
  • 超過するprintfパラメーターは悪用されます:)
  • なぜ三項演算子で空のステートメントを使用できないのですか?二人1は愚かな...
  • 追加の3文字についてはJoshに感謝します...

1
偽の値だけを気にする場合は、三項ステートメントの代わりにブール論理を使用できます。例、(i-i*i/x-i*i%x)||printf(...)。
— ジョシュ

1
また、初期化することができますxし、iグローバルスコープではなく、中にforループカップルの文字を保存します。
— ジョシュ

3

Mathematicaの144 154

k@m_:=((x=m^2)-(w=FromDigits[Take[IntegerDigits@x,y=-IntegerLength@m]]))*10^y+w==m;
g@n_:=(s={};i=0;While[Length@s<n,If[k@i,s=Append[s,i]];i++];s)   

テスト

g[14]

0
1
9
45
55
99
297
703
999
2223
2728
4950
5050
7272


出力が基準を満たしていません各Kaprekar番号は、空白のみで区切る必要があります。
— RononDex

RononDex。出力を調整しました。
— DavidC 14

3

Javascript 96

for(i=0,n=prompt(s='');n;i++){t=''+i*i;if(t.substr(0,l=t.length/2)==i-t.substr(‌​l))n--,s+=i+' '}s

出力:

0 1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 82656 95121 99999 142857 148149 181819 187110 208495 318682 329967 351352 356643 390313 461539 466830 499500 500500 533170 538461 609687 643357 648648 670033 681318 791505 812890 818181 851851 857143 961038 994708 999999 

入力は、最大値ではなく、出力する値の数を指定します。
— primo 14

それを逃した、修正!
— マイケルM. 14

1
96:for(i=0,n=prompt(s='');n;i++){t=''+i*i;if(t.substr(0,l=t.length/2)==i-t.substr(l))n--,s+=i+' '}s
— フロレント14

ビエンジュエフロレント:)
— マイケルM. 14

配列に値を保存して、単純に結合してみませんか?
— イスマエルミゲル14

3

python-98

いくつかの素敵なpythonスライスを使用して、いくつかの文字を削除しました。

i=n=0
while n<20:
 i+=1;s=str(i**2);l=-len(str(i))
 if int("0"+s[:l])+int(s[l:])==i:print(i);n+=1

良くやった。今日の投票は尽きましたが、1時間後に投票します。

3

C#-255文字。

int x=100;decimal k=0;while(x>0){k++;decimal d=k*k;string s=d.ToString("n").Replace(",","").Split('.')[0];int g=k.ToString().Length;int h=s.Length;if(k==d||(h!=g&&long.Parse(s.Substring(h-g))+long.Parse(s.Substring(0,h-g))==k)){Console.Write(k+" ");x--;}}

xは、コードで検索するKaprekar番号の数です。これは1〜100の範囲でテストされていますが、これよりもはるかに多くをサポートするはずです。最初の50個は約1秒しかかかりませんでしたが、100個の数字が戻るのに2時間15分かかりました。

出力:

1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 
82656 95121 99999 142857 148149 181819 187110 208495 318682 329967 351352 356643 
390313 461539 466830 499500 500500 533170 538461 609687 643357 648648 670033 
681318 791505 812890 818181 851851 857143 961038 994708 999999 4444444 4927941 
5072059 5555556 9372385 9999999 11111112 13641364 16590564 19273023 19773073 
24752475 25252525 30884184 36363636 38883889 44363341 44525548 49995000 50005000 
55474452 55636659 61116111 63636364 69115816 74747475 75247525 80226927 80726977 
83409436 86358636 88888888 91838088 94520547 99999999 234567901 332999667 
432432432 567567568 667000333 765432099 999999999 1111111111 1776299581 2020202020 
3846956652 3888938889 4090859091 4132841328 4756047561

このコードのレイアウトは次のとおりです。

        int x = 100;
        decimal k = 0; 
        while (x > 0) 
        {
            k++;
            decimal d = k * k;
            string s = d.ToString("n").Replace(",", "").Split('.')[0];
            int g = k.ToString().Length; 
            int h = s.Length; 

            if (k == d || (h != g && long.Parse(s.Substring(h - g)) + long.Parse(s.Substring(0, h - g)) == k) )
            { 
                Console.Write(k + " "); x--; 
            } 
        }

これをさらに短縮できるかどうかを知りたいです。


3

C、90 76 75バイト

long long d,r=1;k(n){for(;++d/r?r*=10:--n;d-d*d/r-d*d%r||printf("%d ",d));}

2

Python 2.7、144(改行を含む)

def c(c):
 l="1";i=2;u=1
 while u<c:
  r=str(i**2);w=len(r)
  if w>1:
   if i==int(r[:w/2])+int(r[w/2:]):
    l+=" "+str(i);u+=1
  i+=1
 print l

c = 10の出力:

1 9 45 55 99 297 703 999 2223 2728

u = 20の出力:

1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 82656 95121

おっと!今それを修正しました。少し長いですが、正しいです。Pythonでセミコロンを発見しました!ハラー!
— KBKarma 14

2
次に、これはあなたの心を吹き飛ばします:7行目は前の行の終わりに行くことができます。
— primo 14

... ああ。あー しかたがない。Pythonの知識がせいぜい貧弱であることを考えると、昼休みに一緒にノックしたものにはまだかなり良い。
— KBKarma 14

2

R、99文字

k=n=0;N=scan();while(n<N){k=k+1;j=k^2;i=10^ceiling(nchar(j)/2);if(k==j%/%i+j%%i){cat(k," ");n=n+1}}

i桁数の半分であるk^2丸みを帯びたアップ、天気をkの評価がカプレカ数は、商の整数除算の余り加算することにより、ここで行われているk^2ことによっての10^i(数字の左半分である商は切り捨てと残りの半分は切り上げられます)。


2

bash + sed、75文字

Bashは整数のみの算術演算を行い、数値を10進数文字列として表します。これらの属性は、この挑戦​​をゴルフするのに役立ちます。また、未宣言/未割り当ての変数は、算術を行うときに値が0であると想定されます。

for((;s=++i*i,l=${#s}/2,1;));{
((${s:0:l}+10#${s:l}-i))||echo $i
}|sed $1q

10#そこに入れるのは気になりませんでしたが、分割の後半がで始まる場合、このようなものが必要です0。算術を行うとき、は、基数が明示的に指定されていない限り、そのような数値を8進数として扱います。

$ ./kaprekar.sh 10
1
9
45
55
99
297
703
999
2223
2728
$ 

1

Python 3.3-117文字

n=int(input())
p=1
while n>0:
    v=str(p**2)
    l=len(v)
    if p==int(v[l//2:])+int('0'+v[:l//2]):
        print(p)
        n-=1
    p+=1

各レベルのインデント、および最後の改行を除く各改行は、すべて1文字としてカウントされます。Pythonコードにとっては公平だと思います。スクリプトは、ユーザーが計算するKaprekar数の数を入力することを想定しています。


1

J-64

ちょっといですが、それでも。最大100万のすべての数値をチェックしてから取得するnため、n <= 50でのみ機能します。

n{.}.I.(]=+/&;&:(10&#.&.>)&(<.@-:@#({.;}.)])&(10&#.inv@*:))i.1e6

n 入力を置く場所です


仕様書では、最大100個まで計算すると述べています。おそらく、多くの文字を追加して、見つかったKaprekarの数を数えるためだけに別の変数を追加することはないでしょう。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.