Нарциссический Номер представляет собой число , которое является суммой собственных цифр, каждый из возведенных в степень числа цифр.
Например, возьмем 153 (3 цифры):
1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153
1634:
1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634
Соревнование:
Ваш код должен принимать ввод от пользователя и выводить True или False в зависимости от того, является ли данное число нарциссическим числом.
Проверка ошибок на наличие текстовых строк или других неверных входных данных не требуется. 1 или 0 для выхода приемлемо. Код, который просто генерирует список нарциссических чисел или проверяет ввод пользователя по списку, не подходит.
True
если это такое число, но что-нибудь еще (в данном случае само число), если нет?Ответы:
APL (15)
Выводит,
1
если true и0
если false.Объяснение:
∆←⍞
: прочитать строку (как символы), сохранить в∆
(⍎¨∆)*⍴∆
: оцените каждого персонажа∆
и поднимите его до уровня власти⍴∆
∆≡⍕+/
: посмотрите, равно ли входное значение строкового представления суммы этихисточник
GolfScript, 16 символов
Входные данные должны быть даны в STDIN, выходные данные - 0 или 1, указывающие ненарцистическое / нарциссическое число.
Пояснение к коду:
источник
Mathematica, 43 символа
источник
Perl, 38 символов
Довольно простая реализация.
Вот немного другая версия, которая умещается в 35 символов:
Эта версия выводит ложное значение, если вход является нарциссическим, в противном случае выводится (допустимое для Perl) истинное значение. Кто-то может возразить, что эта обратная версия находится в пределах описания вызова, но, подумав, я решил не делать этого. Я не так отчаянно желаю улучшить свой счет. Все же.
источник
echo -n 153 | perl -pe '…'
будет работать без-l
.perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
J, 23 знака
(1!:1)1
это ввод с клавиатуры (возвращающий строку).".
преобразует ввод в число;"0
определяет ранг (размерность) 0, другими словами, беря каждый символ и преобразовывая его в число.^
является степенной функцией и#
является функцией длины, таким образом, каждая цифра переводится в степень длины строки (эквивалентно количеству цифр).+/
это просто сумма, и=
сравнивает сумму и число.источник
Рубин, 34 + 5 = 39
С флагами командной строки
Бегать
Выходы истина или ложь.
источник
R
7169665648Уменьшено на 8 байт благодаря @Giuseppe ! Идея заключалась в том, чтобы выполнить целочисленное деление перед операцией по модулю.
(3 года) старая версия с соответствующим объяснением:
a<-scan()
принимает в качестве входных данных число (целое, вещественное, ...) (скажем,153
для примера).i
становится вектором, содержащим от 3 до 1 (количество символовa
3).%%
векторизовано такa%%10^i
означаетa
по модулю 1000, 100 и 10: поэтому дает153, 53, 3
.(a%%10^i)%/%10^(i-1)
это целочисленное деление этого вектора на 100, 10, 1: следовательно,1, 5, 3
.Мы возводим это с первым элементом
i
которого является количество символов (здесь цифр)a
, то есть3
, таким образом, давая вектор, содержащий1, 125, 27
то, что мыsum
и сравниваемa
.источник
Python 3, 56 байт
Не очень запутанное, но простое решение.
источник
[
и]
нет необходимости, и вы можете оставить место передfor
тоже, так:sum(int(c)**len(s)for c in s)
s = input()
и еще один, переместив его в 2.7, гдеprint
это не функция.print
(следовательно, на один символ больше) сделало бы это действительным решением Python 2.x и Python 3.x.PHP,
807466 символовОчень простое решение PHP:
Предполагается, что
error_reporting
он не включает уведомления, в противном случае потребуется несколько дополнительных символов для инициализации$s=0;
и$i=0
.Спасибо @manatwork за сокращение многих символов.
источник
<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;
короче<?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;
.for(;$i<$l=strlen($a=$argn);)$s+=$a[$i++]**$l;echo$s==$a;
Dc: 48 символов
Образец прогона:
источник
dc
, за исключением безумных опечаток при попытке написатьcd
К,
2423Бритый 1 символ с переупорядочением
источник
R, 53 байта
gsub
Регулярное выражение вставляет пробелы между символами, так чтоscan
функция будет иметь возможность прочитать номер в вектор цифр.источник
Кона, 18
...
источник
Powershell,
7563626058Редактировать: Обновлено за комментарий @ Iszi
(примечание: это рассчитывает нанесуществующий)$x
Редактировать: Добавлены изменения @ Данко.
5856 символовЕсли ввод ограничен 10 цифрами (включает все int32)
источник
$x
и используя ее+=
для суммирования вместоmeasure -sum
проверки$x-eq$n
.($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x
'($x=$n=read-host)-split""|%{$x-=[math]::pow($_,$n.length)};!$x'.length
''
что вы заменили''
. Я взял исходный скрипт в Excel, чтобы перепроверить=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")
и получил 62 также. Конечно, мы всегда можем посчитать это вручную - но кто на самом деле это делает?Python 2.x - 51
Та же концепция, что и у решения crazedgremlin для Python 3.x:
источник
C -
9793 символаС отступом:
источник
int
глобальные переменные.argc
.-lm
во время компиляции считать +1 байт?-lm
флаг не требуется для компиляторов C89.Дельфы - 166
С отступом
источник
05AB1E , 7 байтов (не конкурирует)
Попробуйте онлайн!
-2 байта благодаря @daHugLenny
источник
§1ô
наS
Haskell 2010 - 76 персонажей
источник
Awk:
4039 символовОбразец прогона:
источник
Баш, 64 символа
a = $ 1; p = $ {# a}; for ((; a> 0; a / = 10)); do s = $ ((s + (a% 10) ** p)); сделано; echo $ ( (ы == $ 1))источник
for
пощадить его обособленным;
:for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1]
.for
еще один символ , может быть сокращено:for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
.Луа (101 символ)
Луа не известен своей краткостью, но в любом случае было интересно попробовать.
Улучшения приветствуются.
источник
for n in io.lines()do [...]end
сn=io.read()
экономит несколько байт ( TiO ).JavaScript -
7058 символовисточник
true
для меня, независимо от вводаJava - 84 байта
Не лямбда-версия: 101 байт:
Вызывается так:
Возвращает:
источник
a,l->
работает точно так же.(a,l)->
a->l->
byte
int
a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
Japt ,
1497 байтПопробуйте онлайн
объяснение
Неявный ввод целого числа
U
.Преобразовать
U
в массив digits (ì
), передать его через функцию и затем преобразовать обратно в целое число.Уменьшите добавлением (
x
), увеличивая каждый элемент до степени (p
) длины (Ê
) массива в процессе.Проверьте, строго ли равен результат
U
.источник
¥U¬®n pUlÃx
будет работать на 11 байтов;)F # - 92 символа
источник
Общий Лисп -
116102 персонажаотформатирован:
источник
Smalltalk -
10299 символовВ рабочей области отправьте
value:
с номером и распечатайте его.источник
C #, 117
источник
Haskell,
6866 байтИспользование:
источник