Mathematica, 42 bytes
0!=##&@@d&&##&@@((d=IntegerDigits@#)∣#)&
Eu acho que 0!=##&@@d&&##&@@
é uma nova baixa legibilidade para o Mathematica ...
Explicação
Alguns dos açúcares sintáticos básicos usados aqui:
&
tem precedência muito baixa e transforma tudo o que resta dele em uma função sem nome.
&&
é apenas o And
operador.
#
é o argumento da função sem nome que o encerra mais próxima.
##
é uma sequência de todos os argumentos da função.
@
é uma notação de prefixo para chamadas de função, ie f@x == f[x]
.
@@
é Apply
, que passa os elementos de uma lista como argumentos individuais para uma função, ie f@@{a,b,c} == f[a,b,c]
.
Com isso fora do caminho ...
(d=IntegerDigits@#)
Isso deve ser bastante auto-explicativo: isso nos fornece uma lista dos dígitos decimais da entrada e armazena o resultado d
.
(...∣#)
Isso testa a entrada quanto à divisibilidade de cada um de seus dígitos (porque o operador de divisibilidade é Listable
). Isso nos dá uma lista de True
s e False
s.
...&@@...
Aplicamos a função no lado esquerdo à lista de booleanos, de modo que cada booleano seja um argumento separado.
...&@@d
Aplicamos outra função a d
, para que os dígitos individuais sejam dados como argumentos separados. A função é 0!=##&
, ie . Ele verifica se todos os dígitos são distintos (e que são distintos, mas isso é dado pelo desafio e, se não fosse, não seria um divisor de qualquer maneira). é realmente apenas uma economia de 1 byte no uso de si mesmo, e funciona porque há um elemento de 1 byte ( ) que sabemos que não está presente. Portanto, essa primeira coisa verifica se os dígitos são únicos. Vamos chamar esse resultadoUnequal[0, d1, d2, ...]
0
0!=##&
Unequal
0
U
...&&##
Novamente, isso é realmente apenas uma abreviação para And[U, ##]
. Com ##
sendo uma sequência, as booleans individuais a partir da verificação inicial divisibilidade são expandidos para o And
, então temos que verifica que ambos os dígitos são únicas e cada dígito divide a entrada.And[U, d1∣n, d2∣n, ...]