Введение и кредит
Мы все знаем и любим наши замечательные правила, чтобы проверить, делится ли число на 11 или 3, что является просто некоторой умной суммой по цифрам числа. Теперь этот вызов выводит это на новый уровень, требуя, чтобы вы вычислили сумму цифр, а затем проверили, является ли результат идеальным целочисленным квадратом, и ни одна из этих операций обычно не может быть выполнена очень короткой. Так как это свойство также очень трудно увидеть при просмотре числа, мы хотим, чтобы это было сделано для целых списков чисел, чтобы мы могли сохранить человеческую работу. Так что это ваша задача сейчас!
Это было задание на моем курсе функционального программирования в университете. Это задание теперь закрыто и обсуждалось в классе, и у меня есть разрешение моего профессора опубликовать его здесь (я спросил явно).
Спецификация
вход
Ваш ввод - это список неотрицательных целых чисел в любом стандартном формате ввода / вывода.
Вы можете выбрать формат списка, так как это нужно вашему языку
Выход
Вывод представляет собой список целых чисел в любом стандартном формате ввода / вывода.
Что делать?
Отфильтруйте каждое целое число из списка ввода, для которого сумма цифр не является квадратом (целого числа).
Порядок элементов не может быть изменен, например, если вы получите, [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]
Ответы:
Пайк, 6 байт
Попробуй это здесь!
источник
Mathematica,
3936 байтАнонимная функция:
LLlAMnYP сохранил байт. Спасибо!
Мартин Эндер спас еще три, заменив
IntegerQ
наAtomQ
. Умная! (Результат√
будет точным, поэтому он возвращает составное выражение, какSqrt[5]
если бы его аргумент не был квадратом.)источник
...Digits@#&
вместо...Digits[#]&
Желе,
87 байт1 байт благодаря @ Sp3000 .
Тестирование.
объяснение
источник
Brachylog v2, 8 байт
Попробуйте онлайн!
объяснение
В
&
означает , что выходные элементы являются таким же , как в списке ввода, ноℤ
выдаст ошибку , если вход блока не является квадратным числом, таким образом мы получаем список ввода с элементами с неквадратными значными суммами отбрасываются.Обратите внимание, что на первый взгляд может показаться, что здесь существует проблема погрешности с плавающей запятой (некоторые очень большие неквадратные целые числа имеют целочисленные квадратные корни из-за округления). Однако Brachylog поддерживает арифметику bignum и фактически учитывает это поведение в своей реализации
√
: число, представляющее собой идеальный квадрат, получит квадратный корень в виде целого числа, тогда как число, которое не является идеальным квадратом (но достаточно близко, чтобы его корень квадратный является интегральным), квадратный корень будет представлен как число с плавающей точкой с целым значением. Удобно,ℤ
только разрешает первый тип возвращаемого значения, давая сбой утверждения для второго.источник
Pyth, 10 байт
Тестирование.
объяснение
источник
CJam, 14 байтов
Спасибо @FryAmTheEggman за сохранение одного байта!
Попробуйте онлайн!
Это неназванный блок, который ожидает входной список в стеке и оставляет в нем отфильтрованный список.
объяснение
источник
Haskell -
706059 байтИспользование:
Довольно просто; вычисляет сумму цифр и проверяет, является ли floor (sqrt (y)) ^ 2 == y
Редактировать: украл идею проверки списка квадратов от C. Quilley
источник
f=
требуется для этого ответа.05AB1E,
1910 байтобъяснение
Попробуйте онлайн
Редактировать: 9 байтов сохранено благодаря @Adnan
источник
vySO
сразу же проверить и проверить, квадрат это или нет. Я получил это до 5:tDï->
. Также есть специальная встроенная функция, которая печатаетy
при равенстве1
, то есть (—
). Так что это будетvySOtDï->—
.R ,
5755 байтИспользуйте
Filter
на векторе. Предполагает 32-битные целые числа, поэтому 10 цифр макс.Угловые случаи: возвращает
NULL
для пустого вектора иnumeric(0)
для вектора без допустимых чисел. Они оба имеют нулевую длину, поэтому должны быть приемлемыми.-2 благодаря @Giuseppe
Попробуйте онлайн!
источник
PowerShell ,
6454 байтаПопробуйте онлайн!
-10 байт благодаря маззи
Принимает ввод в качестве аргументов командной строки (см. Примеры ниже), который обрабатывается в массиве PowerShell
$args
. Мы передаем?
это псевдониму дляWhere-Object
(функции, аналогичныеfilter
), чтобы выбрать наш вывод. Наш выбор основан на вызове .NET,[math]::Sqrt()
где цифра-сумма числа является целым числом!(...%1)
. Целые числа приведут к 0, что, когдаnot
ed становится,True
а нецелые корни становятсяFalse
.Как уже упоминалось в другом месте, «возвращать» пустой массив бессмысленно, поскольку он преобразуется в тот момент,
$null
когда он покидает область видимости, поэтому вывод для пустого ввода - ничто.Примеры
источник
$n%1
проверяет только int$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
Python 2, 76 байт
Попробуй это здесь!
Некоторое злоупотребление eval для проверки квадратного числа, отдых довольно не впечатляющий.
Оператор eval оценивает
sum(map(int,
n))**.5==int(sum(map(int,
n))**.5)
источник
Oracle SQL 11.2, 213 байт
Un-golfed
источник
Брахилог , 26 байт
Пример:
объяснение
Это ситуация, когда что-то работает слишком хорошо ...
~^[X:2]
часть верна как для положительногоX
, так и для отрицательного , поэтому, чтобы избежать дубликатов, я должен указать этоX > 0
.;.0
Часть здесь из - за ошибки (перечисление не работает на целое число 0).Главный предикат
Предикат 1
источник
Python 2, 53 байта
Проверьте это на Ideone .
источник
f([1111111111111111])
, похоже,repr(n)
содержит'L'
иint('L')
бросаетValueError
. Я чувствую, что тебе нужноstr(n)
здесь?J,
3327 байт6 байт благодаря @miles .
В переводчиках онлайн,
inv
не встаёт. Измените это^:_1
вместо.использование
Где
>>
STDIN и<<
STDOUT.Слегка разгульный
Предыдущая 33-байтовая версия
использование
Где
>>
STDIN и<<
STDOUT.Слегка разгульный
источник
f&.g
для примененияg
, затемf
, а затем обратное значениеg
для сокращения*:@<.@%:
до<.&.%:
сохранения 2 байтов. Вы можете переставить его и использовать только floor, чтобы получить#~[:(=<.)@%:+/"1@(10&#.inv)
27 байтов, гдеinv
есть^:_1
, и уже определено.Javascript 66 байт
Спасибо за SergioFC за сохранение 7 байтов
источник
c+d
вместоc-+-d
? Кроме того, вы можете использоватьn%1==0
для проверки, является ли результат целым числом, поэтому, возможно, вы можете сохранить несколько байтов, используяb=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)
для фильтрацииPerl 5, 42 байта
41, плюс 1
-pe
вместо-e
Объяснение:
-p
получает каждое входное целое число в новой строке и присваивает$_
этой строке.my$s
инициализирует переменную$s
в ноль, заново для каждого входного целого числа.map$s+=$_,/./g
захватывает каждый числовой символ и численно добавляет его к$s
. (Новая строка становится 0 при нумерации.)sqrt$s==~~sqrt$s
проверяет,$s
имеет ли нецелый квадратный корень и$_ x=
превращает$_
в себя или в пустую строку в зависимости от этого теста.-p
печать$_
Спасибо Брэду Гилберту b2gills за сохранение трех байтов.
Также 41 плюс 1:
s/./$s+=$&/ger
добавляет каждый числовой символ к$s
(и символ новой строки равен 0, как указано выше)источник
JavaScript (Node.js) , 48 байт
Попробуйте онлайн!
объяснение
источник
MATL,
161413 байтПопробуйте онлайн!
объяснение
источник
Юлия - 38 байт
Довольно легко увидеть, что это делает.
digits
преобразует число в список его цифр,sum
таким образом, вычисляя сумму цифр,√
затем получит целое число, если число является квадратом, в противном случае будет дробная часть.%1
вернет только дробную часть и, если она равна нулю (==0
),filter
сохранит ее в списке, в противном случае она будет отфильтрована.Используется как
![22228,4,113125,22345]
источник
Джольф, 8 байт
Попробуй это здесь!
объяснение
источник
MATLAB,
524342 байтаСоздает анонимную функцию с именем ,
ans
которая может быть вызвана с массивом в качестве входных данных:ans([22228,4,113125,22345])
.Демо онлайн . Демонстрация онлайн в Octave, которая не работает для пустого ввода, но MATLAB делает.
объяснение
Мы преобразуем каждый элемент во входном массиве в основание 10, что приведет к двухмерному символьному массиву, где каждая строка содержит цифры числа в массиве. Чтобы преобразовать эти символы в числа, мы вычитаем 48 (ASCII для
'0'
). Затем мы суммируем по строкам, берем квадратный корень и определяем, является ли каждое значение идеальным квадратом~mod 1
. Затем мы используем это логическое значение для фильтрации входного массива.источник
Clojure, 110 байт
Вычисляет сумму цифр числа, а затем отфильтровывает те, для которых не существует числа, квадрат которого равен сумме.
Вы можете увидеть результат здесь - https://ideone.com/ciKOje
источник
Perl 6 ,
3835 байтТест:
источник
C
143141 байтUngolfed попробуйте онлайн
источник
Сетчатка , 69
Потому что тестирование на идеальные квадраты в сетчатке. Это можно изменить для обобщенного вычисления целочисленного квадратного корня .
Ввод - это разделенный новой строкой список.
Попробуйте онлайн.
a
a
одинарным, выраженным вb
s, через пробелисточник
%
конфигурацию\G
и прямые ссылки. Не стесняйтесь брать это: retina.tryitonline.net/… :)Python, 50 байт
Если n - это список чисел
источник
Рубин , 39 байт
Попробуйте онлайн!
источник
K (ок) ,
191713 байтРешение:
Попробуйте онлайн!
Объяснение:
Заметки:
источник
func#list
) ?MathGolf ,
54 байтаПопробуйте онлайн!
Объяснение:
MathGolf все еще находится в разработке,
поэтому я предполагаю, что в ближайшее время появится неявный ввод, чтобы сбрить этот первый байт.Ура!источник