Có bao nhiêu số Lynch-Bell?


19

Thử thách

Cho một số nguyên, nnhư là đầu vào trong đó 36 >= n >= 2, xuất ra có bao nhiêu số Lynch-Bell trong cơ sở n.

Đầu ra phải ở cơ sở 10.

Số Lynch-Bell

Số là số Lynch-Bell nếu:

  • Tất cả các chữ số của nó là duy nhất (không lặp lại các chữ số)
  • Số này chia hết cho mỗi chữ số của nó
  • Nó không chứa số 0 là một trong các chữ số của nó

Vì, tất cả các chữ số phải là duy nhất và bạn có một tập hợp hữu hạn các số có một chữ số trong mỗi cơ sở, có một số hữu hạn các số Lynch-Bell.

Ví dụ: trong cơ sở 2 chỉ có một số Lynch-Bell 1, vì tất cả các số khác đều lặp lại các chữ số hoặc chứa 0.

Ví dụ

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

Mathematica Online đã hết bộ nhớ trên cơ sở 10. Bạn có thể sử dụng đoạn mã sau để tạo mã của riêng mình:

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

Chiến thắng

Mã ngắn nhất trong byte thắng.


1
@MagicOctopusUrn Tại sao chúng ta cần một từ điển? Chúng tôi không cần phải đầu ra trong cơ sở đó.
dùng202729

2
bạn có thể thêm một ví dụ >10?
Rod

1
@Jonathan Allan Tôi thấy, tôi đã xóa nó ngay bây giờ
Beta Decay

3
Nếu chỉ cần [2-36], chúng tôi cũng có thể liệt kê tất cả.
Jonathan Allan

3
Hóa ra là không ai có thể tính toán f(36). Thực hiện một thử thách mã nhanh nhất dựa trên điều này có lẽ sẽ thú vị.
dùng202729

Câu trả lời:


8

Thạch , 13 byte

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

Hãy thử trực tuyến!

Một giải pháp O (n n ) khác .

Giải trình

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 byte ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³Svà nhanh hơn
dặm

5

Thạch , 15 byte

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

Hãy thử trực tuyến!

Phức tạp .O(nn)


5
Chỉ trong code-golf là một O(N^N)giải pháp không chỉ chấp nhận được, mà còn tốt.
DJMcMayhem

5
@DJMcMayhem Meh, tôi nghĩ rằng chúng ta có thể tăng những con số đó lên và nhận đượcO(N↑↑N)
Beta Decay

Có nên O(N^(N+1))bởi vì kiểm tra tính hợp lệ của mỗi số được tạo ra O(N)? (mặc dù tôi không hiểu Jelly)
user202729

@ user202729 N + 1 chỉ là N trong ký hiệu big-O.
mbrig

1
@mbrig Tất nhiên tôi hiểu ký hiệu big-O, rằng ( N+1nằm trong O(N)) không ngụ ý N^(N+1)là trong O(N^N).
dùng202729

3

Java, 222 212 190 byte

-10 byte nhờ Herman

-22 byte nhờ 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;}

Ung dung:

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

Hãy thử trực tuyến!

Được rất chậm cho số lượng lớn.


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

Một trong những lần đầu tiên tôi thấy một nhãn được sử dụng trong câu trả lời của người viết mã
Justin

A:continue A;là 13 byte trong khi {--c;break;}là 12. Điều đó có gây ra một số lỗi tôi không thấy?
JollyJoker

Điều này có thể có giá trị một câu trả lời riêng biệt, nhưng bạn có thể lặp qua các chữ số trong cơ sở n theo từng chữ số i%ai/=atại mỗi vòng lặp. Bạn có thể tránh thiết lập bằng cách sử dụng int[]và kiểm tra xemx[b]++<2
JollyJoker

java.util.Set<Character>‌​g=new java.util.HashSet<>();có thể là import java.util.*;+ Set g=new HashSet();; Long.toStringcó thể được a.toString; và Long.parseLongcó thể được a.parseInt.
Kevin Cruijssen

3

Perl 6 , 86 84 77 byte

-2 byte nhờ Ramillies

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

Hãy thử trực tuyến!

Hoạt động với n = 8 trên TIO.


1
Tôi nghĩ bạn có thể tiết kiệm 2 byte bằng cách làm .allthay vì all $_.
Ramillies

2

Trên thực tế , 24 byte

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

Hãy thử trực tuyến!

Giải trình

Chương trình này bao gồm hai phần chính: tạo hoán vị và thử nghiệm Lynch-Bell. Vì vậy, lời giải thích này sẽ xem xét từng phần riêng biệt, để rõ ràng hơn.

Tạo hoán vị

Đầu vào: n(một số nguyên trong [2, 36])

Đầu ra: tất cả các hoán vị một phần và toàn bộ [1, n-1](các chuỗi chứa các giá trị từ [1, n-1]không lặp lại có độ dài nằm trong [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

Kiểm tra Lynch-Bell

Đầu vào: một danh sách các cơ sở-n số nguyên , được biểu diễn dưới dạng danh sách các nchữ số cơ sở

Đầu ra: số lượng Lynch-Bell trong cơ 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

Toán học, 82 79 76 byte

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

Làm thế nào để bạn vượt qua một số vào đây? (xin lỗi, Mathicala là người mới đối với tôi)
Beta Decay

Dán chức năng (ví dụ: vào hộp cát Wolfram), rồi đặt [<parameter>]sau đó. Với parametermột con số.
dùng202729

Bạn có thể thêm một TIO, hoặc tương đương?
Xù xì


1
Cả f (5) và f (6) có thực sự là 10 không? Thật kỳ lạ ...
Bạch tuộc ma thuật Urn

1

05AB1E , 22 byte

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

Hãy thử trực tuyến!

O_O cũng là khuôn mặt của tôi khi điều này cuối cùng đã làm việc.

<ÝIBJ0Kæ¦Ù€œ˜ nhanh hơn cách tôi sử dụng để tạo ra các số trong câu trả lời thực tế nhưng ngẫu nhiên dừng hoạt động cho bất cứ điều gì lớn hơn 7 (không có lý do rõ ràng?)

Giải trình

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

Tôi khá chắc chắn rằng một cách tiếp cận khác nhau có thể tiết kiệm nhiều byte hơn, nhưng trong giải pháp hiện tại của bạn ε0KÙ}có thể là 0м€Ùlưu một byte.
Kevin Cruijssen

1

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

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

Lạm dụng $;cho vui và lợi nhuận. Lần ra vào đầu vào> 8.

EDIT: -4 byte bằng cách hợp nhất hai vòng lặp.


1

Ruby , 80 65 byte

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

Hãy thử trực tuyến!

Nhờ GB cho -15 byte.


Điều này sẽ không hoạt động cho n> 10 (vì "j.to_i")
GB

Bắt tốt, quá tệ, lần này cũng tốt rồi :)
Kirill L.

Dù sao: bạn có thể gọi "chữ số" chuyển cơ sở làm đối số và lưu rất nhiều: `-> n {(1..n ** n) .count {| i | (d = i.digits n) - [0] == d | d && d.sum? {| j | i% j} <0}} `
GB

Quả thực tôi hoàn toàn bỏ lỡ rằng các chữ số có tham số này. Nhưng tôi thấy bạn đã đăng bài này như một câu trả lời riêng biệt và sau đó xóa. Tôi muốn nói, hãy tiếp tục, bạn đánh bại tôi :)
Kirill L.

Tôi nghĩ rằng câu trả lời của tôi quá giống nhau, đó là cách tiếp cận tương tự với một vài phím tắt, chủ yếu là mã bị đánh cắp.
GB

1

Japt -x , 25 19 byte

-6 byte nhờ Shaggy

pU õìU ËeDâ f myDìU

Hãy thử trực tuyến!



Hoặc 19 byte với -xcờ.
Xù xì

wow O_o tôi rõ ràng là khủng khiếp khi chơi golf
ASCII - chỉ

Bạn đang làm tốt cho đến nay :) Cần có thời gian để nắm bắt một ngôn ngữ mới, tìm ra tất cả các tính năng, thủ thuật và sự kỳ quặc của nó.
Shaggy

@Shaggy nhưng khi bạn sử dụng một ngôn ngữ mới thường xuyên như tôi thì nên dự đoán rằng tôi sẽ gần tối ưu hơn như 25% XD
ASCII

0

Python 3 , 204 174 byte

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*

Hãy thử trực tuyến!

Đối với mỗi hoán vị của từng phần tử lũy thừa của phạm vi (1, n) (không có số không, duy nhất), hãy chuyển đổi thành chuỗi số thành cơ sở n. Tính tổng tất cả các số chia hết cho mỗi chữ số, trừ đi 1 do powerset tạo tập hợp trống.

-30 byte nhờ @ovs!




0

Haskell , 117 byte

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]

Hãy thử trực tuyến! Hoạt động trên TIO cho đến n=7trước khi hết thời gian.


0

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

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

Hãy thử trực tuyến!

Đó là một con lợn. Không chắc chắn nếu nó sẽ làm nhiều hơn cơ sở 8 trên TIO mà không hết thời gian.


0

C # (Trình biên dịch tương tác Visual C #) , 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;}

Đi qua tất cả các số từ 0 đến ulong.MaxValuevà chọn những số đó là số Lynch-Bell trong cơ sở được chỉ định. Mất mãi mãi để chạy, ngay cả trong 2, mặc dù nếu bạn đặt~0UL phần trong vòng lặp for thành một cái gì đó nhỏ hơn, bạn có thể nhận đầu ra cho đầu vào tối đa 7 trong vòng một phút trên TIO.

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.