Ile jest numerów Lynch-Bell?

19

Wyzwanie

Biorąc pod uwagę liczbę całkowitą, njako dane wejściowe 36 >= n >= 2, należy podać liczbę liczb Lynch-Bell w bazie n.

Wyjście musi znajdować się w bazie 10.

Numery Lynch-Bell

Liczba jest liczbą Lynch-Bell, jeśli:

  • Wszystkie jego cyfry są unikalne (bez powtarzania cyfr)
  • Liczba jest podzielna przez każdą z jej cyfr
  • Nie zawiera zera jako jednej z jego cyfr

Ponieważ wszystkie cyfry muszą być unikalne, a ty masz skończony zestaw liczb jednocyfrowych w każdej bazie, istnieje skończona liczba liczb Lynch-Bell.

Na przykład w bazie 2 jest tylko jeden numer Lynch-Bell 1, ponieważ wszystkie inne liczby albo powtarzają cyfry, albo zawierają 0.

Przykłady

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

Mathematica Online zabrakło pamięci powyżej podstawy 10. Możesz wygenerować własny kod za pomocą następującego kodu:

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

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Rozpad beta
źródło
1
@MagicOctopusUrn Dlaczego potrzebujemy słownika? Nie musimy generować danych w tej bazie.
user202729,
2
czy możesz dodać przykład >10?
Rod
1
@JonathanAllan Rozumiem, teraz to wyjaśniłem
Beta
3
Jeśli tylko [2-36] wymaga wsparcia, równie dobrze możemy wymienić je wszystkie.
Jonathan Allan,
3
Okazuje się, że nikomu się nie udało f(36). Podejmij wyzwanie najszybszego kodu w oparciu o to prawdopodobnie byłoby interesujące.
user202729,

Odpowiedzi:

8

Galaretka , 13 bajtów

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

Wypróbuj online!

Kolejne rozwiązanie O (n n ) .

Wyjaśnienie

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
mile
źródło
16 bajtów ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³Si szybciej
mile
5

Galaretka , 15 bajtów

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

Wypróbuj online!

Złożoność .O(nn)

Leaky Nun
źródło
5
Tylko w golfie kodowym jest O(N^N)rozwiązanie nie tylko do zaakceptowania, ale i dobre.
DJMcMayhem
5
@DJMcMayhem Meh, myślę, że możemy zwiększyć te liczby i zdobyćO(N↑↑N)
Beta Decay
Czy powinno tak być, O(N^(N+1))ponieważ sprawdza ważność każdej wygenerowanej liczby O(N)? (chociaż nie rozumiem Jelly)
user202729
@ user202729 N + 1 to tylko N w notacji wielkiej-O.
mbrig
1
@mbrig Oczywiście rozumiem notację wielkiej litery O, która ( N+1jest w środku O(N)) nie oznacza, że N^(N+1)jest w O(N^N).
user202729,
3

Java, 222 212 190 bajtów

-10 bajtów dzięki Hermanowi

-22 bajty dzięki Kevinowi

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

Nie golfowany:

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

Wypróbuj online!

Przy bardzo dużych liczbach działa bardzo wolno.

Okx
źródło
-10 bajtów: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
Jeden z pierwszych raz widziałem etykietę zastosowaną w odpowiedzi codegolfa
Justin
A:i continue A;ma 13 bajtów, podczas gdy {--c;break;}jest 12. Czy to poinstruuje jakiś błąd, którego nie widzę?
JollyJoker
Może to być warte osobnej odpowiedzi, ale możesz zapętlać cyfry w bazie n każdą cyfrą i%ai i/=akażdą pętlą. Możesz tego uniknąć, używając int[]i sprawdzając, żex[b]++<2
JollyJoker
java.util.Set<Character>‌​g=new java.util.HashSet<>();może być import java.util.*;+ Set g=new HashSet();; Long.toStringmoże być a.toString; iLong.parseLong może być a.parseInt.
Kevin Cruijssen
3

Perl 6 , 86 84 77 bajtów

-2 bajty dzięki Ramillies

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

Wypróbuj online!

Działa dla n = 8 na TIO.

nwellnhof
źródło
1
Myślę, że możesz zaoszczędzić 2 bajty, wykonując .allzamiast all $_.
Ramillies,
2

Właściwie 24 bajty

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

Wypróbuj online!

Wyjaśnienie

Program składa się z dwóch głównych części: generowania permutacji i testu Lynch-Bell. To objaśnienie obejrzy każdą część osobno, dla większej przejrzystości.

Generowanie permutacji

Dane wejściowe: n(liczba całkowita w[2, 36] )

Wyjście: wszystkie częściowe i całkowite permutacje [1, n-1](sekwencje zawierające wartości [1, n-1]bez powtórzeń, których długość jest w [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

Dane wejściowe: lista nliczb całkowitych podstawowych, reprezentowana jako listy liczb podstawowychn cyfr podstawowych

Dane wyjściowe: liczba liczb Lynch-Bell w bazie 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
źródło
2

Mathematica, 82 79 76 bajtów

Count[Join@@Permutations/@Subsets@Range[#-1],x_/;x==x~FromDigits~#~GCD~x]-1&
użytkownik202729
źródło
Jak przekazujesz do tego liczbę? (przepraszam, Mathematica jest dla mnie nowa)
Rozpad Beta
Wklej funkcję (np. Do piaskownicy Wolfram), a następnie umieść [<parameter>]po niej. Z parameterjest liczbą.
user202729,
Czy możesz dodać TIO lub ekwiwalent?
Shaggy
1
Czy oba f (5) i f (6) są naprawdę 10? To dziwne ...
Magic Octopus Urn
1

05AB1E , 22 bajty

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

Wypróbuj online!

O_O była też moja twarz, kiedy to w końcu zadziałało.

<ÝIBJ0Kæ¦Ù€œ˜ jest szybszy niż sposób, w jaki generuję liczby w rzeczywistej odpowiedzi, ale losowo przestaje działać dla czegoś większego niż 7 (bez wyraźnego powodu?)

Wyjaśnienie

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
źródło
Jestem prawie pewien, że inne podejście może zaoszczędzić więcej bajtów, ale w twoim obecnym rozwiązaniu ε0KÙ}może być 0м€Ùzapisanie bajtu.
Kevin Cruijssen
1

Perl 5, 80 76 bajtów (75+ -p)

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

Nadużywanie $;dla zabawy i zysków. Przekroczono limit czasu na wejściach> 8.

EDYCJA: -4 bajty poprzez połączenie dwóch pętli.

Ponury
źródło
1

Rubinowy , 80 65 bajtów

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

Wypróbuj online!

Dzięki GB za -15 bajtów.

Kirill L.
źródło
To nie zadziała dla n> 10 (z powodu „j.to_i”)
GB
Dobry połów, szkoda, że ​​upływa znacznie wcześniej :)
Kirill L.
W każdym razie: możesz wywołać „cyfry” przekazując bazę jako argument i zaoszczędzić dużo: `-> n {(1..n ** n) .count {| i | (d = i.digits n) - [0] == d | d && d.sum? {| j | i% j} <0}} `
GB
Rzeczywiście absolutnie mi brakowało, że cyfry mają ten parametr. Ale widzę, że przesłałeś to jako osobną odpowiedź, a następnie usunąłeś. Powiedziałbym, śmiało, pobiliście mnie :)
Kirill L.,
Myślę, że moja odpowiedź jest zbyt podobna, to samo podejście z kilkoma skrótami, głównie skradzionym kodem.
GB
1

Japt -x , 25 19 bajtów

-6 bajtów dzięki Shaggy

pU õìU ËeDâ f myDìU

Wypróbuj online!

Tylko ASCII
źródło
20 bajtów ?
Kudłaty
Lub 19 bajtów z -xflagą.
Kudłaty
wow O_o, jestem wyraźnie okropny podczas gry w golfa
tylko ASCII
Jak dotąd dobrze sobie radzisz :) Zajmuje trochę czasu zapoznanie się z nowym językiem, poznanie wszystkich jego funkcji, sztuczek i dziwactw.
Kudłaty
@ Shaggy, ale kiedy używasz nowego języka tak często, jak ja, należy się spodziewać, że będę bliżej optymalnego niż jak 25% XD
tylko ASCII
0

Python 3 , 204 174 bajty

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*

Wypróbuj online!

Dla każdej permutacji każdego elementu zestawu mocy z zakresu (1, n) (bez zer, unikatowe), przekonwertuj na ciąg liczbowy na bazę n. Zsumuj wszystkie, które są podzielne przez każdą cyfrę, odejmij 1 ze względu na wygenerowanie pustego zestawu przez powerset.

-30 bajtów dzięki @ovs!

Conner Johnston
źródło
0

Haskell , 117 bajtów

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]

Wypróbuj online! Działa na TIO n=7przed upływem limitu czasu.

Laikoni
źródło
0

Perl 5 , 108 + 1 ( -p) = 109 bajtów

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

Wypróbuj online!

To świnia Nie jestem pewien, czy zrobi więcej niż podstawa 8 na TIO bez przekroczenia limitu czasu.

Xcali
źródło
0

C # (interaktywny kompilator Visual C #) , 144 bajty

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

Przechodzi przez wszystkie liczby od 0 do ulong.MaxValue i wybiera te, które są liczbami Lynch-Bell w określonej bazie. Działa wiecznie, nawet dla 2, jeśli jednak ustawisz~0UL część w pętli for na coś mniejszego, możesz uzyskać wynik dla wejścia do 7 w ciągu minuty w TIO.

Wypróbuj online!

Wcielenie ignorancji
źródło