Prefisso divisibilità
Ispirazione
Dato un numero intero positivo \$1 \le n \le 9\$, restituisce tutto positivo \$n\$-digit integer \$i\$ per cui vale quanto segue:
- Ogni cifra da \$1\$a \$n\$appare esattamente una volta in \$i\$. Pertanto, \$i\$Le cifre di sono una permutazione delle cifre di \$1\$a \$n\$.
- \$i\$è divisibile per \$n\$
- Rimozione della cifra più a destra da \$i\$restituisce un altro intero \$i_{\text{trunc}(1)}\$che è divisibile per \$n-1\$
- Rimozione della cifra più a destra da \$i_{\text{trunc}(1)}\$restituisce un altro intero \$i_{\text{trunc}(2)}\$che è divisibile per \$n-2\$
- E così via, finché \$i_{\text{trunc}(n-1)}\$, che è divisibile per 1.
Ad esempio, per \$n = 3\$, uno di questi numeri interi è \$321\$, come \$321\$è divisibile per \$3\$, \$32\$di \$2\$e \$3\$ di 1.
Per \$n = 4, 5, 7\$, non esistono tali numeri interi. In questo caso, è possibile uscita qualche cosa che non può essere confuso con una possibile uscita (ad esempio 0, []nulla, etc.). Per \$n = 3, 6\$, puoi produrre i due numeri in qualsiasi formato in cui i due numeri siano chiaramente separati l'uno dall'altro.
Questo è il codice del golf, quindi vince il codice più breve in byte.
Se utilizzi un metodo di tabella di ricerca, i punti brownie \${}^\dagger\$ vengono assegnati se includi anche una versione che calcola l'output corretto.
\${}^\dagger\$I punti brownie possono o meno essere sotto forma di un voto positivo
Casi test
Questi casi sono esaustivi, quindi non riceverai mai (o dovrai gestire) un input non incluso qui.
n -> i
1 -> [1]
2 -> [12]
3 -> [123, 321]
4 -> []
5 -> []
6 -> [123654, 321654]
7 -> []
8 -> [38165472]
9 -> [381654729]
Risposte
05AB1E , 8 byte
LœJʒηāÖP
Provalo online!
Commentato :
L # push [1..n]
œ # push all permutations
J # join each permutation into a number
ʒ # filter those numbers on:
η # each prefix ...
Ö # ... is divisible ...
ā # ... by its index
P # take the product (all)
Python 2 , 68 byte
lambda n:[`s`[:n]for s in 321654,381654729,123654][380712>>n*2&3::2]
Provalo online!
Emette un elenco di stringhe.
71 byte
lambda n:[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729][n]
Provalo online!
Solo un noioso hardcode dritto. Restituisce un numero singolo o un elenco di due numeri o 0 per nessun output.
Nessuno degli altri metodi che ho provato sembrava essere più breve di questo. Ad esempio, un'idea è generare numeri come prefissi di un singolo numero, generando like 123654/10**(6-i).
Un metodo oggetto fornisce la stessa lunghezza. Sfortunatamente non possiamo usare il molto più breve .popperché rende la funzione non riutilizzabile perché modifica la lista ad ogni chiamata.
[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729].__getitem__
Provalo online!
Anche l'aliasing della costante più lunga fornisce la stessa lunghezza:
lambda n,c=381654729:[0,1,12,[123,321],0,0,[123654,321654],0,c/10,c][n]
Provalo online!
J , 42 37 byte
Calcola i numeri.
0({:#~0=[:+/#\|])@|:i.@!10&#.\@A.1+i.
Provalo online!
1+i.1… ni.@!…@A.tutte le possibili permutazioni di 1… n10&#.\converte ogni prefisso di una permutazione in un numero0(…)@|:trasporre la matrice e ...#\|]1… n mod i prefissi, es1 2 3 | 1 12 1230=[:+/somma il risultato; è 0?{:#~quindi prendi l'ultimo prefisso della permutazione (la permutazione stessa)
Scala, 81 80 byte
| =>1.to(|).mkString.permutations.filter{i=>1 to|forall(r=>i.take(r).toInt%r<1)}
Provalo in Scastie
Spiegazione:
| => //n, the input
1.to(|) //Range to n
.mkString //Turn it into a string
.permutations //Get all permutations
.filter{ i => //Filter them
1 to | forall(r => //For every r from 1 to n
i.take(r).toInt //The number made from i's first r digits
% r < 1 //Should be divisible by r
)
}
Carboncino , 25 byte
NθΦEXχθIι⬤…·¹θ›№ιIλ﹪I…ιλλ
Provalo online! Il collegamento è alla versione dettagliata del codice. Troppo lento per n>5TIO. Spiegazione:
Nθ
Input n.
ΦEXχθIι
Elenca tutti i numeri interi ifino a 10ⁿ, in modo tale che ...
⬤…·¹θ
... per ogni numero intero lda 1a n...
›№ιIλ﹪I…ιλλ
lè una cifra di ie il lprefisso del carattere di iè divisibile per l.
Versione a 28 byte leggermente più veloce:
NθΦEX⊕θθ⍘ι⊕θ⬤…·¹θ›№ιIλ﹪I…ιλλ
Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione: Genera le cifre in base n+1invece che in base 10, rendendo così possibile il completamento n=6su TIO.
La versione più veloce a 29 byte utilizzando una tabella di ricerca compressa:
§⪪”)‴a3HSGS⸿Dπ¬Z⦄O<ε≔<πUθ8”0N
Provalo online! Il collegamento è alla versione dettagliata del codice.
Wolfram Language (Mathematica) , 78 byte
(f=FromDigits)/@Select[Permutations@Range[s=#],f@#[[;;k]]~Mod~k~Sum~{k,s}<1&]&
Provalo online!
-8 byte da @att
Husk , 15 byte
mdföΛIṠz¦ŀmdḣPḣ
Provalo online!
Almos thte stessa come l'altra domanda, tranne con i parametri.
C (gcc) -lm, 67 101 96 byte
Aggiunti 34 byte per correggere un bug gentilmente segnalato da xnor .
Risparmiato 5 byte grazie a Ceilingcat !!!
f(n){write(1,"321654",n-3&&n-6?0:n);n=n<4?123/exp10(3-n):n>7?381654729/exp10(9-n):n-6?0:123654;}
Provalo online!
Soluzione basata sulla ricerca totale. Se ci sono due soluzioni: ne restituisce una stdoute restituisce l'altra. Se c'è una sola risposta, viene semplicemente restituita. Resi \$0\$ se non c'è risposta.
Round bonus per i punti brownie
C (gcc) , 232 212 byte
Risparmiato ben 20 byte grazie a Ceilingcat !!!
p;m;j;char b[9],c[9];d;i;f(n){for(d=0,i=n;i;)d+=9*d+i--;for(sprintf(c,"%d",d);d/++i;)if(sprintf(b,"%d",i),qsort(b,n,1,L"\xf06be0f\xd02917beǃ"),!strcmp(b,c)){for(p=0,m=n,j=i;j;j/=10)p|=j%m--;p||printf("%d ",i);}}
Provalo online!
Calcola i numeri corretti tramite il calcolo e li invia in output stdout. Non restituisce nulla se non c'è risposta. Timeout su TIO per \$n=9\$ma li fa tutti 3m36.499ssul mio laptop.
Gelatina , 11 10 byte
-1 grazie a caird coinheringaahing !
Questo è un metodo ingenuo, potrebbe essercene uno più conciso.
Œ!JḍḌƤẠƲƇḌ
Un collegamento monadico che accetta \$n\$che restituisce 0se non ne viene trovato nessuno o un elenco di numeri validi.
Provalo online! Oppure guarda la suite di test .
Come?
Œ!JḍḌƤẠƲƇḌ - Link: n
Œ! - all permutations of [1..n]
Ƈ - filter keep those (p for p in Œ!) for which:
Ʋ - last four links as a monad f(p):
J - range of length = [1..n]
Ƥ - apply to prefixes (of p):
Ḍ - un-decimal
ḍ - divides? (vectorises)
Ạ - all truthy?
Ḍ - un-decimal
Perl 5 , 64 byte
sub{grep"@_"==y///c,1,12,123,321,123654,321654,$x=38165472,$x.9}
Provalo online!
JavaScript (V8) , 97 byte
Una funzione ricorsiva che calcola e stampa gli interi corrispondenti.
f=(n,s='987654321'.slice(-n),d,p)=>p%d?0:s?[...s].map(v=>f(n,s.replace(v,''),-~d,[p]+v)):print(p)
Provalo online!
JavaScript (ES6), 59 byte
L'hard-coding è ovviamente più breve.
n=>[,1,12,[321,123],,,[321654,123654],,q=38165472,q+[9]][n]
Provalo online!
Wolfram Language (Mathematica) , 71 byte
f[s_:0,l_:0]=0!=##2&&l∣s&&If[l<#,##~f[10s+i,l+1]~i~Do~{i,#},Print@s]&
Provalo online!
Chiama come f[][n]. Stampa i risultati.
Excel, 64 byte
=CHOOSE(A1,1,12,"123,321",,,"123654,321654",,38165472,381654729)
L'input è in A1. La risposta hardcoded è più breve del calcolo.