Kaç tane Lynch-Bell sayısı var?


19

Meydan okuma

Bir tamsayı verildiğinde n, girdi 36 >= n >= 2olarak, bazda kaç Lynch-Bell sayısının çıktısını verir n.

Çıktı 10 bazında olmalıdır.

Lynch-Bell Numaraları

Bir sayı, aşağıdaki durumlarda Lynch-Bell sayılarıdır:

  • Tüm basamakları benzersizdir (basamakların tekrarı yoktur)
  • Sayı, basamaklarının her biri ile bölünebilir
  • Rakamlarından biri olarak sıfır içermez

Tüm rakamların benzersiz olması gerektiğinden ve her bir tabanda sınırlı sayıda tek haneli sayı bulunduğundan, sınırlı sayıda Lynch-Bell sayısı vardır.

Örneğin, baz 2'de sadece bir Lynch-Bell numarası vardır 1, çünkü diğer tüm sayılar ya rakamları tekrarlar ya da 0 içerir.

Örnekler

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

Mathematica Online, taban 10'un üstündeki belleği tüketti. Kendi kodunuzu oluşturmak için aşağıdaki kodu kullanabilirsiniz:

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

Kazanan

Bayt cinsinden en kısa kod kazanır.


1
@MagicOctopusUrn Neden bir sözlüğe ihtiyacımız var? Bu üssün çıktısını almamız gerekmiyor.
— user202729

2
bir örnek ekleyebilir misiniz >10?
— Rod

1
@JonathanAllan Anlıyorum, şimdi temizledim
— Beta Decay

3
Yalnızca [2-36] desteklenmesi gerekiyorsa, hepsini de listeleyebiliriz.
— Jonathan Allan

3
Kimsenin hesaplamayı başaramadığı ortaya çıkıyor f(36). Buna dayanarak en hızlı kod meydan okuma muhtemelen ilginç olurdu.
— user202729

Yanıtlar:


8

Jöle , 13 bayt

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

Çevrimiçi deneyin!

Başka bir O (n n ) çözeltisi.

açıklama

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 bayt ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³Sve daha hızlı
— mil

5

Jöle , 15 bayt

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

Çevrimiçi deneyin!

Karmaşıklık .O(nn)


5
Sadece kod-golf O(N^N)sadece kabul edilebilir değil, aynı zamanda iyi bir çözümdür.
— DJMcMayhem

5
@MDJMcMayhem Meh, sanırım bu sayıları artırabilir ve alabilirizO(N↑↑N)
— Beta Decay

Bunun O(N^(N+1))sebebi, üretilen her numaranın geçerliliğini kontrol etmesi O(N)mi? (
— Jelly'i

@ user202729 N + 1, büyük O gösterimlerinde yalnızca N'dir.
— mbrig

1
ki (ben büyük-O notasyonu anlaşılması Tabii @mbrig N+1içindedir O(N)) ima etmez N^(N+1)içindedir O(N^N).
— user202729

3

Java, 222 212 190 bayt

Herman sayesinde -10 bayt

Kevin sayesinde -22 bayt

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

Çevrimiçi deneyin!

Büyük sayılar için çok yavaş olur.


-10 bayt: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

İlk kez bir codegolf cevabında kullanılan bir etiket gördüm
— Justin

A:ve continue A;13 bayt ise {--c;break;}12'dir. Bu görmediğim bir hata getirir mi?
— JollyJoker

Bu ayrı bir yanıta değer olabilir, ancak her n basamağında i%ave i/=aher döngüde n tabanındaki rakamlar arasında döngü yapabilirsiniz. Bir kullanarak int[]ve kontrol ederek seti kaçınabilirsinizx[b]++<2
— JollyJoker

java.util.Set<Character>‌​g=new java.util.HashSet<>();import java.util.*;+ olabilir Set g=new HashSet();; Long.toStringolabilir a.toString; ve Long.parseLongolabilir a.parseInt.
— Kevin Cruijssen

3

Perl 6 , 86 84 77 bayt

Ramillies sayesinde -2 bayt

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

Çevrimiçi deneyin!

TIO'da n = 8 için çalışır.


1
Sanırım .allyerine 2 bayt tasarruf edebilirsiniz all $_.
— Ramillies

2

Aslında 24 bayt

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

Çevrimiçi deneyin!

açıklama

Bu program iki ana bölümden oluşur: permütasyon üretimi ve Lynch-Bell testi. Böylece, bu açıklama daha fazla netlik için her bir parçaya ayrı ayrı bakacaktır.

Permütasyon Oluşturma

Girdi: n(tamsayı girişi [2, 36])

Çıktı: tüm kısmi ve toplam permütasyonları [1, n-1]( [1, n-1]uzunluğu olmayan tekrarsız değerleri içeren sekanslar [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 Testi

Girdi: base listesi ntamsayılar, baz- listeleri olarak temsil nbasamak

Çıktı: bazdaki Lynch-Bell sayılarının sayısı 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 bayt

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

Buna nasıl bir numara veriyorsunuz? (üzgünüm, Mathematica benim için yeni)
— Beta Çürümesi

İşlevi yapıştırın (örneğin, Wolfram korumalı alanına) ve ardından koyun [<parameter>]. İle parameterbir numara olmak.
— user202729

Bir TIO veya eşdeğeri ekleyebilir misiniz?
— Shaggy


1
F (5) ve f (6) gerçekten 10 mu? Bu tuhaf ...
— Sihirli Ahtapot Urn

1

05AB1E , 22 bayt

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

Çevrimiçi deneyin!

O_O sonunda çalıştığım zaman da yüzümdü.

<ÝIBJ0Kæ¦Ù€œ˜ gerçek cevaptaki sayıları oluşturmak için kullandığım yoldan daha hızlıdır, ancak 7'den büyük bir şey için rasgele çalışmayı durdurur (belirgin bir nedenden dolayı?)

açıklama

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

Eminim farklı bir yaklaşım daha fazla bayt tasarruf edebilir, ancak mevcut çözümünüzde bir bayt kaydetmek ε0KÙ}olabilir 0м€Ù.
— Kevin Cruijssen

1

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

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

$;Eğlence ve kar için istismar . Girişlerde zaman aşımı> 8.

DÜZENLEME: İki döngüyü birleştirerek -4 bayt.


1

Yakut , 80 65 bayt

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

Çevrimiçi deneyin!

-15 bayt için GB'ye teşekkürler.


Bu, n> 10 için çalışmaz ("j.to_i" nedeniyle)
— GB

İyi yakala, bundan önce çok iyi zaman aşımına
— Kirill L.

Her neyse: üssü argüman olarak geçirerek "rakamları" çağırabilir ve çok şey kaydedebilirsiniz: `-> n {(1..n ** n) .count {| i | (d = i.digits n) - [0] == d | d && d.sum? {| j | i% j} <0}} `
— GB

Gerçekten, basamakların bu parametreye sahip olduğunu kesinlikle kaçırdım. Ama görüyorum ki, bunu ayrı bir cevap olarak gönderip sildiniz Diyorum ki, devam et, beni
— dövüyorsun

Cevabımın çok benzer olduğunu düşünüyorum, birkaç kısayolla aynı yaklaşım, çoğunlukla çalınan kod.
— GB

1

Japt -x , 25 19 bayt

Shaggy sayesinde -6 bayt

pU õìU ËeDâ f myDìU

Çevrimiçi deneyin!



Veya bayrağa sahip 19 bayt-x .
— Shaggy

Vay canına O_o golf japt açıkça korkunç
— ASCII-sadece

Şimdiye kadar iyi gidiyorsunuz :) Yeni bir dil ile uğraşmak, tüm özelliklerini, püf noktalarını ve tuhaflıklarını anlamak zaman alıyor.
— Shaggy

@Shaggy ancak sıklıkta ben daha yakın optimal% 25 XD gibi daha olacağını beklenmelidir gibi yeni bir dil kullandığınızda
— ASCII sadece

0

Piton 3 , 204 174 bayt

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*

Çevrimiçi deneyin!

(1, n) aralık kümesinin her bir elemanının her permütasyonu için (sıfır yok, benzersiz), n tabanına sayısal dizgeye dönüştürün. Her bir basamağa bölünebilen her şeyi toplayın, boş kümeyi üreten güç kümesi nedeniyle 1 çıkarın.

@Ovs sayesinde -30 bayt!




0

Haskell , 117 bayt

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]

Çevrimiçi deneyin! Zaman n=7aşımına uğramadan önce TIO üzerinde çalışır.


0

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

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

Çevrimiçi deneyin!

Bu bir domuz. Zaman aşımı yapmadan TIO'da taban 8'den daha fazlasını yapıp yapmayacağından emin değilim.


0

C # (Visual C # Etkileşimli Derleyici) , 144 bayt

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

0 ile arasındaki tüm sayılardan geçer ulong.MaxValueve belirtilen tabandaki Lynch-Bell numaraları olanları seçer. ~0ULFor döngüsü içindeki parçayı daha küçük bir şeye ayarlarsanız, TIO'da bir dakika içinde 7'ye kadar çıkış için çıkış alabilirsiniz.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.