Wie viele Lynch-Bell-Nummern gibt es?

19

Herausforderung

Wenn Sie eine Ganzzahl angeben, geben Sie nals Eingabe wo aus 36 >= n >= 2, wie viele Lynch-Bell-Zahlen sich in der Basis befinden n.

Die Ausgabe muss in der Basis 10 sein.

Lynch-Bell-Nummern

Eine Zahl ist eine Lynch-Bell-Zahl, wenn:

  • Alle Ziffern sind eindeutig (keine Wiederholung von Ziffern)
  • Die Zahl ist durch jede Ziffer teilbar
  • Es enthält keine Null als eine seiner Ziffern

Da alle Ziffern eindeutig sein müssen und Sie in jeder Basis einen endlichen Satz einstelliger Zahlen haben, gibt es eine endliche Anzahl von Lynch-Bell-Zahlen.

Zum Beispiel in der Basis 2 gibt es nur einen Lynch-Bell - Nummer, 1da alle anderen Zahlen entweder wiederholen Ziffern oder eine 0 enthalten.

Beispiele

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

In Mathematica Online ist über Basis 10 kein Speicher mehr verfügbar. Mit dem folgenden Code können Sie Ihren eigenen generieren:

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

Gewinnen

Kürzester Code in Bytes gewinnt.

Beta-Zerfall
quelle
1
@MagicOctopusUrn Warum brauchen wir ein Wörterbuch? Wir müssen nicht in dieser Basis ausgeben.
user202729
2
könntest du ein Beispiel hinzufügen >10?
Rod
1
@ JonathanAllan Ich verstehe, ich habe das jetzt geklärt
Beta Decay
3
Wenn nur [2-36] unterstützt werden muss, können wir sie auch alle auflisten.
Jonathan Allan
3
Es stellt sich heraus, dass es niemand geschafft hat, zu berechnen f(36). Eine schnellstmögliche Code-Abfrage auf dieser Grundlage durchzuführen, wäre wahrscheinlich interessant.
user202729

Antworten:

8

Jelly , 13 Bytes

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

Probieren Sie es online!

Eine weitere O (n n ) -Lösung.

Erläuterung

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
Meilen
quelle
16 Bytes ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³Sund schneller
Meilen
5

Gelee , 15 Bytes

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

Probieren Sie es online!

Komplexität .O(nn)

Undichte Nonne
quelle
5
Nur im Code-Golf ist eine O(N^N)Lösung nicht nur akzeptabel, sondern auch gut.
DJMcMayhem
5
@DJMcMayhem Meh, ich denke wir können diese Zahlen aufpumpen und bekommenO(N↑↑N)
Beta Decay
Sollte es O(N^(N+1))daran liegen, die Gültigkeit jeder generierten Nummer zu überprüfen O(N)? (obwohl ich Jelly nicht verstehe)
user202729
@ user202729 N + 1 ist nur N in Big-O-Notation.
mbrig
1
@mbrig Natürlich verstehe ich die Big-O-Notation, die ( N+1in O(N)) nicht impliziert, N^(N+1)ist in O(N^N).
user202729
3

Java, 222 212 190 Bytes

-10 Bytes dank Herman

-22 Bytes dank 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;
}

Probieren Sie es online!

Wird bei großen Zahlen sehr langsam.

Okx
quelle
-10 Bytes: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
Eines der ersten Male habe ich ein Etikett gesehen, das in einer Codegolf-Antwort verwendet wurde
Justin,
A:und continue A;sind 13 Bytes, während {--c;break;}es 12 sind. Würde das einen Fehler auslösen, den ich nicht sehe?
JollyJoker
Dies mag eine separate Antwort wert sein, aber Sie können die Ziffern in der Basis n durchlaufen, indem Sie jede Ziffer als i%aund i/=aan jeder Schleife eingeben. Sie können den Satz vermeiden, indem Sie ein int[]und überprüfen, dassx[b]++<2
JollyJoker
java.util.Set<Character>‌​g=new java.util.HashSet<>();kann import java.util.*;+ sein Set g=new HashSet();; Long.toStringkann sein a.toString; und Long.parseLongkann sein a.parseInt.
Kevin Cruijssen
3

Perl 6 , 86 84 77 Bytes

-2 Bytes dank Ramillies

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

Probieren Sie es online!

Funktioniert für n = 8 auf TIO.

nwellnhof
quelle
1
Ich denke, Sie können 2 Bytes sparen, indem Sie tun, .allanstatt all $_.
Ramillies
2

Eigentlich 24 Bytes

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

Probieren Sie es online!

Erläuterung

Dieses Programm besteht aus zwei Hauptteilen: der Permutationsgenerierung und dem Lynch-Bell-Test. In dieser Erklärung wird daher zur besseren Übersichtlichkeit jeder Teil einzeln betrachtet.

Permutationen erzeugen

Eingabe: n(eine ganze Zahl in [2, 36])

Ausgabe: alle Teil- und Gesamtpermutationen von [1, n-1](Sequenzen mit Werten von [1, n-1]ohne Wiederholung, deren Länge in ist [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

Lynch-Bell-Test

Eingabe: Eine Liste von Basis- nGanzzahlen, dargestellt als Liste von Basis- nZiffern

Ausgabe: Die Anzahl der Lynch-Bell-Nummern in der Basis 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
quelle
2

Mathematica, 82 79 76 Bytes

Count[Join@@Permutations/@Subsets@Range[#-1],x_/;x==x~FromDigits~#~GCD~x]-1&
user202729
quelle
Wie geben Sie eine Nummer ein? (Sorry, Mathematica ist neu für mich)
Beta Decay
Fügen Sie die Funktion ein (z. B. in die Wolfram-Sandbox) und fügen Sie sie anschließend ein [<parameter>]. Mit parametereiner Nummer.
user202729
Können Sie einen TIO oder ein Äquivalent hinzufügen?
Shaggy
1
Sind f (5) und f (6) beide wirklich 10? Das ist seltsam ...
Magic Octopus Urn
1

05AB1E , 22 Bytes

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

Probieren Sie es online!

O_O war auch mein gesicht als dies endlich funktionierte.

<ÝIBJ0Kæ¦Ù€œ˜ ist schneller als die Art und Weise, wie ich die Zahlen in der eigentlichen Antwort erzeuge, funktioniert jedoch zufällig nicht mehr bei Werten über 7 (ohne ersichtlichen Grund?)

Erläuterung

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
quelle
Ich bin mir ziemlich sicher, dass ein anderer Ansatz mehr Bytes einsparen kann, aber in Ihrer aktuellen Lösung ε0KÙ}kann es sein 0м€Ù, ein Byte einzusparen.
Kevin Cruijssen
1

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

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

Missbrauch $;für Spaß und Gewinn. Zeitüberschreitung bei Eingängen> 8.

BEARBEITEN: -4 Bytes durch Zusammenführen der beiden Schleifen.

Grimmig
quelle
1

Ruby , 80 65 Bytes

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

Probieren Sie es online!

Vielen Dank an GB für -15 Bytes.

Kirill L.
quelle
Dies funktioniert nicht für n> 10 (wegen "j.to_i")
GB
Guter Fang, zu schade, dass es schon lange her ist :)
Kirill L.
Wie auch immer: Sie könnten "Ziffern" nennen, die die Basis als Argument übergeben und viel speichern: `-> n {(1.n ** n) .count {| i | (d = i.digits n) - [0] == d | d && d.sum? {| j | i% j} <0}} `
GB
In der Tat habe ich absolut vermisst, dass Ziffern diesen Parameter haben. Aber ich sehe, Sie hatten dies als separate Antwort gepostet und dann gelöscht. Ich würde sagen, mach weiter, du hast mich geschlagen :)
Kirill L.
Ich denke, meine Antwort ist zu ähnlich, es ist der gleiche Ansatz mit ein paar Verknüpfungen, meist gestohlenem Code.
GB,
1

Japt -x , 25 bis 19 Bytes

-6 Bytes dank Shaggy

pU õìU ËeDâ f myDìU

Probieren Sie es online!

Nur ASCII
quelle
20 Bytes ?
Shaggy
Oder 19 Bytes mit dem -xFlag.
Shaggy
wow O_o ich bin eindeutig schrecklich beim Golfspielen japt
ASCII
Du machst es soweit gut :) Es braucht Zeit, um sich mit einer neuen Sprache vertraut zu machen und all ihre Funktionen, Tricks und Macken herauszufinden.
Shaggy
@Shaggy aber wenn du so oft eine neue Sprache verwendest wie ich, ist zu erwarten, dass ich näher am Optimum bin als wie 25% XD
ASCII
0

Python 3 , 204 174 Bytes

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*

Probieren Sie es online!

Konvertieren Sie für jede Permutation jedes Elements des Potenzsatzes des Bereichs (1, n) (keine Nullen, eindeutig) in eine numerische Zeichenfolge zur Basis n. Addieren Sie alle durch jede Ziffer teilbaren Werte und subtrahieren Sie 1, da das Powerset das leere Set generiert.

-30 Bytes dank @ovs!

Conner Johnston
quelle
0

Haskell , 117 Bytes

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]

Probieren Sie es online! Funktioniert mit TIO bis zu einer n=7Zeitüberschreitung.

Laikoni
quelle
0

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

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

Probieren Sie es online!

Es ist ein Schwein. Ich bin mir nicht sicher, ob es mehr als Basis 8 für TIO ohne Zeitüberschreitung leisten wird.

Xcali
quelle
0

C # (Visual C # Interactive Compiler) , 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;}

Durchläuft alle Nummern von 0 bis ulong.MaxValueund wählt die Lynch-Bell-Nummern in der angegebenen Basis aus. Die Ausführung dauert ewig, auch für 2. Wenn Sie jedoch den ~0ULPart in der for-Schleife auf einen kleineren Wert setzen, können Sie auf TIO innerhalb einer Minute eine Ausgabe für eine Eingabe von bis zu 7 erhalten.

Probieren Sie es online!

Verkörperung der Ignoranz
quelle