Повертаємо цілі числа з квадратними цифрами


31

Вступ та кредит

Всі ми знаємо і любимо наші дивовижні правила, щоб перевірити, чи можна ділити число на 11 чи 3, що є лише певною розумною сумою над цифрами числа. Тепер цей виклик піднімає це на новий рівень, вимагаючи від вас обчислити суму цифр, а потім перевірити, чи є результат ідеальним цілим квадратом, жодна з яких операцій зазвичай не може бути виконана дуже коротко. Оскільки цю властивість також дуже важко помітити, дивлячись на число, ми хочемо, щоб це було зроблено для цілих списків чисел, щоб ми могли зберегти людську роботу. Тож це вже ваш виклик!

Це було завдання на моєму курсі функціонального програмування в університеті. Це завдання закрите і обговорювалося на уроці, і я маю дозвіл свого професора на публікацію його тут (я попросив прямо).

Специфікація

Вхідні дані

Ваш вхід - це список негативних чисел у будь-якому стандартному форматі вводу / виводу.
Ви можете обрати формат списку у міру необхідності

Вихідні дані

Вихід - це список цілих чисел у будь-якому стандартному форматі вводу / виводу.

Що робити?

Відфільтруйте кожне ціле число зі списку вхідних даних, для яких сума цифр не є aa квадрата (цілого числа).
Порядок елементів може не змінюватися, наприклад, якщо ви отримаєте, [1,5,9]ви не можете повернутися[9,1]

Потенційні кутові справи

0 - це невід'ємне ціле число і, таким чином, є дійсним введенням, а 0 також є коректним цілим корінцем, наприклад 0 вважається цілим квадратом.
Порожній список також є дійсним входом і виходом.

Хто виграє?

Це код-гольф, тому найкоротша відповідь у байтах виграє!
Звичайно, застосовуються стандартні правила.

Випробування

[1,4,9,16,25,1111] -> [1,4,9,1111]
[1431,2,0,22,999999999] -> [1431,0,22,999999999]
[22228,4,113125,22345] -> [22228,4,22345]
[] -> []
[421337,99,123456789,1133557799] -> []

Покроковий приклад

Example input: [1337,4444]
Handling first number:
Sum of the digits of 1337: 1+3+3+7=14
14 is not an integer square, thus will be dropped!
Handling second number:
Sum of the digits of 4444: 4+4+4+4=16
16 is an integer square because 4*4=16, can get into the output list!
Example output: [4444]

11
Приємний перший виклик, і ласкаво просимо на сайт!
DJMcMayhem

Для майбутніх проблем зверніть увагу на пісочницю . Це місце, де ми ставимо виклики, перш ніж ставити їх на головний сайт, щоб він міг переглядатись та запитувати їхній вміст, щоб вони (сподіваємось) отримали кращу оцінку. Не те, що це погане питання, хоча (мені насправді це дуже подобається)
Блакитний

@muddyfish, я читав про це і розглядав публікацію там, але вирішив не робити цього, тому що я був впевнений, що тут нічого не можу пропустити / зробити жахливо неправильно :) Звичайно, якщо я навіть сумніваюся, щось може бути Я сумую за публікацією там.
SEJPM

12
Хоча уникати пісочниці цілком чудово, якби ви розмістили там, я б запропонував вам зробити виклик лише щодо тестування окремого цілого числа. Цікавим завданням є тест, обгортати це завдання фільтром не особливо цікаво. Здається, це лише зробити складніше завдання в езотеричних мовах, які не мають масивів як типів. Це може здатися трохи суворим, але це все-таки відмінне перше повідомлення. Просто кажучи, що пісочниця є, тому що, як би ти не був пропущений, ти щось пропустив.
FryAmTheEggman

1
@FryAmTheEggman Я можу сказати для Mathematica, що введення цієї функції в список можливостей ускладнює речі дещо нетривіально, тому це не зовсім нудно.
LLlAMnYP

Відповіді:



5

Математика, 39 36 байт

Анонімна функція:

Select[AtomQ@√Tr@IntegerDigits@#&]

LLlAMnYP зберег байт. Дякую!

Мартін Ендер врятував ще трьох, замінивши IntegerQна AtomQ. Розумний! (Результат буде точним, тому він повертає складений вираз на зразок, Sqrt[5]якщо його аргумент не є квадратом.)


Байт, який потрібно зберегти ...Digits@#&замість...Digits[#]&
LLlAMnYP


4

Brachylog v2, 8 байт

{ẹ+√ℤ&}ˢ

Спробуйте в Інтернеті!

Пояснення

{ẹ+√ℤ&}ˢ
{     }ˢ  Map the following operation over {the input}, discarding elements that error:
 ẹ         Split into a list of digits
  +        Sum that list
   √       Take its square root
    ℤ      Assert that the result is an integer
     &     Return to the original value

Це &означає, що вихідні елементи такі ж, як у списку вхідних даних, але помилка вийде, якщо введення блоку не є квадратним числом, тому ми отримуємо список введення з викинутими не квадратними цифрами сум.

Зауважте, що спочатку може здатися, що тут виникає проблема неточності з плаваючою комою (деякі дуже великі не квадратні цілі числа мають цілі квадратні корені через округлення). Однак Брахілог підтримує арифметику біньюма і фактично цю поведінку враховує в його реалізації : число, яке є досконалим квадратом, має свій квадратний корінь як ціле число, тоді як число, яке не є досконалим квадратом (але достатньо близьким, щоб його квадратний корінь є інтегральним) матиме його квадратний корінь, повідомлений як поплавок із інтегральним значенням. Зручно, лише допускає перший вид повернення вартості, що дає твердження провал для другого.



3

CJam, 14 байт

Дякуємо @FryAmTheEggman за збереження одного байта!

{{Ab:+mq_i=},}

Спробуйте в Інтернеті!

Це неназваний блок, який очікує вхідного списку на стек і залишає відфільтрований список на ньому.

Пояснення

{e # почати новий блок
 Ab e # перетворити на базу 10 -> розділити число на цифри
 : + e # сума й цифри
 mq e # отримати квадратний корінь
 _ е # дублює результат
 тобто конвертувати в ціле число
 = e # перевірте, чи перетворений квадратний корінь та оригінальний рівні
} e # кінцевий блок
, e # фільтрує список введення

3

Haskell - 70 60 59 байт

f=filter(\x->elem(sum.map(read.pure).show$x)$map(^2)[0..x])

Використання:

> f [0..100]
[0,1,4,9,10,13,18,22,27,31,36,40,45,54,63,72,79,81,88,90,97,100]

Досить прямо; обчислює суму цифр і перевіряє, чи підлога (sqrt (y)) ^ 2 == y

Редагувати: Вкрасти ідею перевірити список квадратів у C. Quilley


2
Цікавий підхід. Я не впевнений, що f=потрібна для цієї відповіді.
Майкл Кляйн

3

05AB1E, 19 10 байт

vySOtDï->—

Пояснення

vy                     # for each int in list
  SO                   # digit sum
    tDï-               # difference between sqrt() and int(sqrt())
        >              # increase by 1 giving 1 (true) when equal
         —             # print current int in list if truthy

Спробуйте в Інтернеті

Редагувати: Збережено 9 байт завдяки @Adnan


Отримавши суму цифр для кожного, ви можете зробити vySOі перевірити, чи квадратний він чи ні. Я отримав це до 5: tDï->. Існує також спеціальний вбудований, який друкує yпри рівності 1, який є ( ). Отже, це було б vySOtDï->—.
Аднан

@Adnan: Я не можу повірити, що забув про S. Я навіть не дивився на них - оскільки завдання, яке було сказано, виводиться у вигляді списку, але я бачу, що інші відповіді роблять те саме, тому я припускаю, що це нормально.
Емінья

Так, думаю, елементи, розділені новими рядками, приймаються за замовчуванням, якщо виклик прямо не сказав.
Аднан

3

R , 57 55 байт

Використовуйте Filterна векторі. Припускає 32 бітові цілі числа, тому максимум 10 цифр.

Кутові випадки: повернення NULLдля порожнього вектора та numeric(0)для вектора без дійсних чисел. Вони мають нульову довжину, тому повинно бути прийнятним.

-2 завдяки @Giuseppe

Filter(function(n)!sum(n%/%10^(0:10)%%10)^.5%%1,scan())

Спробуйте в Інтернеті!


3

PowerShell , 64 54 байти

$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}

Спробуйте в Інтернеті!

-10 байт завдяки мазі

Вводить дані як аргументи командного рядка (див. Приклади нижче), який обробляється в PowerShell в масив $args. Ми передаємо це на ?псевдонім для Where-Object(функції, подібні до filter), щоб вибрати наш вихід. Наш вибір заснований на .NET виклик [math]::Sqrt()на значной сумі числа є цілим числом з !(...%1). Цілі цифри приведуть до 0, який, коли notредактор стає, Trueпоки стають нецілі корені False.

Як згадувалося в іншому місці, "повернення" порожнього масиву є безглуздим, оскільки воно перетворюється в нього, $nullяк тільки воно залишає область, тому вихід для порожнього вводу - це нічого.

Приклади

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1 4 9 16 25 1111
1
4
9
1111

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1431 2 0 22 999999999
1431
0
22
999999999

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 22228 4 113125 22345
22228
4
22345

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1337 4444
4444

1
$n%1перевіряє, якщо тільки інт$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
mazzy

2

Python 2, 76 байт

lambda l:filter(lambda n:eval(("sum(map(int,`n`))**.5==int("*2)[:-6]+")"),l)

Спробуйте тут!

Деякі зловживання eval для перевірки квадратного числа, відпочинок є досить непривабливим.
Заява eval оцінюється до sum(map(int,n ))**.5==int(sum(map(int,n))**.5)


2

Oracle SQL 11.2, 213 байт

WITH v AS(SELECT a,SQRT(XMLQUERY(REGEXP_REPLACE(a,'(\d)','+\1')RETURNING CONTENT).GETNUMBERVAL())s FROM(SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))))SELECT a FROM v WHERE s=CEIL(s);

Без гольфу

WITH v AS
(  
  SELECT a,SQRT(XMLQUERY( 
                   REGEXP_REPLACE(a,'(\d)','+\1')  -- Add a + in front of each digit 
                   RETURNING CONTENT
               ).GETNUMBERVAL())s                  -- Evaluate the expression generated by the added +
  FROM 
  (SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))) -- Split string on ','
)
SELECT a FROM v WHERE s=CEIL(s) -- Is a square if square has no decimal part

2

Brachylog , 26 байт

:1f.
e.(:ef+~^[X:2]h>0;.0)

Приклад:

?- run_from_file('code.brachylog',[1431:2:0:22:999999999],Z).
Z = [1431, 0, 22, 999999999]

Пояснення

Це ситуація, коли щось працює занадто добре ... ~^[X:2]частина стосується як позитивних X, так і негативних , тому, щоб уникнути дублікатів, я повинен це вказати X > 0.

;.0Частина тут з - за помилки (перерахування не працює на ціле число 0).

  • Основний присудок

    :1f.                Find all values of Input which satisfy predicate 1
    
  • Присудок 1

    e.                  Unify output with an element of the input
    (
      :ef               Find all elements of Output (i.e. all digits)
         +              Sum the digits
          ~^[X:2]       True if that sum is the result of X², whatever X is
                 h>0    Impose that X > 0
    ;                   OR
      .0                True if Output is 0
    )
    

2

Python 2, 53 байти

lambda x:[n for n in x if sum(map(int,`n`))**.5%1==0]

Перевірте це на Ideone .


1
Бо f([1111111111111111]), схоже, repr(n)містить 'L'і int('L')кидає ValueError. Я відчуваю, що вам str(n)тут потрібно ?
Лінн

2
Правильно, він не буде працювати довгими даними. Я не думаю, що це відрізняється від рішення в мові з цілими числами фіксованої ширини.
Денніс

2

J, 33 27 байт

6 байт завдяки @miles .

#~[:(=<.)@%:+/"1@(10&#.inv)

У онлайн-перекладачів invне закладається. Змініть це на ^:_1.

Використання

>> f =: #~[:(=<.)@%:+/"1@(10&#.inv)
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

Де >>STDIN і <<STDOUT.

Трохи невольф

to_base_10 =: 10&#.^:_1
sum        =: +/"1
sqrt       =: %:
floor      =: <.
itself     =: ]
equals     =: =
of         =: @
is_integer =: equals floor
test       =: is_integer of sqrt
copies_of  =: #
f =: copies_of~ [: test (sum of to_base_10)

Попередня 33-байтна версія

(]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]

Використання

>> f =: (]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

Де >>STDIN і <<STDOUT.

Трохи невольф

to_base_10 =: 10#.^:_1]
sum        =: +/"1
sqrt       =: %:
floor      =: <.
square     =: *:
itself     =: ]
equals     =: =
of         =: @
test       =: itself equals square of floor of sqrt
copies_of  =: #
f =: (test of (sum of to_base_10)) copies_of itself

1
Ви можете використовувати f&.gдля застосування g, потім f, а потім зворотну сторону, gщоб скоротити, *:@<.@%:щоб <.&.%:зберегти 2 байти. Ви можете переставити його і використовувати лише підлогу, щоб отримати #~[:(=<.)@%:+/"1@(10&#.inv)27 байт, де invє ^:_1, і вже визначено.
милі

2

Javascript 66 байт

a=>a.filter(b=>(e=Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d)))==(e|0))

Дякуємо SergioFC за збереження 7 байт


Ви не можете просто використовувати c+dзамість цього c-+-d? Крім того, ви можете використовувати n%1==0для тестування, якщо результат є цілим, тому, можливо, ви можете зберегти кілька байт за допомогою b=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)фільтра
sergioFC

@sergioFC Я не можу змінити - + - на +, тому що вони струнні
Bálint

2

Perl 5, 42 байти

41, плюс 1 для -peзамість-e

my$s;map$s+=$_,/./g;$_ x=sqrt$s==~~sqrt$s

Пояснення:

  • -pотримує кожне вхідне ціле число у новому рядку і присвоює $_цьому рядку.
  • my$sініціалізує змінну $sдо нічого, заново для кожного вхідного цілого числа.
  • map$s+=$_,/./gзахоплює кожен числовий символ і числово додає його $s. (Новий рядок стає 0 при нумерації.)
  • sqrt$s==~~sqrt$sперевіряє, чи $sмає неінтегральний квадратний корінь, і $_ x=вносить $_у себе чи порожній рядок залежно від цього тесту.
  • -p відбитки $_

Завдяки Бреду Гілберту b2gills за збереження трьох байтів.

Також 41 плюс 1:

my$s;s/./$s+=$&/ger;$_ x=sqrt$s==~~sqrt$s
  • s/./$s+=$&/gerдодає кожен числовий символ до $s(а новий рядок - 0, як зазначено вище)

2

JavaScript (Node.js) , 48 байт

a=>a.filter(b=>eval([...b+""].join`+`)**.5%1==0)

Спробуйте в Інтернеті!

Пояснення

a =>                                  // lambda function taking one argument
    a.filter(                         // filter the list
        eval(                         // begin eval
            [...b+""]                 // convert number to array of digits 
                .join`+`              // join them with + sign
            )                         // close eval. we achieved sum of all digits of number
        **.5                          // square root of number
        %1==0                         // check for perfect square
    )                                 // end filter and return value

1

MATL, 16 14 13 байт

"@tV!UsX^1\?x

Спробуйте в Інтернеті!

Пояснення

        % Implicitly grab input
"       % For each number in the input
  @t    % Get this element and duplicate
  V     % Convert to it's string representation
  !     % Transpose the string so each digit is on it's own row
  U     % Convert each row to a number (separates the digits)
  s     % Compute the sum of the digits
  X^    % Compute the square root
  1\    % mod with 1 to determine if the square root is an integer
  ?x    % If there is a remainder, then remove this element from the stack
        % Implicitly display the stack contents

1

Джулія - ​​38 байт

!X=filter(i->√sum(digits(i))%1==0,X)

Досить легко побачити, що це робить. digitsперетворює число в перелік його цифр, sumтаким чином обчислює цифру-суму, потім виведе ціле число, якщо число квадратне, інакше буде дробова частина. %1поверне лише дробову частину, і якщо вона дорівнює нулю ( ==0), filterзбереже її у списку, інакше вона відфільтрується.

Використовується як ![22228,4,113125,22345]



1

MATLAB, 52 43 42 байт

@(x)x(~mod(sum(dec2base(x,10)'-48).^.5,1))

Створює анонімну функцію з ім'ям , ansяка може бути викликана з масивом в якості вхідних даних: ans([22228,4,113125,22345]).

Демо - версія . Демонстрація в Інтернеті знаходиться в Octave, яка не працює для порожнього вводу, але MATLAB робить.

Пояснення

Ми перетворюємо кожен елемент вхідного масиву в базу 10, що дасть двовимірний масив символів, де кожен рядок містить цифри числа в масиві. Для перетворення цих символів у числа віднімаємо 48 (ASCII для '0'). Потім підсумовуємо всі рядки, беремо корінь квадрата та визначаємо, чи кожне значення є ідеальним квадратом ~mod 1. Потім ми використовуємо цей булевий сигнал для фільтрації вхідного масиву.


1

Clojure, 110 байт

(fn[t](filter(fn[x](let[a(reduce +(*(count(str x))-48)(map int(str x)))](some #(=(* % %)a)(range(inc a)))))t))

Обчислює суму числових цифр, а потім фільтрує ті, для яких не існує числа, яке в квадраті дорівнює сумі.

Ви можете побачити результат тут - https://ideone.com/ciKOje


1

Perl 6 ,  38   35 байт

{.grep: {($/=sqrt [+] .comb)==$/.Int}}
{.grep: {($/=.comb.sum.sqrt)==$/.Int}}
{.grep: {($/=sqrt [+] .comb)==^$/}}
{.grep: {($/=.comb.sum.sqrt)==^$/}}

Тест:

#! /usr/bin/env perl6

use v6.c;
use Test;

my @tests = (
  [1,4,9,16,25,1111] => [1,4,9,1111],
  [1431,2,0,22,999999999] => [1431,0,22,999999999],
  [22228,4,113125,22345] => [22228,4,22345],
  [] => [],
  [421337,99,123456789,1133557799] => [],
);

plan +@tests;

my &sq-digit-sum = {.grep: {($/=sqrt [+] .comb)==^$/}}

for @tests -> $_ ( :key($input), :value($expected) ) {
  is sq-digit-sum($input), $expected, .gist
}
1..5
ok 1 - [1 4 9 16 25 1111] => [1 4 9 1111]
ok 2 - [1431 2 0 22 999999999] => [1431 0 22 999999999]
ok 3 - [22228 4 113125 22345] => [22228 4 22345]
ok 4 - [] => []
ok 5 - [421337 99 123456789 1133557799] => []

1

C, 143 141 байт

  • збережено 2 байти, @ user6188402
i;q(char*n){double m=0;while(*n)m+=*n++-48;m=sqrt(m)-(int)sqrt(m);return !m;}s(n,s)char**n;{i=-1;while(++i<s)if(q(n[i]))printf("%s\n",n[i]);}

Ungolfed спробуйте онлайн

int q(char*n)
{
    double m=0;

    while(*n) // sum digits
        m+=*n++-48;

    // get the decimal part of its square root
    m=sqrt(m)-(int)sqrt(m);

    // true if decimal part is zero
    return !m;
}

// input is text, can be a file
void s(char**n, int s)
{
    int i=-1;

    while(++i<s) // for each number in input
        if(q(n[i])) // if is square
            printf("%s\n",n[i]); // output is terminal
}

1

Сітківка , 69

Тому що тестування на ідеальні квадрати в сітківці. Це може бути змінено для узагальненого обчислення цілого цілого квадратного кореня .

. +
$ & a $ &
+ `\ b \ d
$ * b 


\ bb
$ &:
+ `(\ bb +) :( bb \ 1)
$ 1 $ 2:
G` (: a | 0 $)
. * а

Введення - це список, відокремлений новим рядком.

Спробуйте в Інтернеті.

  • Етап 1 - повторіть число на кожному рядку та розділіть їх a
  • Етап 2 - перетворити кожну цифру перед aодинаковою, вираженою як bs, розділеною пробілами
  • Етап 3 - видаліть пробіли - кожен одинар тепер представляє цифру суми
  • Етап 4 і 5 - Використовуйте той факт, що ідеальні квадрати можуть бути виражені 1 + 3 + 5 + 7 + .... Розділіть кожну унурі відповідно
  • Етап 6 - фільтр грейпу лише ті, які точно розділилися на вищевказану форму
  • Етап 7 - відкиньте всі, крім оригіналу

У мене було кілька ідей, як це покращити, але я закінчив переписати більшу частину цього. Тим не менш, це все-таки ваша ідея: дублювати введення, розгорнути цифри в першій половині, відфільтрувати квадрати у вигляді сум непарних чисел, відкинути першу половину решти, що залишилися. Те, як я переграв кроки, - це через %-конфігурацію \Gта прямі посилання. Не соромтеся приймати це: retina.tryitonline.net/… :)
Мартін Ендер

1

Пітон, 50 байт

filter(lambda x:sum(map(int,str(x)))**0.5%1==0,in)

Якщо n - список введення чисел


1
Привіт, ласкаво просимо на сайт! Оскільки це змагання з кодового гольфу , наприклад, хто може написати найкоротший код, ми вимагаємо, щоб усі матеріали були принаймні дещо гольфними . У нас є список пітона гри в гольф поради тут . Очевидне поліпшення, яке ви можете зробити, - це видалити всі додаткові пробіли та перейменувати свої змінні в одну букву кожна. Ви також можете взяти дані як аргументи функції або STDIN замість аргументів командного рядка.
DJMcMayhem

Також слід вказати мову та кількість байтів, які можна було б перерахувати, наприклад, там .
nicael

1
Ласкаво просимо до PPCG! Окрім того, що сказали інші, зауважте, що всі рішення повинні бути або повноцінними програмами, або функціями, що викликаються . Поки всі ваші відповіді були фрагментами, які передбачають, що вхід зберігається в якійсь змінній і просто оцінює результат, що, на жаль, робить їх недійсними. Про прийнятні методи вводу / виводу див. Цей мета-пост .
Мартін Ендер


1

К (оК) , 19 17 13 байт

Рішення:

(~1!%+/.:'$)#

Спробуйте в Інтернеті!

Пояснення:

(~1!%+/.:'$)# / the solution
(          )# / apply function to list
          $   / convert to string
       .:'    / value (.:) each (')
     +/       / sum
    %         / square-root
  1!          / modulo 1
 ~            / not

Примітки:

  • -2 байти з розумнішим способом ідентифікації квадратів
  • -4 байти завдяки ngn

1
ви знаєте про filter ( func#list) ?
ngn

Мені не було, дуже приємно!
Стрітер

1

MathGolf , 5 4 байти

gÅΣ°

Спробуйте в Інтернеті!

Пояснення:

gÅ    Filter by the next two instructions
  Σ   The digit sum
   °  Is a perfect square?

MathGolf все ще знаходиться в розробці, тому я припускаю, що незабаром буде введено неявне введення, щоб відголити цей перший байт. Так!


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