एन कपरेकर नंबरों की गणना करें


12

एक Kaprekar संख्या एक n अंकों की संख्या है कश्मीर है कि, जब पहले n या n-1 कश्मीर के अंकों ^ 2 दूसरे से जुड़ जाते हैं n एन ^ 2 के अंक, परिणाम एन है

उदाहरण:

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

कपरेकर क्रम 1 से शुरू होता है।

एक प्रोग्राम लिखें, जो पहले n कपरेकर नंबरों की गणना और आउटपुट करता है , जिसमें n रेंज में है, लेकिन 1 से 100 तक सीमित नहीं है। प्रत्येक कपरेकर नंबर को व्हाट्सएप से अलग किया जाना चाहिए और कुछ नहीं।

आपके कार्यक्रम की जाँच करने के लिए अधिक कप्रेकर संख्याएँ यहाँ पाई जा सकती हैं , लेकिन इस संसाधन को किसी भी तरह से गणना में मदद करने के लिए उपयोग नहीं किया जाएगा - दूसरे शब्दों में, कोई हार्ड-कोडिंग नहीं, इस स्रोत से पढ़ना, या किसी अन्य शोषक में इसका उपयोग करना। तरीका - सभी नंबरों को आपके प्रोग्राम द्वारा उत्पन्न किया जाना चाहिए।

सबसे छोटा कोड जीतता है।


@ देवनुल क्या यह बेहतर है? इसका मतलब है कि इस कार्यक्रम को nकम से कम 100 तक समर्थन करना चाहिए।

MathWorld की परिभाषा A006886 के साथ संघर्ष करती है ( MathWorld यह निर्दिष्ट करता है कि m मूल संख्या की लंबाई है, A006886 निर्दिष्ट करता है कि यह कम से कम इतना बड़ा है)। पहले पैराग्राफ में आपकी परिभाषा दोनों की तुलना में थोड़ी अलग है।
प्रिमो

@primo ठीक है, मैं इसे अभी प्राप्त करता हूं। का संशोधन करेंगे।

आह, तुम सही हो। वे समकक्ष कथन हैं। एक नोट किया जाना चाहिए कि दो परिभाषाएं समान नहीं हैं, हालांकि। 4879 पहला काउंटर उदाहरण है (वर्ग 3: 5 विभाजित है, बजाय 4: 4)।
प्रिमो

@primo क्या यह बेहतर है? तो संख्या वर्ग की लंबाई संख्या की दोगुनी या संख्या की संख्या से दो गुना अधिक होनी चाहिए?

जवाबों:


5

पर्ल - 63 बाइट्स

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

एक बाइट के रूप में शेबंग की गिनती। इनपुट से लिया जाता है 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

सी, 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,
  • अधिक प्रिंट करने वाले पैरामीटर का दुरुपयोग किया जाता है :)
  • टर्नरी ऑपरेटर में खाली विवरण का उपयोग करना क्यों संभव नहीं है? दो 1मूर्ख हैं ...
  • 3 पात्रों के लिए जोश के लिए धन्यवाद ...

1
यदि आप केवल झूठे मूल्य की परवाह करते हैं, तो आप टर्नरी कथन के बजाय बूलियन तर्क का उपयोग कर सकते हैं। उदाहरण के लिए, (i-i*i/x-i*i%x)||printf(...)
जोश

1
आप एक जोड़े को बचाने के लिए लूप के बजाय वैश्विक दायरे में xऔर इनिशियलाइज़ कर सकते हैं । ifor
जोश

3

गणितज्ञ १४४ १५४

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


आपका आउटपुट मानदंडों को पूरा नहीं करता है प्रत्येक कापरेकर नंबर को व्हाट्सएप से अलग किया जाना चाहिए और कुछ नहीं।
RononDex

RononDex। मैंने आउटपुट समायोजित किया।
डेविड एफएक्स

3

जावास्क्रिप्ट 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 

इनपुट आउटपुट के लिए मानों की संख्या निर्दिष्ट करता है, न कि अधिकतम मूल्य।
प्राइमो

चूक गए, निश्चित!
माइकल एम।

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
फ्लोरेंट

बिएन जौ फ्लोरेंट :)
माइकल एम।

आप किसी सरणी में मानों को संग्रहीत क्यों नहीं करते हैं और बस उन्हें शामिल करते हैं?
इस्माईल मिगुएल

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

अच्छी नौकरी। मैं आज के लिए वोटों से भाग गया, लेकिन मैं इसे एक घंटे में बढ़ा दूंगा।

3

सी # - 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 कपरेकर संख्याओं की संख्या है जिसे आप कोड ढूंढना चाहते हैं। यह 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--; 
            } 
        }

मुझे यह जानकर अच्छा लगेगा कि क्या इसे और छोटा किया जा सकता है।


3

सी, 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

अजगर २. 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

यू = 20 के लिए आउटपुट:

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

ओह! अभी तय किया है। थोड़ा लंबा है, लेकिन सही है। मैंने पायथन में अर्धविराम की खोज की! हुर्रे!
KBKarma

2
फिर यह आपके दिमाग को उड़ा देगा: लाइन 7 पिछली पंक्ति के अंत में जा सकती है।
प्राइमो

... ओह। आह धिक्कार है। ओह अच्छा। फिर भी मेरे लंच ब्रेक के दौरान मैंने एक साथ कुछ खटखटाया, यह देखते हुए कि पायथन का मेरा ज्ञान सबसे कम है।
केबीकर्मा

2

आर, 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 का मूल्यांकन एक कापरेकर संख्या है, जो यहाँ के भागफल और शेष पूर्णांक विभाजन को जोड़कर किया जाता k^2है 10^i(भागफल को अंकों के बाएँ आधे भाग को छोड़ दिया जाता है और शेष आधा गोलाकार शेष)।


2

बैश + सेड, 75 अक्षर

बैश पूर्णांक-केवल अंकगणित करता है और दशमलव तार के रूप में संख्याओं का प्रतिनिधित्व करता है; ये विशेषताएँ इस चुनौती को पूरा करने में सहायक हैं। यह भी कि अघोषित / अघोषित चर को अंकगणित करते समय 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

पायथन 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 वर्ण के लिए गिना जाता है। मुझे लगता है कि पायथन कोड के लिए यह उचित है। स्क्रिप्ट को उम्मीद है कि उपयोगकर्ता गणना करने के लिए कपरेकर संख्याओं का इनपुट करेगा।


1

जे - 64

Kinda बदसूरत, लेकिन अभी भी। यह एक लाख तक की सभी संख्याओं की जांच करता nहै, फिर उनमें से लेता है, इसलिए यह केवल n <= 50 के लिए काम करता है।

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

n इनपुट डालने के लिए कहाँ है


कल्पना में, यह उनमें से 100 तक की गणना करने के लिए कहा। यह संभवत: नहीं पाया जाएगा कि कई पात्रों को एक और चर जोड़ने के लिए केवल कपरेकर की संख्या की गणना के लिए मिला।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.