Hitung n Angka Kaprekar

12

Angka Kaprekar adalah angka n-digit k , ketika n pertama atau n-1 digit k ^ 2 ditambahkan ke angka kedua n digit N ^ 2, hasilnya adalah N.

Contoh:

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

Urutan Kaprekar dimulai pada 1.

Tulis sebuah program yang menghitung dan mengeluarkan angka pertama n Kaprekar, dengan n berada dalam kisaran, tetapi tidak terbatas pada kisaran, dari 1 hingga 100. Setiap angka Kaprekar harus dipisahkan dengan spasi putih dan tidak ada yang lain.

Lebih banyak angka Kaprekar dapat ditemukan di sini untuk memeriksa program Anda, tetapi sumber daya ini TIDAK DAPAT digunakan dengan cara apa pun untuk membantu perhitungan - dengan kata lain, tidak ada penyandian kode, membaca dari sumber ini, atau menggunakannya dalam eksploitatif lainnya cara - semua angka harus dihasilkan oleh program Anda.

Kode terpendek menang.


sumber
@ evnull Apakah ini lebih baik? Ini berarti bahwa program tersebut harus mendukung npaling sedikit 100.
Konflik definisi MathWorld dengan A006886 (MathWorld menetapkan bahwa m adalah panjang dari angka asli, A006886 menetapkan bahwa itu setidaknya sebesar itu). Definisi Anda dalam paragraf pertama sedikit berbeda dari keduanya.
primo
@rimo OK, saya mengerti sekarang. Akan direvisi.
Ahh, kamu benar. Itu adalah pernyataan yang setara. Perlu dicatat bahwa kedua definisi tersebut tidak identik. 4879 adalah contoh penghitung pertama (kuadrat dibagi 3: 5, bukan 4: 4).
primo
@ primo Apakah ini lebih baik? Jadi panjang angka kuadrat harus sama dengan dua kali panjang angka atau dua kali panjang angka plus 1?

Jawaban:

5

Perl - 63 byte

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

Menghitung shebang sebagai satu byte. Input diambil dari stdin.

Ini memiliki runtime yang dapat diterima untuk n ≤ 50 , setelah itu agak lambat.

Penggunaan sampel:

$ 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
primo
sumber
Tidak ada masalah tentang runtime. Ini hanya kode 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--);}
  • dengan nhingga 17 tidak masalah untuk menghapus long long,
  • Parameter printf yang melebihi disalahgunakan :)
  • Mengapa tidak mungkin menggunakan pernyataan kosong di operator ternary? keduanya 1konyol ...
  • Terima kasih kepada Josh untuk 3 karakter tambahan ...
VX
sumber
1
Jika Anda hanya peduli pada nilai yang salah, Anda bisa menggunakan logika boolean alih-alih pernyataan ternary. Contoh (i-i*i/x-i*i%x)||printf(...),.
Josh
1
Anda juga dapat menginisialisasi xdan ipada lingkup global alih-alih di forloop untuk menyimpan beberapa karakter.
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)   

Uji

g[14]

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

DavidC
sumber
Output Anda tidak memenuhi kriteria. Setiap nomor Kaprekar harus dipisahkan dengan spasi putih dan tidak ada yang lain.
RononDex
RononDex. Saya menyesuaikan output.
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

Keluaran:

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 
Michael M.
sumber
Input menentukan jumlah nilai untuk output, dan bukan nilai maksimum.
primo
merindukan itu, diperbaiki!
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.
Mengapa Anda tidak menyimpan nilai dalam array dan bergabung saja?
Ismael Miguel
3

python - 98

Saya menggunakan beberapa irisan python yang bagus untuk mencukur beberapa karakter.

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
qwr
sumber
Pekerjaan yang baik. Saya kehabisan suara untuk hari ini, tetapi saya akan membatalkannya dalam satu jam.
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 adalah jumlah angka Kaprekar yang ingin Anda temukan kode. Ini telah diuji dalam kisaran 1 hingga 100 tetapi harus mendukung lebih dari ini. 100 angka membutuhkan dua dan seperempat jam untuk kembali walaupun 50 pertama hanya membutuhkan sekitar 1 detik - semuanya melambat secara bertahap setelah itu.

Keluaran:

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

Meletakkan kode ini adalah sebagai berikut;

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

Saya ingin tahu apakah ini dapat dipersingkat lebih lanjut.

pengguna17567
sumber
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));}
o79y
sumber
2

Python 2.7, 144 (termasuk baris baru)

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

Output untuk c = 10:

1 9 45 55 99 297 703 999 2223 2728

Output untuk u = 20:

1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 82656 95121
KBKarma
sumber
Aduh! Memperbaiki itu sekarang. Sedikit lebih lama, tetapi benar. Saya menemukan titik koma di Python! Hore!
KBKarma
2
Maka ini akan mengejutkan Anda: baris 7 dapat pergi di akhir baris sebelumnya.
primo
... Oh Sialan. Baiklah. Masih cukup bagus untuk sesuatu yang saya ketuk bersama saat istirahat makan siang, mengingat pengetahuan saya tentang Python sedikit sekali.
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}}

Dengan imenjadi setengah jumlah digit yang k^2dibulatkan ke atas, evaluasi apakah k adalah bilangan Kaprekar dilakukan di sini dengan menambahkan hasil bagi dan sisanya dari pembagian bilangan bulat k^2dengan 10^i(hasil bagi menjadi bagian kiri dari angka yang dibulatkan ke bawah dan sisa setengah kanan dibulatkan ke atas).

plannapus
sumber
2

bash + sed, 75 karakter

Bash tidak hanya bilangan bulat aritmatika dan mewakili angka sebagai string desimal; atribut ini sangat membantu untuk bermain golf tantangan ini. Juga variabel yang tidak dideklarasikan / tidak ditugaskan diasumsikan memiliki nilai 0 saat melakukan aritmatika.

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

Itu membuat saya kesal untuk meletakkan 10#di sana, tetapi sesuatu seperti ini diperlukan jika paruh kedua perpecahan dimulai dengan a 0. Saat melakukan aritmatika, memperlakukan angka seperti oktal, kecuali jika pangkalan tersebut dinyatakan secara eksplisit.

$ ./kaprekar.sh 10
1
9
45
55
99
297
703
999
2223
2728
$ 
Trauma Digital
sumber
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

Setiap tingkat lekukan, dan setiap baris baru kecuali yang terakhir, semua dihitung untuk 1 karakter. Saya pikir itu adil untuk kode Python. Script mengharapkan pengguna untuk memasukkan jumlah angka Kaprekar untuk dihitung.

Thomas
sumber
1

J - 64

Agak jelek, tapi tetap saja. Ia memeriksa semua angka hingga satu juta kemudian mengambilnya n, sehingga hanya berfungsi untuk n <= 50.

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

n adalah tempat untuk memasukkan input

desir
sumber
Dalam spek, katanya untuk menghitung hingga 100 dari mereka. Mungkin tidak akan menambahkan banyak karakter untuk menambahkan variabel lain hanya untuk menghitung jumlah angka Kaprekar yang ditemukan.