最も長い担当者を見つける


17

あなたの仕事は、入力nとして正の数を取り、任意のベースでnの最も長いrep-digit表現の長さを出力することです。たとえば、7は次のいずれかとして表すことができます

111_2
21_3
13_4
12_5
11_6
10_7
7_8

REP-桁がある111_211_6111_2私たちの答えは3であるので、長いです。

これは質問なので、回答はバイト単位でスコアリングされ、バイト数は少ない方が良いでしょう。

テストケース

1   -> 1
2   -> 1
3   -> 2
4   -> 2
5   -> 2
6   -> 2
7   -> 3
8   -> 2
9   -> 2
10  -> 2
11  -> 2
26 -> 3
63  -> 6
1023-> 10

サンプル実装

これは、より多くのテストケースを生成するために使用できるHaskellの実装です。

f 0 y=[]
f x y=f(div x y)y++[mod x y]
s x=all(==x!!0)x
g x=maximum$map(length.f x)$filter(s.f x)[2..x+1]

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


1
想定base > 1
H.PWiz

2
必要に応じて、テストケース63-> 6および1023-> 10を追加できます
-J42161217

1
@WheatWizardたとえば26はそれを行うと思います222。ベース3にあります。
xnor17年

1
基地は10を超えることができますか?その場合、10を超える塩基の場合、文字a〜zを含める必要がありますか?36を超えるベースについてはどうですか?
リックヒッチコック

6
@RickHitchcock Basesは任意に高くすることができます。あなたは出力に10以外の任意の塩基のいずれかの数字を持っていないので、私はあなたが他の塩基を表す方法を気にしないが、彼らは36を超える拠点のために働く必要があります
ポストロックGARFハンター

回答:


9

ゼリー、9 バイト

b‘Ḋ$EÐfZL

数字を受け入れて返すモナドリンク

オンラインでお試しください!またはテストスイートを参照してください(1〜32を含む入力)。

どうやって?

b‘Ḋ$EÐfZL - Link: number, n
   $      - last two links as a monad:
 ‘        -   increment = n+1
  Ḋ       -   dequeue (with implicit range build) = [2,3,4,...,n+1]
b         - convert to those bases
     Ðf   - filter keep if:
    E     -   all elements are equal
       Z  - transpose
        L - length (note:  length of the transpose of a list of lists is the length of the
          -                longest item in the original list, but shorter than L€Ṁ)

...または多分私はやるべきだった:

bḊEÐfZLo1

Lo1zの場合


だから... ...私は考え出したのは一つだけじゃないことZLよりも短くなっているL€Ṁ...
エリックOutgolfer

8

JavaScript(ES6)、62バイト

f=(n,b=2,l=0,d=n)=>d?n%b<1|n%b-d%b?f(n,b+1):f(n,b,l+1,d/b|0):l
<input oninput=o.textContent=f(this.value)><pre id=o>


2
私は不必要にゴルフされたテストHTMLが大好き
ヤコブ

6

ハスケル86 81 79バイト

Laikoniのおかげで2バイト節約

0!y=[]
x!y=mod x y:div x y!y
length.head.filter(all=<<(==).head).(<$>[2..]).(!)

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

これは少し落ちたので、ここに私のアプローチがあります。これは、質問用に作成したサンプルコードのゴルフ版です。間違いなく短くなると思います。私はそこにそれを出すと思った。


Pointfreeは少し短くなりますlength.head.filter(all=<<(==).head).(<$>[2..]).(!)
ライコニ

@ライコニありがとう!何らかの理由で、それをポイントフリー表記にする方法を理解することができませんでした。
ポストロックガーフハンター

lambdabotのポイントフリーコンバーターに基づいたpointfree.ioをお勧めします。
ライコニ

@Laikoni pointfree.ioをかなり使います。ここでは試したことがなかったに違いありません。通常はかなり良い結果が得られます。
ポストロックガーフハンター

5

13 11バイト

zgarbのおかげで-2バイト

L←fȯ¬tuMBtN

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


mmすることができMṠoΛ=←できますȯ¬tu。リストのすべての要素が等しいことを確認するための組み込みはまだありません
...-Zgarb

Mはまだウィキにさえありません:(
H.PWiz

ΓoΛ=4バイトとしても機能します
-H.PWiz

1
おっと、Mドキュメントに含まれているはずです。私はそれを修正する必要があります。しかし、それは基本的にの二重です
-Zgarb





1

Mathematica、58バイト

FirstCase[#~IntegerDigits~Range[#+1],l:{a_ ..}:>Tr[1^l]]&

(base-1は有効なベースではないため)エラーをスローしますが、無視しても安全です。

もちろん、最初のrepdigit(FirstCase)の長さをとっても大丈夫です。なぜなら、下の基数の数字は、高い基数の数字よりも短くできないからです。


1

CJam(17バイト)

{_,2>3+fb{)-!}=,}

オンラインテストスイート。これは、スタック上の整数を受け取り、スタック上に整数を残す匿名ブロック(関数)です。

3特殊なケース(入力1または2)を処理するフォールバックベースとして使用して、ブルートフォースで動作します。


1

Perl 6、49バイト

{+first {[==] $_},map {[.polymod($^b xx*)]},2..*}

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

説明

{                                               }  # A lambda.
                  map {                   },2..*   # For each base from 2 to infinity...
                        .polymod($^b xx*)          #   represent the input in that base,
                       [                 ]         #   and store it as an array.
  first {[==] $_},                                 # Get the first array whose elements
                                                   # are all the same number.
 +                                                 # Return the length of that array.

polymodの方法は、Pythonのの一般化であるdivmod:それは除数の与えられたリストを用いて繰り返し整数の除算を行い、中間剰余を返します。
数量を複数の単位に分解するために使用できます。

my ($sec, $min, $hrs, $days, $weeks) = $seconds.polymod(60, 60, 24, 7);

除数のリストとして遅延シーケンスを渡すpolymodとき、商がゼロに達すると停止します。したがって、同じ数の無限の繰り返しを与えると、入力をその基数の数字に分解します。

my @digits-in-base-37 = $number.polymod(37 xx *);

.base最大36のベースのみをサポートする文字列ベースの方法とは対照的に、任意の高いベースを許可するため、ここでこれを使用します。


に変更することにより、[]周囲を削除することができますpolymod$_@_
ジョーキング

1

TI-BASIC、37バイト

Input N
For(B,2,2N
int(log(NB)/log(B
If fPart(N(B-1)/(B^Ans-1
End

Nのプロンプト、Ansの出力を返します。

説明

概要として、順番に考えられる各ベースBについて、ベースBで表される場合のNの桁数を最初に計算し、ベースBの同じ1桁の数で表される値でNが割り切れるかどうかを確認します。

Input N            Ask the user for the value of N.
For(B,2,2N         Loop from base 2 to 2N. We are guaranteed a solution
                   at base N+1, and this suffices since N is at least 1.
int(log(NB)/log(B  Calculate the number of digits of N in base B,
                   placing the result in Ans.
                   This is equivalent to floor(log_B(N))+1.
          (B-1)/(B^Ans-1   The value represented by Ans consecutive
                           1-digits in base B, inverted.
If fpart(N         Check whether N is divisible by the value with Ans
                   consecutive 1-digits, by multiplying it by the inverse
                   and checking its fractional part.
                   Skips over the End if it was divisible.
End                Continue the For loop, only if it was not divisible.
                   The number of digits of N in base B is still in Ans.


0

Java 8、111バイト

n->{int r=0,i=1,l;for(String t;++i<n+2;r=(l=t.length())>r&t.matches("(.)\\1*")?l:r)t=n.toString(n,i);return r;}

111のバイトカウントもrep-digitです。;)

説明:

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

n->{                            // Method with Integer as parameter return-type
  int r=0,                      //  Result-integer
      i=1,                      //  Index-integer
      l;                        //  Length-integer
  for(String t;                 //  Temp-String
      ++i<n+2;                  //  Loop from 2 to `n+2` (exclusive)
      r=                        //    After every iteration, change `r` to:
        (l=t.length())>r        //     If the length of `t` is larger than the current `r`
        &t.matches("(.)\\1*")?  //     and the current `t` is a rep-digit:
         l                      //      Change `r` to `l` (the length of the rep-digit)
        :                       //     Else:
         r)                     //      Leave `r` as is
    t=n.toString(n,i);          //   Set String representation of `n` in base-`i` to `t`
                                //  End of loop (implicit / single-line body)
  return r;                     //  Return the result-integer
}                               // End of method

ラムダはJava 8で導入されました。-
ヤコブ

1
@Jakob Woops .. 7を入力した理由がわからない。>
ケビンクルーッセン

0

Java 8、79バイト

からIntegerまでのラムダInteger

n->{int m,b=2,l;for(;;b++){for(m=n,l=0;m>0&m%b==n%b;l++)m/=b;if(m<1)return l;}}

ゴルフされていないラムダ

n -> {
    int m, b = 2, l;
    for (; ; b++) {
        for (m = n, l = 0; m > 0 & m % b == n % b; l++)
            m /= b;
        if (m < 1)
            return l;
    }
}

rep-digitの基数が見つかるまで、2から昇順で基数をチェックします。このような最小の基数が最大の桁数の表現に対応するという事実に依存しています。

mは入力のコピーでbあり、基数でありl、チェックされる桁数(および最終的には基数b表現の長さ)です。


0

バーレスク、24バイト

(以下の正しい解決策を参照してください)

J2jr@jbcz[{dgL[}m^>]

アクションを参照してください。

J2jr@ -- boiler plate to build a list from 2..N
jbcz[ -- zip in N
{dgL[}m^ -- calculate base n of everything and compute length
>]    -- find the maximum.

少なくとも私の直観が正しい場合、担当者の数字表現は常に最長になるということですか?それ以外の場合...

J2jr@jbcz[{dg}m^:sm)L[>]

:sm -- filter for "all elements are the same"

1
ベース-2表現は常に入力26と、たとえば試してみて、あなたはあなたの最初のソリューションが間違っていることがわかります、最長になります
レオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.