Mathematica, 42 byte
0!=##&@@d&&##&@@((d=IntegerDigits@#)∣#)&
Penso che 0!=##&@@d&&##&@@
sia un nuovo basso livello di leggibilità per Mathematica ...
Spiegazione
Alcuni degli zuccheri sintattici di base usati qui:
&
ha una priorità molto bassa e trasforma tutto ciò che ne rimane in una funzione senza nome.
&&
è solo l' And
operatore.
#
è l'argomento della funzione anonima che racchiude più vicina.
##
è una sequenza di tutti gli argomenti della funzione.
@
è la notazione del prefisso per le chiamate di funzione, ad es f@x == f[x]
.
@@
è Apply
, che passa gli elementi di un elenco come singoli argomenti a una funzione, ad es f@@{a,b,c} == f[a,b,c]
.
Con quello fuori mano ...
(d=IntegerDigits@#)
Questo dovrebbe essere abbastanza autoesplicativo: questo ci dà un elenco delle cifre decimali dell'input e memorizza il risultato d
.
(...∣#)
Questo verifica l'input per la divisibilità per ciascuna delle sue cifre (perché l'operatore di divisibilità è Listable
). Questo ci dà un elenco di True
s e False
s.
...&@@...
Applichiamo la funzione sul lato sinistro all'elenco dei booleani, in modo tale che ogni booleano sia un argomento separato.
...&@@d
Applichiamo un'altra funzione a d
, in modo che le singole cifre siano fornite come argomenti separati. La funzione è 0!=##&
, ad es . Verifica che tutte le cifre siano distinte (e che siano distinte da ma ciò è dato dalla sfida, e se non lo fosse, non sarebbe comunque un divisore). è davvero solo un risparmiatore di 1 byte sull'uso di se stesso e funziona perché c'è un elemento di 1 byte ( ) che sappiamo che non è presente. Quindi questa prima cosa controlla che le cifre siano uniche. Chiamiamo questo risultatoUnequal[0, d1, d2, ...]
0
0!=##&
Unequal
0
U
...&&##
Ancora una volta, questa è davvero solo una scorciatoia per And[U, ##]
. Con ##
essendo una sequenza, i singoli booleani dal controllo divisibilità iniziale espandono nella And
, in modo da ottenere che controlli che entrambe le cifre sono unici e ogni cifra divide l'ingresso.And[U, d1∣n, d2∣n, ...]