คำนวณตัวเลข n Kaprekar


12

จำนวน Kaprekarเป็นจำนวน n หลักkว่าเมื่อแรกnหรือn-1หลัก k ^ 2 จะมีการเพิ่มที่สอง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

เขียนโปรแกรมที่คำนวณและส่งออกตัวเลขn Kaprekar แรกโดยมีnอยู่ในช่วง แต่ไม่ จำกัด เฉพาะช่วงที่ 1 ถึง 100 หมายเลข Kaprekar แต่ละหมายเลขต้องแยกด้วยช่องว่างและไม่มีอะไรอื่น

คุณสามารถดูหมายเลข Kaprekar เพิ่มเติมได้ที่นี่เพื่อตรวจสอบโปรแกรมของคุณ แต่ไม่สามารถใช้ทรัพยากรนี้ในทางใดก็ได้เพื่อช่วยในการคำนวณ - กล่าวอีกนัยหนึ่งคือไม่มีการเข้ารหัสที่ยากอ่านจากแหล่งนี้หรือใช้ประโยชน์อื่น ๆ วิธี - ตัวเลขทั้งหมดจะต้องสร้างโดยโปรแกรมของคุณ

รหัสที่สั้นที่สุดชนะ


@devnull นี้ดีกว่าไหม หมายความว่าโปรแกรมจะต้องรองรับnอย่างน้อย 100 ขึ้นไป

คำจำกัดความของ MathWorldขัดแย้งกับA006886 (MathWorld ระบุว่าmคือความยาวของหมายเลขเดิม A006886 ระบุว่ามันมีขนาดใหญ่อย่างน้อยนั้น) ความหมายของคุณในย่อหน้าแรกนั้นแตกต่างจากทั้งสองเล็กน้อย
primo

@primo ตกลงฉันเข้าใจแล้ว จะแก้ไข

อ่าคุณพูดถูก พวกเขาเป็นงบที่เทียบเท่า ควรทราบว่าคำจำกัดความทั้งสองนั้นไม่เหมือนกัน 4879เป็นตัวอย่างตัวนับแรก (ตารางแบ่งเป็น 3: 5 แทนที่จะเป็น 4: 4)
primo

@primo มันดีกว่าไหม? ความยาวของตัวเลขกำลังสองต้องเท่ากับสองเท่าของความยาวของตัวเลขหรือสองเท่าของความยาวของตัวเลขบวก 1?

คำตอบ:


5

Perl - 63 ไบต์

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

นับ Shebang เป็นหนึ่งไบต์ 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--);}
  • ที่มีnถึง 17 มันจะตกลงที่จะลบlong long,
  • พารามิเตอร์เกิน printf ถูกทารุณกรรม :)
  • เหตุใดจึงไม่สามารถใช้คำสั่งที่ว่างในตัวดำเนินการประกอบ ทั้งสอง1เป็นคนโง่ ...
  • ขอบคุณ Josh สำหรับ aditional 3 ตัวอักษร ...

1
หากคุณสนใจเฉพาะค่าเท็จคุณสามารถใช้ตรรกะบูลีนแทนคำสั่งแบบไตรภาค ตัวอย่าง(i-i*i/x-i*i%x)||printf(...).
Josh

1
คุณยังสามารถเริ่มต้นxและiที่ขอบเขตโกลบอลแทนที่จะforวนซ้ำเพื่อบันทึกตัวอักษรสองสามตัว
Josh

3

วิชาคณิตศาสตร์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

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

พลาดนั่นคงที่!
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

Bien joué Florent :)
Michael M.

ทำไมคุณไม่เก็บค่าไว้ในอาเรย์และเข้าร่วมกับมัน?
Ismael Miguel

3

หลาม - 98

ฉันใช้ตัวแบ่งหลามที่ดีในการโกนขนอักขระสองสามตัว

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

งานที่ดี. ฉันหมดคะแนนสำหรับวันนี้ แต่ฉันจะ upvote ในอีกหนึ่งชั่วโมง

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 แต่ควรรองรับมากกว่านี้ 100 ตัวเลขใช้เวลาสองชั่วโมงครึ่งในการกลับมาแม้ว่า 50 แรกจะใช้เวลาประมาณ 1 วินาที - สิ่งต่าง ๆ ชะลอตัวลงเรื่อย ๆ หลังจากนั้น

เอาท์พุท:

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

ฉันชอบที่จะรู้ว่านี้จะสั้นลงอีก



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

2
จากนั้นสิ่งนี้จะทำให้คุณตะลึง: บรรทัดที่ 7 สามารถไปที่จุดสิ้นสุดของบรรทัดก่อนหน้า
primo

... โอ้ อ่า โอ้ดี ยังคงค่อนข้างดีสำหรับบางสิ่งที่ฉันเคาะด้วยกันในช่วงพักเที่ยงการพิจารณาว่าความรู้ของฉันเกี่ยวกับ Python นั้นน้อยมาก
KBKarma

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ปัดเศษการประเมิน wether k คือจำนวน Kaprekar จะดำเนินการที่นี่โดยการเพิ่มความฉลาดทางและส่วนที่เหลือของการหารจำนวนเต็มk^2โดย10^i(ความฉลาดทางเป็นครึ่งซ้ายของตัวเลขที่ถูกปัดเศษลงและ เหลือครึ่งขวาให้ปัดขึ้น)


2

bash + sed, 75 ตัวอักษร

Bash ทำการคำนวณเลขจำนวนเต็มอย่างเดียวและแสดงตัวเลขเป็นสตริงทศนิยม คุณลักษณะเหล่านี้มีประโยชน์สำหรับการตีกอล์ฟความท้าทายนี้ นอกจากนี้ตัวแปรที่ไม่ได้ประกาศ / ไม่ได้กำหนดจะถือว่ามีค่าเป็น 0 เมื่อดำเนินการทางคณิตศาสตร์

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

มันเป็นอันมากผมที่จะใส่10#ในมี 0แต่บางอย่างเช่นนี้เป็นสิ่งจำเป็นหากในช่วงครึ่งหลังของการแยกเริ่มต้นด้วย เมื่อทำการคำนวณเลขคณิตจะใช้ตัวเลขดังกล่าวเป็นเลขฐานแปดยกเว้นว่ามีการระบุฐานไว้อย่างชัดเจน

$ ./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

ค่อนข้างน่าเกลียด แต่ก็ยัง มันตรวจสอบตัวเลขทั้งหมดได้มากถึงหนึ่งล้านnครั้งดังนั้นจึงใช้งานได้กับ n <= 50 เท่านั้น

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

n เป็นสถานที่ที่จะนำเข้า


ในสเป็คมันบอกว่าจะคำนวณได้ถึง 100 ของพวกเขา มันอาจจะไม่เพิ่มตัวละครจำนวนมากที่จะเพิ่มตัวแปรอื่นเพียงอย่างเดียวสำหรับการนับจำนวน Kaprekar ตัวเลขที่พบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.