すべての可能なベース表現の合計を見つける


20

このチャレンジの目的は、2〜36のできるだけ多くの基数の文字と数字のみを含むと想定できる入力文字列を変換するプログラムを作成し、結果の基数10の合計を見つけることです。

入力文字列は、最大36:までのベースの標準アルファベットに従って番号が定義されるすべてのベースに変換されます0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ。たとえば、入力2Tはベース30以上でのみ有効です。プログラムは、2Tを30から36のベースから10進数に変換し、結果を合計します。

入力文字列には文字と数字のみが含まれていると想定できます。プログラムでは大文字または小文字を使用できます。両方をサポートできますが、必ずしもサポートする必要はありません。


テストケース

サンプル入力: 2T

可能なベースのチャート

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

出力:665

サンプル入力: 1012

可能なベースのチャート:

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

出力: 444278

サンプル入力: HELLOworld

可能なベースのチャート

Base   Value
33     809608041709942
34     1058326557132355
35     1372783151310948
36     1767707668033969

出力: 5008425418187214

の入力は、2から36までのすべての基数0として読み込まれ0ます。ベース1などはありません。


これはコードゴルフです。標準ルールが適用されます。バイト単位の最短コードが優先されます。


5
基本変換用のビルトインは許可されていますか?
リルトシアスト

2
重要なテストケース:0
Martin Ender

それをやった、私は非常に似た課題を投稿するつもりだった。
DanTheMan

3
@MartinBüttnerなぜ0重要なテストケースなのですか?0ある0すべてのベースには、ベース1のようなものはありません
アルクトゥルス

3
@Eridanは、一部の言語がベース1から変換しようとして失敗する可能性があるためです。
マーティンエンダー

回答:


12

Python 3、72 71 69バイト

バイトを保存してくれたFryAmTheEggmanに感謝します!

2バイトを節約してくれたDSMに感謝します!

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

それのベース10(いくつかの結果が大きすぎるようになりますどの)かどうかをチェックするように機能するように、純粋に数値入力のためのどのうではない仕事、ゼロが追加されます@ThomasKwa
ケビンW.

@FryAmTheEggmanありがとう!私はそれを調整しました
アドナン

あなたのためにチェックしました。try exceptあなたができるようになりますrange(37)。2バイト!
Sherlock9

@ Sherlock9純粋に数値の入力では機能しません。これらは基数10の数値として解釈されます。
アドナン

ああ、そうだね。@アドナン
シャーロック


4

Pure Bash(ユーティリティなし)、38

組み込みのベース変換が許可されていると仮定します:

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

これにより、STDERRにエラーが出力されます。私はこれがこのメタ回答に従ってOKであると仮定しています

テスト出力:

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


3

真剣に、65バイト

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

印刷できないもの、hexdumpを含む:

2c963bbb726b6022303132333435363738394142434445464748494a4b4c4d4e4f505152535455565758595a22a175604d53643a33373a407860bda8604de42e7f

残念ながら、タイプに基づいてリストからフィルタリングする良い方法がありません。自己への注意:それを追加します。

のような入力を取る "2T"

オンラインで試してください(手動で入力する必要があります)

説明:

,û    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

おそらく真剣に、アルファベットおよび/または数字0-9を生成するコマンドを持つ必要がありますか?
アークトゥルス

@Eridanそれは真剣にすべきです-そのインデックスを取得するには半分のバイトがかかります。
Mego


2

オクターブ、75 73バイト

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

説明:

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

polyvalbase2decベクトル化されるという利点があり、forループは不要です。

入力としてサポートされるのは、「0」..「9」および大文字の「A」..「Z」のみです。


polyvalベクトル化するための非常に巧妙な使用!
ルイスメンドー

1

Japt、26バイト

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

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

非ゴルフと説明

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

Pyth、16バイト

V36 .x=+ZizhN ;Z

オンラインで試す

説明:

                 # 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バイト

1バイトを保存してくれたReto Koradiに感謝します。

これはちょっと恐ろしいです...

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

大文字が必要です。

ここでテストしてください。

CJamには、文字列からの組み込みのbase-36変換がないため、文字列を自分で書き出す必要があります。あらゆる種類のdivmodシェナンガンを試してきましたが、36桁すべての文字列を作成し、その文字列の各文字のインデックスを見つけるのが最も短いようです。


q{'0-_9>7*-}% 同様に短いです。
ピーターテイラー

@PeterTaylorああ、右...
マーティン・エンダー

1

C関数、93(32ビット整数出力のみ)

出力がINT_MAXにしかならないとしても、これを行うことができます。

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);}

最後のテストケースは、これではおそらく十分ではないことを示しています。そうである場合、64ビット整数では次のようになります。

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);}

残念ながら#include <stdlib.h>が必要なので、戻り値の型strtoll()は正しいです。テストケースのlong long処理に使用する必要がありHELLOworldます。そうでなければ、これはかなり短くなる可能性があります。

テストドライバー:

#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");
}

テスト出力:

$ ./basesum
0
665
444278
5008425418187214
$ 

#include <stdlib.h>Cでは、C ++でできるようにスペースを削除できますか?
アレックスA.

@AlexA。はい-知りませんでした-ありがとう!
デジタル外傷

0

Python 3、142バイト

アドナンは私に彼らの解決策をしっかりと打ち負かしましたが、私は自分の試みを追加したかったのです。

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

この関数は大文字の入力のみを処理します。に追加.upper()するとfor i in s、大文字と小文字の両方が処理されます。


0

Scala 2.11、93バイト

これは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バイト

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

小文字のみをサポートします。使用例:

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

文字からASCIIへの変換とベース変換の両方を自分で実装する必要があるため、非常に大規模です。対応する事前定義関数は、さらに高価なインポートを必要とするモジュールに含まれています。

仕組み:i文字cを数字に変換します(例i 't'-> 29)。f可能なすべてのベースの入力文字列の値を計算し、合計します。内部ループの非ポイントフリーバージョンはmap (\base -> foldl1 (\value digit -> value*base + digit) (map i s)) [ ...bases... ]です。


0

JavaScript(ES6)、86バイト

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)`)

説明

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

テスト


&&b=v1バイトを節約し?b=v:0ます。
ニール

@Neilそれをテストしましたか?これは、割り当ての左手が無効になると確信しています。
user81655

申し訳ありませんが、別のゴルフの同様のケースと混同しました。
ニール

0

Perl 6、35バイト

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

使用法:

# 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

セイロン、100 96バイト

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

私は最初、この単純なバージョンでたった69バイトしか使いませんでした。

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

しかし、これは最初のテストケースで失敗し、2000000000665代わりにを返します665。(理由は、基数が10の場合、Tin 2TがTeraとして解析される、つまり2に10 ^ 12を乗算するからです。)したがって、このケースを個別にキャッチする必要があります。4バイトを節約する別の方法を提案してくれたNeilに感謝します。

フォーマット済み:

// 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
    )
);

文字列に文字が含まれている場合、ベース11から開始してコードを短縮し、ベース10の特殊なケースを避けることができますか?
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.