Subdivide-Sum Sequence


8

Xem xét các chữ số của bất kỳ cơ sở tích phân nào trên một, được liệt kê theo thứ tự. Chia chúng chính xác thành một nửa liên tục cho đến khi mỗi đoạn chữ số có độ dài lẻ:

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
...

Bây giờ, đối với bất kỳ hàng nào trong bảng này, hãy đọc các khối chữ số được chia nhỏ dưới dạng số trong cơ sở của hàng đó và tính tổng chúng. Đưa ra kết quả trong cơ sở 10 cho thuận tiện.

Ví dụ...

  • đối với cơ sở 3 chỉ có một số để tổng hợp: 012 3 = 12 3 = 5 10
  • đối với cơ sở 4 có 4 số cần tổng: 0 4 + 1 4 + 2 4 + 3 4 = 12 4 = 6 10
  • cơ sở 6: 012 6 + 345 6 = 401 6 = 145 10
  • cơ sở 11: 0123456789A 11 = 2853116705 10

Thử thách

Viết chương trình lấy số nguyên lớn hơn một số làm cơ sở và thực hiện thủ tục tổng chia nhỏ này, xuất ra tổng cuối cùng trong cơ sở 10 . (Vì vậy, nếu đầu vào là 3đầu ra 5, nếu đầu vào là 6đầu ra 145, v.v.)

Viết hàm lấy và trả về một số nguyên (hoặc chuỗi vì các số có thể trở nên khá lớn) hoặc sử dụng stdin / stdout để nhập và xuất các giá trị.

Mã ngắn nhất tính bằng byte thắng.

Ghi chú

  • Bạn có thể sử dụng bất kỳ chức năng chuyển đổi cơ sở tích hợp hoặc nhập khẩu.
  • Không có giới hạn trên cho giá trị đầu vào (bên cạnh mức hợp lý Int.Max). Các giá trị đầu vào không dừng ở 36 chỉ vì "Z" dừng ở đó .

ps đây là câu hỏi thứ năm mươi của tôi :)


nếu tôi sử dụng một hàm, nghĩa là ".. tổng cuối cùng trong cơ sở 10" nghĩa là gì? nếu chúng ta trả lại đầu ra, thì nó được thể hiện bên trong máy tính ở dạng nhị phân. "trong cơ sở 10" có nghĩa là gì?
tự hào

2
Chúc mừng bạn đã đạt được 50 câu hỏi. Và như một sự đa dạng đáng kinh ngạc. Cảm ơn.
DavidC

@proudhaskeller Trong trường hợp đó, chỉ cần đưa ra ví dụ của bạn trong cơ sở 10 nếu bạn có bất kỳ. Mặc dù nó cũng ổn nếu hàm trả về một chuỗi vì các số có thể khá lớn. Sau đó sử dụng cơ sở 10.
Sở thích của Calvin

Câu trả lời:


4

CJam, 17 15

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

Hoạt động nếu có một dòng mới trong đầu vào.

Một phiên bản rõ ràng hơn cho những người không biết x & -x:

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

Làm thế nào nó hoạt động

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
Có được sức mạnh cao nhất là 2 như x & -xthực sự thông minh.
Dennis

Chấp nhận điều này vì nó ngắn nhất, nhưng là đạo cụ cho Ell để tìm công thức.
Sở thích của Calvin

11

Con trăn 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))

Huh?

  • Số lượng các nhóm chữ số mà phân nhóm mang lại, G , chỉ đơn giản là sức mạnh lớn nhất của hai phân chia số chữ số (tức là cơ sở), b . Nó được đưa ra bởi G = b ^ (b & (b - 1)) , trong đó ^ là bitwise-XOR. Nếu bạn quen thuộc với thực tế rằng n là lũy thừa của hai iff n & (n - 1) = 0 thì sẽ khá dễ dàng để biết lý do tại sao. Nếu không, hãy tìm ra một vài trường hợp (ở dạng nhị phân) và nó sẽ trở nên rõ ràng.

  • Số lượng chữ số cho mỗi nhóm, g , chỉ đơn giản là b / G .

  • Nhóm chữ số đầu tiên, 012 ... (g-1) , như một số trong cơ sở b , là F3.

  • Nhóm tiếp theo, g (g + 1) ... (2g-1) , như một số trong cơ sở b , là tổng F4.

  • Tổng quát hơn, nhóm thứ n (không dựa trên), như một số trong cơ sở b , a n , là F5.

  • Hãy nhớ lại rằng có các nhóm G , do đó tổng của tất cả các nhóm F6.1 F6.2
    là những gì chương trình tính toán.


Wow, đó là siêu, làm thế nào bạn tìm ra công thức đó? Có phiền nếu tôi chuyển đổi nó thành CJam không?
Tối ưu hóa

@Optimizer Đi trước! Tôi sẽ viết một lời giải thích khi tôi có thêm thời gian.
Ell

1
+1 nếu bạn vẫn thích "Hả?" sau khi đọc lời giải thích đó: D
Trình tối ưu hóa

Chỉ cần rõ ràng, không phải vì có bất kỳ lỗi nào trong lời giải thích, mà bởi vì nó quá phức tạp đối với não của tôi: D
Trình tối ưu hóa

1
Đó là phép thuật! Bạn có thể lưu một số ký tự bằng cách sử dụng ~: b/G-i-1có thể b/g+~i(G-1)*b/2có thể~-G*b/2
xnor

2

CJam (ảnh chụp nhanh), 19 byte

li__,\mf2m1+:*/fb:+

Lưu ý rằng bản phát hành ổn định mới nhất (0.6.2) có lỗi có thể gây ra mftrả về Số nguyên thay vì Long. Nghịch lý thay, điều này có thể được phá vỡ bằng cách chuyển thành số nguyên ( :i).

Để chạy cái này với CJam 0.6.2 (ví dụ: với trình thông dịch trực tuyến ), bạn phải sử dụng mã sau:

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

Ngoài ra, bạn có thể tải xuống và xây dựng ảnh chụp nhanh mới nhất bằng cách thực hiện các lệnh sau:

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

Các trường hợp thử nghiệm

$ 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

Làm thế nào nó hoạt động

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

Haskell, 74 69 55

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

ví dụ:

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


1

Mathicala, 114 byte (hoặc 72 byte)

Hừm, cái này dài hơn tôi nghĩ:

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

Và vô lương tâm:

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

Ngoài ra, nếu tôi chỉ chuyển công thức tiện lợi của Ell, thì đó là 72 byte:

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

1

J - 22 char

Chức năng lấy một đối số duy nhất (gọi nó ycho mục đích của golf này) ở bên phải.

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

Đầu tiên chúng ta sử dụng 1&q:để có được số lần ychia hết cho 2, và sau đó chia -ycho 2 lần đó. Điều này mang lại cho chúng ta tiêu cực về chiều rộng mà chúng ta cần chia mọi thứ thành hoàn hảo, bởi vì ]\sẽ lấy các phần chồng chéo nếu đối số là dương và không chồng lấp nếu nó âm.

Vì vậy, sau đó chúng tôi chia ra i.ycác số nguyên từ 0 đến y-1các vectơ có độ rộng này và sử dụng #.để chuyển đổi chúng từ cơ sở ysang cơ sở 10. Cuối cùng, +/thực hiện tổng kết, và chúng ta đã hoàn thành.

Ví dụ: (đầu vào tại J REPL được thụt lề, đầu ra bị trượt sang trái)

   +/@(#.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 byte

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++}}

hoặc là

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}

Hàm thứ hai tương tự như của Ell. Cách thứ nhất sử dụng cách tiếp cận truyền thống hơn. Cả hai đều có kích thước 89 ký tự.

Thử tại đây: http://jsfiddle.net/wndv1zz8/1/


0

Thạch , 10 9 byte

Ḷœs&N$ðḅS

Hãy thử trực tuyến!

Về cơ bản chỉ là một bản dịch của câu trả lời CJam của jimmy23013, ngoại trừ sử dụng n & -ntrực tiếp như số lượng phân đoạn để chia thành.

        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.

(Không ðliên quan gì đến ánh xạ: chỉ cần vectơ hóa đối số bên trái của nó và ðtách ḅSra thành một chuỗi dyadic mới lấy kết quả ḶœsÇlà đối số bên trái của nó và đối số cho liên kết chính làm đối số bên phải của nó.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.