Tính n số Kaprekar


12

Một số Kaprekar là một số n chữ số k đó, khi là người đầu tiên n hoặc n-1 chữ số của k ^ 2 được bổ sung vào thứ hai n các chữ số của N ^ 2, kết quả là N.

Ví dụ:

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

Trình tự Kaprekar bắt đầu từ 1.

Viết chương trình tính toán và xuất ra n số Kaprekar đầu tiên , với n nằm trong phạm vi, nhưng không giới hạn trong phạm vi từ 1 đến 100. Mỗi số Kaprekar phải được phân tách bằng khoảng trắng và không có gì khác.

Có thể tìm thấy nhiều số Kaprekar hơn ở đây để kiểm tra chương trình của bạn, nhưng tài nguyên này KHÔNG THỂ được sử dụng theo bất kỳ cách nào để giúp tính toán - nói cách khác, không mã hóa cứng, đọc từ nguồn này hoặc sử dụng nó trong bất kỳ khai thác nào khác cách - tất cả các số phải được tạo bởi chương trình của bạn.

Mã ngắn nhất sẽ thắng.


@devnull Cái này có tốt hơn không? Điều đó có nghĩa là chương trình phải hỗ trợ ntối thiểu 100.

Định nghĩa của MathWorld mâu thuẫn với A006886 (MathWorld chỉ định rằng m là độ dài của số gốc, A006886 chỉ định rằng nó ít nhất là lớn như vậy). Định nghĩa của bạn trong đoạn đầu tiên hơi khác so với cả hai.
primo

@primo OK, tôi hiểu rồi. Sẽ sửa lại.

À, bạn nói đúng. Chúng là những tuyên bố tương đương. Một lưu ý nên được thực hiện rằng hai định nghĩa không giống nhau, mặc dù. 4879 là ví dụ truy cập đầu tiên (hình vuông được chia 3: 5, thay vì 4: 4).
primo

@primo Điều này có tốt hơn không? Vậy độ dài của số bình phương phải bằng hai lần chiều dài của số hoặc gấp đôi chiều dài của số cộng 1?

Câu trả lời:


5

Perl - 63 byte

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

Đếm shebang là một byte. Đầu vào được lấy từ stdin.

Điều này có thời gian chạy chấp nhận được cho n ≤ 50 , sau đó nó hơi chậm.

Sử dụng mẫu:

$ 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

Không có vấn đề về thời gian chạy. Đây chỉ là mã golf.

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--);}
  • với nlên đến 17 nó sẽ là ok để loại bỏ các long long,
  • Tham số printf bị lạm dụng :)
  • Tại sao không thể sử dụng câu lệnh trống trong toán tử ternary? cả hai 1đều ngớ ngẩn ...
  • Cảm ơn Josh vì 3 nhân vật ...

1
Nếu bạn chỉ quan tâm đến giá trị sai, bạn có thể sử dụng logic boolean thay vì câu lệnh ternary. Ví dụ , (i-i*i/x-i*i%x)||printf(...).
Josh

1
Bạn cũng có thể khởi tạo xiở phạm vi toàn cầu thay vì trong forvòng lặp để lưu một vài ký tự.
Josh

3

Toán học 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)   

Kiểm tra

g[14]

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


Đầu ra của bạn không đáp ứng các tiêu chí Mỗi số Kaprekar phải được phân tách bằng khoảng trắng và không có gì khác.
RononDex

RononDex. Tôi điều chỉnh đầu ra.
DavidC

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

Đầu ra:

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 

Đầu vào chỉ định số lượng giá trị cho đầu ra, và không phải giá trị tối đa.
primo

bỏ lỡ điều đó
Michael M.

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
Florent

Biên joué Florent :)
Michael M.

Tại sao bạn không lưu trữ các giá trị trong một mảng và chỉ cần tham gia chúng?
Ismael Miguel

3

trăn - 98

Tôi đã sử dụng một vài lát trăn đẹp để cạo một vài ký tự.

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

Công việc tốt. Tôi đã hết phiếu cho ngày hôm nay, nhưng tôi sẽ nâng cấp nó trong một giờ nữa.

3

C # - 255 Ký tự.

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 là số lượng số Kaprekar mà bạn muốn tìm mã. Điều này đã được thử nghiệm trong phạm vi từ 1 đến 100 nhưng sẽ hỗ trợ nhiều hơn thế này. 100 số mất hai và một phần tư giờ để trở về mặc dù 50 số đầu tiên chỉ mất khoảng 1 giây - mọi thứ chậm lại sau đó.

Đầu ra:

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

Đặt ra mã này là như sau;

        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--; 
            } 
        }

Tôi muốn biết nếu điều này có thể được rút ngắn hơn nữa.


3

C, 90 76 75 byte

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 (bao gồm cả dòng mới)

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

Đầu ra cho c = 10:

1 9 45 55 99 297 703 999 2223 2728

Đầu ra cho u = 20:

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

Rất tiếc! Đã sửa nó ngay. Hơi dài, nhưng đúng. Tôi phát hiện ra dấu chấm phẩy trong Python! Tiếng hoan hô!
KBKarma

2
Sau đó, điều này sẽ thổi vào tâm trí của bạn: dòng 7 có thể đi ở cuối dòng trước đó.
primo

... Oh. Ôi chết tiệt. Ồ tốt Vẫn còn khá tốt cho những thứ tôi đã gõ cùng nhau trong giờ nghỉ trưa, vì cho rằng kiến ​​thức về Python của tôi ít ỏi nhất.
KBKarma

2

R, 99 ký tự

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

Với imột nửa số chữ số củak^2 lên tròn, đánh giá của thời tiết k là một số Kaprekar được thực hiện ở đây bằng cách thêm các thương và phần còn lại của bộ phận nguyên k^2do 10^i(các thương là nửa trái của các chữ số được làm tròn xuống và Còn lại nửa bên phải làm tròn lên).


2

bash + sed, 75 ký tự

Bash thực hiện số học chỉ số nguyên và biểu diễn các số dưới dạng chuỗi thập phân; những thuộc tính này rất hữu ích cho việc chơi golf thử thách này. Các biến không được khai báo / không được gán được giả sử có giá trị 0 khi thực hiện số học.

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

Tôi cảm thấy khó chịu khi đặt nó 10#vào đó, nhưng một cái gì đó như thế này là cần thiết nếu nửa sau của phần tách bắt đầu bằng a 0. Khi làm số học, xử lý các số như bát phân, trừ khi cơ sở được nêu rõ ràng.

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

1

Python 3,3 - 117 ký tự

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

Mỗi cấp độ thụt lề và mỗi dòng mới ngoại trừ cấp độ cuối cùng, tất cả đều được tính cho 1 ký tự. Tôi nghĩ rằng đó là công bằng cho mã Python. Kịch bản lệnh người dùng sẽ nhập số lượng số Kaprekar để tính toán.


1

J - 64

Kinda xấu xí, nhưng vẫn còn. Nó kiểm tra tất cả các số lên tới một triệu sau đó lấy nchúng, vì vậy nó chỉ hoạt động với n <= 50.

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

n là nơi để đặt đầu vào


Trong thông số kỹ thuật, nó cho biết tính toán tới 100 trong số chúng. Có lẽ sẽ không thêm nhiều ký tự để thêm một biến khác chỉ để đếm số lượng số Kaprekar được tìm thấy.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.