Prefisso divisibilità

Nov 02 2020

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

5 ovs Nov 02 2020 at 19:28

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)
5 xnor Nov 02 2020 at 21:12

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!

4 xash Nov 02 2020 at 18:43

J , 42 37 byte

Calcola i numeri.

0({:#~0=[:+/#\|])@|:i.@!10&#.\@A.1+i.

Provalo online!

  • 1+i. 1… n
  • i.@!…@A. tutte le possibili permutazioni di 1… n
  • 10&#.\ converte ogni prefisso di una permutazione in un numero
  • 0(…)@|: trasporre la matrice e ...
  • #\|] 1… n mod i prefissi, es 1 2 3 | 1 12 123
  • 0=[:+/somma il risultato; è 0?
  • {:#~ quindi prendi l'ultimo prefisso della permutazione (la permutazione stessa)
3 user Nov 02 2020 at 22:36

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
      )
    }
2 Neil Nov 02 2020 at 19:50

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.

2 J42161217 Nov 02 2020 at 18:38

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

2 Razetime Nov 03 2020 at 03:47

Husk , 15 byte

mdföΛIṠz¦ŀmdḣPḣ

Provalo online!

Almos thte stessa come l'altra domanda, tranne con i parametri.

2 Noodle9 Nov 02 2020 at 18:44

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.

2 JonathanAllan Nov 02 2020 at 18:44

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
1 KjetilS. Nov 02 2020 at 20:41

Perl 5 , 64 byte

sub{grep"@_"==y///c,1,12,123,321,123654,321654,$x=38165472,$x.9}

Provalo online!

1 Arnauld Nov 02 2020 at 22:55

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!

att Nov 03 2020 at 02:48

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.

EngineerToast Nov 03 2020 at 13:32

Excel, 64 byte

=CHOOSE(A1,1,12,"123,321",,,"123654,321654",,38165472,381654729)

L'input è in A1. La risposta hardcoded è più breve del calcolo.