Calcola n numeri di Kaprekar


12

Un numero di Kaprekar è un numero di n cifre k che, quando le prime cifre n o n-1 di k ^ 2 vengono aggiunte alla seconda n cifre di N ^ 2, il risultato è N.

Esempi:

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

La sequenza di Kaprekar inizia da 1.

Scrivi un programma che calcola e genera i primi n numeri Kaprekar, con n compreso nell'intervallo, ma non limitato all'intervallo, da 1 a 100. Ogni numero Kaprekar deve essere separato con spazi bianchi e nient'altro.

È possibile trovare altri numeri Kaprekar qui per verificare il proprio programma, ma questa risorsa NON PUO 'essere utilizzata in alcun modo per aiutare con il calcolo - in altre parole, nessuna codifica, lettura da questa fonte o utilizzo in qualsiasi altro sfruttamento modo - tutti i numeri devono essere generati dal tuo programma.

Il codice più corto vince.


@devnull È meglio? Vuol dire che il programma deve supportare un nmassimo di almeno 100.

La definizione di MathWorld è in conflitto con A006886 (MathWorld specifica che m è la lunghezza del numero originale, A006886 specifica che è almeno così grande). La tua definizione nel primo paragrafo è leggermente diversa da entrambe.
primo

@primo OK, ora capisco. Revisioneremo.

Ah, hai ragione. Sono dichiarazioni equivalenti. Si noti tuttavia che le due definizioni non sono identiche. 4879 è il primo esempio di contatore (il quadrato è diviso 3: 5, anziché 4: 4).
primo

@primo È meglio? Quindi la lunghezza del numero al quadrato deve essere uguale al doppio della lunghezza del numero o al doppio della lunghezza del numero più 1?

Risposte:


5

Perl - 63 byte

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

Contando lo shebang come un byte. L'input è preso da stdin.

Questo ha un tempo di esecuzione accettabile per n ≤ 50 , dopodiché diventa un po 'lento.

Esempio di utilizzo:

$ 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

Nessun problema di runtime. Questo è solo codice 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--);}
  • con un nmassimo di 17 sarebbe opportuno rimuovere il long long,
  • Il parametro printf in eccesso viene abusato :)
  • Perché non è possibile utilizzare un'istruzione vuota nell'operatore ternario? i due 1sono sciocchi ...
  • Grazie a Josh per altri 3 personaggi ...

1
Se ti interessa solo il valore falso, puoi usare la logica booleana invece di un'istruzione ternaria. Esempio, (i-i*i/x-i*i%x)||printf(...).
Josh,

1
È inoltre possibile inizializzare xe inell'ambito globale anziché nel forciclo per salvare un paio di caratteri.
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)   

Test

g[14]

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


Il tuo output non soddisfa i criteri. Ogni numero Kaprekar deve essere separato con spazi bianchi e nient'altro.
RononDex,

RononDex. Ho regolato l'uscita.
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

Produzione :

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 

L'input specifica il numero di valori da emettere e non il valore massimo.
primo

perso quello, risolto!
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.

Perché non memorizzi i valori in un array e semplicemente li unisci?
Ismael Miguel,

3

pitone - 98

Ho usato un bel taglio di pitone per radere alcuni personaggi.

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

Bel lavoro. Ho finito i voti per oggi, ma lo voterò tra un'ora.

3

C # - 255 caratteri.

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 è il numero di numeri Kaprekar che si desidera trovare il codice. Questo è stato testato nell'intervallo da 1 a 100, ma dovrebbe supportare molto di più. 100 numeri impiegarono due ore e un quarto per tornare, anche se i primi 50 impiegarono solo circa 1 secondo, dopo di che le cose rallentarono gradualmente.

Produzione:

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

Definito questo codice è il seguente;

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

Mi piacerebbe sapere se questo può essere ridotto ulteriormente.


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

2

Python 2.7, 144 (comprese le nuove linee)

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

Uscita per c = 10:

1 9 45 55 99 297 703 999 2223 2728

Uscita per u = 20:

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

Ops! Risolto questo ora. Leggermente più lungo, ma corretto. Ho scoperto i punti e virgola in Python! Evviva!
KBKarma,

2
Quindi questo ti lascerà a bocca aperta: la linea 7 può andare alla fine della linea precedente.
primo

... Oh Ah dannazione. Oh bene. Ancora abbastanza buono per qualcosa che ho messo insieme durante la mia pausa pranzo, considerando che la mia conoscenza di Python è al massimo scarsa.
KBKarma,

2

R, 99 caratteri

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

Con iessendo metà del numero di cifre k^2fino arrotondate, la valutazione di montone k è un numero Kaprekar viene eseguita qui aggiungendo il quoziente e il resto della divisione intera k^2da 10^i(quoziente essendo la metà sinistra delle cifre arrotondato verso il basso e la resto la metà destra arrotondata per eccesso).


2

bash + sed, 75 caratteri

Bash esegue solo l'aritmetica dei numeri interi e rappresenta i numeri come stringhe decimali; questi attributi sono utili per giocare a golf questa sfida. Si presume inoltre che le variabili non dichiarate / non assegnate abbiano un valore pari a 0 quando si esegue l'aritmetica.

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

Mi ha infastidito metterlo 10#lì dentro, ma qualcosa di simile è necessario se la seconda metà della divisione inizia con a 0. Quando si esegue l'aritmetica, tratta tali numeri come ottali, a meno che la base non sia esplicitamente dichiarata.

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

1

Python 3.3 - 117 caratteri

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

Ogni livello di rientro e ogni nuova riga tranne l'ultimo, contano tutti per 1 carattere. Penso che sia giusto per il codice Python. Lo script prevede che l'utente inserisca il numero di numeri Kaprekar da calcolare.


1

J - 64

Brutto, ma comunque. Controlla tutti i numeri fino a un milione, quindi ne prende n, quindi funziona solo per n <= 50.

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

n è dove inserire l'input


Nelle specifiche, ha detto di calcolarne fino a 100. Probabilmente non aggiungerebbe molti caratteri per aggiungere un'altra variabile esclusivamente per contare il numero di numeri di Kaprekar trovati.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.