Calculer n nombres de Kaprekar

12

Un nombre Kaprekar est un nombre à n chiffres k qui, lorsque les premiers n ou n-1 chiffres de k ^ 2 sont ajoutés au deuxième n les chiffres de N ^ 2, le résultat est N.

Exemples:

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

La séquence de Kaprekar commence à 1.

Écrivez un programme qui calcule et génère les n premiers nombres Kaprekar, avec n compris dans la plage, mais sans s'y limiter, de 1 à 100. Chaque numéro Kaprekar doit être séparé par des espaces et rien d'autre.

Plus de numéros Kaprekar peuvent être trouvés ici pour comparer votre programme, mais cette ressource NE PEUT PAS être utilisée de quelque manière que ce soit pour aider au calcul - en d'autres termes, pas de codage en dur, de lecture à partir de cette source, ou de l'utiliser dans tout autre exploitant façon - tous les numéros doivent être générés par votre programme.

Le code le plus court gagne.


la source
@devnull Est-ce mieux? Cela signifie que le programme doit prendre en ncharge au moins 100.
La définition de MathWorld est en conflit avec A006886 (MathWorld spécifie que m est la longueur du nombre d'origine, A006886 spécifie qu'il est au moins aussi grand). Votre définition dans le premier paragraphe est légèrement différente des deux.
primo
@primo OK, je comprends maintenant. Va réviser.
Ahh, tu as raison. Ce sont des déclarations équivalentes. Il convient toutefois de noter que les deux définitions ne sont pas identiques. 4879 est le premier contre-exemple (le carré est divisé 3: 5, plutôt que 4: 4).
primo
@primo Est-ce mieux? Donc, la longueur du nombre au carré doit être égale à deux fois la longueur du nombre ou deux fois la longueur du nombre plus 1?

Réponses:

5

Perl - 63 octets

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

Compter le shebang comme un octet. L'entrée provient de stdin.

Cela a un temps d'exécution acceptable pour n ≤ 50 , après quoi il devient un peu lent.

Exemple d'utilisation:

$ 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
la source
Aucun problème d'exécution. C'est juste du golf de code.
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--);}
  • avec njusqu'à 17, il serait correct d'enlever le long long,
  • Le paramètre printf dépassé est abusé :)
  • Pourquoi il n'est pas possible d'utiliser une instruction vide dans l'opérateur ternaire? les deux 1sont idiots ...
  • Merci à Josh pour 3 personnages supplémentaires ...
VX
la source
1
Si vous ne vous souciez que de la fausse valeur, vous pouvez utiliser une logique booléenne au lieu d'une instruction ternaire. Exemple, (i-i*i/x-i*i%x)||printf(...).
Josh
1
Vous pouvez également initialiser xet ià la portée globale au lieu de dans la forboucle pour enregistrer quelques caractères.
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)   

Tester

g[14]

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

DavidC
la source
Votre sortie ne répond pas aux critères Chaque numéro de Kaprekar doit être séparé par des espaces et rien d'autre.
RononDex
RononDex. J'ai ajusté la sortie.
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

Production :

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.
la source
L'entrée spécifie le nombre de valeurs à afficher, et non la valeur maximale.
primo
manqué ça, réparé!
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.
Pourquoi ne stockez-vous pas les valeurs dans un tableau et ne les joignez-vous pas simplement?
Ismael Miguel
3

python - 98

J'ai utilisé de jolies tranches de python pour raser quelques caractères.

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
la source
Bon travail. J'ai manqué de votes pour aujourd'hui, mais je voterai dans une heure.
3

C # - 255 caractères.

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 est le nombre de numéros Kaprekar que vous souhaitez que le code trouve. Cela a été testé dans la plage de 1 à 100, mais devrait prendre en charge beaucoup plus que cela. 100 numéros ont mis deux heures et quart pour revenir, bien que les 50 premiers aient seulement pris environ 1 seconde - les choses ont ralenti progressivement par la suite.

Production:

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

Disposé ce code est le suivant;

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

J'aimerais savoir si cela peut être encore raccourci.

user17567
la source
3

C, 90 76 75 octets

long long d,r=1;k(n){for(;++d/r?r*=10:--n;d-d*d/r-d*d%r||printf("%d ",d));}
o79y
la source
2

Python 2.7, 144 (y compris les nouvelles lignes)

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

Sortie pour c = 10:

1 9 45 55 99 297 703 999 2223 2728

Sortie pour u = 20:

1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 82656 95121
KBKarma
la source
Oups! Corrigé cela maintenant. Légèrement plus long, mais correct. J'ai découvert des points-virgules en Python! Hourra!
KBKarma
2
Ensuite, cela vous épatera: la ligne 7 peut aller à la fin de la ligne précédente.
primo
... Oh. Ah putain. Tant pis. Toujours assez bon pour quelque chose que j'ai frappé ensemble pendant ma pause déjeuner, étant donné que ma connaissance de Python est au mieux maigre.
KBKarma
2

R, 99 caractères

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

Étant donné ique la moitié du nombre de chiffres est k^2arrondie, l'évaluation de si k est un nombre de Kaprekar est effectuée ici en ajoutant le quotient et le reste de la division entière de k^2par 10^i(le quotient étant la moitié gauche des chiffres arrondis vers le bas et le reste la moitié droite arrondie).

plannapus
la source
2

bash + sed, 75 caractères

Bash fait de l'arithmétique entière uniquement et représente les nombres sous forme de chaînes décimales; ces attributs sont utiles pour jouer à ce défi. Les variables non déclarées / non attribuées sont également supposées avoir une valeur de 0 lors de l'exécution de l'arithmétique.

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

Ça m'a énervé de mettre ça 10#dedans, mais quelque chose comme ça est nécessaire si la deuxième moitié de la scission commence par un 0. Lorsque vous faites de l'arithmétique, traite ces nombres comme octaux, sauf si la base est explicitement indiquée.

$ ./kaprekar.sh 10
1
9
45
55
99
297
703
999
2223
2728
$ 
Traumatisme numérique
la source
1

Python 3.3 - 117 caractères

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

Chaque niveau d'indentation, et chaque nouvelle ligne sauf le dernier, comptent tous pour 1 caractère. Je pense que c'est juste pour le code Python. Le script attend de l'utilisateur qu'il saisisse le nombre de nombres Kaprekar à calculer.

Thomas
la source
1

J - 64

Un peu moche, mais quand même. Il vérifie tous les nombres jusqu'à un million puis en prend n, il ne fonctionne donc que pour n <= 50.

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

n est où mettre l'entrée

bruissement
la source
Dans la spécification, il a indiqué d'en calculer jusqu'à 100. Il ne serait probablement pas ajouter autant de caractères pour ajouter une autre variable uniquement pour compter le nombre de nombres Kaprekar trouvés.