Tìm tổng của tất cả các biểu diễn cơ sở có thể


20

Mục tiêu của thách thức này là viết một chương trình để chuyển đổi một chuỗi đầu vào của những gì có thể được giả sử là chỉ chứa các chữ cái và số từ càng nhiều cơ sở từ 2 đến 36 càng tốt và tìm ra tổng 10 kết quả cơ bản.

Chuỗi đầu vào sẽ được chuyển đổi thành tất cả các cơ sở trong đó số sẽ được xác định theo bảng chữ cái tiêu chuẩn cho các cơ sở lên đến 36 : 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ. Ví dụ, đầu vào 2Tsẽ có hiệu lực chỉ trong các cơ sở 30 trở lên. Chương trình sẽ chuyển đổi 2T từ cơ sở 30 đến 36 sang số thập phân và tổng hợp kết quả.

Bạn có thể giả sử rằng chuỗi đầu vào chỉ chứa các chữ cái và số. Chương trình của bạn có thể sử dụng chữ hoa hoặc chữ thường; nó có thể, nhưng không cần, hỗ trợ cả hai.


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

Đầu vào mẫu: 2T

Biểu đồ các căn cứ có thể

Base   Value
30     89
31     91
32     93
33     95
34     97
35     99
36     101

Đầu ra: 665

Đầu vào mẫu: 1012

Biểu đồ các căn cứ có thể:

Base   Value
3      32
4      70
5      132
6      224
7      352
8      522
9      740
10     1012
11     1344
12     1742
13     2212
14     2760
15     3392
16     4114
17     4932
18     5852
19     6880
20     8022
21     9284
22     10672
23     12192
24     13850
25     15652
26     17604
27     19712
28     21982
29     24420
30     27032
31     29824
32     32802
33     35972
34     39340
35     42912
36     46694

Đầu ra: 444278

Đầu vào mẫu: HELLOworld

Biểu đồ các căn cứ có thể

Base   Value
33     809608041709942
34     1058326557132355
35     1372783151310948
36     1767707668033969

Đầu ra: 5008425418187214

Một đầu vào 0sẽ được đọc như 0trong tất cả các cơ sở từ 2 đến 36. Không có những thứ như cơ sở 1.


Đây là mã golf. Quy tắc tiêu chuẩn áp dụng. Mã ngắn nhất trong byte thắng.


5
Được xây dựng để chuyển đổi cơ sở được phép?
lirtosiast

2
Trường hợp thử nghiệm quan trọng:0
Martin Ender

Dang nó, tôi sẽ gửi một thử thách rất giống nhau.
DanTheMan

3
@ MartinBüttner Tại sao 0một trường hợp thử nghiệm quan trọng? 00ở mọi căn cứ, và không có thứ nào như căn cứ 1.
Arcturus

3
@Eridan vì một số ngôn ngữ có thể thử chuyển đổi từ cơ sở 1 và không thành công.
Martin Ender

Câu trả lời:


12

Python 3, 72 71 69 byte

Cảm ơn FryAmTheEggman vì đã tiết kiệm một byte!

Cảm ơn DSM vì đã tiết kiệm được 2 byte!

N=x=0
y=input()
while N<36:
 N+=1
 try:x+=int(y,N)
 except:0
print(x)

@ThomasKwa sẽ thêm số 0, sẽ không hoạt động đối với các đầu vào số thuần túy vì nó có chức năng như kiểm tra nếu đó là cơ sở 10 (sẽ làm cho một số kết quả quá lớn)
Kevin W.

@FryAmTheEggman Cảm ơn! Tôi đã điều chỉnh nó
Adnan

Chỉ cần kiểm tra cho bạn. Ý try exceptchí cho phép bạn làm range(37). Hai byte!
Sherlock9

@ Sherlock9 Nó sẽ không hoạt động đối với các đầu vào số thuần túy, chúng sẽ được hiểu là 10 số cơ bản.
Adnan

Ồ đúng rồi, chết tiệt. @Ad
Sherlock9

10

Bình thường 20 19 11 byte

sm.xizd0S36

Đánh cắp một cách trắng trợn ý tưởng của Adnan từ câu trả lời Python của anh ấy.

Hãy thử nó ở đây


@orlp Bạn có thể xóa Schar
Blue

Không. Kiểm tra 1012.
orlp

4

Pure Bash (không có tiện ích), 38

Giả sử chuyển đổi cơ sở tích hợp được cho phép:

for((b=36;s+=$b#$1;b--));{ :;}
echo $s

Điều này sẽ xuất ra một lỗi cho STDERR. Tôi cho rằng điều này là ổn theo câu trả lời meta này .

Đầu ra thử nghiệm:

$ for t in 0 2T 1012 HELLOworld; do ./basesum.sh $t; done 2> /dev/null
0
665
444278
5008425418187214
$ 

3

Toán học, 57 byte

#~Sum~{x,Max@CoefficientList[#,x]+1,36}&@FromDigits[#,x]&

Bạn có thể sử dụng mẫu infix cho FromDigits.
LegionMammal978

3

Nghiêm túc, 65 byte

,û;╗rk`"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"íu`MSd:37:@x`╜¿`MΣ.

Chứa không thể in được, hexdump:

2c963bbb726b6022303132333435363738394142434445464748494a4b4c4d4e4f505152535455565758595a22a175604d53643a33373a407860bda8604de42e7f

Thật không may, tôi không có cách tốt để lọc từ danh sách dựa trên các loại. Lưu ý đến bản thân: thêm điều đó.

Có đầu vào như "2T"

Dùng thử trực tuyến (bạn sẽ phải nhập thủ công)

Giải trình:

,û    get input and convert to uppercase
;╗    make a copy and save to register 0
rk    explode string into list
`"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"íu`M  map the function over the list:
    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"íu    get the character's index in the string and add one to get a value in [1,36]
Sd    get maximum element (maximum base aka max_base) from list by sorting and popping the last element off and pushing it to the stack
:37:@x  push range(max_base,37)
`╜¿`M  map the function over the list:
    ╜¿    convert value in register 0 to an int, interpreting it as a base-n int (n is value from list)
Σ.    sum and print
0x7f  quit

Có lẽ Nghiêm túc nên có một lệnh tạo ra bảng chữ cái và / hoặc các số 0-9?
Arcturus

@Eridan Nó thực sự nghiêm túc - làm cho chỉ mục đó tốn một nửa byte.
Mego

2

Matlab, 98 byte

function y=f(s)
[~,m]=max(bsxfun(@eq,s,[48:57 65:90]'));y=0;for n=max(m):36
y=y+base2dec(s,n);
end

2

Octave, 75 73 byte

function v=u(a) m([48:57 65:90])=0:35;v=sum(polyval(t=m(a),max(t)+1:36));

Giải trình:

function v=u(a) 
   m([48:57 65:90])=0:35; %// create a map: '0'-'9' = 0-9
                          %//               'A'-'Z' = 10-35
   t=m(a);                %// convert string to mapped values
   b=max(t)+1;            %// find minimum base
   p=polyval(t,b:36);     %// calculate polynomial for each base (vectorized)
   v=sum(p);              %// and return the sum of the resulting vector

polyvalcó một lợi thế hơn base2decở chỗ nó được vector hóa, vì vậy khôngfor vòng lặp.

Chỉ '0' .. '9' và chữ hoa 'A' .. 'Z' được hỗ trợ làm đầu vào.


Sử dụng rất thông minh polyvalđể vector hóa!
Luis Mendo

1

Japt , 26 byte

1+U¬r@XwYn36}0)o37 £UnX} x

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

Ung dung và giải thích

1+U¬ r@   XwYn36}0)o37 £    UnX} x
1+Uq rXYZ{XwYn36}0)o37 mXYZ{UnX} x

           // Implicit: U = input string
Uq rXYZ{   // Split U into chars, and reduce each item Y and previous value X by:
XwYn36     //  Choosing the larger of X and parseInt(Y,36),
}0         // starting at 0.
1+   )o37  // Add 1 and create a range from this number to 36.
mXYZ{UnX}  // Map each item X in this range to parseInt(U,X)
x          // and sum.
           // Implicit: output last expression

1

Bình thường, 16 byte

V36 .x=+ZizhN ;Z

Dùng thử trực tuyến

Giải thích:

                 # Implicit: Z = 0, z = input
V36              # For N in range 36
    .x           # Try except
      =+Z        # Z = Z + izhN
         izhN    # Convert z from base N+1 to decimal
              ;  # Infinite ), for closing the for loop
               Z # Print Z

1

CJam, 28 27 byte

Cảm ơn Reto Koradi vì đã tiết kiệm 1 byte.

Điều này thật kinh khủng ...

qA,s'[,65>+f#_:e>)37,>\fb:+

Yêu cầu chữ in hoa.

Kiểm tra nó ở đây.

CJam không có chuyển đổi cơ sở 36 tích hợp từ các chuỗi, vì vậy chúng tôi phải tự viết ra các chuỗi. Tôi đã thử tất cả các loại shenanigans divmod, nhưng dường như là ngắn nhất để xây dựng một chuỗi gồm tất cả 36 chữ số và chỉ tìm thấy chỉ mục của mỗi ký tự trong chuỗi đó.


q{'0-_9>7*-}%chỉ là ngắn.
Peter Taylor

@PeterTaylor Ồ, phải ...
Martin Ender

1

Hàm C, 93 (chỉ đầu ra số nguyên 32 bit)

Giả sử OK cho đầu ra chỉ đi lên INT_MAX, thì chúng ta có thể làm điều này:

i,n,x;f(char *s){char *e;for(i=36,x=0;n=strtol(s,&e,i--),!*e&&i;)x+=*e?0:n;printf("%d\n",x);}

Testcase cuối cùng ngụ ý rằng điều này có lẽ là không đủ. Nếu vậy, với số nguyên 64 bit, chúng ta có:

Hàm C, 122

#include<stdlib.h>
f(char *s){long long i=36,n,x=0;char *e;for(;n=strtoll(s,&e,i--),!*e&&i;)x+=*e?0:n;printf("%lld\n",x);}

Thật không may, điều #include <stdlib.h>này là bắt buộc nên kiểu trả về strtoll()là chính xác. Chúng ta cần sử dụng long longđể xử lý HELLOworldtestcase. Nếu không, điều này có thể ngắn hơn một chút.

Lái thử:

#include<stdlib.h>
f(char *s){long long i=36,n,x=0;char *e;for(;n=strtoll(s,&e,i--),!*e&&i;)x+=*e?0:n;printf("%lld\n",x);}

int main (int argc, char **argv)
{
    f("0");
    f("2T");
    f("1012");
    f("HELLOworld");
}

Đầu ra thử nghiệm:

$ ./basesum
0
665
444278
5008425418187214
$ 

Trong C, bạn có thể xóa khoảng trắng #include <stdlib.h>giống như trong C ++ không?
Alex A.

@AlexA. Vâng - tôi không biết điều đó - cảm ơn!
Chấn thương kỹ thuật số

0

Python 3, 142 byte

Adnan đã đánh bại tôi một cách rõ ràng với giải pháp của họ, nhưng tôi đã muốn thêm nỗ lực của riêng mình.

def f(s):
 t=0
 for x in range(37):
  n=0
  for i in s:
   try:m=int(i)
   except:m=ord(i)-55
   if x<=m:n=0;break
   n=n*x+m
  t+=n
 return t

Chức năng này chỉ xử lý đầu vào chữ hoa. Thêm .upper()vào for i in s, và nó sẽ xử lý cả chữ hoa và chữ thường.


0

Scala 2.11, 93 byte

Điều này được chạy trên bảng điều khiển scala.

val i=readLine
var s=0
for(j<-2 to 36)try{s=s+Integer.parseInt(i,j)}catch{case _:Exception=>}

0

Haskell, 97 byte

i c|'_'<c=fromEnum c-87|1<2=read[c]
f s=sum$map((`foldl1`map i s).((+).).(*))[1+i(maximum s)..36]

Chỉ hỗ trợ các ký tự chữ thường. Ví dụ sử dụng:

f "2t"           -> 665
f "helloworld"   -> 5008425418187214

Nó rất lớn, vì tôi phải tự thực hiện cả chuyển đổi từ char sang ASCII và chuyển đổi cơ sở. Các chức năng được xác định trước tương ứng là trong các mô-đun yêu cầu nhập khẩu thậm chí đắt hơn.

Cách thức hoạt động: ichuyển đổi một ký tự cthành giá trị chữ số của nó (ví dụ i 't'-> 29). ftính toán giá trị của chuỗi đầu vào cho mọi cơ sở có thể và tính tổng của nó. Một phiên bản không có điểm của vòng lặp bên trong là map (\base -> foldl1 (\value digit -> value*base + digit) (map i s)) [ ...bases... ].


0

JavaScript (ES6), 86 byte

s=>eval(`p=parseInt;b=2;[...s].map(d=>(v=p(d,36))>b?b=v:0);for(r=0;++b<37;)r+=p(s,b)`)

Giải trình

s=>
  eval(`                     // use eval to enable for loop without return keyword or {}
    p=parseInt;
    b=2;                     // b = minimum base of s
    [...s].map(d=>           // iterate through each digit d
      (v=p(d,36))            // get it's base-36 value
        >b?b=v:0             // set b to the max value
    );
    for(r=0;++b<37;)         // r = sum of all base values
      r+=p(s,b)              // add each base value from b to 36 to r
  `)                         // implicit: return r

Kiểm tra


&&b=vtiết kiệm hơn 1 byte ?b=v:0.
Neil

@Neil Bạn đã kiểm tra chưa? Tôi khá chắc chắn rằng đó sẽ là một nhiệm vụ bên trái không hợp lệ.
dùng81655

Xin lỗi tôi nhầm lẫn nó với một trường hợp tương tự trong một golf khác.
Neil

0

Perl 6 , 35 byte

{[+] map {+(":$^a"~"<$_>")||0},^37}

sử dụng:

# store it somewhere
my &code = {[+] map {+(":$^a"~"<$_>")||0},^37}

say code 'HELLOworld' # 5008425418187214

say map &code, <2T 1012>
# (665 444278)

say code 'qwertyuiopasdfghjklzxcvbnm1234567890'
# 79495849566202185148466281109757186006261081372450955140

0

Ceylon, 100 96 byte

Integer b(String s)=>sum(((any(s*.letter)then 11else 2)..36).map((r)=>parseInteger(s,r)else 0));

Lần đầu tiên tôi có phiên bản đơn giản hơn này chỉ mất 69 byte:

Integer b(String s)=>sum((2..36).map((r)=>parseInteger(s,r)else 0));

Nhưng điều này thất bại với trường hợp thử nghiệm đầu tiên, trở lại 2000000000665thay vì 665. ( Lý do là Tin 2Tđược phân tích cú pháp là Tera, tức là nhân 2 với 10 ^ 12, khi cơ số là 10. ) Vì vậy, chúng ta cần phải tách riêng trường hợp này. Cảm ơn Neil đã gợi ý một cách khác để thực hiện việc này giúp tiết kiệm 4 byte.

Định dạng:

// Find sum of all possible base representations.
//
// Question:  /codegolf//q/65748/2338
// My Answer: /codegolf//a/65836/2338

Integer b(String s) =>
// take the sum of ...
        sum(
    // span from 2 to 36. (Though
    // if there are letters in there, we start at 11,
    // because the other ones can't be valid.
    // Also, parseInteger(s, 10) behaves a bit strange in Ceylon.)
    ((any(s*.letter) then 11 else 2) .. 36)
    // map each r of them to ...
        .map((r) =>
            // try parsing s as a number using base r
            parseInteger(s, r)
            // if that didn't succeed, use 0.
                    else 0
    )
);

Có lẽ bạn có thể rút ngắn mã bằng cách bắt đầu từ cơ sở 11 nếu chuỗi chứa một chữ cái, do đó tránh phải sử dụng cơ sở 10 đặc biệt?
Neil
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.