Lynch-Bell 번호는 몇 개입니까?


19

도전

ninput where으로 정수가 주어지면 36 >= n >= 2기본에 몇 개의 Lynch-Bell 숫자가 있는지 출력합니다.n .

출력은 10 진이어야합니다.

린치 벨 번호

다음과 같은 경우 번호는 Lynch-Bell 번호입니다.

  • 모든 숫자는 고유합니다 (숫자 반복 없음)
  • 숫자는 각 숫자로 나눌 수 있습니다
  • 숫자 중 하나로 0을 포함하지 않습니다.

모든 자릿수는 고유해야하며 각 밑면에 유한 한 한 자릿수 숫자 세트가 있으므로 유한 수의 Lynch-Bell 숫자가 있습니다.

예를 들어, 기수 2에는 Lynch-Bell 번호가 하나만 있습니다. 1다른 모든 숫자는 숫자를 반복하거나 0을 포함하기 때문입니다.

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

Mathematica Online에는 기본 10 이상의 메모리가 부족합니다. 다음 코드를 사용하여 자체 메모리를 생성 할 수 있습니다.

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

승리

바이트 단위의 최단 코드가 이깁니다.


1
@MagicOctopusUrn 왜 사전이 필요한가요? 우리는 그베이스에서 출력 할 필요가 없습니다.
user202729

2
예를 추가 할 수 >10있습니까?
로드

1
@JonathanAllan 내가 본, 나는 그것을 정리했다.
Beta Decay

3
[2-36] 만 지원해야하는 경우 모두 나열 할 수 있습니다.
Jonathan Allan

3
아무도 계산을 관리 할 수 ​​없었습니다 f(36). 이를 기반으로 가장 빠른 코드 도전을하는 것은 아마도 흥미로울 것입니다.
user202729

답변:


8

젤리 , 13 바이트

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

온라인으로 사용해보십시오!

다른 O (n n ) 솔루션.

설명

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 바이트 ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³S이상
마일

5

젤리 , 15 바이트

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

온라인으로 사용해보십시오!

복잡성 .O(nn)


5
코드 골프 O(N^N)에서만 허용되는 솔루션 일뿐만 아니라 좋은 솔루션입니다.
DJMcMayhem

5
@DJMcMayhem Meh, 나는 우리가 그 숫자를 펌핑하고 얻을 수 있다고 생각합니다O(N↑↑N)
Beta Decay

O(N^(N+1))생성 된 각 숫자의 유효성을 검사 해야합니까 O(N)? (젤리를 이해하지 못하지만)
user202729

@ user202729 N + 1은 큰 O 표기법에서 N입니다.
mbrig

1
즉 (내가 큰 O 표기법을 이해 물론 @mbrig N+1O(N)) 의미하지 않습니다 N^(N+1)이다 O(N^N).
user202729

3

자바 222 212 190 바이트

허먼 덕분에 -10 바이트

Kevin 덕분에 -22 바이트

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

언 골프 드 :

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

온라인으로 사용해보십시오!

많은 수의 경우 매우 느려집니다.


-10 바이트 :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;}
허먼 L

코드 골프 답변에 사용 된 레이블을 처음 본 것 중 하나
Justin

A:그리고 continue A;12 바이트는 13 바이트 {--c;break;}입니다. 내가 보지 못한 버그를 유발합니까?
JollyJoker

이것은 별도의 답을 얻을 가치가 있지만 각 숫자 i%ai/=a각 루프 마다 기본 n의 숫자를 반복 할 수 있습니다 . 를 사용하여 다음 int[]을 확인 하여 세트를 피할 수 있습니다.x[b]++<2
JollyJoker

java.util.Set<Character>‌​g=new java.util.HashSet<>();import java.util.*;+ 일 수 있습니다 Set g=new HashSet();; Long.toString될 수 있습니다 a.toString; 그리고 Long.parseLong될 수 있습니다 a.parseInt.
Kevin Cruijssen


2

실제로 24 바이트

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

온라인으로 사용해보십시오!

설명

이 프로그램은 순열 생성과 Lynch-Bell 테스트의 두 가지 주요 부분으로 구성됩니다. 따라서이 설명은 명확성을 위해 각 부분을 개별적으로 살펴볼 것입니다.

순열 생성

입력 : n(정수[2, 36] )

출력 : 모든 부분 및 전체 순열 [1, n-1]( [1, n-1]길이가에있는 반복없이 값을 포함하는 시퀀스 [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

린치 벨 테스트

입력 : 기본 n정수 목록으로, 기본 목록으로 표시됩니다.n 자릿수

출력 : 기본에있는 Lynch-Bell 수 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 바이트

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

이 번호를 어떻게 전달합니까? (죄송합니다, Mathematica는 나에게 새로운 것입니다)
Beta Decay

함수를 붙여넣고 (예 : Wolfram 샌드 박스에) 그 후에 넣습니다 [<parameter>]. 와 parameter수있는.
user202729

TIO 또는 이와 동등한 제품을 추가 할 수 있습니까?
Shaggy


1
f (5)와 f (6)는 모두 실제로 10입니까? 이상하다 ...
Magic Octopus Urn

1

05AB1E , 22 바이트

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

온라인으로 사용해보십시오!

O_O 이것이 마침내 작동했을 때도 내 얼굴이었습니다.

<ÝIBJ0Kæ¦Ù€œ˜ 실제 답변에서 숫자를 생성하는 데 사용하는 방법보다 빠르지 만 7보다 큰 것은 임의로 작동하지 않습니다 (명백한 이유는 없습니까?)

설명

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

다른 접근 방식으로 더 많은 바이트를 절약 할 수 있다고 확신하지만 현재 솔루션 에서 바이트를 저장하는 ε0KÙ}것이 될 수 있습니다 0м€Ù.
Kevin Cruijssen

1

Perl 5, 80 76 바이트 (75 + -p)

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

$;재미와 이익을 위해 남용 . 입력 시간 초과> 8

편집 : 두 루프를 병합하여 -4 바이트.


1

루비 , 80 65 바이트

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

온라인으로 사용해보십시오!

-15 바이트의 GB 덕분입니다.


n> 10에서는 작동하지 않습니다 ( "j.to_i"때문에)
GB

좋은 캐치, 물론 그 :) 전에 밖으로 너무 나쁜 그것은 시간
키릴 L.

어쨌든 :베이스를 인수로 전달하는 "숫자"를 호출하고 많은 것을 저장할 수 있습니다 :`-> n {(1..n ** n) .count {| i | (d = i.digits n)-[0] == d | d && d.sum? {| j | i % j} <0}}`
GB

실제로 숫자 에이 매개 변수가 있다는 것을 절대 놓쳤습니다. 그러나 당신이 이것을 별도의 답변으로 게시 한 다음 삭제 한 것으로 보입니다. 내가 말하고 싶습니다, 당신은 그것을 이길 :)
Kirill L.

내 대답이 너무 비슷하다고 생각합니다. 두 개의 바로 가기, 주로 도난당한 코드가있는 동일한 접근 방식입니다.
GB

1

Japt -x , 25 19 바이트

Shaggy 덕분에 -6 바이트

pU õìU ËeDâ f myDìU

온라인으로 사용해보십시오!



또는 플래그 가있는 19 바이트 -x
얽히고 설킨

와우 O_o 나는 골프 japt에 분명히 끔찍하다
ASCII 만

당신은 지금까지 잘하고 있습니다 :) 새로운 언어를 익히고 모든 기능, 요령 및 단점을 파악하는 데 시간이 걸립니다.
얽히고 설킨

@Shaggy하지만 당신은 자주 나는 내가 가까이 최적의 25 %의 XD와 같은보다 줄 것으로 기대한다처럼 새로운 언어를 사용하는 경우
ASCII 전용

0

파이썬 (3) , 204 (174) 바이트

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*

온라인으로 사용해보십시오!

range (1, n) (0, 고유 없음)의 powerset의 각 요소의 각 순열에 대해 숫자 문자열을 밑수 n으로 변환합니다. 각 세트로 나눌 수있는 모든 것을 합산하십시오. 빈 세트를 생성하는 전력 세트로 인해 1을 뺍니다.

@ovs 덕분에 -30 바이트!





0

Perl 5 , 108 + 1 ( -p) = 109 바이트

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

온라인으로 사용해보십시오!

돼지입니다. 시간 초과없이 TIO에서 기본 8 이상을 수행하는지 확실하지 않습니다.


0

C # (Visual C # 대화식 컴파일러) 144 바이트

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에서까지의 모든 숫자를 살펴 ulong.MaxValue보고 지정된 기준에서 Lynch-Bell 숫자 인 숫자를 선택합니다. 2를 설정해도 영원히 실행됩니다.~0ULfor 루프 파트를 더 작은 것으로 TIO에서 1 분 내에 최대 7 개의 입력에 대한 출력을 얻을 수 됩니다.

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.