Combien y a-t-il de numéros Lynch-Bell?

19

Défi

Étant donné un entier,, ncomme entrée où 36 >= n >= 2, sortez combien de nombres Lynch-Bell il y a dans la base n.

La sortie doit être en base 10.

Numéros de Lynch-Bell

Un numéro est un numéro de Lynch-Bell si:

  • Tous ses chiffres sont uniques (pas de répétition de chiffres)
  • Le nombre est divisible par chacun de ses chiffres
  • Il ne contient pas zéro comme l'un de ses chiffres

Étant donné que tous les chiffres doivent être uniques et que vous avez un ensemble fini de numéros à un chiffre dans chaque base, il existe un nombre fini de numéros Lynch-Bell.

Par exemple, dans la base 2, il n'y a qu'un seul numéro Lynch-Bell 1, car tous les autres numéros répètent des chiffres ou contiennent un 0.

Exemples

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

Mathematica Online a manqué de mémoire au-dessus de la base 10. Vous pouvez utiliser le code suivant pour générer le vôtre:

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

Gagnant

Le code le plus court en octets gagne.

Beta Decay
la source
1
@MagicOctopusUrn Pourquoi avons-nous besoin d'un dictionnaire? Nous n'avons pas besoin de sortir dans cette base.
user202729
2
pourriez-vous ajouter un exemple >10?
Rod
1
@JonathanAllan Je vois, je l'ai effacé maintenant
Beta Decay
3
Si seulement [2-36] doit être pris en charge, nous pouvons aussi bien les énumérer tous.
Jonathan Allan
3
Il s'avère que personne n'a réussi à calculer f(36). Faire un défi de code le plus rapide basé sur cela serait probablement intéressant.
user202729

Réponses:

8

Gelée , 13 octets

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

Essayez-le en ligne!

Une autre solution O (n n ) .

Explication

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
miles
la source
16 octets ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³Set plus rapide
miles
5

Gelée , 15 octets

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

Essayez-le en ligne!

Complexité .O(nn)

Leaky Nun
la source
5
Seul le code-golf est une O(N^N)solution non seulement acceptable, mais bonne.
DJMcMayhem
5
@DJMcMayhem Meh, je pense que nous pouvons augmenter ces chiffres et obtenirO(N↑↑N)
Beta Decay
Est-ce que cela devrait être O(N^(N+1))parce que la validité de chaque numéro généré doit être vérifiée O(N)? (bien que je ne comprenne pas Jelly)
user202729
@ user202729 N + 1 est juste N en notation big-O.
mbrig
1
@mbrig Bien sûr, je comprends la notation big-O, qui ( N+1est en O(N)) n'implique pas N^(N+1)est en O(N^N).
user202729
3

Java, 222 212 190 octets

-10 octets grâce à Herman

-22 octets grâce à 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;}

Non golfé:

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;
}

Essayez-le en ligne!

Obtient très lent pour les grands nombres.

Okx
la source
-10 octets: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
L'une des premières fois où j'ai vu une étiquette utilisée dans une réponse codegolf
Justin
A:et continue A;sont de 13 octets alors qu'il {--c;break;}est de 12. Est-ce que cela entraînerait un bug que je ne vois pas?
JollyJoker
Cela pourrait valoir une réponse distincte, mais vous pouvez parcourir les chiffres de la base n par chaque chiffre i%aet i/=aà chaque boucle. Vous pouvez éviter l'ensemble en utilisant un int[]et en vérifiant quex[b]++<2
JollyJoker
java.util.Set<Character>‌​g=new java.util.HashSet<>();peut être import java.util.*;+ Set g=new HashSet();; Long.toStringpeut être a.toString; et Long.parseLongpeut être a.parseInt.
Kevin Cruijssen du
3

Perl 6 , 86 84 77 octets

-2 octets grâce aux Ramillies

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

Essayez-le en ligne!

Fonctionne pour n = 8 sur TIO.

nwellnhof
la source
1
Je pense que vous pouvez économiser 2 octets en faisant .allau lieu de all $_.
Ramillies
2

En fait , 24 octets

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

Essayez-le en ligne!

Explication

Ce programme comprend deux parties principales: la génération de permutation et le test de Lynch-Bell. Ainsi, cette explication examinera chaque partie séparément, pour plus de clarté.

Génération de permutations

Entrée: n(un entier dans [2, 36])

Sortie: toutes les permutations partielles et totales de [1, n-1](séquences contenant des valeurs [1, n-1]sans répétition dont la longueur est en [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 de Lynch-Bell

Entrée: une liste d' nentiers de base , représentés sous forme de listes de nchiffres de base

Sortie: le nombre de numéros de Lynch-Bell en 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)
Mego
la source
2

Mathematica, 82 79 76 octets

Count[Join@@Permutations/@Subsets@Range[#-1],x_/;x==x~FromDigits~#~GCD~x]-1&
user202729
la source
Comment transmettez-vous un chiffre à cela? (désolé, Mathematica est nouveau pour moi)
Beta Decay
Collez la fonction (par exemple, dans le bac à sable Wolfram), puis placez-la [<parameter>]après. Avec parameterétant un nombre.
user202729
Pouvez-vous ajouter un TIO ou équivalent?
Shaggy
1
F (5) et f (6) sont-ils tous les deux vraiment 10? C'est étrange ...
Magic Octopus Urn
1

05AB1E , 22 octets

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

Essayez-le en ligne!

O_O était aussi mon visage quand cela a finalement fonctionné.

<ÝIBJ0Kæ¦Ù€œ˜ est plus rapide que la façon dont j'utilise pour générer les nombres dans la réponse réelle, mais cesse de fonctionner au hasard pour quelque chose de plus grand que 7 (sans raison apparente?)

Explication

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
Datboi
la source
Je suis à peu près sûr qu'une approche différente peut économiser plus d'octets, mais dans votre solution actuelle, vous ε0KÙ}pouvez 0м€Ùenregistrer un octet.
Kevin Cruijssen
1

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

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

Abuser $;pour le plaisir et le profit. Expiration des entrées> 8.

EDIT: -4 octets en fusionnant les deux boucles.

Grimmy
la source
1

Rubis , 80 65 octets

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

Essayez-le en ligne!

Merci à GB pour -15 octets.

Kirill L.
la source
Cela ne fonctionnera pas pour n> 10 (à cause de "j.to_i")
GB
Bonne prise, dommage qu'elle expire bien avant ça :)
Kirill L.
Quoi qu'il en soit: vous pouvez appeler des "chiffres" en passant la base comme argument et économiser beaucoup: `-> n {(1..n ** n) .count {| i | (d = i.digits n) - [0] == d | d && d.sum? {| j | i% j} <0}} `
GB
En effet, j'ai absolument manqué que les chiffres aient ce paramètre. Mais je vois que vous aviez posté cela comme une réponse distincte, puis supprimé. Je dirais, allez-y, vous m'avez battu :)
Kirill L.
Je pense que ma réponse est trop similaire, c'est la même approche avec quelques raccourcis, principalement du code volé.
GB
1

Japt -x , 25 19 octets

-6 octets grâce à Shaggy

pU õìU ËeDâ f myDìU

Essayez-le en ligne!

ASCII uniquement
la source
20 octets ?
Shaggy
Ou 19 octets avec le -xdrapeau.
Shaggy
wow O_o je suis clairement terrible au golf japt
ASCII uniquement
Vous vous débrouillez bien jusqu'ici :) Il faut du temps pour se familiariser avec un nouveau langage, comprendre toutes ses fonctionnalités, astuces et bizarreries.
Shaggy
@Shaggy mais quand vous utilisez une nouvelle langue aussi souvent que moi, il faut s'attendre à ce que je sois plus proche de l'optimale que comme 25% XD
ASCII uniquement
0

Python 3 , 204 174 octets

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*

Essayez-le en ligne!

Pour chaque permutation de chaque élément de l'ensemble de puissance de la plage (1, n) (pas de zéros, unique), convertissez en chaîne numérique en base n. Additionnez tout ce qui est divisible par chaque chiffre, soustrayez 1 en raison du jeu de puissance générant l'ensemble vide.

-30 octets grâce à @ovs!

Conner Johnston
la source
0

Haskell , 117 octets

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]

Essayez-le en ligne! Fonctionne sur TIO jusqu'à n=7avant expiration.

Laikoni
la source
0

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

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

Essayez-le en ligne!

C'est un cochon. Je ne sais pas s'il fera plus que la base 8 sur TIO sans expiration.

Xcali
la source
0

C # (Visual C # Interactive Compiler) , 144 octets

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;}

Parcourt tous les numéros de 0 à ulong.MaxValueet sélectionne ceux qui sont des numéros de Lynch-Bell dans la base spécifiée. Il faut une éternité pour fonctionner, même pour 2, bien que si vous définissez la ~0ULpartie de la boucle for sur quelque chose de plus petit, vous pouvez obtenir une sortie pour une entrée jusqu'à 7 en une minute sur TIO.

Essayez-le en ligne!

Incarnation de l'ignorance
la source