Дизариум Дилемма
Дисариум определяется как число, чье:
сумма его цифр, приведенных в соответствие с их положением, равна исходному числу
Ваша задача :
У вас странная одержимость числами, классифицированными как дизариум. Необходимость следовать путям дисариума настолько велика в вас, что вы отказываетесь читать любые страницы, не пронумерованные дисарием, в любой книге. У вас есть две большие проблемы:
- Ваш профессор только что поручил вам читать ваш учебник со страницы
n
на страницуm
- На прошлой неделе вы сильно ударились головой и, похоже, не помните, как программно определить, считается ли число дисариумом.
Время имеет существенное значение, поэтому код для определения страниц, которые вам нужно будет прочитать, должен быть как можно короче.
Вы должны идентифицировать весь дисарий в пределах широкого диапазона до n
конца m
.
Примеры дизария :
89 = 8 1 + 9 2
135 = 1 1 + 3 2 + 5 3
518 = 5 1 + 1 2 + 8 3
Это код-гольф, поэтому выигрывает наименьшее количество байтов!
Вот полная последовательность A032799 .
n
иm
? Там очень большой дизарий (12157692622039623539), должны ли ответы быть в состоянии его идентифицировать?Ответы:
Perl 6 ,
4039 байтПопробуйте онлайн!
Как это работает
источник
Python2,
98898884 байтаКакой ужас. Будет короче.Начинаю выглядеть лучшеВот моя рекурсивная попытка (86 байт):
Спасибо @Rod за сохранение 4 байта!
range
кenumerate
и так далее.источник
enumerate
, вы можете использоватьint(n)
вместоint(`x`[p])
Perl, 43 байта
Попробуйте онлайн!
Regex действительно мощные, ребята.
объяснение
Первое, что делает код, это читает два целых числа как ввод через
<>
и создает диапазон от первого до второго с помощью..
. Затем он использует стандартнуюmap
функцию для перебора этого диапазона, и применяет следующий код для каждого значения:say if$_==eval s/./+$&**$+[0]/gr
. Это похоже на бред, и вроде как, но вот что на самом деле происходит.map
неявно сохраняет свое текущее значение в переменной$_
. Многие функции и операции perl используют это значение, если ни одна не указана. Это включает в себя регулярные выражения, такие какs///
оператор подстановки.Регулярное выражение подстановки состоит из четырех частей:
=~
используется для применения регулярного выражения к строке, но если этот оператор отсутствует, то регулярное выражение применяется к неявной переменной$_
, которая содержит наше текущее число черезmap
функцию..
. По сути, мы фиксируем каждую отдельную цифру.+
за которым следует математическое выражение, смешанное с некоторыми магическими переменными Perl, которые значительно упрощают все.Специальная скалярная переменная
$&
всегда содержит весь последний успешный захват регулярного выражения, который в данном случае представляет собой одну цифру. Специальная переменная массива@+
всегда содержит список смещений после последнего совпадения, т. Е. Индекс текста после совпадения.$+[0]
индекс в$_
тексте сразу после$&
. В случае135
мы фиксируем цифру1
, и индекс в135
тексте сразу после этого (а именно35
) равен 1, что является нашим показателем степени. Итак, мы хотим повысить$&
(1) до степени$+[0]
(1) и получить 1. Мы хотим повысить 3 до степени 2 и получить 9. Мы хотим повысить 5 до степени 3 и получить 125.Если вход был
135
, результирующая строка+1**1+3**2+5**3
./g
и/r
./g
говорит интерпретатору продолжить замены после того, как первый найден (в противном случае мы бы закончили+1**135
)./r
говорит интерпретатору не изменять исходную строку , а вместо этого возвращать, какой будет строка после замен. Это важно, потому что в противном случае он будет перезаписан$_
, и нам это нужно для сравнения.После полной замены мы получаем математическое выражение, которое оценивается
eval
функцией.+1**1+3**2+5**3
оценивается в1 + 9 + 125 = 135
, который сравнивается с исходным числом135
. Поскольку эти два равны, код печатает число.источник
map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
"@+"
на 1 байт короче$+[0]
:)JavaScript (ES7),
10591898883798281 байтСпасибо Arnauld за сохранение 20B и ETHProductions за сохранение 6B!
использование
Присвойте функцию переменной и дайте ей минимум и максимум в качестве аргументов. Пример:
Выход
Дальнейший гольф
Это кажется довольно удачным, но всегда есть возможности для улучшения ... Я думаю.
источник
d**(e+1)
чтобыd**-~e
спасти два байта.&
вместо&&
. Еще один байт идти ...JavaScript (Firefox 52+), 68 байт
Рекурсивная функция, которая выводит через
alert
. Работает в версии для разработчиков Firefox, которую вы можете скачать на этой странице . Предыдущие версии Firefox не поддерживают**
оператор, и никакой другой браузер не поддерживает[for(a of b)c]
синтаксис.Тестовый фрагмент
Это использует
.map
вместо понимания массива, иMath.pow
вместо**
, поэтому он должен работать во всех браузерах, которые поддерживают ES6.Показать фрагмент кода
источник
05AB1E , 12 байтов
Сохранено 2 байта благодаря Emigna
Попробуйте онлайн!
источник
ŸvygLySmOyQ—
должно работать на 12 байтов.Python 3, 100 байт
Не самый короткий подход, но довольно милый. Есть конечное число дизариев; см. страницу OEIS для хорошего доказательства. Это все из них.
источник
R, 100 байт
Безымянная функция, которая принимает
n
иm
. Как всегда в R, расщепление целых чисел на числовой цифровой вектор утомительно и отнимает много байтов. Это делает функцию относительно медленной и работает только для 32-битных целых чисел.источник
Желе , 11 байт
Попробуйте онлайн!
С 16 по 11, с некоторой помощью @miles!
Объяснение:
источник
J
чтобы получить индексы. Более короткий путь может быть ,D*J$S⁼
чтобы объединить две ссылки на одинCJam , 23 байта
Попробуйте онлайн!
объяснение
источник
05AB1E , 18 байт
Попробуйте онлайн!
источник
Python 2.X, 92 байта
источник
(i+1)
, но это не проблема, когда вы избавляетесь от скобок, выполняя-~i
.list('k')
, чего у меня нет. Тем не менее, вы все еще можете удалить пробелы :)Python 2 , 84 байта
Полный программный подход, в настоящее время такой же длины, что и лямбда-решение.
Попробуйте онлайн!
источник
input()
. Очень хорошо! +1.Japt, 15 байт
Проверьте это онлайн! Это было сотрудничество между @obarakon и мной.
Как это работает
В последней версии Japt
x
принимает функцию в качестве аргумента, которая позволяет нам обработать еще один байт:Проверьте это онлайн!
источник
Clojure, 107 байт
Реализация уравнения ужасно долго.
источник
(.pow(-(int v)48M)
TI-Basic, 85 байт
источник
int(log(
каждого числа, а затем сделать полномочия. Возможно, это короче, но я сомневаюсь в этом.FUNC
режиме, и окно должно быть настроено, чтобы включить вашу точку ввода. Не кажется достаточно портативным для меня.FUNC
режиме, хотя я вижу, что вы говорите о входном разрешении. Но этот метод довольно распространен в гольфе. Вы могли бы всегдаPrompt X,Y
вместо этого.Haskell, 61 байт
Пример использования
5 # 600
->[5,6,7,8,9,89,135,175,518,598]
.Проверьте каждое число
i
в диапазоне[n..m]
. Цифры извлекаются путем превращенияi
в строку (show
) и превращения каждого символа в строку из одного элемента (pure
), которая снова превращается в целое число (read
). Застегните эти числа с[1..]
помощью функции^
и возьмитеsum
.источник
PHP
929188 байт3 байта сохранены благодаря @AlexHowansky
принимает входные данные из аргументов командной строки; печатает запятую Беги с
-r
.источник
for([,$n,$m]=$argv;$n<=$m;
"$n"[index]
и"_$n"[index]
выдают ошибки синтаксического анализа,"89"[index]
и$s="$n";$s[index]
все в порядке.("_$n")[index]
Mathematica, 59 байт
Безымянная функция, принимающая два целочисленных аргумента и возвращающая список целых чисел.
(d=IntegerDigits@#)^Range@Length@d
выдает список цифр номера с соответствующими полномочиями;Tr[...]==#
определяет, равна ли сумма этих цифр-степеней исходному числу.источник
MATLAB,
8873 байтаОригинальный ответ:
num2str(n)-'0'
разбивает an
на вектор его цифр и1:floor(log10(n))+1
представляет собой вектор, содержащий единицу в количестве цифр вn
. Благодаря регистрации для гольфа до анонимной функции, экономя 15 байтов.источник
Хаскелл ,
82 7675 байтПопробуйте онлайн! Использование:
5 ! 175
Это проверяет каждое число в диапазоне
n
доm
узнать, является ли оно числом дизария, и, следовательно, является довольно медленным для большогоm
.Более быстрая версия: (93 байта)
Попробуйте онлайн!
источник
C (gcc) , 136 байтов
Заголовок, определяющий pow на TIO, потому что по какой-то причине он автоматически не включает pow. Мой компьютер сделал, так что я собираюсь катиться с этим.
Попробуйте онлайн!
источник
MATL , 16 байт
Попробуйте онлайн!
источник
Пакетный, 115 байт
Пакет имеет только 32-битную арифметику, которая не может сравнивать последнее число дизария, но если вы настаиваете на сравнении строк, то для 402 байтов:
источник
Python 2, 100 байт
У меня еще не было возможности запустить это (делая это на моем телефоне).
источник
sum
.i
строку на каждой итерации, где находится Disarium. Я понятия не имею, разрешено ли это, но я бы сказал нет, так как вывод становится очень пустым.Scala,
132129 байт129 Редактирование: Изменение для имени переменной передачи контура от
&
кi
сохраненным трех пространств.объяснение
Для каждого значения в диапазоне ввода:
+""
zipWithIndex
для создания списка кортежей, содержащих символ цифры и ее индексКомментарии
Наконец-то дошли руки до изучения как
fold
и какzipWithIndex
работать. Я недоволенint
обращениями, но я доволен краткостьюfold
иzipWithIndex
.источник
Октава,
8887 байтСпасибо MattWH за сохранение байта (f (x) -48 против f (x) - '0')
Бежать:
объяснение
источник
C
175169 байтБезголовая версия:
Можно как-то укоротить, но пока не вижу.
@TuukkaX Спасибо за сохранение 6 байтов.
источник
n!=0
могут быть изменены наn
.Джава
объяснение
источник
Python 3: 131 байт
После создания этого кода стало очевидным, что число дисариумов ограничено, поэтому было бы более целесообразно проверить их явно, а не использовать такое большое понимание списков, которое сложно использовать при больших затратах в этом решении.
Попробуйте онлайн!
источник