数値を「4」が最も多い基数に変換します


30

これに触発され。整数、文字列、または数字の配列(任意)として指定された数値があります。数値の表現が最も「4」になるベースを見つけ、そのベースを返します。

番号結果
624 5
444 10
 68 16

制限:

  • 返されるベースは、入力を超えてはなりません。
  • abs(4)以下の数値は有効な入力とは見なされないため、未定義の戻り値は受け入れ可能です

これはcode-golfまたはcode-challengeのいずれかです。要件、受賞基準を詳しく説明して、おそらく入力と望ましい出力の1つ以上の例を挙げてください。
codeporn

最高許容ベースは何ですか?
スティーブンランバルスキー

それが後に表すことは困難で取得するように私は、36を引き受ける
SeanC

2
@SeanCheshire:実際に番号を表示する必要はありません。簡単のような、アレイのような任意の塩基の数値を表すことができ[1,15,3,64,43]、ベースの一部の数のために80。ベース番号のみを出力しているため、から2まですべてのベースを技術的にテストできますn
mellamokb

1
何のための正しい答えである123、すべての拠点に「4」S(0)の同じ番号を持っていますか?また、多くの数は、多くの4基数で同じ数の「4」を持ちます(たとえば、基数> 5、44基数> 45、14基数9、または基数> 15など)。正解は、「4」の数が最も多い最小のベースである必要がありますか?
mellamokb

回答:


24

APL(31 19)

次に、すべての可能なベースをテストします。

⊃⍒{+/4=K⊤⍨K⍴⍵}¨⍳K←⎕

説明:

  • ⍳K←⎕:ユーザー入力を読み取り、Kに保存します。1からKまでのリストを作成します。これらは試してみてください。
  • {... :これらのそれぞれについて、次の関数を実行します
  • K⊤⍨K⍴⍵:Kをそのベースにエンコードし、ベースごとの数字のリスト(数字として)を提供します。K桁を使用します(大きな過大評価ですが、使用されていない数字はすべてゼロになるため問題ではありません)。
  • 4=:これらのどれが4に等しいかを確認
  • +/:これらを合計すると、ベースあたりのフォースの数がわかりました
  • ⊃⍒:リストが下にソートされている場合は、リストのインデックスを指定します。そのため、最大のインデックスが先頭になります。このリストの最初の項目を取ります。

2
APLソリューションが大好きです。
MrZander

25
:そのAPL式がそれを読むとき、ほとんどの人が作る表現が含まれどのようにおかしい
epidemian

5

GolfScript、30文字

.,{[2+.2$\base{4=},,\]}%$)~p];

どのベースでも動作します-コードをオンラインでテストします

コメント:このソリューションは、質問の元のバージョンに基づいています。したがって、入力よりも大きいベースを返す場合があります。たとえば、入力4の場合、ベース5を正しく返します。これは新しいルールでは無効になります。


5

GolfScript(23文字)

~:^,2>{^\base[4]/,~}$0=

または

~:^,2>{^\base[4]/,}$-1=

または

~:^,2>{^\base[4]/,}$)\;

これはstdinから入力を受け取ることに注意してください。HowardのGolfScriptバージョンとの公正な比較のために、1文字を減算します。


ハワードは、規則が変更されたことを指摘し4、有効な出力(4を超える任意の整数)がある場合に可能な入力として除外することはあまり論理的ではありません。その場合もカバーするには、すべての種類の方法で追加できる追加の2文字が必要です。

~:^)),2>{^\base[4]/,}$)\;

または

~:^,{))^\base[4]/,}$)))\;

いくつかの明らかなものであること。


いいね しかし、入力「4」に対して間違った答えを与えます。
ハワード

ルールを完全に変更し、提出後に特殊なケースを削除したことがわかりました。したがって、ソリューションは新しいルールに準拠しています。
ハワード

@Howard、ルールはそのケースを処理する必要がないと言うかもしれませんが、完全性のためにいくつかのバリエーションを追加します。
ピーターテイラー

それにもかかわらず、私は
ハワード

@Howard、本当に望むなら賞金を追加できます;)
ピーターテイラー

4

Python 2.x、77文字

F=lambda x:max((sum(x/b**d%b==4for d in range(99)),b)for b in range(5,99))[1]

最大98桁、最大98桁の数字まで機能します。


4

J、38文字

f=.[:(i.>./)[:+/[:|:4=(10#"0(i.37))#:]

使用法:

   p 624
5
   p 444
10
   p 68
16

4

VBA、121

Function k(a)
For w=5 To a
Z=0:q=a:Do:c=q Mod w:Z=Z-(c=4):q=Int(q/w):Loop Until q=0
If Z>x Then x=Z:k=w
Next
End Function

使用法:

  • ダイレクトウィンドウ: ?k(num)
  • Excelの式: =k(A1)

すべてのベースを修正し、テストを単純に4を
SeanC

FWIWは、あなたがスペースを削除することができますFor w=5To a
トーストエンジニア

3

Mathematica 59

コード

Sort[{Count[IntegerDigits[n, #], 4], #} & /@ Range[5, 36]][[-1, 2]]

上記の関数に名前を付けましょう。

whichBase[n_] := Sort[{Count[IntegerDigits[n, #], 4], #} & /@ Range[2, 36]][[-1, 2]]

説明

  1. Count[IntegerDigits[n,k],4]nのベースk表現の4の数を数えます。
  2. Sort 最少から最大4までのベース。
  3. リストの最後のアイテム、つまり、4が最も多い表現を持つベースからベースを返します。

いくつかの特別な番号

それでは、whichBaseを次の特別な番号に適用しましょう。

numbers= {1953124, 8062156, 26902404, 76695844, 193710244, 444444444, 
943179076, 1876283764, 3534833124, 6357245164, 10983816964, 
18325193796, 29646969124, 46672774204, 71708377284, 107789473684, 
158856009316, 229956041484, 327482302084, 459444789604, 635782877604, 
868720588636, 1173168843844, 1567178659764, 2072449425124, 
2714896551724, 3525282954756, 4539918979204, 5801435550244, 
7359635486844, 9272428079044, 11606852190676}

{5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、 29、30、31、32、33、34、35、36}

各数値を対応する基数に変換すると、それらの特別な点がわかります。


使用したい場合、完全な関数定義のために7バイトを追加する必要があると思いますn。また、MaximalBy本当に役立ちますMaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&
。49

また、現在の一方が上に起動失敗のnが36の代わりに37を与える= 152、
LegionMammal978

あなたのコードは動作しますが、どのベースを使用すべきかをどのように知っているのかわかりません。ベース2〜36(または1〜36)を調べるように指示する必要はありませんか?
DavidC

ベース36は問題で指定されることはありません、とのは、なぜ私はあなたがのために失敗したと主張していることをN = 152 = 4・37 + 4.私のコードをチェックし、すべての1から拠点のn拠点以来、N以降+ 1とは、単一のが含まれます数字のn
LegionMammal978

明確な説明をありがとう。
DavidC

3

Japt -h、10バイト

444in base 10[4,4,4]数字数字を43回含むが444、base 100は3回数字を[4,44]含むが、数字4としては1回だけである。444テストケースの課題で予想される出力を考えると、4を数えることになっていると思います。

õ ñ@ìX è¥4

それを試してみてください

しかし、我々は、以下の場合され、その後の数字4をカウント:

õ ñ@ìX ¬è4

それを試してみてください

õ              :Range [1,...,input]
  ñ@           :Sort by passing each X through a function
    ìX         :  Convert the input to a base X digit array
               :(VERSION 1)
       è       :  Count the elements
        ¥4     :    Equal to 4
               :(VERSION 2)
       ¬       :  Join to a string
        è4     :  Count the occurrences of "4"
               :Implicitly output the last element in the sorted array

2

C-(114文字)

すべてがゴルフの栄光です。

x,k,c,d,n;main(v){scanf("%d",&v);for(k=5;v/k;++k){x=v;c=0;while(x)c+=x%k==4,x/=k;c>=d?n=k,d=c:0;}printf("%d",n);}

そして、やや自由です:

x,k,c,d,n; // declare a bunch of ints, initialized to 0
main(v){   // declare one more, without using an extra comma
    scanf("%d",&v); // get the input (v)
    for(k=5;v/k;++k){ // loop over each base (k) greater than or equal to (/)
                      // our input (v)
        x=v;          // temp value (x) set to input (v)
        c=0;          // number of 4s in the current base (c) re-initialized
        while(x)       // loop over our temp until it's used up
            c+=x%k==4, // if the next digit (x%k) is 4 (==4) increment the
                       // current count (c+=)
            x/=k;      // remove the current digit
        c>=d?n=k,d=c:0; // if the number of 4s in this base (c) is greater
                       // than the current maximum number of 4s (d), then
                       // save the new best base (n), and new maximum
                       // number of 4s
    }
    printf("%d",n);   // output the result
}

おもしろいのは、数値の出力です[0,127](入力数値自体の下の最大の基数です)。

0、0、0、0、0、5、6、7、8、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、5、5 21、22、23、6、25、26、27、7、29、30、31、8、33、34、35、9、37、38、39、10、41、42、43、11、5、 46、47、12、49、50、51、13、53、54、55、14、57、58、59、15、61、62、63、16、65、66、67、17、69、5 71、18、73、74、75、19、7、78、79、20、81、82、83、21、85、86、87、22、89、90、91、23、93、94、5 24、97、98、99、25、101、102、103、26、5、106、107、27、109、5、111、28、113、114、5、29、9、5、5、5 121、122、123


1
@AttilaO。私は誰かが気付くことを望んでいた:)
ゴードンベイリー

2

R- 148 137文字

(したがって、他の競争からは遠く離れていますが、それでも)

f=function(n){s=sapply;which.max(s(lapply(strsplit(s(4:n,function(x){q=n;r="";while(q){r=paste(q%%x,r);q=q%/%x};r})," "),`==`,4),sum))+3}

基本的に入力を基数10から4からnのすべての基数に変換し(モジュロ%%および整数除算を使用%/%)、4が最も多い最初のインデックスを選択します。

f(624)
[1] 5
f(444)
[1] 10

2

@marinus 'APLソリューションのJ翻訳:

NB. Expression form (22 characters, not including "n" - the "argument"):
{.\:(+/@(4=$#:[)"0 i.)n
NB. Function form (24 characters, not including "f=:"):
f=:{.@\:@(+/@(4=$#:[)"0 i.)

興味深いことに、いくつかの値があります。

(,.f"0)9+i.24
 9  5
10  6
11  7
12  8
13  9
14  5
15 11
16  6
17 13
18  7
19  5
20  5
21  5
22  5
23  5
24  5
25  6
26  6
27  6
28  6
29  5
30  7
31  7
32  7

最もフォーティーな変換を与える最小ベースを出力します。表の最後のいくつかの値では、表現は「4n」のように見えます(たとえば、ベース7の31は「43」です)。


2

ゼリー、6バイト

bⱮċ€4M

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

最大4を与えるNまでの「すべて」ベースを出力します。最大または最小ベースが必要な場合は、それぞれ(max)または(min)を追加します。

使い方

bⱮċ€4M    Main link (monad). Input: integer N.
bⱮ        Convert N to each base of 1..N
  ċ€4     Count 4's in each representation
     M    Take maximal indices

2

05AB1E10 9 バイト

LBε4¢}Zk>

@Cowabungholeのおかげで-1バイト。

複数の拠点が4Sの同じ量を持っている場合、それは出力が小さいもの(すなわち意志16になります6が、12また、可能な出力されているだろう)。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

L           # Create a list in the range [1, (implicit) input]
            #  i.e. 624 → [1,2,3,...,622,623,634]
 B          # Convert the (implicit) input integer to Base-N for each N in this list
            #  i.e. 624 and [1,2,3,...,622,623,624]
            #   → ["1","1001110000","212010",...,"12","11","10"]
  ε  }      # Map this list to:
   4¢       #  Count the number of 4s in the number
            #   → [0,0,0,0,4,0,0,0,0,1,0,2,...,0,0,0]
      Z     # Take the max (without popping the list)
            #  i.e. [0,0,0,0,4,0,0,0,0,1,0,2,...,0,0,0] → 4
       k    # Get the index of this max in the list
            #  i.e. [0,0,0,0,4,0,0,0,0,1,0,2,...,0,0,0] and 4 → 4
         >  # Increase it by to convert the 0-index to our base (and output implicitly)
            #  i.e. 4 → 5

に置き換えQƶàられk>ませんか?すなわち、最大値の0から始まるインデックスを見つけて、それをインクリメントしますか?
Cowabunghole

@Cowabungholeああ、あなたは本当に正しい。どうしてそれを見逃したのか分かりません。ありがとう!
ケビンクルーイッセン

1

Linq 273を使用したC#

using System;using System.Linq;class P{static void Main(){int r,z,k=int.Parse(Console.ReadLine());if(k<=4) return;Console.WriteLine(Enumerable.Range(4, k).Select(x =>{r = 0;z = k;while (z > 0){if(z % x==4){r++;}z/=x;}return new[]{r, x};}).OrderBy(n => n[0]).Last()[1]);}}

または

using System;
using System.Linq;

class P
{
    static void Main()
    {
        int r, z, k = int.Parse(Console.ReadLine());
        if (k <= 4) return;
        Console.WriteLine(
            Enumerable.Range(4, k).Select(x =>
                {
                    r = 0;
                    z = k;
                    while (z > 0)
                    {
                        if (z % x == 4)
                        {
                            r++;
                        }
                        z /= x;
                    }
                    return new[] { r, x };
                }).OrderBy(n => n[0]).Last()[1]);

    }
}

変数の数を減らすことができ、ifを?sに変換できることを確認してください。しかたがない...


1

C#(482〜423バイト)

「ゴルフ」ソリューションの最初の試み。上記のVBAと基本的に同じアルゴリズムを使用しました。おそらく、変換関数をインライン化するか、名前を短縮して、いくつかのバイトを節約できます。私が言ったように、これは最初の試みですので、優しくしてください。

空白あり:

using System;
class Program
{
    static void Main(string[] args)
    {
        int n = int.Parse(args[0]);
        int c=0, m=0;
        string r="";
        int t = 0;
        for (int i = 5; i < 37; i++)
        {
            while (n > 0)
            {
                r = (char)((int)(n % i) + 48 + (7 * ((int)(n % i) > 9 ? 1 : 0))) + r;
                n = (int)(n / i);
            }
            t = r.Length - r.Replace("4", "").Length;
            if (t > c) { c = t; m = i; }
        }
        Console.WriteLine("Base: " + m);
    }
}

4
namespaceが必要だとは思わない。Programおよびを含むすべての名前は単一の文字でなければなりませんcBase。はい、インラインにする必要がありますcBase。また、宣言と初期化を組み合わせint c=0,m=0ます。
mellamokb

2
また、テストコードとロジックを実行する関数コードを組み合わせたように見えます。仕様には、数字/数字列の入力と整数の出力が必要です。メソッドを使用せずに、intパラメータを受け取り、パラメータを返す関数を作成し、文字を呼び出してスコアをカウントするだけで十分です。intMain
mellamokb

@mellamokbtheWise-何か新しいことを学びました。名前空間が必要だといつも思っていました。また、テストアレイをうまくキャッチすると、文字数が節約され、実際にこの課題に答えることができます。
theB

1

バーレスク-28バイト

Jbcjro{dg}Z]J{4CN}Cmsb[~Fi?i
Jbcjro                        create a list 1..input and convert input
                              to an infinite list.                      
      {dg}Z]                  convert number to base (zipWith operation)
            J                 duplicate
             {4CN}Cm          create comparison function 
              4CN             count the number of fours.
                    sb        sort by 
                      [~      take the last element (which is going to be
                              the base-n representation where count of fours
                              is highest)
                        Fi    Find the index of this last element in the original
                              unsorted list
                          ?i  increment (because base 1 is index 0)

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


そこに行きます。(編集を参照するか、tio.run / ## SyotykktLixN /…をクリックします)
mroman

1

k、18バイト

{*>+/'4=x{y\x}'!x}

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

{                } /function(x)
        x     '!x  /for every y in 0, 1, ..., (x-1):
         {y\x}     /    do x in base y
      4=           /see which digits equal four
   +/'             /sum, to get number of 4s per base
 *>                /get index (which equals base) of largest number of 4s


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