Я номер особи?


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як вхідного даних, виведіть коефіцієнт truthy, якщо xце власне число в базі 10, а значення фальси - в іншому випадку. Для уточнення значень правди та фальси зверніться до цього мета-повідомлення з цього приводу .

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

Це , тому чим коротше ваша відповідь (у байтах), тим краще!

Тестові справи

Truthy:

1
3
5
7
9
20
31
86
154
525

Фальсі:

2
4
6
8
10
15
21
50
100
500

Посилання в пісочниці

Табло лідерів

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

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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


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

Щоб не викликати більше плутанини, але я думаю, що ця дискусія має відношення до того, чому сталася якась плутанина. Будь ласка, врахуйте це під час майбутніх викликів, оскільки це може бути важко розміщувати мовами, які не мають if / else конструкції, якщо ви використовуєте старий консенсус.
FryAmTheEggman

@FryAmTheEggman Я не зрозумів, що консенсус змінився, я зараз відчуваю себе порожнім: / Все-таки я вже додав одне уточнення, здається, неправильне його змінити знову. Я просто маю це на увазі для наступного завдання, яке я опублікую. Спасибі
Sok

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;}
Невай


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
@Sok Я додав 3 нецікаві байти, щоб вирішити ваші проблеми.
Фаталізувати


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 байт завдяки Conor O'Brien

-2 байти завдяки ngn

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

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

Пояснення:

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

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

.,.&.": перетворити його у список цифр,

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

+ і додайте його до елемента

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


1
Я усвідомлюю, що це стара публікація, але "0 i.може бути "+i.(-1 байт).
Conor O'Brien

1
@ ConorO'Brien Дякую! Я думаю, я тоді не знав такого роду гольфів; зараз я його використовую (коли я згадую :))
Гален Іванов

1
-.@e.->$@-.
ngn

@ngn Дякую, дуже приємно!
Гален Іванов

1
@GalenIvanov також [:( )"+i.->( )"+@i.
ngn

2

Пітон 2, 70 66 байт

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

EDIT: -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, виводить істинно, або помилково.
  m - Позначення в межах [0 ... Q) зі змінною d.
     jdT - Перетворення d у базу 10.
    s - сума.
   + - І додай суму до d себе.
 / - Порахуйте випадки Q в результаті.
! - Негат. Неналежне виведення результату.

Я мав .AmnQ+dsjdT, про що не мав уявлення /. Я довго не використовував Pyth належним чином, здається! +1
Sok

@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 $_, map {$_+[+] .comb}, ^$_

Решта - це просто примус до булінгу та загортання в блок.

39 байт

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

Тест-посилання TIO, надане @Emigna

@nwellenhof зазначив, що використання грепу дозволить заощадити 6 байт!


1
Класне рішення! Ви можете додати посилання TIO для тестування.
Емінья




2

Japt -d! , 6 байт

N¥U+ìx

Спробуй це


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

Повертає вхідний номер для truthy або 0for falsey. Якби в 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

Стакс , 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

Pyt , 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

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