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.