Вычислите n чисел Капрекара

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 чисел Капрекара, где n находится в диапазоне, но не ограничивается диапазоном, от 1 до 100. Каждое число Капрекара должно быть отделено пробелом и ничем иным.

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

Самый короткий код выигрывает.


источник
@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 персонажа ...
VX
источник
1
Если вы заботитесь только о ложном значении, вы можете использовать логическую логику вместо троичного выражения. Пример (i-i*i/x-i*i%x)||printf(...).
Джош
1
Вы также можете инициализировать xи iв глобальной области вместо forцикла, чтобы сохранить пару символов.
Джош
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)   

Тестовое задание

g[14]

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

DavidC
источник
Ваш вывод не соответствует критериям Каждый номер Капрекара должен быть отделен пробелом и ничем иным.
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
qwr
источник
Хорошая работа. На сегодня у меня закончились голоса, но я проголосую через час.
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 - число чисел Капрекара, которое вы хотите найти в коде. Это было проверено в диапазоне от 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--; 
            } 
        }

Я хотел бы знать, если это может быть сокращено дальше.

user17567
источник
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));}
o79y
источник
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

Выход для с = 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
KBKarma
источник
Упс! Исправлено это сейчас. Чуть дольше, но правильно. Я обнаружил точки с запятой в 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^2на 10^i(коэффициент, являющийся левой половиной цифр, округленных в меньшую сторону, и остаток правой половины округляется).

plannapus
источник
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. Скрипт ожидает от пользователя ввода числа Капрекара для вычисления.

Томас
источник
1

J - 64

Вроде некрасиво, но все же. Он проверяет все числа до одного миллиона, затем берет nих, поэтому он работает только для n <= 50.

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

n где поставить вход

рассекать
источник
В спецификации сказано, что для расчета до 100 из них. Вероятно, это не добавит столько символов, чтобы добавить другую переменную исключительно для подсчета числа найденных чисел Капрекара.