Обчисліть n чисел Kaprekar


12

Номер Kaprekar цього числа п-значний до , що, коли перший п або п-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 чисел Kaprekar, з n знаходяться в діапазоні, але не обмежуючись діапазоном, від 1 до 100. Кожне число Kaprekar повинно бути розділене пробілом і більше нічого.

Більше номерів Kaprekar можна знайти тут, щоб перевірити вашу програму, але цей ресурс НЕ МОЖЕ бути використаний ні в якому разі для обчислення - іншими словами, жодне жорстке кодування, читання з цього джерела або використання його в будь-якому іншому експлуатуванні спосіб - всі номери повинні бути згенеровані вашою програмою.

Найкоротший код виграє.


@devnull Це краще? Це означає, що програма повинна підтримувати nщонайменше до 100.

Визначення MathWorld суперечить A006886 (MathWorld вказує, що m - довжина вихідного числа, A006886 визначає, що він принаймні такий великий). Ваше визначення в першому абзаці дещо відрізняється від обох.
примо

@primo Добре, я зараз розумію. Буде переглянути.

Ах, ти маєш рацію. Вони є рівнозначними твердженнями. Слід зазначити, що ці два визначення не є однаковими. 4879 - перший приклад лічильника (квадрат розділений 3: 5, а не 4: 4).
прим

@primo Це краще? Тож довжина числа в квадраті повинна бути дорівнює подвоєній довжині числа або вдвічі довшішій кількості плюс 1?

Відповіді:


5

Perl - 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--);}
  • з nдо 17 було б добре видалити long long,
  • Перевищення параметра printf зловживається :)
  • Чому в термінальному операторі неможливо використовувати порожній вислів? двоє 1дурні ...
  • Дякую Джошу за додаткові 3 символи ...

1
Якщо вас цікавить лише помилкове значення, ви можете використовувати булеву логіку замість потрійного твердження. Приклад, (i-i*i/x-i*i%x)||printf(...).
Джош

1
Ви також можете ініціалізувати xі iв глобальному масштабі, а не в forциклі, щоб зберегти пару символів.
Джош

3

Математика 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)   

Тест

g[14]

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


Ваш вихід не відповідає критеріям. Кожне число Kaprekar повинно бути розділене пробілом і більше нічого.
RononDex

RononDex. Я відкоригував вихід.
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

Вихід:

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
Флорент

Bien joué Florent :)
Майкл М.

Чому ви не зберігаєте значення в масиві та просто приєднуєтесь до них?
Ісмаїл Мігель

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

C # - 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 - число номерів Kaprekar, яке ви хочете знайти в коді. Це було випробувано в межах від 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

C, 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

Python 2.7, 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

Вихід для u = 20:

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

Ого! Виправлено це зараз. Трохи довше, але правильно. Я відкрив крапки з комою в Python! Ура!
KBKarma

2
Тоді це підірве ваш розум: рядок 7 може пройти в кінці попереднього рядка.
примо

... Ой. Ах чорт. Що ж, добре. І все-таки досить добре для чогось, що я збив разом під час обідньої перерви, вважаючи, що мої знання про Python в кращому випадку мізерні.
KBKarma

2

R, 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округлених вгору, оцінка коефіцієнта k k Kaprekar число виконується тут шляхом додавання коефіцієнта і решти цілого ділення k^2на 10^i(коефіцієнт - ліва половина цифр, округлена вниз і інша права половина закруглена вгору).


2

bash + sed, 75 символів

Bash виконує арифметику лише для цілих чисел і представляє числа у вигляді десяткових рядків; ці атрибути корисні для гри в цю проблему. Також для необмежених / непризначених змінних вважається значення 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

Python 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 символ. Я думаю, що це справедливо для Python-коду. Сценарій очікує, що користувач введе кількість обчислених чисел Kaprekar для обчислення.


1

J - 64

Якийсь потворний, але все ж. Він перевіряє всі числа до одного мільйона, а потім бере nїх, тому він працює лише для n <= 50.

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

n є куди покласти вхід


У специфікації сказано, щоб обчислити до 100 з них. Напевно, не буде додано, що багато символів додають іншу змінну виключно для підрахунку кількості знайдених чисел Kaprekar.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.