Возьмите натуральное число X
. Это число является частью интересующей нас последовательности, если сумма всех цифр X
является делителем X
и если произведение всех цифр X
является делителем X
.
Например, 135
такое число, потому что 1 + 3 + 5 = 9
которое делит 135 = 9 * 15
и 1 * 3 * 5 = 15
которое тоже делит 135
.
Это последовательность A038186 в OEIS.
Ваша задача: дать целое число N
, вывести N
положительное целое число с такими свойствами.
Входы и выходы
Числа могут быть
0
индексированными или1
индексированными; Пожалуйста, укажите, какой из них использует ваш ответ.Входные данные могут быть приняты
STDIN
в качестве аргумента функции или чего-либо подобного.Вывод может быть распечатан
STDOUT
, возвращен из функции или чем-то подобным.
Контрольные примеры
Тестовые случаи, приведенные ниже, 1
индексируются.
Input Output
1 1
5 5
10 12
20 312
42 6912
50 11313
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
источник
0
.Ответы:
05AB1E ,
1312 байтСпасибо Emigna за сохранение байта!
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
µNNSONSP‚ÖP½
работает хорошо, не так ли?Пайк, 14 байт (неконкурентный) (1-индексированный)
Попробуй это здесь!
Боже мой, что много новых функций.
Из которых неконкурентоспособны
I
Исправлена ошибка, из- за которой он проверял только правдивость первого элемента в стеке.digits
- вернуть список цифр в номере@
используется для получения n-го элемента бесконечного спискаИз которых были использованы впервые:
Удалите последние 2 байта, чтобы получить все эти числа.
источник
C #, 118 байт
Полная программа с функцией ungolfed и контрольными примерами:
источник
for(int x=0,c=0;;)
экономит 1 байтЖеле , 13 байт
1 на основе.
TryItOnline!
Как?
источник
Perl 6 , 44 байта (0-проиндексирован)
Объяснение:
Бесконечные списки ftw!
источник
*
означало бы больше байтов.//0
вgrep
блоке.//0
потому что это обычно принято в codegolf для печати в stderr.//0
На самом деле , 20 байтов
Наивная реализация определения последовательности. Предложения по игре в гольф приветствуются! Попробуйте онлайн!
Ungolfing
источник
Медуза , 45 байт
Попробуйте онлайн!
объяснение
Это, безусловно, самая сложная (и самая длинная) программа, которую я когда-либо писал на «Медузах». Я понятия не имею, смогу ли я разобрать это понятным образом, но, думаю, мне придется попробовать.
Jellyfish предоставляет довольно общий оператор итерации
\
, который очень помогает в «поиске чего-то Nth ». Одна из его семантик - «итерация функции по значению, пока отдельная тестовая функция не даст что-то правдивое» (на самом деле тестовая функция получает как текущий, так и последний элемент, но мы только заставим его взглянуть на текущий элемент) , Мы можем использовать это для реализации функции «следующий действительный номер». Другая перегрузка\
- это «перебрать функцию по начальному значению N раз». Мы можем использовать нашу предыдущую функцию и повторять ее0
N раз, где N - это ввод. Все это настроено довольно кратко с этой частью кода:(Причины, по которым
0
фактический ввод в результирующую функцию закончился, немного сложны, и я не буду вдаваться в них здесь.)Проблема со всем этим в том, что мы не будем передавать текущее значение в тестовую функцию вручную.
\
Оператор сделает это за нас. Итак, теперь мы должны сконструировать единственную унарную функцию (с помощью композиций, хуков, вилок и карри), которая принимает число и сообщает нам, является ли оно действительным числом (т. Е. Делением на сумму, состоящую из цифр и цифр). Это довольно нетривиально, когда вы не можете ссылаться на аргумент. Когда-либо. Вот эта красотаЭто
(
унарный хук , который означает, что он вызывает функцию ниже (f
) на своем входе (текущее значениеx
), а затем передает их оба в тестовую функцию right (g
), то есть вычисляетg(f(x), x)
.В нашем случае
f(x)
это еще одна составная функция, которая получает пару с цифрой произведения и цифрой суммыx
. Это означаетg
, что функция будет иметь все три значения, чтобы проверить,x
является ли она действительной.Мы начнем с рассмотрения того, как
f
вычисляется сумма и цифра произведения. Этоf
:&
тоже композиция (но наоборот).~
каррирует, поэтому10~b
дает функцию, которая вычисляет десятичные цифры числа, и, поскольку мы передаем это&
справа, это первое, что произойдет с вводомx
. Остальная часть использует этот список цифр для вычисления их суммы и произведения.Чтобы вычислить сумму, мы можем сложить поверх нее сложение
/+
. Аналогично, чтобы вычислить произведение, мы складываем умножение на него/*
. Чтобы объединить оба этих результата в пару, мы используем пару хуков,(
и)
. Структура этого:(Где
f
иg
продукт и сумма, соответственно.) Давайте попробуем выяснить, почему это дает нам паруf(x)
иg(x)
. Обратите внимание, что правый хук)
имеет только один аргумент. В этом случае подразумевается, что другой аргумент;
свои аргументы в пару. Кроме того, хуки могут также использоваться в качестве бинарных функций (что будет иметь место здесь), и в этом случае они просто применяют внутреннюю функцию только к одному аргументу. Так что)
на самом деле на одну функциюg
дает функцию, которая вычисляет[x, g(y)]
. Используя это в левом хуке, вместе сf
, мы получаем[f(x), g(y)]
. Это, в свою очередь, используется в унарном контексте, что означает, что он на самом деле вызывается с,x == y
и поэтому мы получаем в соответствии с[f(x), g(x)]
требованиями. Уф.Это оставляет только одну вещь, которая была нашей предыдущей тестовой функцией
g
. Напомним, что это будет называтьсяg([p, s], x)
, гдеx
до сих пор текущее значение входного сигнала,p
является цифра продукта иs
является его цифра суммы. Этоg
:Для проверки делимости мы, очевидно, будем использовать модуль по модулю
|
в Jellyfish. Несколько необычно, что он берет свой правый операнд по модулю своего левого операнда, что означает, что аргументыg
уже находятся в правильном порядке (такие арифметические функции, как эта, автоматически перебирают списки, так что это вычислит два отдельных модуля бесплатно) , Наше число делится как на произведение, так и на сумму, если в результате получается пара нулей. Чтобы проверить, так ли это, мы рассматриваем пару как список цифр base-2 (d
). Результат этого равен нулю, только когда оба элемента пары равны нулю, поэтому мы можем отменить результат этого (N
), чтобы получить истинное значение для того, разделяют ли оба значения входные данные. Следует отметить , что|
,d
иN
просто все составлены вместе с парой&
с.К сожалению, это не полная история. Что если цифра продукта равна нулю? Деление и по модулю на ноль оба возвращают ноль в медузе. Хотя это может показаться странным соглашением, на самом деле оно оказывается несколько полезным (потому что нам не нужно проверять ноль перед выполнением по модулю). Однако это также означает, что мы можем получить ложный положительный результат, если сумма цифр делит входные данные, но произведение цифр равно нулю (например, ввод
10
).Мы можем исправить это, умножив наш результат делимости на произведение цифр (поэтому, если произведение цифр равно нулю, оно также превратит наше истинное значение в ноль). Оказывается, проще умножить результат делимости на пару продукта и суммы, а затем извлечь результат из продукта.
Чтобы умножить результат на пару, нам нужно вернуться к более раннему значению (паре). Это делается с помощью fork (
]
). Вилы как крючки на стероидах. Если вы дадите им две функцииf
иg
, они представляют двоичную функцию, которая вычисляетf(a, g(a, b))
. В нашем случаеa
это пара продукт / сумма,b
текущее входное значение,g
наш тест делимости иf
умножение. Так что все это вычисляется[p, s] * ([p, s] % x == [0, 0])
.Осталось только извлечь первое значение этого, которое является окончательным значением тестовой функции, используемой в итераторе. Это так же просто, как composing (
&
) форк с функцией head<
, которая возвращает первое значение списка.источник
R
132115 байтНовая версия благодаря @Billywob приятных комментариев!
Ungolfed:
Поскольку R ведет себя странно сNA
s, мне пришлось добавить всюifelse(is.na(...))
часть!Или использовать
na.omit(...)
источник
n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(!b%%sum(d)&ifelse(is.na((p=!b%%prod(d))),F,p))i=i+1};b
экономит несколько байтов с помощью:el(...)
вместо[[1]]
использованияc(b,"")
вместо , вместоpaste(b)
отрицания логических выражений,!
вместо==0
и пропуская фигурные скобки вif
операторе. Я предполагаю, что должен быть более простой способ решенияNA
проблемы, но не могу придумать что-нибудь умное.0
к выражению, вычисленному вif
выражении. Тем не менее, это возвращает предупреждение, когда продукт не равен0
.n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b
el(...)
!Брахилог , 22 байта
Попробуйте онлайн!
объяснение
источник
JavaScript (ES6), 78
Меньше гольфа
источник
Pyth, 18 байт
Попробуйте онлайн: демонстрация
Объяснение:
источник
JavaScript (ES6), 72 байта
демонстрация
Это имеет тенденцию быть медленным для более высоких значений, поэтому я ограничу его до 20 здесь.
Показать фрагмент кода
источник
Haskell,
94857271 байт1-индексироваться.
Спасибо @Zgarb за сохранение 13 байтов!
Спасибо @nimi за сохранение байта!
источник
(==)=<<map(gcd n)$[sum k,product k]
следует сохранить несколько байтов.[sum k,product k]
может бытьmap($read.pure<$>show n)[sum,product]
.([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
MATL , 21 байт
Долго и неэффективно ...
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6), 70 байт
Это оказалось немного похоже на ответ @ Arnauld, но рекурсия, видимо, на 2 байта короче. Работает в Chrome, хотя он очень медленный на входах больше 30 или около того (50 занимает 6 секунд).
источник
Python 2,
122110 байт1 проиндексирован, вам нужно использовать интерпретатор Python с довольно высоким пределом рекурсии.
источник
Чудо, 33 байта
Zero-индексироваться. Использование:
объяснение
Более читабельно:
В основном получает бесконечный список чисел, делимых на его цифровую сумму и произведение, фильтруя бесконечный список целых чисел через предикат. Затем этот
n
элемент просто выбирается из списка.источник
Юлия, 81 байт
Это анонимная функция, которая принимает целое число и возвращает целое число. Чтобы назвать это, дать ему имя. Подход очевиден: проверяйте каждое число, пока мы не встретимся с
n
членами последовательности.all
Проверка необходима , чтобы гарантировать , что мы не получаемDivisionError
от%
когда произведение цифр 0.Ungolfed:
Попробуйте онлайн! (включает все тестовые случаи)
источник
prod(d)
наp
или что - то , а затем заменяяall(d.>0)
сp>0
. И вы можете сохранить другую, перемещаяi%sum(d)
на другой стороне1
естьp<1>i%sum(d)
.С89,
381226195170169 байт1-индексированный (те же точные ответы, что и в задании).
Предполагает 4 байта (32 бита)
int
(большинство современных архитектур) .Я искренне верю, что это не может быть короче.
функция
int g (int)
выполняет утечку памяти и получает доступ к неинициализированной памяти один раз за вызов, но не вызывает ошибку и возвращает правильный номер.Полная программа, которая принимает входные данные в унарной
./prog $(seq 1 10)
форме (на 10) с разгрузкой (вроде)Старый ответ:
C99, 381 байт
Это, вероятно, может быть в гольф больше.
Полная программа:
источник
int
для всего, так как это целочисленный тип по умолчанию.C, 110 байтов
Ungolfed и использование:
источник
Python3,
13480 байтНовая версия благодаря Flp.Tkc
Новый код, я вспомнил способ игры в гольф, чтобы сделать факториалСам код не очень похож на гольф, больше похож на гольф грубой силыg (x) - это функция, которая возвращает True, если x соответствует критериям.
источник
<1
вместо==0
. Вам не нуженis True
оператор if, чтобы проверить, верно ли условие в любом случае. Вы можете использовать ярлык backtick для Python 2,str/repr
чтобы сбрить некоторые байты. Здесь также много ненужных пробелов.h+=g(str(k))
добавляет 1, если True, 0, если False.x
(backtick) в Python 2 - это то же самое,repr(x)
илиstr(x)
в Python 3 :)PHP, 96 байт
принимает
n
в качестве аргумента командной строки.Golfed
Ungolfed
источник
PowerShell v2 +, 84 байта
Итеративное решение. Принимает вход
$n
и входит вfor
цикл, если$n
он не равен нулю. Каждую итерацию мы вычитаем из$n
результата логического выражения, разбитого ниже:Таким образом, только если
$a%(sum)
и$a%(product)
являются одновременно равны нулю будет добавление также может быть равно нулю, и , следовательно , булева-не будет истинным и , следовательно ,$n
уменьшается.Когда мы выходим из цикла (т. Е. Достигаем n-го члена), мы просто помещаем его
$a
в конвейер, и вывод неявен.Примеры
Примечание. Это сбрасывает кучу ошибок «Попытка деления на ноль» в STDERR, которая по умолчанию игнорируется. Я явно добавил
2>$null
к примеру ниже, чтобы очистить вывод. Это также довольно медленно, как только он достигает примерно30
или около того, и50
занимает около 45 секунд на моей машине.источник
BASH, 125 байт
источник