有多少个林奇贝尔号?


19

挑战

给定一个整数,n作为输入where 36 >= n >= 2,输出base中有多少个Lynch-Bell数字n

输出必须以10为底。

林奇贝尔数字

在以下情况下,数字是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吗?
2015年

1
@JonathanAllan我明白了,我已经清理,截至目前
β衰变

3
如果仅需要[2-36],我们可能会全部列出。
乔纳森·艾伦

3
事实证明,没有人设法进行计算f(36)。以此为基础进行最快的代码挑战可能会很有趣。
user202729

Answers:


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以big-O表示法只是N。
mbrig

1
@mbrig我当然理解big-O表示法,(N+1in中O(N))并不意味着N^(N+1)in中O(N^N)
user202729

3

Java中,222个 212 190字节

-10字节感谢Herman

-22字节感谢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;}

取消高尔夫:

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

我第一次看到一个在代码高尔夫答案中使用的标签
贾斯汀

A:并且continue A;是13个字节,{--c;break;}而是12 个字节。这会引起一些我看不到的错误吗?
JollyJoker

这可能值得一个单独的答案,但是您可以通过在每个循环中的每个数字i%ai/=a在每个循环中以n为底的数字循环。您可以通过使用an 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
凯文·克鲁伊森


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表示

输出:以基数计的林奇·贝尔数 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's

粘贴功能(例如,粘贴到Wolfram沙箱),然后放置[<parameter>]。随着parameter成为一个数字。
user202729

您可以添加TIO或同等功能吗?
毛茸茸的


1
f(5)和f(6)都是10吗?真是奇怪...
魔术章鱼缸

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

在线尝试!

多亏了GB的-15个字节。


这对于n> 10无效(因为“ j.to_i”)
GB

好收成,太糟糕了,在此之前就超时了:)
Kirill 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 -x25 19字节

-6个字节,感谢Shaggy

pU õìU ËeDâ f myDìU

在线尝试!



或带有标志的19个字节-x
毛茸茸的

哇O_o我在打高尔夫球时显然很糟糕
仅使用ASCII

到目前为止,您一切都很好:)掌握一种新语言需要花费时间,要弄清它的所有功能,窍门和怪癖。
毛茸茸的

@Shaggy,但是当您像我一样经常使用一种新语言时,应该期望我会比25%XD更接近于最佳语言
仅使用ASCII

0

Python 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*

在线尝试!

对于范围(1,n)的幂集的每个元素的每个排列(无零,唯一),将数字字符串转换为以n为底的数字。对所有可被每个数字整除的数求和,由于幂集生成空集而将其减去1。

-30个字节,感谢@ovs!




0

Haskell,117个字节

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]

在线尝试!n=7超时之前可以在TIO上工作。


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的基础上做更多的事情。


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的数字。尽管~0UL将for循环中的部件设置为较小的值,也要花很长时间才能运行,即使将它设置为2,也可以在一分钟之内在TIO上获得多达7个输入的输出。

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.