Математика, 42 байти
0!=##&@@d&&##&@@((d=IntegerDigits@#)∣#)&
Я думаю 0!=##&@@d&&##&@@
, це новий рівень читабельності для Mathematica ...
Пояснення
Деякі основні синтаксичні цукру, які використовуються тут:
&
має дуже низький пріоритет і перетворює все, що залишилося від нього, на неназвану функцію.
&&
просто And
оператор.
#
- це аргумент найближчої вкладеної неназваної функції.
##
є послідовністю всіх аргументів функції.
@
є позначення префікса для викликів функцій, тобто f@x == f[x]
.
@@
є Apply
, який передає елементи списку як окремі аргументи функції, тобто f@@{a,b,c} == f[a,b,c]
.
З цим не виходить ...
(d=IntegerDigits@#)
Це має бути досить зрозумілим: це дає нам список десяткових цифр введення та зберігає результат у d
.
(...∣#)
Це перевіряє вхід на подільність за кожною з його цифр (оскільки оператор поділення є Listable
). Це дає нам список True
s і False
s.
...&@@...
Застосовуємо функцію з лівої сторони до списку булевих, так що кожен булевий аргумент є окремим аргументом.
...&@@d
Ми застосовуємо іншу функцію до d
, так що окремі цифри подаються як окремі аргументи. Функція є 0!=##&
, тобто . Він перевіряє, чи всі цифри є чіткими (і що вони відрізняються від, але це задано викликом, і якби це не було, то все одно не було б дільником). насправді просто 1-байтова заставка на самому використанні , і вона працює, тому що є 1-байтовий елемент ( ), про який ми знаємо, що немає. Тож це перше, що перевіряє, чи є цифри унікальними. Назвемо цей результатUnequal[0, d1, d2, ...]
0
0!=##&
Unequal
0
U
...&&##
Знову ж таки, це справді просто скорочення And[U, ##]
. З ##
Будучи послідовності, окремі булеві від первісної перевірки подільності підставляються в And
, таким чином ми отримуємо , яка перевіряє , що обидві цифри є унікальними , і кожна цифра ділить вхід.And[U, d1∣n, d2∣n, ...]