デジタルサモリアル


21

入力が与えられた場合、すべてのベース1からのnデジタル和の合計を出力/返すプログラムまたは関数を記述nnます。

n+b=2ni=0nbimodb

例:

n = 5


範囲を作成します[1...n][1,2,3,4,5]


各要素xに対して、次の基本x桁の配列を取得しますn[[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]

全単射な塩基15 IS[1,1,1,1,1]

のベース2(バイナリ)5[1,0,1]

な塩基35 IS[1,2]

な塩基45 IS[1,1]

な塩基55 IS[1,0]


数字を合計します。 13


テストケース:

1    1
2    3
3    6
4    8
5    13
6    16
7    23
8    25
9    30
10   35

36   297
37   334

64   883
65   932

シーケンスはOEISで見つけることができます:A131383

得点:

:最低スコアの提出が勝ちます。


4
楽しいもの:227 -> 9999。そしてまた:1383 -> 345678
アーナルド

回答:



7

Haskell、46バイト

f n=sum$do a<-[1..n];mapM(pure[0..a])[1..n]!!n

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

説明

関数は\b n -> mapM(pure[0..b])[1..n]、辞書式順序ですべての文字列[0b]nを生成します。例えば:

mapM(pure[0..2])[0..1] == [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]

これにインデックスを付けることでbase (!!n)に変換できますが、これは単項(nbase- 1)ではb+1機能しませんが、結果を合計しています。.base- n + 1 よりもむしろ仕事の周りのベース-のために1我々が欠けているため、[ 1 ... 1 のn  倍 ]と同じである[ N ]合計するとき。1a <- [1..n](n+1)1[1,,1n times][n]

do-notation を使用すると、すべてのリストをネストするのではなく、単に連結します。

λ [ mapM (pure [0..a]) [1..5] !! n | a <- [1..5] ]
[[0,0,1,0,1],[0,0,0,1,2],[0,0,0,1,1],[0,0,0,1,0],[0,0,0,0,5]]

λ do a <- [1..5]; mapM (pure [0..a]) [1..5] !! n
[0,0,1,0,1,0,0,0,1,2,0,0,0,1,1,0,0,0,1,0,0,0,0,0,5]

6

APL(Dyalog Unicode)、14 バイト

+/∘∊⊢,⊢(⍴⊤⊣)¨⍳

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

説明

いくつかの括弧が暗示されており、追加できます(「公式の」括弧よりも軽い):

+/∘∊(⊢,(⊢(⍴⊤⊣)¨⍳))

これは単項です。引数を指定するとY、この関数は次のように動作します:

+/∘∊(⊢,(⊢(⍴⊤⊣)¨⍳))Y

2つの機能は順番に適用されます。正しいものから始めます。

⊢,(⊢(⍴⊤⊣)¨⍳)

このトレインには3つの機能があるため、これは分岐です。引数を指定するとY、次のように機能します。

(⊢Y),((⊢Y)(⍴⊤⊣)¨⍳Y)

これを簡単に減らすことができます(モナディックは引数を返すため、identityと呼ばれます):

Y,Y(⍴⊤⊣)¨⍳Y

さて、これがY整数(単純なスカラー、つまり数値または文字)であることがわかりました。したがって⍳Y、with ⎕IO=1を返します1 2 ... Y⍳Y実際には形状を持つ配列を返しますYYベクトルである必要があります)。ここで、すべてのスカラーは配列内の自身のインデックスです(そのため、モナディックインデックスジェネレーターと呼ばれます)。これらのインデックスは、1≡⍴Yスカラーであるwhere の場合を除き、ベクトルです(これは私たちの場合です)。

(⍴⊤⊣)¨次に中央の関数を解析しましょう。⍴⊤⊣¨each)のオペランドであり、関数はダイアディックです。したがって、¨演算子は最初に各length-1引数を他の引数の形状に変更します(つまり、要素を取り、それを使用して他の引数のすべてのスカラーを置き換えます) 、および2つの引数の各ペアに関数を適用します。この場合には、⍳Yベクトルであり、Yもしそうであれば、スカラーでありn≡⍴⍳Y、その後Yに変換されるn⍴Y表し形状(単項)及び変形(ダイアディック)関数)。つまり、簡単に言えば、times Yを含む配列に変換されます。YY

それでは、各ペアについて、左引数Xと右引数を呼び出しましょうZ(入力と競合しないようにY)。⍴⊤⊣二項フォークなので、次のように展開されます。

(XZ)⊤XZ

に還元X⊣Zする簡単な最初のステップを作ってみましょうX(ダイアディック左の関数です):

(XZ)⊤X

中にはX⍴Z、再び、ある再形成ので、機能X⍴Z、我々の場合には、単にXZあるエンコード機能が。左の配列が結果の各桁の基数である2つの数値配列(整数または正である必要はない)、つまりエンコード、および右が数値の配列である場合、それらの転置された配列を返します指定されたエンコーディングの数値(転置は、配列の要素の相対的な次元の反転です)。数字の表現は、数値の除算の商と、重要度の低い基数の積に基づいています。いずれかのベースがの場合、ベース0+∞として機能します。引数のスカラーはすべて単純です。以降のX正の整数であり、そしてX⍴Zは等しい要素のベクトルであり、これは実際にはXベースに変換しZX数字に再形成する場合にすぎません。以下のためにバツZNバツZバツベースでZ)よりも持つことができないバツため、桁バツ1有するバツ桁。したがって、X⍴Z私たちの目的には十分です。

Y(⍴⊤⊣)¨⍳Yしたがって、の結果は、Y1からの各基数に変換されY、先頭にゼロが付きます。ただし、1つの問題があります。APLでは、基数1は特別なケースではありませんが、このチャレンジは特別なケースであるため、基数1の合計を含める必要がありますY。幸いなことに、この合計はわずかであるYため、Y1=[111]Y、和は単にそうY×1=Y。したがってY、配列のどこかに追加する必要があります。これは私たちのやり方です:

Y,Y(⍴⊤⊣)¨⍳Y

私はすでにこの部分をここに含めています。二項が,あるCATENATEの機能それができないならば、それは彼らの最後の軸、およびエラーの引数を連結します。ここではY、上Y(⍴⊤⊣)¨⍳YY説明したように、スカラーをvector に単純に連結し、計算する合計をインクリメントします。

最後の部分は、上にある左側の関数です+/∘∊

+/∘∊Y,Y(⍴⊤⊣)¨⍳Y

あるコンオペレータが。f∘g Yはと同じf g Yです。ただし、ここで使用しているので、列車は分岐しません。したがって、以下を削減できます。

+/∊Y,Y(⍴⊤⊣)¨⍳Y

今、合計の時間ですが、待ってください...問題があります。配列はフラットではないため、最初にフラット化する前に要素を合計することはできません。参加機能は、アレイを平坦化します。配列が平坦化されたので、最終的に+/それを合計するために使用します。/ある減らすオペレータは、それが右から左へ優先して、その最後から2番目の軸上の配列の要素の間にダイアディック関数を適用します。配列のランク(次元数、つまり形状の長さ)が減少しない場合、配列は囲まれますが、ここではそうではありません。ここで適用される関数+は、プラスです2つの配列の最後の軸にペアを追加する関数(および配列をそのように追加できない場合はエラー)。ここでは、単純に2つの数字を何度も加算するため、リデュースが完了します。

見よ、私たちの列車:

+/∘∊⊢,⊢(⍴⊤⊣)¨⍳

+1印象的な説明。短くはありませんが、括弧はありません:+/∘∊⊢,⊢⊤¨⍨⊢⍴¨⍳
アダム

@Adámありがとう!私はそれを書いたとき、ほとんど眠っていました。:-P
エリック・ザ・アウトゴルファー

@Adámあなたのバージョンに関しては、理解するのが少し難しいようです。;-)
エリック・ザ・アウトゴルファー

6

ルビー39 37

->n{(2..n).sum{|b|n.digits(b).sum}+n}

ここでの唯一のゴルフは、空白を削除することです。オンラインで試す


@Giuseppe OPは「与えられた入力n、(...)」で始まります。私はここに長い間いません。ソリューションの要件のリストはありますか?
steenslag

2
通常は、完全なプログラムまたは関数(名前付きまたは名前なし)である必要があります。詳細については、「抜け穴I / Oデフォルト」を参照してください。ルビーはわかりませんが、これは最も短い修正のようです。
ბიმო

@BMOありがとう。Rubyを知らない人にとっては、ラムダを最も簡単に作成して呼び出すことができます!
steenslag

1
括弧を削除できますn(37b):->n{(2..n).sum{|b|n.digits(b).sum}+n}
コナーオブライエン

1
さて、グーグル「ルビーラムダ」がトリックをしました; Pしかし、私はあなたが2バイトを保存することができたという点で訂正します。
ბიმო

5

Python 2、57バイト

lambda n:sum(n/(k/n+2)**(k%n)%(k/n+2)for k in range(n*n))

an=b=2n+1=0n1nbmodb
nn+10modn+1=n

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


5

Java 8、76 65バイト

n->{int r=n,b=n,N;for(;b>1;b--)for(N=n;N>0;N/=b)r+=N%b;return r;}

@OlivierGrégoireのおかげで-11バイト。

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

説明:

n->{           // Method with integer as both parameter and return-type
  int r=n,     //  Result-sum, starting at the input to account for Base-1
      b=n,     //  Base, starting at the input
      N;       //  Temp integer
  for(;b>1     //  Loop the Base `b` in the range [n, 1):
      ;b--)    //    After every iteration: Go to the next Base (downwards)
    for(N=n;   //   Set `N` to the input `n`
        N>0;   //   Loop as long as `N` isn't 0 yet:
        N/=b)  //     After every iteration: Divide `N` by the Base `b`
      r+=N%b;  //    Increase the result `r` by `N` modulo the Base `b`
  return r;}   //  Return the result-sum `r`


@OlivierGrégoireくそー、私はバカです。どうもありがとう!うーん、今私はまた私の派生Cと空白の答えゴルフに必要な..;)
ケビンCruijssen

4

デモ、127バイト

fn=b=2n+1=0n1modnbb

f\left(n\right)=\sum_{b=2}^{n+1}\sum_{i=0}^{n-1}\operatorname{mod}\left(\operatorname{floor}\left(\frac{n}{b^i}\right),b\right)

ffn

65932

desmos.comで生成されたグラフ

Desmos、56バイト

f2n

f(n)=\sum_{b=2}^{n+1}\sum_{i=0}^{n-1}mod(floor(n/b^i),b)

2番目の合計はnまで実行でき、3バイトを節約できます^n
TheConstructor

また、別の2バイトの保存に変更\sum_{b=2}^{n+1}することもできn+\sum_{b=2}^nます
TheConstructor

4

SAS、81 74バイト

data;input n;s=n;do b=2to n;do i=0to n;s+mod(int(n/b**i),b);end;end;cards;

次のように、入力はcards;ステートメントの後に改行で入力されます。

data;input n;s=n;do b=2to n;do i=0to n;s+mod(int(n/b**i),b);end;end;cards;
1
2
3
4
5
6
7
8
9
10
36
37
64
65

s(ヘルパー変数とともに)回答を含むデータセットを、各入力値の行とともに出力します

ここに画像の説明を入力してください

ゴルフをしていない:

data; /* Implicit dataset creation */
input n; /* Read a line of input */

s=n; /* Sum = n to start with (the sum of base 1 digits of n is equal to n) */
do b=2to n; /* For base = 2 to n */
    do i=0to n; /* For each place in the output base (output base must always have less than or equal to n digits) */

        /* Decimal value of current place in the output base = b^i      */
        /* Remainder = int(b / decimal_value)                           */
        /* Current place digit = mod(remainder, base)                   */
        s+mod(int(n/b**i),b);
    end;
end;

cards;
1
2
3



3

05AB1E(レガシー)、5バイト

LвOO+

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

説明:

LвOO+  //Full program
L      //push [1 .. input]
 в     //for each element b, push digits of input converted to base b
  O    //sum each element
   O   //sum each sum
    +  //add input

05AB1E(レガシー)では、ベース1の5は[0,0,0,0,0]であり、[1,1,1,1,1]ではありません。したがって、範囲を合計した後、不足しているベース1を説明する入力を追加します。

現在の05AB1Eでは、ベース1の5が[1]であるため、05AB1E(レガシー)を使用しています。これを説明するには、結果を1減らすか、範囲の最初の要素を削除する必要があります。どちらも1バイトかかります。



3

空白、153バイト

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S N
S _Duplicate_input][N
S S N
_Create_Label_OUTER_LOOP][S N
S _Duplicate_top][S S S T   N
_Push_1][T  S S T   _Subtract][N
T   S S N
_If_0_Jump_to_Label_PRINT][S S S N
_Push_0][S N
S _Duplicate_0][T   T   T   _Retrieve_input][N
S S T   N
_Create_Label_INNER_LOOP][S N
S _Duplicate][N
T   S S S N
_If_0_Jump_to_Label_AFTER_INNER_LOOP][S N
T   _Swap_top_two][S T  S S T   N
_Copy_1st_item_to_top][S T  S S T   T   N
_Copy_3rd_item_to_top][T    S T T   _Modulo][T  S S S _Add][S N
T   _Swap_top_two][S T  S S T   S N
_Copy_2nd_item_to_top][T    S T S _Integer_divide][N
S N
T   N
_Jump_to_Label_INNER_LOOP][N
S S S S N
_Create_Label_AFTER_INNER_LOOP][S N
N
_Discard_top][S T   S S T   S N
_Copy_2nd_item_to_top][T    S S S _Add][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S T   _Subtract][N
S N
N
_Jump_to_Label_OUTER_LOOP][N
S S S N
_Create_Label_PRINT][S N
N
_Discard_top][T N
S T _Print_as_integer]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

オンラインで試してください(未加工のスペース、タブ、改行のみ)。

ホワイトスペースにはベース変換ビルトインがまったくないため、私のJava 8の回答のポートです。

実行例: input = 3

Command    Explanation                     Stack            Heap   STDIN  STDOUT  STDERR

SSSN       Push 0                          [0]
SNS        Duplicate 0                     [0,0]
TNTT       Read STDIN as integer           [0]              {0:3}  3
TTT        Retrieve input from heap 0      [3]              {0:3}
SNS        Duplicate 3                     [3,3]            {0:3}
NSSN       Create Label_OUTER_LOOP         [3,3]            {0:3}
 SNS       Duplicate 3                     [3,3,3]          {0:3}
 SSSTN     Push 1                          [3,3,3,1]        {0:3}
 TSST      Subtract (3-1)                  [3,3,2]          {0:3}
 NTSSN     If 0: Jump to Label_PRINT       [3,3]            {0:3}
 SSSN      Push 0                          [3,3,0]          {0:3}
 SNS       Duplicate 0                     [3,3,0,0]        {0:3}
 TTT       Retrieve input from heap 0      [3,3,0,3]        {0:3}
 NSSTN     Create Label_INNER_LOOP         [3,3,0,3]        {0:3}
  SNS      Duplicate 3                     [3,3,0,3,3]      {0:3}
  NTSSSN   If 0: Jump to Label_AFTER_IL    [3,3,0,3]        {0:3}
  SNT      Swap top two                    [3,3,3,0]        {0:3}
  STSSTN   Copy (0-indexed) 1st            [3,3,3,0,3]      {0:3}
  STSSTTN  Copy (0-indexed) 3rd            [3,3,3,0,3,3]    {0:3}
  TSTT     Modulo (3%3)                    [3,3,3,0,0]      {0:3}
  TSSS     Add (0+0)                       [3,3,3,0]        {0:3}
  SNT      Swap top two                    [3,3,0,3]        {0:3}
  STSSTSN  Copy (0-indexed) 2nd            [3,3,0,3,3]      {0:3}
  TSTS     Integer divide (3/3)            [3,3,0,1]        {0:3}
  NSNTN    Jump to LABEL_INNER_LOOP        [3,3,0,1]        {0:3}

  SNS      Duplicate 1                     [3,3,0,1,1]      {0:3}
  NTSSSN   If 0: Jump to Label_AFTER_IL    [3,3,0,1]        {0:3}
  SNT      Swap top two                    [3,3,1,0]        {0:3}
  STSSTN   Copy (0-indexed) 1st            [3,3,1,0,1]      {0:3}
  STSSTTN  Copy (0-indexed) 3rd            [3,3,1,0,1,3]    {0:3}
  TSTT     Modulo (1%3)                    [3,3,1,0,1]      {0:3}
  TSSS     Add (0+1)                       [3,3,1,1]        {0:3}
  SNT      Swap top two                    [3,3,1,1]        {0:3}
  STSSTSN  Copy (0-indexed) 2nd            [3,3,1,1,3]      {0:3}
  TSTS     Integer divide (1/3)            [3,3,1,0]        {0:3}
  NSNTN    Jump to LABEL_INNER_LOOP        [3,3,1,0]        {0:3}

  SNS      Duplicate 0                     [3,3,1,0,0]      {0:3}
  NTSSSN   If 0: Jump to Label_AFTER_IL    [3,3,1,0]        {0:3}
 NSSSSN    Create Label_AFTER_IL           [3,3,1,0]        {0:3}
  SNN      Discard top                     [3,3,1]          {0:3}
  STSSTSN  Copy (0-indexed) 2nd            [3,3,1,3]        {0:3}
  TSSS     Add (1+3)                       [3,3,4]          {0:3}
  SNT      Swap top two                    [3,4,3]          {0:3}
  SSSTN    Push 1                          [3,4,3,1]        {0:3}
  TSST     Subtract (3-1)                  [3,4,2]          {0:3}
  NSNN     Jump to LABEL_OUTER_LOOP        [3,4,2]          {0:3}

 SNS       Duplicate 2                     [3,4,2,2]        {0:3}
 SSSTN     Push 1                          [3,4,2,2,1]      {0:3}
 TSST      Subtract (2-1)                  [3,4,2,1]        {0:3}
 NTSSN     If 0: Jump to Label_PRINT       [3,4,2]          {0:3}
 SSSN      Push 0                          [3,4,2,0]        {0:3}
 SNS       Duplicate 0                     [3,4,2,0,0]      {0:3}
 TTT       Retrieve input from heap 0      [3,4,2,0,3]      {0:3}
 NSSTN     Create Label_INNER_LOOP         [3,4,2,0,3]      {0:3}
  SNS      Duplicate 3                     [3,4,2,0,3,3]    {0:3}
  NTSSSN   If 0: Jump to Label_AFTER_IL    [3,4,2,0,3]      {0:3}
  SNT      Swap top two                    [3,4,2,3,0]      {0:3}
  STSSTN   Copy (0-indexed) 1st            [3,4,2,3,0,3]    {0:3}
  STSSTTN  Copy (0-indexed) 3rd            [3,4,2,3,0,3,2]  {0:3}
  TSTT     Modulo (3%2)                    [3,4,2,3,0,1]    {0:3}
  TSSS     Add (0+1)                       [3,4,2,3,1]      {0:3}
  SNT      Swap top two                    [3,4,2,1,3]      {0:3}
  STSSTSN  Copy (0-indexed) 2nd            [3,4,2,1,3,2]    {0:3}
  TSTS     Integer divide (3/2)            [3,4,2,1,1]      {0:3}
  NSNTN    Jump to LABEL_INNER_LOOP        [3,4,2,1,1]      {0:3}

  SNS      Duplicate 1                     [3,4,2,1,1,1]    {0:3}
  NTSSSN   If 0: Jump to Label_AFTER_IL    [3,4,2,1,1]      {0:3}
  SNT      Swap top two                    [3,4,2,1,1]      {0:3}
  STSSTN   Copy (0-indexed) 1st            [3,4,2,1,1,1]    {0:3}
  STSSTTN  Copy (0-indexed) 3rd            [3,4,2,1,1,1,2]  {0:3}
  TSTT     Modulo (1%2)                    [3,4,2,1,1,1]    {0:3}
  TSSS     Add (1+1)                       [3,4,2,1,2]      {0:3}
  SNT      Swap top two                    [3,4,2,2,1]      {0:3}
  STSSTSN  Copy (0-indexed) 2nd            [3,4,2,2,1,2]    {0:3}
  TSTS     Integer divide (1/2)            [3,4,2,2,0]      {0:3}
  NSNTN    Jump to LABEL_INNER_LOOP        [3,4,2,2,0]      {0:3}

  SNS      Duplicate 0                     [3,4,2,2,0,0]    {0:3}
  NTSSSN   If 0: Jump to Label_AFTER_IL    [3,4,2,2,0]      {0:3}
 NSSSSN    Create Label_AFTER_IL           [3,4,2,2,0]      {0:3}
  SNN      Discard top                     [3,4,2,2]        {0:3}
  STSSTSN  Copy (0-indexed) 2nd            [3,4,2,2,4]      {0:3}
  TSSS     Add (2+4)                       [3,4,2,6]        {0:3}
  SNT      Swap top two                    [3,4,6,2]        {0:3}
  SSSTN    Push 1                          [3,4,6,2,1]      {0:3}
  TSST     Subtract (2-1)                  [3,4,6,1]        {0:3}
  NSNN     Jump to LABEL_OUTER_LOOP        [3,4,6,1]        {0:3}

 SNS       Duplicate 1                     [3,4,6,1,1]      {0:3}
 SSSTN     Push 1                          [3,4,6,1,1,1]    {0:3}
 TSST      Subtract (1-1)                  [3,4,6,1,0]      {0:3}
 NTSSN     If 0: Jump to Label_PRINT       [3,4,6,1]        {0:3}
NSSSSN     Create Label_PRINT              [3,4,6,1]        {0:3}
 SNN       Discard top                     [3,4,6]          {0:3}
 TNST      Print top (6) to STDOUT as int  [3,4]            {0:3}         6
                                                                                  error

プログラムはエラーで停止します:出口が見つかりません。(このNNNエラーを取り除くために、3つの末尾の改行を追加できました。)


3

R、60バイト

function(n){if(n-1)for(i in 2:n)F=F+sum(n%/%i^(0:n)%%i)
n+F}

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

が得ることができるよりも大きいn>143ので失敗します。単純に置き換えることを提案してくれたJosh Ellerに感謝144^144doublelog(n,i)n

以下のために動作しn>143ます; どの時点で機能しなくなるかわかりません。

R、67バイト

function(n){if(n-1)for(i in 2:n)F=F+sum(n%/%i^(0:log(n,i))%%i)
n+F}

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

従来のn%/%i^(0:log(n,i))%%i方法を使用して、各baseのbase- idigit を抽出し、それらを合計してに初期化し、次に結果(にの基本表現)を追加して返します。のために、それはベースをスキップして、単に追加します。nb>1F0n1nFn=1nF


1
私はRを知りませんが、使用する代わりに、使用0:log(n,i)できませんでした0:nか?nのベース表現には常に最大n桁あり、最初のlog(n,i)桁以降はすべて0である必要があるため、合計には影響しません。
ジョシュ

@JoshEllerできると思う。これは、ために失敗し始めるだろうn=144から、143^143周りで1.6e308かつ144^144に評価Inf。ありがとう!
ジュゼッペ

3

Python 2、61バイト

f=lambda n,b=2.:n and n%b+f(n//b,b)+(n//b>1/n==0and f(n,b+1))

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

これはより長いデニスの解決策に基づいていますが、私はこの方法はあまりにも面白くて共有できないと思います。

目標は、最後の桁の切り捨てn->n/bとbaseの増分の両方で再帰するb->b+1ことですが、1つ以上の桁が切り取られた後に基数が増加しないようにします。これは、ベースbをフロートにすることで実現されます。そのため、更新n->n//b後にフロートがフロートにb感染nします。このように、nfloat かどうかは、から数字を削除したかどうかのビットフラグですn

条件1/n==0が満たされ、incrementingに再帰する必要があります。floorの分割は行われますが、floatsは失敗するためb、整数はn満たされます。(n=1また失敗しますが、とにかく再帰したくありません。)それ以外の場合、floatは、floor divisionに注意しているため、関数の整数のように機能n//bし、出力は整数のfloatです。


3

C(gcc)、67 56バイト

b,a,s;e(n){for(b=a=n;a>1;a--)for(s=n;s;s/=a)b+=s%a;n=b;}

私のJava 8回答の移植版。Javaでの@OlivierGrégoireのゴルフの
おかげで、-11バイトになりました。

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

説明:

b,             // Result integer
a,             // Base integer
s;             // Temp integer
e(n){          // Method with integer as parameter
  for(b=a=n;   //  Set the result `b` to input `n` to account for Base-1
               //  And set Base `a` to input `n` as well
      a>1      //  Loop the Base `a` in the range [input, 1):
      ;a--)    //    After every iteration: Go to the next Base (downwards)
    for(s=n;   //   Set `s` to input `n`
        s;     //   Inner loop as long as `s` is not 0 yet:
        s/=a)  //     After every iteration: Divide `s` by Base `a`
      b+=s%a;  //    Add `s` modulo Base `a` to the result `b`
  n=b;}        //  Set input `n` to result `b` to 'return it'

2

JavaScript(ES6)、42バイト

このバージョンは私の主な答えとほとんど同じですが、算術アンダーフローに依存して再帰を停止します。サポートされる最大値は、呼び出しスタックのサイズによって異なります。

f=(n,b=1,x)=>b>n?n:~~x%b+f(n,b+!x,x?x/b:n)

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


JavaScript(ES6)、 51 48  44バイト

f=(n,b=2,x=n)=>b>n?n:x%b+f(n,b+!x,x?x/b|0:n)

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

コメント済み

f = (             // f = recursive function taking:
  n,              // - n = input
  b = 2,          // - b = current base, initialized to 2
  x = n           // - x = current value being converted in base b
) =>              //
  b > n ?         // if b is greater than n:
    n             //   stop recursion and return n, which is the sum of the digits of n
                  //   once converted to unary
  :               // else:
    x % b +       //   add x modulo b to the final result
    f(            //   and add the result of a recursive call:
      n,          //     pass n unchanged
      b + !x,     //     increment b if x = 0
      x ?         //     if x is not equal to 0:
        x / b | 0 //       update x to floor(x / b)
      :           //     else:
        n         //       reset x to n
    )             //   end of recursive call


2

、6バイト

私は本当にのようなものがあったことを望むMためcmap:(

Σ§ṁ`Bḣ

オンラインで試すか、すべてをテストしてください

説明

Σ§ṁ`Bḣ  -- example input: 5
 §      -- fork the argument..
     ḣ  -- | range: [1,2,3,4,5]
   `B   -- | convert argument to base: (`asBase` 5)
  ṁ     -- | and concatMap: cmap (`asBase` 5) [1,2,3,4,5]
        -- : [1,1,1,1,1,1,0,1,1,2,1,1,1,0]
Σ       -- sum: 13

または、6バイト

ΣΣṠMBḣ

オンラインで試すか、すべてをテストしてください

説明

ΣΣṠMBḣ  -- example input: 5
  Ṡ     -- apply .. 
     ḣ  -- | range: [1,2,3,4,5]
           .. to function applied to itself
   MB   -- | map over left argument of base
        -- : [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
 Σ      -- flatten: [1,1,1,1,1,1,0,1,1,2,1,1,1,0]
Σ       -- sum: 13



1

アタッシュ、25バイト

{Sum!`'^^ToBase[_,2:_]'_}

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

説明

{Sum!`'^^ToBase[_,2:_]'_}
{                       }   anonymous lambda, input: _
                            example: 5
         ToBase[_,   ]      convert `_`
                  2:_       ...to each base from 2 to `_`
                            example: [[1, 0, 1], [1, 2], [1, 1], [1, 0]]
                      '_    append `_`
                            example: [[1, 0, 1], [1, 2], [1, 1], [1, 0], 5]
       ^^                   fold...
     `'                     the append operator over the list
                            example: [1, 0, 1, 1, 2, 1, 1, 1, 0, 5]
 Sum!                       take the sum
                            example: 13

1

、12バイト

IΣEIθΣ↨Iθ⁺²ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。木炭は基数1に変換できませんが、幸いなことに数字の合計は基数への変換と同じですn+1。説明:

    θ           First input
   I            Cast to integer
  E             Map over implicit range
        θ       First input
       I        Cast to integer
      ↨         Converted to base
           ι    Current index
         ⁺      Plus
          ²     Literal 2
     Σ          Sum
 Σ              Grand total
I               Cast to string
                Implicitly print

1

Retina 0.8.2、49バイト

.+
$*
1
11$`;$_¶
+`\b(1+);(\1)+
$1;$#2$*1,
1+;

1

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

.+
$*

単項に変換します。

1
11$`;$_¶

2からのすべての番号をリストします n+1 (これはベース1の変換よりも簡単だからです)。

+`\b(1+);(\1)+
$1;$#2$*1,

繰り返されるdivmodを使用して、元の数値を各基数に変換します。

1+;

ベースのリストを削除し、ベース変換桁のみを残します。

1

合計を取り、10進数に変換します。



0

APL(NARS)、29文字、58バイト

{+/+/¨⍵{(⍺⍴⍨⌊1+⍺⍟⍵)⊤⍵}⍨¨1+⍳⍵}

使用方法に関する小さなテスト:

  h←{+/+/¨⍵{(⍺⍴⍨⌊1+⍺⍟⍵)⊤⍵}⍨¨1+⍳⍵}
  h¨1 2 4 10 36 37 64 65
1 3 8 35 297 334 883 932 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.