N Kaprekar Sayılarını Hesapla


12

Bir Kaprekar numarası bir n-haneli bir sayıdır k , bu birinci , n ya da n-1 , 2 saniye eklenir ^ k basamak N , N ^ 2 basamak, sonuç N.

Örnekler:

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

Kaprekar dizisi 1'den başlar.

İlk n Kaprekar sayısını hesaplayan ve çıktısı veren , n aralıkta, ancak aralık ile sınırlı olmayan, 1 ile 100 arasında bir program yazın. Her Kaprekar numarası boşlukla ve başka bir şeyle ayrılmamalıdır.

Programınızı kontrol etmek için burada daha fazla Kaprekar numarası bulunabilir , ancak bu kaynak hesaplamada herhangi bir şekilde KULLANILAMAZ - başka bir deyişle, sabit kodlama, bu kaynaktan okuma veya başka herhangi bir patlayıcıda kullanma yol - tüm sayılar programınız tarafından oluşturulmalıdır.

En kısa kod kazanır.


@devnull Bu daha iyi mi? Bu, programın nen az 100'e kadar desteklemesi gerektiği anlamına gelir.

MathWorld'ün tanımı A006886 ile çakışıyor (MathWorld, m'nin orijinal sayının uzunluğu olduğunu belirtir, A006886, en azından bu kadar büyük olduğunu belirtir). İlk paragraftaki tanımınız her ikisinden de biraz farklıdır.
primo

@primo Tamam, şimdi anladım. Düzeltilecek.

Ahh, haklısın. Bunlar eşdeğer ifadelerdir. Bununla birlikte, iki tanımın aynı olmadığına dikkat edilmelidir. 4879 ilk sayaç örneğidir (kare 4: 4 yerine 3: 5 ayrılmıştır).
primo

@primo Bu daha iyi mi? Bu nedenle, karenin sayısının uzunluğu, sayının iki katına veya sayının artı 1'in iki katına eşit olmalıdır?

Yanıtlar:


5

Perl - 63 bayt

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

Mesele bir bayt sayılıyor. Giriş alındı stdin.

Bu işlem n ≤ 50 için kabul edilebilir bir çalışma süresine sahiptir , bundan sonra biraz yavaşlar.

Örnek kullanım:

$ 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

Çalışma zamanı hakkında sorun yok. Bu sadece kod 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--);}
  • ile n17 kadar onu kaldırmak ok olacağını long long,
  • Aşan printf parametresi kötüye kullanıldı :)
  • Üçlü operatörde neden boş deyim kullanmak mümkün değil? ikisi 1aptal ...
  • Josh'a ek 3 karakter için teşekkürler ...

1
Yalnızca yanlış değeri önemsiyorsanız üçlü bir ifade yerine boole mantığı kullanabilirsiniz. Örnek (i-i*i/x-i*i%x)||printf(...),.
Josh

1
Ayrıca başlatabilir xve iküresel kapsamda yerine de fordöngü birkaç karakter kaydedin.
Josh

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)   

Ölçek

g[14]

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


Çıktınız ölçütleri karşılamıyor Her Kaprekar numarası boşlukla ayrılmalı ve başka bir şey olmamalıdır.
RononDex

RononDex. Çıkışı ayarladım.
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

Çıktı :

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 

Girdi, maksimum değeri değil, çıkarılacak değerlerin sayısını belirtir.
primo

özledim, sabit!
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.

Neden değerleri bir dizide saklamıyorsunuz ve onlara katılmıyorsunuz?
Ismael Miguel

3

piton - 98

Birkaç karakter tıraş etmek için güzel python dilimleme kullandım.

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

İyi iş. Bugün için oylarım tükendi, ancak bir saat içinde oylayacağım.

3

C # - 255 Karakter.

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 kodun bulmasını istediğiniz Kaprekar numaralarının sayısıdır. Bu 1 ila 100 aralığında test edilmiştir, ancak bundan çok daha fazlasını desteklemelidir. İlk 50 sadece 1 saniye sürse de 100 sayının geri dönmesi iki buçuk saat sürdü - bundan sonra işler yavaşladı.

Çıktı:

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

Bu kodu şu şekilde ortaya koyar;

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

Bunun daha da kısaltılabileceğini bilmek isterim.


3

C, 90 76 75 bayt

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 (yeni satırlar dahil)

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 için çıktı:

1 9 45 55 99 297 703 999 2223 2728

U = 20 için çıktı:

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

Tüh! Şimdi düzeltildi. Biraz daha uzun, ama doğru. Python'da noktalı virgül keşfettim! Yaşa!
KBKarma

2
Sonra bu aklınızı başınızdan alacak: 7. satır önceki satırın sonuna gidebilir.
primo

... Ah. Ah lanet olsun. Oh iyi. Python bilgimin en iyi ihtimalle yetersiz olduğunu göz önünde bulundurarak öğle tatilim sırasında birlikte çaldığım bir şey için hala oldukça iyi.
KBKarma

2

R, 99 karakter

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

İle ibasamak sayısının yarısı olan k^2yuvarlak kadar, Hava k değerlendirilmesi Kaprekar sayıda bölüm ve tam bölümünün geri kalan eklenerek burada gerçekleştirilir olduğu k^2göre 10^i(basamak sol yarısı olan bölüm aşağı yuvarlanır ve kalan kısım sağa yuvarlanır).


2

bash + sed, 75 karakter

Bash sadece tamsayı aritmetiği yapar ve sayıları ondalık dizeler olarak gösterir; bu özellikler bu zorluğun üstesinden gelmek için faydalıdır. Ayrıca, kayıt dışı / atanmamış değişkenlerin aritmetik yapılırken 0 değerine sahip olduğu varsayılır.

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

Oraya koymam beni rahatsız etti 10#, ama bölünmenin ikinci yarısı a ile başlıyorsa böyle bir şey gerekli 0. Aritmetik yaparken , baz açıkça belirtilmedikçe bu sayıları sekizlik olarak ele alır.

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

1

Python 3.3 - 117 karakter

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

Her girinti seviyesi ve sonuncusu hariç her yeni satır 1 karakterdir. Bence bu Python kodu için adil. Komut dosyası, kullanıcının hesaplanacak Kaprekar sayılarının sayısını girmesini bekler.


1

J - 64

Biraz çirkin ama yine de. Bir milyona kadar olan tüm sayıları kontrol eder ve sonra alır n, bu yüzden sadece n <= 50 için çalışır.

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

n girdiyi nereye koyacağınız


Spesifikasyonda, 100'e kadar hesapladığı söyleniyor. Muhtemelen sadece Kaprekar sayılarını saymak için başka bir değişken eklemek için bu kadar karakter eklemez.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.