Quanti numeri di Lynch-Bell ci sono?


19

Sfida

Dato un numero intero, ncome input where 36 >= n >= 2, genera quanti numeri di Lynch-Bell ci sono nella base n.

L'output deve essere nella base 10.

Numeri di Lynch-Bell

Un numero è un numero di Lynch-Bell se:

  • Tutte le sue cifre sono uniche (nessuna ripetizione di cifre)
  • Il numero è divisibile per ciascuna delle sue cifre
  • Non contiene zero come una delle sue cifre

Poiché, tutte le cifre devono essere univoche e in ogni base è presente un set finito di numeri a una cifra, esiste un numero finito di numeri Lynch-Bell.

Ad esempio, nella base 2 esiste un solo numero Lynch-Bell 1, poiché tutti gli altri numeri ripetono le cifre o contengono uno 0.

Esempi

Input > Output
2 > 1
3 > 2
4 > 6
5 > 10
6 > 10
7 > 75
8 > 144
9 > 487
10 > 548

Mathematica Online ha esaurito la memoria sopra la base 10. È possibile utilizzare il seguente codice per generare il proprio:

Do[Print[i," > ",Count[Join@@Permutations/@Rest@Subsets@Range[#-1],x_/;And@@(x\[Divides]FromDigits[x,#])]&[i]],{i,10,36,1}]

vincente

Vince il codice più breve in byte.


1
@MagicOctopusUrn Perché abbiamo bisogno di un dizionario? Non abbiamo bisogno di produrre in quella base.
user202729

2
potresti aggiungere un esempio >10?
Rod,

1
@JonathanAllan Capisco, l'ho chiarito ora
Decadimento della Beta

3
Se è necessario supportare solo [2-36], potremmo anche elencarli tutti.
Jonathan Allan,

3
Si scopre che nessuno è riuscito a calcolare f(36). Fare una sfida con il codice più veloce basato su questo sarebbe probabilmente interessante.
user202729

Risposte:


8

Gelatina , 13 byte

Q⁼g
*`Ṗ©bç"®S

Provalo online!

Un'altra soluzione O (n n ) .

Spiegazione

Q⁼g  Helper link. Input: digits (LHS), integer (RHS)
Q    Unique (digits)
 ⁼   Match
  g  GCD between each digit and the integer

*`Ṗ©bç"®S  Main link. Input: integer n
*`         Compute n^n
  Ṗ        Pop, forms the range [1, n^n-1]
   ©       Store previous result in register
    b      Convert each integer to base n
     ç"    Call the helper link, vectorized, with
       ®   The register's value
        S  Sum

16 byte ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³Se più veloce
miglia

5

Gelatina , 15 byte

*ḃ€’Q€Qḍḅ¥€⁸Ạ€S

Provalo online!

Complessità .O(nn)


5
Solo nel code-golf è una O(N^N)soluzione non solo accettabile, ma buona.
DJMcMayhem

5
@DJMcMayhem Meh, penso che possiamo pompare quei numeri e ottenereO(N↑↑N)
Decadimento Beta

Dovrebbe essere O(N^(N+1))perché controlla la validità di ogni numero generato prende O(N)? (Anche se non capisco Jelly)
user202729,

@ user202729 N + 1 è solo N in notazione big-O.
mbrig,

1
@mbrig Naturalmente capisco la notazione big-O, che ( N+1è in O(N)) non implica che N^(N+1)sia dentro O(N^N).
user202729,

3

Java, 222 212 190 byte

-10 byte grazie a Herman

-22 byte grazie a Kevin

import java.util.*;a->{int c=0,i=1;A:for(;i<Math.pow(a,a);i++){Set g=new HashSet();for(char b:a.toString(i).toCharArray())if(!g.add(b)|b<49||i%a.parseInt(b+"",a)>0)continue A;c++;}return c;}

Ungolfed:

a -> {
    int count = 0;
    OUTER:
    for (int i = 1; i < Math.pow(a, a); i++) {
        Set<Character> found = new HashSet<>();
        for (char b : Integer.toString(i, a).toCharArray()) {
            if (!found.add(b) || b == 48 || i % Integer.parseInt(b + "", a) != 0) {
                continue OUTER;
            }
        }
        count++;
    }
    return count;
}

Provalo online!

Diventa molto lento per grandi numeri.


-10 byte:a->{int c=0,i=1;A:for(;i<Math.pow(a,a);i++){java.util.Set<Character>g=new java.util.HashSet<>();for(char b:Long.toString(i,a).toCharArray())if(!g.add(b)|b<49||i%Long.parseLong(b+"",a)>0)continue A;c++;}return c;}
Herman L

Una delle prime volte che ho visto un'etichetta usata in una risposta codegolf
Justin l'

A:e continue A;sono 13 byte mentre {--c;break;}è 12. Ciò implicherebbe alcuni bug che non vedo?
JollyJoker,

Questo potrebbe valere la pena di una risposta separata, ma puoi scorrere le cifre nella base n per ogni essere di cifra i%ae i/=aper ogni ciclo. Puoi evitare il set usando int[]e controllando chex[b]++<2
JollyJoker,

java.util.Set<Character>‌​g=new java.util.HashSet<>();può essere import java.util.*;+ Set g=new HashSet();; Long.toStringpuò essere a.toString; e Long.parseLongpuò essere a.parseInt.
Kevin Cruijssen,

3

Perl 6 , 86 84 77 byte

-2 byte grazie a Ramillies

->\n{n-1+grep {.Set==$_&&.reduce(* *n+*)%%.all},map {|[X] (1..^n)xx$_},2..^n}

Provalo online!

Funziona per n = 8 su TIO.


1
Penso che puoi salvare 2 byte facendo .allinvece di all $_.
Ramillies,

2

In realtà , 24 byte

;╗DR⌠╜DR╨i⌡M⌠;╜@¿♀%ΣY⌡MΣ

Provalo online!

Spiegazione

Questo programma è composto da due parti principali: la generazione della permutazione e il test Lynch-Bell. Quindi, questa spiegazione esaminerà ciascuna parte separatamente, per una maggiore chiarezza.

Generazione di permutazioni

Input: n(un numero intero in [2, 36])

Output: tutte le permutazioni parziali e totali di [1, n-1](sequenze contenenti valori [1, n-1]senza ripetizione la cui lunghezza è in [1, n-1])

;╗DR⌠╜DR╨i⌡M
;╗            store a copy of n in register 0
  DR          range(1, n)
    ⌠╜DR╨i⌡M  do the following for each element k in range:
     ╜DR        range(1, n)
        ╨       k-permutations of [1, n-1]
         i      flatten

Test Lynch-Bell

Input: un elenco di nnumeri interi di base , rappresentati come elenchi di nnumeri base

Output: il numero di numeri Lynch-Bell nella base n

⌠;╜@¿♀%ΣY⌡MΣ
⌠;╜@¿♀%ΣY⌡M   for each base-n digit list a:
 ;╜             duplicate a, push n
   @¿           convert a from base-n to decimal
     ♀%         modulo a with each of its base-n digits
       Σ        sum
        Y       boolean negation (1 if all modulo results are 0, else 0)
           Σ  sum (count the 1s in the resultant list)

2

Mathematica, 82 79 76 byte

Count[Join@@Permutations/@Subsets@Range[#-1],x_/;x==x~FromDigits~#~GCD~x]-1&

Come si passa un numero in questo? (scusate, Mathematica è una novità per me)
Decadimento beta

Incollare la funzione (ad es. Nella sandbox Wolfram), quindi inserirla [<parameter>]. Con l' parameteressere un numero.
user202729

Puoi aggiungere un TIO o equivalente?
Shaggy,


1
F (5) ef (6) sono entrambi davvero 10? È strano ...
Magic Octopus Urn l'

1

05AB1E , 22 byte

mLIBε0KÙ}ÙvyIöySIö%O_O

Provalo online!

O_O era anche la mia faccia quando finalmente ha funzionato.

<ÝIBJ0Kæ¦Ù€œ˜ è più veloce del modo in cui utilizzo per generare i numeri nella risposta effettiva ma smette di funzionare in modo casuale per qualcosa di più grande di 7 (senza una ragione apparente?)

Spiegazione

mLIBε0KÙ}ÙvyIöySIö%O_O # (input = i)
m                      # Push i^i
 L                     # ...and get a range from one to this value
  IB                   # Map every element to their base i representation
    ε   }              # Map every element to ...
     0K                 # Itself without 0s
       Ù                # ...and only unique digits
         Ù             # Uniquify the resulting list
          v            # For each element...
           yIö          # Push it converted to base 10
              ySIö      # Push every digit of it converted to base 10 in a list
                  %     # Calculate the modulo for each digit
                   O    # Sum all results together
                    _   # Negate: Returns 0 for every positive number and 1 for 0
                     O  # Sum with the rest of the stack (Basically counting all Lynch-Bell-Numbers)
                       # Implicit print

Sono abbastanza sicuro che un approccio diverso può salvare più byte, ma nella soluzione corrente ε0KÙ}può essere quella 0м€Ùdi salvare un byte.
Kevin Cruijssen,

1

Perl 5, 80 76 byte (75 + -p)

$\+=!grep$_?$;%$_|$|{0,$_}++:1,@@until($@[$}++]+=1)%=$_ and++$;,$}=$}==$_}{

Abusare $;per divertimento e profitto. Timeout sugli ingressi> 8.

EDIT: -4 byte unendo i due loop.


1

Rubino , 80 65 byte

->n{(1..n**n).count{|i|(d=i.digits n)-[0]==d|d&&d.sum{|j|i%j}<1}}

Provalo online!

Grazie a GB per -15 byte.


Questo non funzionerà per n> 10 (a causa di "j.to_i")
GB

Buona cattura, peccato che scada molto prima :)
Kirill L.,

Comunque: potresti chiamare "cifre" passando la base come argomento e risparmiare molto: `-> n {(1..n ** n) .count {| i | (d = i.digits n) - [0] == d | d && d.sum? {| j | i% j} <0}} `
GB

Anzi, mi è assolutamente mancato che le cifre abbiano questo parametro. Ma vedo che l'hai pubblicato come una risposta separata e poi eliminato. Direi, vai avanti, mi hai battuto :)
Kirill L.,

Penso che la mia risposta sia troppo simile, è lo stesso approccio con un paio di scorciatoie, per lo più codice rubato.
GB

1

Japt -x , 25 19 byte

-6 byte grazie a Shaggy

pU õìU ËeDâ f myDìU

Provalo online!



O 19 byte con la -xbandiera.
Shaggy,

wow O_o, sono chiaramente terribile a golf japt
ASCII, solo il

Stai andando bene finora :) Ci vuole tempo per imparare un nuovo linguaggio, capire tutte le sue caratteristiche, trucchi e stranezze.
Shaggy,

@Shaggy, ma quando usi una nuova lingua tutte le volte che lo faccio, ci si dovrebbe aspettare che sarei più vicino all'ottimale di come il 25% XD
ASCII-solo il

0

Python 3 , 204 174 byte

lambda x,r=range,i=chain:sum(0**any(int(''.join(map(str,y)),x)%z for z in y)for y in i(*map(permutations,i(*[combinations(r(1,x),e)for e in r(x)]))))-1
from itertools import*

Provalo online!

Per ogni permutazione di ciascun elemento del powerset di intervallo (1, n) (nessuno zero, univoco), converti in stringa numerica in base n. Somma tutto ciò che è divisibile per ogni cifra, sottrai 1 a causa del powerset che genera il set vuoto.

-30 byte grazie a @ovs!




0

Haskell , 117 byte

f n=sum[1|x<-id=<<[mapM(\_->[1..n-1])[0..m]|m<-[0..n]],all(\y->[mod(sum(zipWith((*).(n^))[0..]x))y|c<-x,c==y]==[0])x]

Provalo online! Funziona su TIO fino a n=7prima del timeout.


0

Perl 5 , 108 + 1 ( -p) = 109 byte

while(@a<$_){$r=%k=@a=();for($t=++$i;$t;$t=int$t/$_){push@a,$t%$_}$r||=!$_||$i%$_||$k{$_}++for@a;$r||$\++}}{

Provalo online!

È un maiale. Non sono sicuro se farà più della base 8 su TIO senza timeout.


0

C # (compilatore interattivo Visual C #) , 144 byte

n=>{int j,i,p;for(j=i=0;i++<~0UL;){p=i;var a=new List<int>();for(;p>0;p/=n)a.Add(p%n);j+=a.All(c=>c>0&&i%c<1&a.Count(x=>x==c)<2)?1:0;}return j;}

Passa attraverso tutti i numeri da 0 a ulong.MaxValuee seleziona quelli che sono numeri Lynch-Bell nella base specificata. L'esecuzione richiede un'eternità, anche per 2, anche se se si imposta la ~0ULparte nel ciclo for su qualcosa di più piccolo, è possibile ottenere un output per input fino a 7 entro un minuto su TIO.

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.