Repdigit Base Finding


21

ぞろ目は、同じ数字を繰り返すことによってのみ書き込むことができる自然数です。たとえば、3回繰り返される777数字のみで構成されるため、repdigit 7です。

ただし、これは単に10進数(10進数)に限定されません。

  • M n = 2 n -1の形式の)すべてのメルセンヌ数は、バイナリ(基数2)で書かれた場合、repdigitです。
  • 単項(基数1)で記述されている場合、すべての数字は簡単にrepdigitです。
  • すべての数値n11、基本的にrepdigitとして簡単に記述できますn-1(たとえば、1716進数(16進数)で記述されている場合は1132進数(2 進数)で記述されている場合も同様です11)。

ここでの課題は、入力番号がrepdigitである可能性のある他のベースを見つけることです。

入力

x > 3任意の便利な形式の正の整数。

出力

正の整数b(x-1) > b > 1の表現ここでxベースではbぞろ目です。

  • そのようなものbが存在しない場合、出力0または何らかの偽の値。
  • そのようなものbが複数存在する場合、それらのいずれかまたはすべてを出力できます。

ルール

  • (x-1) > b > 1制限は、単項または「減算つ」塩基に些細な変換を防止するためです。出力数は、単項または任意の便利な塩基で書くことができるが、基部自体は些細な変換のいずれかであってはなりません。
  • 入出力は、任意の適切な方法で行うことができます。
  • 標準的な抜け穴の制限が適用されます。

In --> Out
11 --> 0            (or other falsey value)
23 --> 0            (or other falsey value)
55 --> 10           (since 55 is 55 in base 10)
90 --> 14           (since 90 is 66 in base 14 ... 17, 29, 44 also allowed)
91 --> 9            (since 91 is 111 in base 9 ... 12 also allowed)

想定できますかb ≤ 36(多くの言語のビルトインベース変換関数はこれ以上高くなりません)?
ドアノブ

2
@Doorknob は、この問題の範囲をb ≤ 36 厳しく制限すると仮定し、既存の回答はすべて、より大きなベースを正しく処理するため、ノーと言うつもりですb
AdmBorkBork

ほとんどの数字は、ある種の数字です。例えば、91 = 13 * 7、それの77ベース12におけるよう
ニール

@Neil ...それは...そこに、あなたが何かににしているほとんどのようなものだ
AdmBorkBork

回答:


11

ゼリー、11 9バイト

bRI¬P€TḊṖ

ベースのリストを返します。ベースがない場合は空(偽)です。オンラインでお試しください!

使い方

bRI¬P€TḊṖ  Main link. Argument: x (number)

 R         Range; yield [1, ..., x].
b          Base; convert x to base n, for each n in the range.
  I        Compute the increment (differences of successive values) of each array
           of base-n digits. This yields only 0's for a repdigit.
   ¬       Apply logical NOT to each increment.
    P€     Compute the product of all lists of increments.
      T    Get the indices of all truthy products.
       Ḋ   Discard the first index (1).
        Ṗ  Discard the last index (x - 1).

9

Pyth、 11 10

fqjQT)r2tQ

どうやらPythの単項qチェックは、約10日前の時点ですべての一意の値を持つリストをチェックします。どうやらPythのバグを調査すると、ゴルフのスコアが向上します。

[2..input-1)そのベースの入力の一意の数字セットが長さ1である場合、リストをフィルターします。

テストスイート

説明:

r2tQ     ##  generate the python range from 2 to the input (Q) - 1
         ##  python range meaning inclusive lower and exclusive upper bounds
f        ##  filter that list with lambda T:
  jQT    ##  convert the input to base T
 q    )  ##  true if the resulting list digits has all equal elements

5

ルビー、87 69 63バイト

->x{(2..x-2).find{|b|y=x;a=y%b;a=0if a!=y%b while(y/=b)>0;a>0}}

Rubyのビルトインは36進までしか行かないため、ベース変換を手動で実装する必要がありました...

nil見つかりませんで返されます。

->x{      # anonymous lambda that takes one argument
(2..x-2)  # range of the possible bases to search over
.find{    # return the first element that satisfies the block, or nil if none
|b|       # b represents the base currently being tested
y=x;      # a temporary value to avoid mutating the original value of x
a=y%b;    # the first (well, last) digit in base b, which will be compared to

                   y/=b      # divide the number by the base
   if a!=y%b                 # if this digit does not match (is different)...
a=0                          # set a to a value representing "failure"
             while(    )>0;  # keep doing this until we get zero (no digits left)

a>0       # return whether a has maintained its original value (no digit change)
}}        # find then returns the first element for which this is true (or nil)

5

Python、71 72 78バイト

lambda x:{b for b in range(2,x-1)for d in range(x)if x*~-b==x%b*~-b**d}

再帰はありません。すべてのベースを試行し、機能するベースのセットを出力します。

これは、エンコードに魅力的だbし、d単一の数で、それはそれらを抽出するためにあまりにも多くの括弧で囲まれた式をとります。77バイト:

lambda x:{k/x for k in range(2*x,x*x-x))if x*~-(k/x)==x%(k/x)*~-(k/x)**(k%x)}

72バイト:

f=lambda x,b=2:b*any(x*~-b==x%b*~-b**d for d in range(x))or f(x,b+1)%~-x

最初の出力 b動作をか0、何も動作しない場合。

in baseのrep xd数字の単位に値がありますcbx==c*(b**d-1)/(b-1)。同様に、x*(b-1)==c*(b**d-1)

cx%b、最後の桁である必要があります。決定する方法がわかりませんd算術的ので、コードはそれらのいずれかが機能するかどうかを確認するためにあらゆる可能性を試みます。

出力をモジュロで取得することで到達したときに偽の出力を与えるというデニスのトリックをコピーすることで5バイトを節約しました。デニスから保存された別のバイトは、べき乗が不可解に高い優先順位を持つことを私に思い出させます。bx-1x-1~

in代わりにを使用した等しい長さのソリューションany

f=lambda x,b=2:b*(x*~-b in[x%b*~-b**d for d in range(x)])or f(x,b+1)%~-x

4

ルビー、50バイト

->n{(2..n-2).find{|b,i=n|i%b==(i/=b)%b ?redo:i<1}}

私は本当にその迷惑なスペースを削除したいと思いますが、ルビーの新人として、その構文の癖にまだなじみがありません。


この場合の問題のある癖は、それb?が有効なメソッド名であるため、スペースを取り除くことができないということです。
ヨルダン

4

絵文字コード、214バイト

(77文字):

🐇🐹🍇🐇🐖🏁➡🚂🍇🍦b🍺🔲🗞🔷🔡😯🔤🔤🚂🍮i 2🍮n 0🔁◀i➖b 1🍇🍦v🔷🔡🚂b i🍊▶🐔🔫v🔪v 0 1📏v🍇🍮n i🍉🍫i🍉😀🔷🔡🚂n 9🍎0🍉🍉

結果を基数9で印刷します。

私はここ数週間絵文字コードを使ってコードゴルフをするつもりでしたが、言語は実際にwithで動作するほど十分に安定しました。おまけとして、この質問では、絵文字コードが実際に得意とする1つの機能を利用します。つまり、他のベースで整数を表現します。

Ungolfed(👴は絵文字コードの行コメントです)

🐇🐹🍇         👴 define main class "🐹"
  🐇🐖🏁➡🚂🍇  👴 define main method

    👴 read an integer from stdin, store it in frozen variable "b"
    🍦 b 🍺 🔲 🗞 🔷🔡😯🔤🔤 🚂

    🍮 i 2  👴 i = 2
    🍮 n 0  👴 n = 0

    🔁◀i➖b 1🍇     👴 while i < b - 1
      🍦 v 🔷🔡🚂b i  👴 v = the string representation of b in base i

      👴 Split v on every instance of the first character of v.
      👴 If the length of that list is greater than the actual length of v,
      👴 n = i
      🍊▶🐔🔫v🔪v 0 1📏v🍇
        🍮 n i
      🍉

      🍫 i  👴 increment i
    🍉
    😀 🔷🔡🚂 n 9  👴 represent n in base 9 instead of 10, to save a byte 😜
    🍎 0          👴 return error code 0
  🍉
🍉

4

Python 2、79バイト

f=lambda x,b=2:~-b*x in[i%b*~-b**(i/b)for i in range(b*x)]and b or f(x,-~b)%~-x

Ideoneで試してみてください。

アイディア

基数b> 1および桁d <bの repdigit xは、以下を満たします。

調子

以来、D <B 、マップ(B、D)↦CB + dが単射です。

また、以降B、X> 1、我々は、C <Xをので、CB + D <CB + B =(C + 1)XB≤B

以下のための適切な値を見つけるために、この手段CD所与の基地用のBは、我々はすべてを反復することができ、私は[0、...、BX)とするかどうかをチェック(B - 1)x ==(I%のB)(B i / b -1)

コード

名前ラムダFか否かをテストXが- (1 b)の集合である(B {(I%b)はI / B - 1)| 0≤i <bx}、値b = 2で始まります。

  • テストが成功した場合、bを返します。

  • それ以外の場合は、同じxb1増やしてfを再度呼び出します。

bは最終的にx-1に達する可能性があるため、この場合はx-1を法とする最終結果を取得して0を返しますb = 2が条件を満たしている場合、再帰なしで返されるため、これは発生しないことに注意してください。ただし、この場合、b = 2 <x-1であることが保証されます。


3

Perl 6の、45の 43 42バイト

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}

説明(種類)

参考のために、変数$^xin { ... }は次と同じです。-> $x { ... }

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}
{                                          # Anonymous function taking $x
 grep                                      # Return the all values in
      2..$^x-2: {                          # Range from 2 to $x - 2 satisfying:
                 [==]                      #     Reduce with ==:
                      $x.polymod(          #         (See below for polymod)
                                 $_ xx*    #         An infinite list containing
                                           #         the current value
                                       )}}

Polymod(TL; DR):$n.polymod($b xx *)あなたのための桁/「数字」は逆リスト与え$nベースでの$b

Polymod(実際):polymodメソッドは、Pythonのdivmod関数のより強力なバージョンにほとんど似ています。$n.polymod(*@args)$ nを* @ argsの各値で$n mod $x除算し、返されるリストに剰余()を追加し、次の除算に商を使用します。私はそれを不十分に説明したと思うので、ここにいくつかの例があります(perl 6で書かれていますが、ほとんどの人が理解できるほどきれいです):

12.polymod(7)    # returns (5, 1)
# Roughly equivalent to:
(12 mod 7, 12 div 7)

86400.polymod(60,60,24) # returns (0, 0, 0, 1)
# Roughly equivalent to (this will give you an array rather than a list):
my $n = 86400;
my @remainders; # Here lies the end result
for (60, 60, 24) -> $divisor {
    @remainders.push( $n mod $divisor );
    $n div= $divisor;
}
@remainders.push($n)

# This is essentially the base conversion algorithm everyone
# knows and loves rolled into a method.
# Given an infinite list of divisors, polymod keeps going until
# the remainder given is 0.     
0xDEADBEEF.polymod(16 xx *) # returns (15 14 14 11 13 10 14 13)
# Roughly equivalent to (but gives an array rather than a list):
my $n = 0xDEADBEEF;
my @remainders; # Here lies the end result
while $n > 0 {
    @remainders.push( $n mod 16 );
    $n div= 16;
}

1
実際には、有効な値の「一部またはすべて」を出力することが許可されているため、grepメソッドの代わりにメソッドを使用できますfirst
ブラッドギルバートb2gills

いいキャッチ、私はそれを見逃した
ホットキー

3

Dyalog APL、28バイト

 {b/⍨⍵{1=≢∪⍵⊥⍣¯1⊢⍺}¨b←1+⍳⍵-3}

{... ... }に適用される匿名関数x(で表される
b←1+⍳⍵-32から整数- ⍵-2として記憶b
⍵{... Bの各要素のための()関数を適用{... }左引数としてXと
⍵⊥⍣¯1⊢⍺変換がそのベースにXが
1=≢∪割符に1等しいです。ユニークな数字の?
b/⍨真のbの要素(一意の数字が1つしかないこと)。

事例

このプログラムが示すように、ベースが存在しない場合、出力は空(偽)です。

 WhatIsEmpty
 →''/TRUE ⍝ goto (→) TRUE: if (/) emptystring ('')
 'False'
 →END       
TRUE:       
 'True'     
END:        

これは「False」を印刷します



2

MATL15 14バイト

3-:Q"G@:YAd~?@

これは 現在のバージョン(14.0.0)の言語/コンパイラで動作します。

ベースが存在しない場合、出力は空になります(これは偽です)。

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

3-:Q    % take input x implicitly. Generate range of possible bases: [2,3,...,x-2]
"       % for each base b
  G     %   push input again
  @:    %   generate vector of (1-based) digits in base b: [1,2,...,b]
  YA    %   convert to that base
  d~    %   differences between consecutive digits; negate
  ?     %   if all values are true (that is, if all digits were equal)
    @   %     push that base
        %   end if implicitly
        % end for each implicitly
        % display implicitly

2

Mathematica、55バイト

Cases[4~Range~#-2,a_/;Equal@@#~IntegerDigits~a]/.{}->0&

無名関数、複雑すぎません。repdigit-nessに基づいてベースをフィルタリングするだけです。


2

Python 2、75バイト

n=input()
b=1
while b<n-2:
 i=n;b+=1
 while i%b==i/b%b:i/=b
 if i<b:print b

ルビーの回答の移植版。存在する場合、すべての有効なベースを出力します。


2

ジュリア、45バイト

n->filter(b->endof(∪(digits(n,b)))<2,2:n-2)

これは、整数を受け入れて整数配列を返す匿名関数です。呼び出すには、変数に割り当てます。該当するすべてのベースまたは空の配列を返します。大きなベースには問題はありません。

最初に、包含範囲[2、n -2] を生成します。ここで、nは入力です。次にfilter、ベースbのnが2未満の一意の数字である整数bのみをリストします。これを行うには、範囲内の整数bごとに、ベースbnの数字を配列として取得し、を使用して一意の項目を取得し、を使用して最後の要素のインデックス(長さ)を取得します。digitsendof


1

Brachylog、12バイト

>>.ℕ₂≜&ḃ↙.=∧

オンラインでお試しください! (ジェネレーターとして!)

入力変数を介して入力を受け取り、これが可能な場合は出力変数を介してベースを出力します。そうでない場合は失敗します。同時に、それはまたすべてのベースのリストを出力するジェネレーターます。このリストは空にすることができます。

理想的には、これはのように見えるḃ↙.=&>>可能性があり、おそらくその形式または類似のジェネレーター機能を犠牲にします(最終的に単項にヒットするため)が、現在のところ12バイトが最短です。

     ≜          Assign an integer value to
  .             the output variable
   ℕ₂           which is greater than or equal to 2
 >              and less than a number
>               which is less than the input.
      &         The input
       ḃ↙.      in base-(the output)
          =     is a repdigit.
           ∧    (which is not necessarily the output)


0

05AB1E、7 バイト

ÍL¦ʒвÙg

すべての可能な値、または空のリストを偽の値として出力します(ただし、技術的に有効な出力も偽です。 1です。05AB1Eで真実であり、他のすべては偽です)。

オンラインで試すたり、すべてのテストケースを検証します

説明:

Í        # Decrease the (implicit) input-integer by 2
 L       # Create a list in the range [1, input-2]
  ¦      # Remove the first value to make the range [2, input-2]
   ʒ     # Filter this list by:
    в    #  Convert the (implicit) input to the base of the number we're filtering
     Ù   #  Uniquify it, leaving only distinct digits
      g  #  Get the length of this, which is truthy (1) if all digits were the same
         # (and then output the filtered list implicitly as result)

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