\ $n\$-идеальные числа
Положительное целое число \$x\$это \$n\$-совершенное число, если \$\sigma(x) = nx\$, где \$\sigma(x)\$- функция суммы делителей. Например, \$120\$это \$3\$-совершенное число, потому что сумма его делителей равна \$360\$:
$$360 = 3\times120 = 1+2+3+4+5+6+8+10+12+15+20+24+30+40+60+120$$
и
$$926073336514623897600 = 6\times154345556085770649600 = 1+2+3+4+5+6+7+8+9+10+11+12+\dots+51448518695256883200+77172778042885324800+154345556085770649600$$
так что \$154345556085770649600\$это \$6\$-совершенный номер.
Вы должны взять целое число \$x\$в качестве ввода и вывода значение \$n\$, такие что \$x\$это \$n\$-совершенный номер. Если таких \$n\$существует, вы можете вывести любое согласованное значение, не являющееся положительным целым числом. Вы никогда не получите ввод за пределами вашего языка, но ваш алгоритм должен работать для произвольно больших \$x\$.
Это кодовый гольф, поэтому побеждает самый короткий код в байтах.
Мини-испытание: пройти 5 байт в Jelly
Тестовые примеры
x -> n
1 -> 1
2 -> 0
3 -> 0
4 -> 0
5 -> 0
6 -> 2
28 -> 2
120 -> 3
496 -> 2
500 -> 0
672 -> 3
30240 -> 4
154345556085770649600 -> 6
Ответы
Шелуха , 4 байта
¦¹ΣḊ
Попробуйте онлайн!
Время ожидания последнего тестового примера истекло.
Объяснение
¦¹ΣḊ Input is a number x.
Ḋ List of divisors.
Σ Sum.
¦ Division if divisible, 0 if not
¹ by x.
¦ обычно это просто тест на делимость, но здесь полезно его возвращаемое значение.
Желе , 5 байт
R×iÆs
Попробуйте онлайн!
Пояснение:
- Explanation (sample for input 6)
R - Range ([1, 2, 3, 4, 5, 6])
× - Multiply by input ([6, 12, 18, 24, 30, 36])
Æs - Divisor sum (12)
i - Index of divisor sum in list, else 0 (2)
Брахилог , 6 байт
f+;?/ℕ
Попробуйте онлайн!
Как это устроено
f+;?/ℕ
f+ the sum of the factors
;?/ℕ divided by the input
ℕ is a natural number
Альтернативный вариант, думаю круче, но длиннее:
f+~×[?,.]∧
f+ the sum of the factors
~× unifies with the multiplication of
[?,.] the input and the output
∧ return the output
05AB1E ,
7
6 байт
Ý*IÑOk
Попробуйте онлайн!
Пояснение:
Ý*IÑOk>
Ý 0-Index inclusive range of input (6 -> [1, 2, 3, 4, 5, 6])
* Multiply by input ([6, 12, 18, 24, 30, 36])
IÑO Get input -> divisors -> sum (6 -> [1, 2, 3, 6] -> 12)
k 0-Index of divisor-sum in array or -1 if not found. ([6, >12<, 18, 24, 30, 36] -> 1)
Я просто воспользовался методом Сизифа. Это, вероятно, можно было бы проиграть или даже сделать более эффективным, но мне не хватает для этого знаний 05AB1E. Просто подумал, что попробую, чтобы скоротать время.
-1 байт благодаря ovs
C (gcc) , 47 байт
s,i;f(x){for(i=s=x;--i;)s+=x%i?0:i;s/=s%x*s+x;}
Попробуйте онлайн!
Возвращает nили 0.
APL (Dyalog Unicode) , 16 15 13 байт
Благодаря Bubbler за указание, я могу изменить выходной формат, чтобы сэкономить пару байтов.
⍸×∘⍳⍨=1⊥∘∪⊢∨⍳
Попробуйте онлайн!
Выводит одноэлементный список, nесли nсуществует, и пустой массив в противном случае. Находит индекс ( ⍸), где сумма ( 1⊥) делителей ( ∪⊢∨⍳) равна ( =) кратному входу ( ×∘⍳⍨). Я использую ⍸и =вместо того, ⍳чтобы просто найти индекс, потому что он возвращает пустой список, когда элемента нет, а не длину списка.
Пробел , 153 байта
[S S S N
_Push_0][S N
S _Duplicate_0][T N
T T _Read_STDIN_as_integer][T T T _Retrieve_input][S N
S _Duplicate_input][S N
S _Duplicate_input][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T S S T _Subtract][S N
S _Duplicate][N
T S S N
_If_0_Jump_to_Label_REACHED_ZERO][S T S S T S N
_Copy_0-based_2nd_input][S T S S T N
_Copy_0-based_1st_integer][T S T T _Modulo][N
T S T N
_If_0_Jump_to_Label_ADD_TO_SUM][N
S N
N
_Jump_to_Label_LOOP][N
S S T N
_Create_Label_ADD_TO_SUM][S N
T _Swap_top_two][S T S S T N
_Copy_0-based_1st_integer][T S S S _Add_top_two][S N
T _Swap_top_two][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_REACHED_ZERO][S N
N
_Discard_top][S N
S _Duplicate_top][S T S S T S N
_Copy_0-based_2nd_input][T S T T _Modulo][N
T S S S N
_If_0_Jump_to_Label_DIVISIBLE][S S S N
_Push_0][N
S N
S T
_Jump_to_Label_OUTPUT][N
S S S S N
_Create_Label_DIVISIBLE][S N
T _Swap_top_two][T S T S _Integer_divide_top_two][N
S S S T N
_Create_Label_OUTPUT][T N
S T _Output_as_integer]
Буквы S(пробел), T(табуляция) и N(новая строка) добавлены только для выделения.
[..._some_action]добавлено только в качестве пояснения.
Попробуйте онлайн (только с необработанными пробелами, табуляциями и новыми строками).
Объяснение в псевдокоде:
Integer input = STDIN as input
Integer sum = input
Integer i = input
Start LOOP:
i = i - 1
If(i == 0):
Jump to Label REACHED_ZERO
If(input % i == 0):
sum = sum + i
Go to next iteration of LOOP
Label REACHED_ZERO:
Integer output
If(sum % input == 0):
output = sum integer-divided by input
Else:
output = 0
Print output as integer to STDOUT
Пример выполнения: input = 6
Command Explanation Stack Heap STDIN STDOUT STDERR
SSSN Push 0 [0]
SNS Duplicate top (0) [0,0]
TNTT Read STDIN as integer [0] {0:6} 6
TTT Retrieve at address (0) [6] {0:6}
SNS Duplicate top (6) [6,6] {0:6}
SNS Duplicate top (6) [6,6,6] {0:6}
NSSN Create Label LOOP [6,6,6] {0:6}
SSSTN Push 1 [6,6,6,1] {0:6}
TSST Subtract top two (6-1) [6,6,5] {0:6}
SNS Duplicate top (5) [6,6,5,5] {0:6}
NTSSN If 0: Jump to Label REACHED_ZERO [6,6,5] {0:6}
STSSTSN Copy 0-based 2nd (6) [6,6,5,6] {0:6}
STSSTN Copy 0-based 1st (5) [6,6,5,6,5] {0:6}
TSTT Modulo top two (6%5) [6,6,5,1] {0:6}
NTSTN If 0: Jump to Label ADD_TO_SUM [6,6,5] {0:6}
NSNN Jump to Label LOOP [6,6,5] {0:6}
SSSTN Push 1 [6,6,5,1] {0:6}
TSST Subtract top two (5-1) [6,6,4] {0:6}
SNS Duplicate top (4) [6,6,4,4] {0:6}
NTSSN If 0: Jump to Label REACHED_ZERO [6,6,4] {0:6}
STSSTSN Copy 0-based 2nd (6) [6,6,4,6] {0:6}
STSSTN Copy 0-based 1st (4) [6,6,4,6,4] {0:6}
TSTT Modulo top two (6%4) [6,6,4,2] {0:6}
NTSTN If 0: Jump to Label ADD_TO_SUM [6,6,4] {0:6}
NSNN Jump to Label LOOP [6,6,4] {0:6}
SSSTN Push 1 [6,6,4,1] {0:6}
TSST Subtract top two (4-1) [6,6,3] {0:6}
SNS Duplicate top (3) [6,6,3,3] {0:6}
NTSSN If 0: Jump to Label REACHED_ZERO [6,6,3] {0:6}
STSSTSN Copy 0-based 2nd (6) [6,6,3,6] {0:6}
STSSTN Copy 0-based 1st (3) [6,6,3,6,3] {0:6}
TSTT Modulo top two (6%3) [6,6,3,0] {0:6}
NTSTN If 0: Jump to Label ADD_TO_SUM [6,6,3] {0:6}
NSSTN Create Label ADD_TO_SUM [6,6,3] {0:6}
SNT Swap top two [6,3,6] {0:6}
STSSTN Copy 0-based 1st (3) [6,3,6,3] {0:6}
TSSS Add top two (6+3) [6,3,9] {0:6}
SNT Swap top two [6,9,3] {0:6}
NSNN Jump to Label LOOP [6,9,3] {0:6}
SSSTN Push 1 [6,9,3,1] {0:6}
TSST Subtract top two (3-1) [6,9,2] {0:6}
SNS Duplicate top (2) [6,9,2,2] {0:6}
NTSSN If 0: Jump to Label REACHED_ZERO [6,9,2] {0:6}
STSSTSN Copy 0-based 2nd (6) [6,9,2,6] {0:6}
STSSTN Copy 0-based 1st (5) [6,9,2,6,2] {0:6}
TSTT Modulo top two (6%5) [6,9,2,0] {0:6}
NTSTN If 0: Jump to Label ADD_TO_SUM [6,9,2] {0:6}
SNT Swap top two [6,2,9] {0:6}
STSSTN Copy 0-based 1st (2) [6,2,9,2] {0:6}
TSSS Add top two (9+2) [6,2,11] {0:6}
SNT Swap top two [6,11,2] {0:6}
NSNN Jump to Label LOOP [6,11,2] {0:6}
SSSTN Push 1 [6,11,2,1] {0:6}
TSST Subtract top two (2-1) [6,11,1] {0:6}
SNS Duplicate top (1) [6,11,1,1] {0:6}
NTSSN If 0: Jump to Label REACHED_ZERO [6,11,1] {0:6}
STSSTSN Copy 0-based 2nd (6) [6,11,1,6] {0:6}
STSSTN Copy 0-based 1st (1) [6,11,1,6,1] {0:6}
TSTT Modulo top two (6%1) [6,11,1,0] {0:6}
NTSTN If 0: Jump to Label ADD_TO_SUM [6,11,1] {0:6}
SNT Swap top two [6,1,11] {0:6}
STSSTN Copy 0-based 1st (1) [6,1,11,1] {0:6}
TSSS Add top two (11+1) [6,1,12] {0:6}
SNT Swap top two [6,12,1] {0:6}
NSNN Jump to Label LOOP [6,12,1] {0:6}
SSSTN Push 1 [6,12,1,1] {0:6}
TSST Subtract top two (1-1) [6,12,0] {0:6}
SNS Duplicate top (1) [6,12,0,0] {0:6}
NTSSN If 0: Jump to Label REACHED_ZERO [6,12,0] {0:6}
NSSSN Create Label REACHED_ZERO [6,12,0] {0:6}
SNN Discard top (0) [6,12] {0:6}
SNS Duplicate top (12) [6,12,12] {0:6}
STSSTSN Copy 0-based 2nd (6) [6,12,12,6] {0:6}
TSTT Modulo top two (12%6) [6,12,0] {0:6}
NTSSSN If 0: Jump to Label DIVISIBLE [6,12] {0:6}
NSSSSN Create Label DIVISIBLE [6,12] {0:6}
SNT Swap top two [12,6] {0:6}
TSTS Integer-divide top two (12/6) [2] {0:6}
NSSSTN Create Label OUTPUT [2] {0:6}
TNST Output top as integer (2) [] {0:6} 2
error
Останавливается с ошибкой после печати результата, потому что выход не определен.
Pyth , 15 байт
&!%Jsf!%QTSQQ/J
Попробуйте онлайн!
Объяснение
&!%Jsf!%QTSQQ/J
J # set J to
s # sum of
f SQ # filtering the range [1, input] with
!%QT # lambda T: not (input % T) (divisibility test)
# implicit print the
& # short-circuiting and of
!%J Q # not (J % input)
/J # and J / input
JavaScript (ES6), 41 байт
Возвращает 0, если решения нет.
x=>(g=k=>x=k&&k*!(x%k)/x+g(k-1))(x)%1?0:x
Попробуйте онлайн!
Желе , 6 байт
Æs0:%?
Монадическая ссылка, принимающая положительное целое число, которое дает неотрицательное целое число.
Попробуйте онлайн! Или посмотрите набор тестов .
Как?
Æs0:%? - Link: x
Æs - divisor sum
? - if...
% - ...condition: has a remainder when divided
0 - ...then: zero
: - ...else: integeger divide
APL (Dyalog Unicode) , 19 18 байт
⊢(÷⍨×0=|)1⊥∘⍸0=⍳|⊢
Попробуйте онлайн!
Преобразование в поезд Джо Кинг. (- 3 байта)
-1 дополнительный байт от Джо Кинга после изменения условия проверки.
Старый ответ, 22 байта
{(⊢×⌊=⊢)⍵÷⍨+/⍸0=⍵|⍨⍳⍵}
Объяснение
{(⊢×⌊=⊢)⍵÷⍨+/⍸0=⍵|⍨⍳⍵} ⍵ → input
⍳⍵ range 1-⍵
⍵|⍨ mod ⍵
0= check which ones are divisors
⍸ get the indices (factors)
+/ sum the factors
⍵÷⍨ divide by ⍵
(⊢×⌊=⊢) Inner tacit fn:
⌊=⊢ Floor equals right? (integer test, returns 0 or 1)
⊢× times right
Haskell , 51 46 байт
a!b=0^mod a b*div a b
f n=sum(map(n!)[1..n])!n
Попробуйте онлайн!
Язык Wolfram Language (Mathematica) , 30 байт
Tr@Divisors@#/#/._Rational->0&
Попробуйте онлайн!
-6 байт от @att
Уголь , 23 20 байт
NθI⌕E⊕θ×θιΣΦ⊕θ∧ι¬﹪θι
Попробуйте онлайн! Ссылка на подробную версию кода. Порт алгоритма @Sisyphus, но с использованием комментария @vs для работы с 0-индексированием. Выходы -1для небытия. Пояснение:
Nθ Input `x` as a number
θ `x`
⊕ Incremented
Φ Filter over implicit range
ι Current index
∧ Logical AND
θ `x`
﹪ Modulo
ι Current index
¬ Logical NOT
Σ Take the sum
θ `x`
⊕ Incremented
E Map over implicit range
θ `x`
× Multiplied by
ι Current index
⌕ Find the index
I Cast to string
Implicitly print
К сожалению, для древесного угля сумма []не равна нулю, а это означает, что я не могу сохранить байт, удалив два приращения xи увеличив вместо этого результат.
Предыдущее 23-байтовое решение:
Nθ≔ΣΦ⊕θ∧ι¬﹪θιη¿¬﹪ηθI÷ηθ
Попробуйте онлайн! Ссылка на подробную версию кода. Пояснение:
Nθ
Вход x.
≔ΣΦ⊕θ∧ι¬﹪θιη
Создайте список 1..x, отфильтруйте числа, которые не делятся x, и возьмите сумму.
¿¬﹪ηθI÷ηθ
Если xсумма делится, выведите частное.
R , 42 41 39 байт
Изменить: -1 байт (и, вдохновленный этим, еще -2 байта) благодаря Робину Райдеру
function(x)(d=sum(1:x*!x%%1:x))/x*!d%%x
Попробуйте онлайн!
Прокомментировал:
perfect_n=
function(x)
(d= # d is the divisor sum, calculated as...
sum( # sum of...
1:x* # the values of 1..x that have...
! # zero values for...
x%%1:x) # x MOD 1..x
)
)/x # output d/x...
*!d%%x # but only if it's an integer
# (so d MOD x == 0)
Scala, 54 53 байта
x=>{val s=1 to x filter(x%_<1)sum;s/x*(1-(s%x).sign)}
Попробуй в Scastie
Суммирует каждый делитель xот 1 до x включительно. Если эта сумма делится на x, возвращается сумма, деленная на x, в противном случае возвращается 0.
Retina , 51 байт
.+
*
|""Lw`^(.+)(?=\1*$) ^ $-1;
L$`^(.+);(\1)+$
$#2
Попробуйте онлайн! Ссылка включает менее медленные тесты. Пояснение:
.+
*
Преобразуйте ввод в унарный.
|""Lw`^(.+)(?=\1*$)
Перечислите все факторы, не ограничивая их, таким образом суммируя их.
^
$-1;
Получить исходное унарное значение.
L$`^(.+);(\1)+$ $#2
Посчитайте, во сколько раз делится сумма. (Или ничего не выводите, если это не так.)
Октава , 36 34 байта
@(x)~mod(s=~mod(x,r=1:x)*r',x)*s/x
Анонимная функция, которая принимает на вход целое или плавающее число. Последний тестовый пример не выполняется из-за ограничений памяти.
Попробуйте онлайн! Или проверьте тестовые примеры .
Объяснение
@(x)~mod(s=~mod(x,r=1:x)*r',x)*s/x
@(x) % anonymous function with input x
1:x % row vector [1 2 ... x]
r= % call that r
mod(x, ) % x modulo [1 2 ... x]. Gives a row vector
~ % negate each element. Gives 1 for divisors
r' % column vector [1; 2; ... ; x]
* % matrix-multiply. Gives the sum of divisors
s= % call that s
mod( ,x) % sum of divisors modulo x
~ % negate. Gives 1 if x divides sum of divisors
s/x % sum of divisors divided by x
* % multiply
Python 3.8 (предварительная версия) , 62 байта
lambda x:(a:=sum(x/i*(x%i<1)for i in range(1,x+1)))%x<1and a/x
Попробуйте онлайн!
MathGolf , 7 байт
─Σk‼÷/*
Попробуйте онлайн.
Пояснение:
─ # Get the divisors of the (implicit) input-integer
Σ # Sum those divisors
k # Push the input-integer again
‼ # Apply the following two commands separately to the stack:
÷ # Check if the divisor-sum is divisible by the input (1 if truthy; 0 if falsey)
/ # Integer-divide the divisor-sum by the input
* # Multiply the two together
# (after which the entire stack joined together is output implicitly as result)
Rockstar , 141 135 131 байт
Если ничего не nсуществует, ничего не выводит.
listen to N
X's0
T's0
while N-X
let X be+1
let D be N/X
turn up D
let T be+D is N/X and X
let D be T/N
turn up D
if D is T/N
say D
Попробуйте здесь (необходимо вставить код)
Иконка , 67 байт
procedure f(n)
s:=0
n%(i:=1to n)=0&s+:=i&\z
return(0=s%n&s/n)|0
end
Попробуйте онлайн!
Japt -æ , 7 байт
Выводится, undefinedесли ничего nне найдено.
*N¶Îâ x
Попытайся
Фактор , 84 байта
: f ( n -- n ) dup [1,b] [ dupd mod 0 = ] filter sum swap /mod 0 > [ drop 0 ] when ;
Попробуйте онлайн!
Пролог, 117 байт
s(X,D,S):-D<1,!,S is 0;E is D-1,(0 is X mod D,!,s(X,E,T),S is T+D;s(X,E,S)).
f(X,N):-s(X,X,S),0 is S mod X,N is S//X.
Попробуйте онлайн! (Пожалуйста, не изменяйте его напрямую, это изменит и мою версию)
Если бы кто-нибудь мог понять, почему эта более короткая версия (96 байт) не работает, я был бы очень благодарен.
s(X,D,S):-D<1,!,S is 0;E is D-1,(0 is X mod D,!,s(X,E,T),S is T+D;s(X,E,S)).
f(X,N):-s(X,X,N*X).
Версия с отладкой печати
GolfScript , 22 байта
~:x),{.x\%!*+}*.x%!*x/
Попробуйте онлайн!
~:x # Store the input in x
), # Make an array from 0 to x
{ }* # For each number in the array, execute this block
. # Copy current number
x\%! # The copy becomes 1 if it is a divisor of x and 0 if it isn't
*+ # Multiply and add
. # Copy the sum of the divisors
x%! # The copy becomes 1 if it is a divisor of x and 0 if it isn't
* # Multiply
x/ # Divide by x