Я сам номер?


31

Само число (также называемое колумбийским или Devlali числом) представляет собой натуральное число, x, где уравнение n + <digit sum of n> = xне имеет решений для любого натурального числа n. Например, 21 не является собственным числом, как n = 15результат 15 + 1 + 5 = 21. С другой стороны, 20 является собственным числом, поскольку не nможет быть найдено, которое удовлетворяет такому равенству.

Поскольку это определение ссылается на сумму цифр, оно зависит от базы. Для целей этой задачи мы будем рассматривать только базовые 10 номеров, которые являются последовательностью A003052 в OEIS. Двоичные ( A010061 ) и базовые 100 ( A283002 ) собственные номера также были сопоставлены.

Соревнование

Если в xкачестве входных данных задано положительное целое число , выведите истинное значение if, xявляющееся собственным числом в базе 10, а значение false в противном случае. Для разъяснения истинных и ложных ценностей, обратитесь к этому мета-посту на эту тему .

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

Это , поэтому чем короче ваш ответ (в байтах), тем лучше!

Контрольные примеры

Truthy:

1
3
5
7
9
20
31
86
154
525

Falsey:

2
4
6
8
10
15
21
50
100
500

Песочница ссылка

Leaderboards

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

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

# Perl, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


Кажется, что есть некоторое обсуждение / несогласие с действительными результатами, так что я думаю, что я не был ясно о том, что я намеревался. Я добавил предложение, которое, надеюсь, прояснит ситуацию, ссылаясь на этот мета-пост . Извините, если я вызвал замешательство по этому поводу!
Сок

Не вызывать больше путаницы, но я думаю, что это обсуждение имеет отношение к тому, почему произошла некоторая путаница. Пожалуйста, учтите это при рассмотрении будущих задач, поскольку публикация на языках, которые не имеют конструкции if / else, может быть затруднительной, если вы используете старый консенсус.
FryAmTheEggman

@FryAmTheEggman Я не осознавал, что консенсус изменился, теперь я чувствую себя пустышкой: / Тем не менее, я уже добавил одно уточнение, кажется, что менять его снова неправильно. Я просто приму это к сведению в следующем сообщении. Спасибо
Сок

2
Я не какой-либо номер! Я свободный человек!
Дэвид Ричерби

1
@DavidRicherby * посылает белый шар за тобой *
Sok

Ответы:



7

Java (JDK 10) , 84 байта

i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}

Попробуйте онлайн!

объяснение

i->{                                    // IntPredicate
  for(int n=i;i-->1;)                   //  for each number below n
    i|=(                                //   keep the sign of
      (""+i).chars().map(x->x-48).sum() //    sum of digits
      +i                                //    plus the number
      ^n                                //    xor n (hoping for a zero)
     )-1>>-1;                           //    changing that into a negative number if equals to zero
  return~i<0;                           //  return i>=0
}

кредиты


1
-1 байт:n->{int i=n,r=0;for(;i-->0;)r=(""+i).chars().map(x->x-48).sum()+i==n?1:r;return r<1;}
Кевин Круйссен

2
84 байта:i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}
Nevay


5

Брахилог , 12 байт

¬{⟦∋Iẹ+;I+?}

Попробуйте онлайн!

объяснение

¬{         }    Fails if succeeds, suceeds if fails:
  ⟦∋I             I ∈ [0, ..., Input]
    Iẹ+           The sum of the elements (i.e. digits) of I...
       ;I+?       ... with I itself results in the Input

1
Является false.ли истинная ценность каким-либо объективным способом таким, каким это true.не является? Я, например, так не думаю, и похоже, что это будет поддержано мета-консенсусом
Sok

1
@ Так я добавил 3 неинтересных байта, чтобы решить ваши проблемы.
Fatalize


4

Октава , 49 47 44 байта

@(x)arrayfun(@(k)k+sum(num2str(k)-48)-x,1:x)

Попробуйте онлайн!

Объяснение:

Попытка выполнить операцию с диапазоном является громоздкой и длительной, поскольку num2strвозвращает строку с пробелами в качестве разделителей, если их больше, чем входное число. Следовательно, вычитание 48 даст что-то вроде: 1 -16 -16 2 -16 -16 3 -16 -16 4для диапазона ввода 1 ... 4 . Избавление от всех -16занимает много байтов.

Поэтому мы сделаем это с помощью цикла arrayfun. Для каждого из чисел k = 1 .. x , где x - это ввод, мы добавляем kи его сумму цифр, и вычитаем x. Это вернет массив с результатом этой операции для каждого из чисел в k . Если любое из чисел в массиве является нулем, число не является собственным числом.

Для входов 20и 21выходов:

20:  -18, -16, -14, -12, -10, -8, -6, -4, -2, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 2
21:  -19, -17, -15, -13, -11, -9, -7, -5, -3, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 1, 3

Есть только ненулевые элементы для ввода 20и по крайней мере один ненулевой элемент для ввода 21. Это означает, что 20это собственный номер, а 21не его.

Octave обрабатывает массив, по крайней мере, с одним нулем как ложный, что можно увидеть в TIO-ссылке.


4

MATL , 11 байт

t:tFYA!Xs+-

Выходными данными является непустой массив, который является правдивым, если все его записи отличны от нуля, и ложным, если он содержит один или несколько нулей.

Попробуйте онлайн! Или проверьте все контрольные примеры , включая проверку на достоверность / ложность.

объяснение

Рассмотрим ввод n = 10в качестве примера.

t       % Implicit input, n. Duplicate
        % STACK: 10, 10
:       % Range
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10]
t       % Duplicate
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 10]
FYA!    % Convert to base 10 digits and transpose
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [0 0 0 0 0 0 0 0 0 1
                                              1 2 3 4 5 6 7 8 9 0]
Xs      % Sum of each column
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 1]
+       % Add, element-wise
        % STACK: 10, [2 4 6 8 10 12 14 16 18 11]
-       % Subtract, element-wise
        % STACK: [8 6 4 2 0 -2 -4 -6 -8 -1]
        % Implicit display


3

Желе , 6 байт

ḟDS+Ɗ€

Для ввода n это возвращает [n], если n является собственным числом, [] если нет.

Попробуйте онлайн!

Как это работает

ḟDS+Ɗ€  Main link. Argument: n

     €  Call the link to the left for each k in [1, ..., n].
    Ɗ     Drei; combine the three links to the left into a monadic chain.
 D          Decimal; map k to the array of its digits in base 10.
  S         Take the sum.
   +        Add k to the sum of the k's digits.
ḟ       Filterfalse; promote n to [n], then remove all elements that appear in the
        array to the right.
        This returns [n] if the array doesn't contain n, [] if it does.

Какая кодировка упаковывает эти шесть символов только в шесть байтов?
WGroleau




3

J , 28, 24, 22 21 байт

-1 байт благодаря Конору О'Брайену

-2 байта благодаря ngn

$@-.(+1#.,.&.":)"+@i.

Попробуйте онлайн!

Объяснение:

i. список 0 .. н-1

( )"+ для каждого элемента в списке

.,.&.": преобразовать его в список цифр,

1# найти их сумму

+ и добавьте его в товар

$@-. исключить список из аргумента и найти форму


1
Я понимаю, что это старый пост, но "0 i.может быть "+i.(-1 байт).
Конор О'Брайен

1
@ ConorO'Brien Спасибо! Я думаю, что я тогда не знал такого рода гольфы; теперь я им пользуюсь (когда вспомню :))
Гален Иванов

1
-.@e.->$@-.
нг

@ngn Спасибо, очень мило!
Гален Иванов

1
@GalenIvanov также [:( )"+i.->( )"+@i.
нгн

2

Python 2, 70 66 байт

lambda x:[i for i in range(x)if i+sum([int(j)for j in`i`])==x]==[]

РЕДАКТИРОВАТЬ: -4 благодаря @ user56656


1
в python2 вы можете использовать `i`вместо того, str(i)чтобы сохранить 4 байта.
Пшеничный волшебник

@ user56656 спасибо, я не знал об этом
sonrad10

1
Вы можете бросить [и ]внутриsum
г-н Xcoder

lambda x:[i for i in range(x)if i+sum(map(int,`i`))==x]==[]
Б. Эклз

lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
Б. Эклс

2

Pyth , 8 байт

!/m+sjdT

Тестирование.

Если допускается замена значений «истина / ложь», мы можем отбросить !и получить вместо них 7 байтов. Одно из предложений Сока помогло мне сыграть в гольф 2 байта.

объяснение

! / m + sjdT - Полная программа. Принимает вход Q от STDIN, выводит либо True, либо False.
  m - Карта диапазона [0 ... Q) с переменной d.
     jdT - конвертировать d в базу 10.
    с - сумма.
   + - и добавить сумму к d сам.
 / - Считать вхождения Q в результате.
! - Отрицательно. Неявно выведите результат.

Я имел .AmnQ+dsjdT, я понятия не имел о /. Кажется, я давно не использовал Pyth правильно! +1
Сок

@Sok в /основном подсчитывает вхождения элемента в списке. Я также могу использовать }, который проверяет, появляется ли объект в списке, но я думаю, что это то же самое количество байтов.
г-н Xcoder

Я думаю, что Sэто не обязательно - входные данные будут положительным целым числом, поэтому наличие 0в списке отображения не будет проблемой? По крайней мере, кажется, что это работает для данных тестов.
Сок

@ Отлично, ты прав! Благодаря этому я сбрил еще один байт.
г-н Xcoder

Как +sjdTдобавить sjdTк d? Я никогда не видел ничего подобного
РК.

2

Perl 6 , 39 33 байта

{!grep $_,map {$_+[+] .comb},^$_}

Попробуйте!

Пустой блок с неявным единственным параметром, который называется так:

say {!grep $_,map {$_+[+] .comb},^$_}(500);
> False
say {!grep $_,map {$_+[+] .comb},^$_}(525);
> True

Поскольку n + digits(n) >= nмы можем просто вычислить колумбийское число для всех чисел до значения нашего запроса и посмотреть, совпадает ли какое-либо из них. Таким образом, это вычисляет колумбийское число для данного ввода:

{$_ + [+] .comb}

Который мы применяем ко всем значениям до нашей цели:

(^$_).map({$_+[+] .comb})

Но нас интересует только то, совпадает ли какое-либо из них, а не то, что это за значения, поэтому, как указал @nwellenhof, мы можем выполнить команду grep:

grep $_, map {$_+[+] .comb}, ^$_

Остальное - просто принуждение к булу и завертывание в блок.

39 байт

{!((^$_).map({$_+[+] .comb}).any==$_)}

Тестовая ссылка TIO предоставлена ​​@Emigna

@nwellenhof отметил, что использование grep сэкономит 6 байт!


1
Классное решение! Вы можете добавить ссылку TIO для тестирования.
Эминья

1
{!grep $_,map {$_+[+] .comb},^$_}для 33 байтов.
nwellnhof



2

Japt -d! , 6 байт

N¥U+ìx

Попытайся


Оригинал, 8 байт

Возвращает введенный номер для истины или 0фальси. Если бы в JavaScript был только пустой массив, то это могло бы быть 7 байтов.

ÂNkUÇ+ìx

Попытайся


объяснение

             :Implicit input of integer U
   UÇ        :Generate the range [0,U) and pass each Z through a function
      ì      :  Digits of Z
       x     :  Reduce by addition
     +       :  Add to Z
  k          :Remove the elements in that array
 N           :From the array of inputs
            :Bitwise NOT NOT (~~), casts an empty array to 0 or a single element array to an integer 

альтернатива

Ç+ìxÃe¦U

Попытайся

             :Implicit input of integer U
Ç            :Generate the range [0,U) and pass each Z through a function
  ì          :  Digits of Z
   x         :  Reduce by addition
 +           :  Add to Z
    Ã        :End function
     e       :Every
      ¦U     :  Does not equal U

1

Сетчатка , 55 байт

.+
*
Lv`_+
_+
$&$.&
^_+
$&¶$&
\d
*
Cms`^(_+)\b.*¶\1\b
0

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

.+
*

Преобразовать ввод xв унарный.

Lv`_+

Создайте диапазон от xвниз до 1.

_+
$&$.&

Добавьте суффикс десятичного значения каждого nк его унарному значению.

^_+
$&¶$&

Сделайте копию x.

\d
*

Преобразуйте каждую десятичную цифру nв унарную, добавляя тем самым цифры к существующей копии n.

Cms`^(_+)\b.*¶\1\b

Проверьте, xпоявляется ли какой-либо из результатов.

0

Инвертировать результат.






1

Сетчатка , 24 байта

.+
*

$.`¶$`
\d
*
D`
.\z

Попробуйте онлайн!

Может быть 18 байт с вводом в унарном формате, но другой ответ Retina также использует десятичную дробь, поэтому я подумал, что использование десятичной дроби сделает более справедливое сравнение.

объяснение

.+
*

Преобразовать ввод в унарный, используя _в качестве унарной цифры.


$.`¶$`

В каждой позиции в строке (то есть в начале, конце и между каждой парой символов) вставьте:, $.`длину префикса (или позицию совпадения с нулевым индексом), перевод строки $`, сам префикс (т.е. унарное представление позиции с нулевым индексом). Например, если вход был 3и у нас было бы унарное представление ___, то это привело бы к:

0
_1
__2
___3
___

Другими словами, мы получаем одну строку для каждого числа от 0 до ввода (включительно), которое содержит как унарное, так и десятичное представление этого числа.

\d
*

Мы конвертируем каждую цифру в унарную, которая эффективно вычисляет сумму цифр в каждой строке и добавляет ее к самому числу (все в унарной форме).

D`

Дублированные строки. Это на самом деле не удаляет повторяющиеся строки, а просто очищает их до пустых строк. Таким образом, если любое число от 0 до входа плюс его сумма цифр равно входу, последняя строка будет очищена. В противном случае последняя строка остается на месте.

.\z

Проверьте, есть ли еще символ в последней строке. Мы не можем использовать $, потому что это также совпадает с конечным переводом строки (это именно то, где мы не хотим смотреть).


1

Bash + GNU Coreutils, 91 байт

Возвращает правду или ложь.

e=1;for((i=1;i<=$1;i++));{ [ $(bc<<<`grep -o . <<<$i|tr '\n' +`$i) -eq $1 ]&&e=0; };exit $e

1

Котлин , 48 байтов

x->(1..x).all{v->"$v".sumBy{it.toInt()-48}+v!=x}

Попробуйте онлайн!

Объяснение:

(1..x)      // Range of numbers from 1 to x
.all{v->    // Function expression that checks if ALL values evaluate to tru
"$v"        // Convert the value into a string
.sumBy{it.toInt()-48} // For each character, get the ASCII char value, subtract 48 in order to get it back to the numerical value, and then sum it up
+v          // Add the original number
!=x}        // Ensure that it does not equal the input

1

Добавить ++ , 27 байт

D,g,@,BDB+A+BK=
L,RbUABkºg!

Попробуйте онлайн!

Как это работает

D,g,@,		; Create a monadic function 'g'
		; Example argument:		[15]
	BD	; Digits;		STACK = [[1 5]]
	B+	; Sum;			STACK = [6]
	A+	; Add argument;		STACK = [21]
	BK=	; Equals input;		STACK = [1]

L,		; Create a lambda function
		; Example argument:		[21]
	RbUABk	; Push range;		STACK = [1 2 3 ... 19 20 21]
	ºg	; Any true from 'g';	STACK = [1]
	!	; Logical NOT;		STACK = [0]


1

Stax , 8 байт

Å8avj╒Éπ

Запустите и отладьте его

объяснение

ASCII эквивалент:

{cE+|+x=f!
{       f     Filter [1..input] with block
 cE           Decimal digits of current value
   +|+        Sum of digits and the current value
      x=      Equals input
         !    Logical not, maps empty array to 1 and non-empty array to 0

fcE+|+x=является программой Stax, которая выводит все числа, чья сумма цифр, добавленных к себе, равна входу Например, для 101вывода будет 91и 100, каждый на отдельной строке.

Запустите и отладьте его


1

Пыть , 7 байт

ĐřĐŚ+∈¬

Попробуйте онлайн!

Если допускается обмен значениями «истина / ложь», то ¬в конце значение может быть отброшено на 6 байтов.

Объяснение:

        Implicit input
Đ       Duplicate input
ř       Get [1,2,...,input]
Đ       Duplicate the top of the stack
Ś       Get the sum of the digits of each element in the array
+       Add the top two items on the stack element-wise
∈       Is the input in the list?
¬       Negate the top of the stack
        Implicit print

1

J , 20 байт

#@-.i.+1#.10#.inv i.

Попробуйте онлайн!

                  i.     Range [0,n-1]
          10#.inv        To base 10
       1#.               Sum the digits
    i.+                  Plus the corresponding number
  -.                     Remove from the input, leaves an empty list if it was a self number.
#@                       An empty list is truthy, so return the length instead.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.