細分割和シーケンス


8

順番にリストされている、1を超える整数の基数の数字を検討します。数字のすべてのチャンクが奇数の長さになるまで、それらを正確に半分に繰り返し再分割します。

Base    Digits              Subdivided Digit Chunks
2       01                  0 1
3       012                 012
4       0123                0 1 2 3
5       01234               01234
6       012345              012 345
7       0123456             0123456
8       01234567            0 1 2 3 4 5 6 7
9       012345678           012345678
10      0123456789          01234 56789
11      0123456789A         0123456789A
12      0123456789AB        012 345 678 9AB
...                                                        
16      0123456789ABCDEF    0 1 2 3 4 5 6 7 8 9 A B C D E F
...

ここで、このテーブルの任意の行について、細分割された数字のチャンクをその行のベースの数値として読み取り、それらを合計します。便宜上、結果を基数10で示します。

例えば...

  • ベース3のための唯一の数の合計にある:012 3 = 12 3 = 5 10
  • 基数4の場合、合計する4つの数値があります:0 4 + 1 4 + 2 4 + 3 4 = 12 4 = 6 10
  • 基数6:012 6 + 345 6 = 401 6 = 145 10
  • 基数11:0123456789A 11 = 2853116705 10

チャレンジ

1より大きい整数をベースとして取り、この細分合計手順を実行して、最終的な合計をベース10に出力するプログラムを記述します。(したがって入力がある場合に3出力され5入力された場合、6出力される145等)

(数字はかなり大きな得ることができますので、または文字列)整数を受け取り、返す関数の書き込みのいずれかまたは入力と出力に値を使用標準入力/標準出力を。

バイト単位の最短コードが優先されます

ノート

  • 組み込みまたはインポートされた基本変換関数を使用できます。
  • 入力値に上限はありません(妥当な以外にInt.Max)。"Z"がそこで止まるからといって、入力値は36で止まりません。

PS これは私の50番目の質問です :)


関数を使用する場合、「10進数の最終合計」とはどういう意味ですか。出力を返す場合、コンピューター内でバイナリとして表されます。「10を底とする」とはどういう意味ですか?
誇り高いハスケラー2014

2
50問に達しました。おめでとうございます。そして、そのような驚くべき多様性。ありがとう。
DavidC 2014

@proudhaskellerその場合、もしあればベース10の例を示してください。ただし、数値が非常に大きくなる可能性があるため、関数が文字列を返す場合も問題ありません。そして、ベース10使用しています
カルバンの趣味

回答:


4

CJam、17 15

q5*~W*&/\,/fb:+

入力に後続の改行がある場合に機能します。

知らない人のためのより明白なバージョンx & -x

q5*~(~&/\,/fb:+

使い方

q5*~               " Push 5 times the input as numbers. ";
W*&/               " Calculate n / (n & -n). (Or n / (n & ~(n-1))) ";
\,                 " List the digits. ";
/                  " Split into chunks. ";
fb:+               " Sum in the correct base. ";

1
2の最高のパワーを得るのx & -xは本当に賢いです。
デニス

それ以来、これを受け入れている最短が、エルに小道具式を求めます。
カルバンの趣味

11

Python、 82 78

def f(b):G=b^b&b-1;return sum(b**(b/G-i-1)*(G*i+(G-1)*b/2)for i in range(b/G))

えっ?

  • 細分割によって得られる桁グループの数Gは、桁数(つまり、基数)を分割する2の最大の累乗bです。これは、G = b ^(b&(b-1))で与えられます。ここで、^はビットごとのXORです。nn&(n-1)= 0の場合の2の累乗であるという事実に精通している場合は、その理由を簡単に確認できます。それ以外の場合は、いくつかのケースを(バイナリで)解決すれば、それが明らかになります。

  • グループあたりの桁数gは、単にb / Gです。

  • 最初の数字グループ012 ...(g-1)は、基数bの数値としてですF3

  • 次のグループg(g + 1)...(2g-1)は、基数bの数値として合計 F4です。

  • より一般的には、N番目のグループ(ゼロベースの)、ベースに数としてBN、です。F5

  • Gグループがあることを思い出してください。したがって、すべてのグループの合計が F6.1 F6.2
    プログラムで計算されるものになります。


うわー、それはすごいです、どうやってその公式を理解したのですか?これをCJamに変換してもよろしいですか?
オプティマイザ

@オプティマイザーどうぞ!時間があれば、説明を書きます。
Ell

1
まだ「ハァッ?」みたいな人なら+1 その説明を読んだ後:D
オプティマイザ

ただ、説明のいずれかの障害があるため、明確ではないことが、私の脳のためにそのが複雑すぎるためにする:D
オプティマイザ

1
それは魔法です!次を使用していくつかの文字を保存できます~b/G-i-1can be b/g+~iand (G-1)*b/2can be~-G*b/2
xnor

2

CJam(スナップショット)、19バイト

li__,\mf2m1+:*/fb:+

最新の安定版リリース(0.6.2)には、Long ではなくInteger を返す可能性のあるバグがあることに注意してくださいmf。かなり逆説的に、これは整数(:i)にキャストすることで回避できます。

これをCJam 0.6.2で(たとえば、オンラインインタープリターで)実行するには、次のコードを使用する必要があります。

li__,\mf:i2m1+:*/fb:+

または、次のコマンドを実行して、最新のスナップショットをダウンロードしてビルドすることもできます。

hg clone http://hg.code.sf.net/p/cjam/code cjam-code
cd cjam-code/
ant

テストケース

$ cjam <(echo 'li__,\mf2m1+:*/fb:+') <<< 3; echo
5
$ cjam <(echo 'li__,\mf2m1+:*/fb:+') <<< 4; echo
6
$ cjam <(echo 'li__,\mf2m1+:*/fb:+') <<< 6; echo
145
$ cjam <(echo 'li__,\mf2m1+:*/fb:+') <<< 11; echo
2853116705

使い方

li                     " N := int(input()) ";
   _,                  " A := [ 0 1 ... (N - 1) ] ";
  _  \mf               " F := factorize(N) ";
        2m1+           " F := F - [2] + [1] ";
            :*         " L := product(F) ";
              /        " A := A.split(L) ";
               fb      " A := { base(I, N) : I ∊ A } ";
                 :+    " R := sum(A) ";

2

ハスケル、74 69 55

f n=sum[(n-x)*n^mod(x-1)(until odd(`div`2)n)|x<-[1..n]]

例:

*Main> map f [2..15]
[1,5,6,194,145,22875,28,6053444,58023,2853116705,2882,2103299351334,58008613,2234152501943159]


1

Mathematica、114バイト(または72バイト)

うーん、これは思ったより長くなりました:

f@b_:=Tr[#~FromDigits~b&/@({Range@b-1}//.{a___,x_List,c___}/;EvenQ[l=Length@x]:>Join@@{{a},Partition[x,l/2],{c}})]

そしてゴルフされていない:

f@b_ := Tr[#~FromDigits~
     b & /@ ({Range@b - 1} //. {a___, x_List, c___} /; 
       EvenQ[l = Length@x] :> Join @@ {{a}, Partition[x, l/2], {c}})]

または、Ellの気の利いた数式をそのまま移植した場合、72バイトになります。

f=Sum[#^(#/g-i-1)(g*i+(g-1)#/2),{i,0,#/(g=Floor[BitXor[#,#-1]/2+1])-1}]&

1

J-22文字

y右側で単一の引数を取る関数(このゴルフの目的のために呼び出す)。

+/@(#.i.]\~-%2^0{1&q:)

最初に使う 1&q:y 2で割り切れる回数を取得するためし、次にその数で2で割り-yます。これにより、物事を分割する必要がある幅の負が得られます。これは完璧です。これは]\、引数が正の場合はオーバーラップし、負の場合はオーバーラップしないためです。

だから私たちは分割します i.y 0から整数までy-1のこれらの幅のベクトルに、#.それらを基数yから基数10 に変換するために使用します。最後に+/、合計が行われ、完了です。

例:(J REPLでの入力はインデントされ、出力は左揃えです)

   +/@(#.i.]\~-%2^0{1&q:) 6
145
   f =: +/@(#.i.]\~-%2^0{1&q:)
   f 11
2853116705
   (,: f every) 1+i.14   NB. make a little table for 1 to 14
1 2 3 4   5   6     7  8       9    10         11   12            13       14
0 1 5 6 194 145 22875 28 6053444 58023 2853116705 2882 2103299351334 58008613
   f every 20 30 40x     NB. x for extended precision
5088086 7455971889417360285373 368128332
   ":"0 f every 60 240 360 480 720 960x   NB. ":"0 essentially means "align left"
717771619660116058603849466
3802413838066881388759839358554647144
37922443403157662566333312695986004014731504774215618040741346803890772359370271801118861585493594866582351161148652
256956662280637244030391695293099315292368
2855150453577666748223324970642938808770913717928692581430408703547858603387919699948659399838672549766810262282841452256553202264
17093564446058417577302441219081667908764017056

0

JavaScript、 99 89バイト

function f(n){m=n/(n&-n);for(r=s=i=0;;){if(!(i%m)){r+=s;s=0;if(i==n)return r;}s=s*n+i++}}

または

function g(n){c=n&-n;for(s=i=0;i<n/c;++i)s+=Math.pow(n,n/c-i-1)*(c*i+(c-1)*n/2);return s}

2番目の関数はEllの関数に似ています。最初のものは、より伝統的なアプローチを使用しています。どちらもサイズは89文字です。

ここで試してください:http : //jsfiddle.net/wndv1zz8/1/


0

ゼリー10 9バイト

Ḷœs&N$ðḅS

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

n & -n分割するチャンクの数として直接使用する場合を除いて、基本的にはjimmy23013のCJam回答の単なる変換です。

        S    The sum of
Ḷ            the range from 0 to the input minus one
 œs          split into sublists of length equal to
   &         the input bitwise AND
    N$       its negation
      ðḅ     with each sublist converted from base-the-link's-argument.

(これðはマッピングとは関係ありません:左の引数をベクトル化するだけであり、その結果を左の引数として、メインリンクへの引数を右の引数として取る新しい二項連鎖としてð分離ḅSḶœsÇます。)

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