リンチベルの番号はいくつありますか?


19

チャレンジ

n入力として整数を指定すると、36 >= n >= 2baseにあるリンチベルの数を出力しますn

出力は基数10でなければなりません。

リンチベル番号

次の場合、番号はリンチベル番号です。

  • その数字はすべて一意です(数字の繰り返しはありません)
  • 数字はその数字ごとに割り切れます
  • 数字の1つとしてゼロが含まれていません

すべての数字は一意である必要があり、各ベースに有限の1桁の数字セットがあるため、有限の数のリンチベル番号があります。

たとえば、基数2では1、他のすべての数字は数字を繰り返すか0を含むため、Lynch-Bell番号は1つだけです。

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、私は今までクリアしてきました
ベータ崩壊

3
[2-36]のみをサポートする必要がある場合は、それらすべてをリストすることもできます。
ジョナサンアラン

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
code-golfでO(N^N)のみ解決策が受け入れられるだけでなく、良いものです。
DJMcMayhem

5
@DJMcMayhem Meh、私たちはそれらの数字を上げて得ることができると思うO(N↑↑N)
ベータ崩壊

それがあるべきO(N^(N+1))各生成された番号がかかるの妥当性を確認するためにO(N)?(私はゼリーを理解していないが)
user202729

@ user202729 N + 1は、ビッグO表記ではNです。
mbrig

1
それは(私はビッグO記法を理解もちろん@mbrig N+1であるO(N))を意味しないN^(N+1)ですO(N^N)
user202729

3

Java、222 212 190バイト

ハーマンのおかげで-10バイト

ケビンのおかげで-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

codegolfの回答で使用されるラベルを見たのは初めてのことの1つ
ジャスティン

A:そして、continue A;しながら、13のバイトがある{--c;break;}12ですが、いくつかのバグinstroduce私は見ていないということですか?
JollyJoker

これは価値がある別の答えかもしれませんが、あなたは、各桁があることによってベースのnの桁をループすることができますi%aし、i/=a各ループで。あなたは使用して設定を回避することができ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
ケビンCruijssen


2

実際には、24バイト

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

オンラインでお試しください!

説明

このプログラムは、順列生成とリンチベルテストの2つの主要部分で構成されています。したがって、より明確にするために、この説明では各部分を個別に説明します。

順列の生成

入力:(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は初めてです)
ベータ崩壊

関数を(たとえば、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м€Ùバイトを節約することができます。
ケビンクルーッセン

1

Perlの5、80、76バイト(75 + -p

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

$;楽しさと利益のために虐待。入力のタイムアウトが8を超えています。

編集:2つのループをマージして-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

実際、数字にこのパラメータがあることを絶対に見逃しました。しかし、私はあなたがこれを別の回答として投稿し、その後削除したと思います。私は言うだろう、あなたは私にそれを打ち負かした:)
キリルL.

私の答えはあまりにも似ていると思いますが、それはいくつかのショートカットを使用した同じアプローチで、ほとんどが盗まれたコードです。
GB

1

ジャプト -x25 19バイト

シャギーのおかげで-6バイト

pU õìU ËeDâ f myDìU

オンラインでお試しください!



または、フラグ付きの19バイト-x
シャギー

すごいO_O私はJAPTゴルフで明らかにひどいよ
ASCIIのみ

これまでのところ順調に進んでいます:)新しい言語を理解し、そのすべての機能、トリック、癖を理解するには時間がかかります。
シャギー

あなたは、多くの場合、私がそうであるように、新しい言語を使用する場合@Shaggyが、することは、私が25%XDなどのより最適に近いものだろうと予想されなければなりません
ASCIIのみ

0

Pythonの3204の 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)(ゼロなし、一意)のpowersetの各要素の順列ごとに、ベースnの数値文字列に変換します。各桁で割り切れるすべてを合計し、powersetが空のセットを生成するため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#Interactive Compiler)、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調べ、指定された基数のリンチベル数である数字を選択します。~0ULforループの一部をより小さな値に設定すると、TIOで1分以内に最大7の入力の出力を取得できますが、実行するのに2時間もかかります。

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.