ミックスのベース


23

入力:
各アイテムがの範囲にある整数のリスト/配列2-36

出力:
整数の合計(10を底とする)。次の各整数は前の値の底(通常の10から始まる)にあります。

例:次の
ような入力があるとします。[4, 12, 34, 20, 14, 6, 25, 13, 33]
次に、次のような合計があります。

4    (4  in base-10) +
6    (12 in base-4 ) +
40   (34 in base-12) +
68   (20 in base-34) +
24   (14 in base-20) +
6    (6  in base-14) +
17   (25 in base-6 ) +
28   (13 in base-26) +
42   (33 in base-13)
= 235

数学的基礎の説明:基礎
がどのように機能するかは誰もが知っていると仮定しましたが、念のため、とにかくそれがどのように機能するかの簡単な例を挙げます。34 in base-12例を見てみましょう、どうやって手に入れました40か?

1-34 in regular base-10:
 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34
 So, from 1 to 34 is 34 steps in base-10

1-34 in base-12:
 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 2B, 30, 31, 32, 33, 34
 So, from 1 to 34 is 40 steps in base-12

これはおそらく便利な電卓です。

チャレンジルール:

  • 配列サイズは妥当な範囲になります(1-100テストケースのように/を参照)。
  • テストケースには、現在の値が前のベースに対して無効な整数が含まれることはありません(つまり、ベース6には数字しか含まれていないため、19 in base-6またはなどのようなものはありません)。6 in base-60-5
  • 任意の方法で入力を取得できます。int-array、カンマ/スペースで区切られた文字列などとして使用できます。呼び出し。(int配列を逆にすることもできます。これは、スタックベースのプログラミング言語に役立つ場合があります。)

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非ゴルフ言語で回答を投稿することを妨げないでください。どのプログラミング言語でも、できるだけ短い回答を考えてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターを持つ関数/メソッド、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

[4, 12, 34, 20, 14, 6, 25, 13, 33]                            ->   235
 4+ 6+  40+ 68+ 24+ 6+ 17+ 28+ 42

[5, 14, 2, 11, 30, 18]                                        ->   90
 5+ 9+  2+ 3+  33+ 38

[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10]    ->   98
 12+ 13+ 11+ 9+ 8+ 7+ 6+ 5+ 4+ 3+ 5+  2+ 3+  3+ 3+  2+ 2

[36, 36]                                                      ->   150
 36+ 114

1
LIFOコンテナを持つスタックベースの言語の場合、入力は逆の順序で与えることができますか?dcでは、入力の最初の数字が処理される最初の数字になるようにスタックを反転するために〜30バイトが必要になります。これは非スタックベースの言語がデフォルトで持っています。
seshoumara

@seshoumaraどうして?これをチャレンジで明確にします。これは主にチャレンジと出力に関するものであり、実際には入力形式に関するものではありません。
ケビンCruijssen

回答:


4

05AB1E7 6 5バイト

05AB1Eエンコードを使用します。

Kevin Cruijssenšによって提案された新しいビルトインを使用して1バイトを保存しました

TšüöO

説明

チャレンジ仕様で許可されているように、入力リストは逆になります。

Tš     # prepend a 10 to the list
  üö   # reduce by conversion to base-10
    O  # sum

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

変更されたテストスイート


2
š代わりに組み込みで5バイトにすることができます¸ì。また、説明には「prepend」ではなく「append」と記載されています。:)
ケビンクルーッセン

@KevinCruijssen:ありがとう:)
エミグナ

9

Python 3、40バイト

lambda a:sum(map(int,map(str,a),[10]+a))

テストは 理想的です

map(str, a)ジェネレータを作成しG、そのコールstrの各値にはa、文字列に変換する
map(int, G, [10]+a)発電機を作成し、そのコールint(g, v)を横切る対についてGおよび[10]+a
int(g, v)ストリング変換g整数ベースからv(場合vであり、[2,36]かつg有効である)
sum、それは錫で言うし


7

Python 2、48バイト

lambda a:sum(int(`x`,y)for x,y in zip(a,[10]+a))

テストは理想的です

zip(a,[10]+a)値のトラバース対a、および前の値又は10第一のためにコール変換文字列に、文字列を変換する整数ベースから(場合であり、かつ有効である)、それは錫で言うし
backticksintxs
int(s, y)syy[2,36]s
sum


6

Perl、35 34 33バイト

+2を含む -ap

STDINの数字のリストを使用して実行します。

basemix.pl <<< "4 12 34 20 14 6 25 13 33";echo

basemix.pl

#!/usr/bin/perl -ap
$\+=$&+"$`$& 10"*/.$/*$`for@F}{

私はこの乱用を使用する機会のために長い間待っていました...

説明

入力番号は最大2桁です。xybase の数値bは単純b*x+yです。/.$/最初の数字が終わり$`、最後の数字が終わるように正規表現を使用しようとしているので$&、合計への貢献は$&+$b*$`

for正規表現変数を適切にローカライズしないという事実(たとえばmap、andなどwhile)を悪用して、前のループでの一致の結果が現在のループでまだ利用できるようにします。したがって、操作を行う順序に注意すると、ベースは"$`$&"10にする必要がある最初のループを除いて、ベースを使用できます。"$`$& 10"代わります

最初の$&動作方法は、実際には/.$/既にスタック上に追加されるのを待って間あります。

最後の乱用は、}{最後に、-pからのループを変更します

LINE: while (defined($_ = <ARGV>)) {
    ...code..
}
continue {
    die "-p destination: $!\n" unless print $_;
}

LINE: while (defined($_ = <ARGV>)) {
    ...code..
}
{
}
continue {
    die "-p destination: $!\n" unless print $_;
}

これは$_印刷では定義されないことを意味しますが、それでも$\私が合計したものを追加します。また、ポストループ処理を取得するための標準的なゴルフトリックです


私はperl-fuが弱い人たちの説明に本当に興味があります!
m-chrzan

2
@ m-chrzanソリューションが修正され、説明が追加されました
Ton Hospel

4

PHP、53 51バイト

for(;$x=$argv[++$i];$b=$x)$s+=intval($x,$b);echo$s;

入力を反復処理し、各入力を文字列バリアントに変換します。次に、前の数値をベースとして使用して整数値を取得します。最初の数値については、基数は設定されず、PHPは10から始まります(数値形式から推測されます)。

次のように実行します(-d美学のためにのみ追加):

php -d error_reporting=30709 -r 'for(;$x=$argv[++$i];$b=$x)$s+=intval($x,$b);echo$s;' -- 12 11 10 9 8 7 6 5 4 3 12 2 11 3 10 2 10;echo

微調整

  • 実際、CLI引数はすでに文字列であるため、文字列に変換する必要はありません。2バイトを保存しました。


3

Java、86バイト

s->{int[]b={10};return s.reduce(0,(r,n)->{r+=n.valueOf(""+n,b[0]);b[0]=n;return r;});}

テストと未使用

import java.util.function.ToIntFunction;
import java.util.stream.Stream;

public class Main {

  public static void main(String[] args) {
    ToIntFunction<Stream<Integer>> f = s -> {
      int[] b = {10};                 // Base, initialized with 10
      return s.reduce(0, (r, n) -> {  // Typical use of reduction, sum starts with 0.
        r += n.valueOf("" + n, b[0]); // Add the value in the previous base.
        b[0] = n;                     // Assign the new base;
        return r;
      });
    };

    System.out.println(f.applyAsInt(Stream.of(new Integer[]{4, 12, 34, 20, 14, 6, 25, 13, 33})));
  }
}

3

JavaScriptのES6、45の 42の 41バイト

const g =
     a=>a.map(v=>s+=parseInt(v,p,p=v),s=p=0)|s
;

console.log(g.toString().length);                                            // 42
console.log(g([4, 12, 34, 20, 14, 6, 25, 13, 33]));                          // 235
console.log(g([5, 14, 2, 11, 30, 18]  ));                                    // 90
console.log(g([12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10] )); // 98

便宜的にparseInt(x,0) === parseInt(x,10)

編集:@ETHproductionsのおかげで1バイト保存


いいね!に置き換えること&&sでバイトを節約できると思います|s
ETHproductions

また、置き換えることができますconst gだけでg
クライド・ロボ

3

ピュアバッシュ、38

b=10
for i;{((t+=$b#$i,b=i));}
echo $t

入力リストはコマンドラインで提供されます。 for i;入力パラメーターを自動的に繰り返します(と同等for i in $@;)。

イデオン。


3

Java 7、109 89 86バイト

int c(int[]a){for(Byte i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}

@cliffrootのおかげで20バイトのゴルフをしました(うち12は、私が自分で犯した愚かなミスのため)。

未ゴルフ&テストコード:

ここで試してみてください。

class M{
  static int c(int[] a){
     for(Byte i = 1; i < a.length; a[0] += i.valueOf(a[i]+"", a[++i-2]));
     return a[0];
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 4, 12, 34, 20, 14, 6, 25, 13, 33 }));
    System.out.println(c(new int[]{ 5, 14, 2, 11, 30, 18 }));
    System.out.println(c(new int[]{ 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10 }));
    System.out.println(c(new int[]{ 36, 36 }));
  }
}

出力:

235
90
98
150

本当に必要pですか?合計は次のように計算できますが、できません:r+=r.valueOf(""+a[i],a[i-1])
オリビエグレゴワール

1
不必要な変数の+""代わりに変換を使用しvalueOf、不要な変数を削除しました–int c(int[]a){for(Integer i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}
cliffroot

ああ@cliffroot、私は馬鹿だ..私は私がミスを犯し、持っていたテストしていたとき10p逆転しました。私は間違いに気付いて修正しましたが、文字列部分が通常の10進数であるため、実際に削除してtoString使用でき+""ます。ありがとう。また、他のことをゴルフしてくれてありがとう、-20バイト。私は本当にあなたがもっとゴルフをすることができない答えを作らなければなりません(私はそれを感謝していません!もちろん短いほど良いです-Pであるコードゴルフでは)
ケビン・クルーッセン

私の答えと比較するために、現在のJavaの構文の長さは79バイトです(現在の長さは86バイトです)。しかし、それは他人のコードをとるのは楽しいことではありません;)
オリビエグレゴワール

1
@KevinCruijssen、私はそれで大丈夫です:)私は現実的にJavaはその5〜6バイトのすべてのソリューションと競合しないと感じているので、私は自分の答えを頻繁に追加しませんが、それでもゴルフは楽しいと思います他人のソリューションをダウン。
クリフルート

2

実際には、12バイト

;p(dX(♂$♀¿Σ+

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

説明:

;p(dX(♂$♀¿Σ+
;             dupe input
 p            pop first element from list
  (dX         pop and discard last element from other copy
     (♂$      stringify all elements in first copy
        ♀¿    for each pair of elements in the two lists, interpret the first element as a base-(second element) integer
          Σ   sum
           +  add first element of original list

2

CJam、15バイト

l~{A\:A10bb}%:+

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

説明

l~     e# Read and evaluate input.
{      e# Map this block over the input...
  A    e#   Push A. Initially this is 10, afterwards it will be the value of the
       e#   last iteration.
  \:A  e#   Swap with current value and store that in A for the next iteration.
  10b  e#   Convert to base 10 to get its decimal digits.
  b    e#   Interpret those in the base of the previous A.
}%
:+     e# Sum all of those values.


2

Matlab、68バイト

非常に創造的な解決策ではありませんが、ここにあります:

function[s]=r(x);j=10;s=0;for(i=x)s=s+base2dec(num2str(i),j);j=i;end

テスト:

>> r([4,12,34,20,14,6,25,13,33])
ans =
   235
>> r([12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10])
ans =
   98
>> r([5, 14, 2, 11, 30, 18])
ans =
   90
>> r([36,36])
ans =
   150

1バイトを保存するにはfunction s=r(x);...
ルイスメンドー

2

JavaScript(ES6)、54 48 40バイト

再帰的なアプローチを使用しました。

f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0

Lmisのおかげで6バイトを節約しました!
ニールのおかげで、さらに8バイト節約できました!


1
最初の引数を文字列に変換し、最初の無効な文字(「、」)で始まるすべてを無視するので、parseInt(a,b)代わりにを使用して3バイト節約できると思います。parseInt(a[0],b)parseInt
Lmis

1
また、a[0]?stuff():0代わりにa.length&&stuff()
-Lmis

@Lmisありがとう、私はそれを更新しました:)
ハントロ

1
これを40バイトに短縮できると思いますf=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
ニール

@Neil slice関数を使用しない素敵な方法
ハントロ

2

Perl 6の 52の  50バイト

{sum (10,|@_).rotor(2=>-1).map:{+":{.[0]}<{.[1]}>"}}
{sum (10,|@_).rotor(2=>-1).map:{":{.[0]}<$_[1]>"}}

説明:

# bare block lambda with implicit parameter 「@_」
{
  sum

    ( 10, |@_ )        # the input with a preceding 10
    .rotor( 2 => -1 )  # grab 2 values, back up one, repeat
    .map:
    {
      # create a string of the form ":10<4>"
      ":{
        .[0]            # first element from $_
      }<{
        .[1]            # second element from $_
      }>"
    }
}


1

ジュリア、63バイト

f(l)=sum([parse(Int,string(l[i]),l[i-1])for i=2:length(l)])+l[]

前の要素を基数および合計として各数値(最初の数値を除く)を解析します。最後に最初の要素を追加します


1

ルビー、52バイト

->a{eval a.zip([10]+a).map{|e|'"%s".to_i(%s)'%e}*?+}

食べない

->a{
  eval(
    a.zip([10]+a).map { |e|
      '"%s".to_i(%s)' % e
    }.join("+")
  )
}

使用法

f=->a{eval a.zip([10]+a).map{|e|'"%s".to_i(%s)'%e}*?+}
p f[[4, 12, 34, 20, 14, 6, 25, 13, 33]] # => 235

1

Scala、67バイト

def f(a:Int*)=a zip(10+:a)map{t=>Integer.parseInt(""+t._1,t._2)}sum

説明:

def f(a: Int*) =     //declare a method f with varargs of type Int as parameter
a zip (10 +: a)      //zip a with 10 prepended to a, resulting in...
                     //...Array((4,10), (12,4), (34,12), (20,34), (14,20), (6,14), (25,6), (13,25), (33,13))
map { t =>           //map each tuple t to...
  Integer.parseInt(  //...an integer by parsing...
    ""+t._1, t._2    //...a string of the first item in base-second-item.
  )
}
sum                  //and sum

1

Mathematica、59バイト

Mathematicaの関数名がもっと短くなればいいのですが。しかし、そうでなければ私は幸せです。

Tr[FromDigits@@@Transpose@{IntegerDigits/@{##,0},{10,##}}]&

例えば、

Tr[FromDigits@@@Transpose@{IntegerDigits/@{##,0},{10,##}}]&[4,12,34,20,14,6,25,13,33]

利回り 235

{##,0}0が追加された入力引数のリストです(数字を表します)。{10,##}10が先頭に追加された入力引数のリストです(ベースを表します)。リストのそのペアはTransposedであり、それぞれをそのベースと数字に関連付け、FromDigits(yay!)各数字とベースのペアを10進整数に変換し、その結果はによって合計されTrます。


1

Common Lisp、83

(lambda(s)(loop for b ="10"then x for x in s sum(#1=parse-integer x :radix(#1#b))))

詳細

(defun base-mix (list)
  (loop
     for base = "10" then string
     for string in list
     sum (parse-integer string :radix (parse-integer base))))

このloop構造は、「v then w」反復構造を受け入れますここで、vは反復変数が最初に計算されるときに評価される式であり、wは連続する反復で評価される式です。宣言は次々と評価されるためbase、最初に「10」、次にstringリストの前の要素listが反復されます。sumキーワードは、和を計算:整数から読み出したstring塩基とBBは、から解析整数でbaseベース10内の文字列、#1=および#1#定義するために表記して使用されていますリーダ変数:最初は変数のs式に影響し、もう1つは同じオブジェクトで参照を置き換えます。これにより、長い名前の一部の文字が保存されます。

(base-mix '("4" "12" "34" "20" "14" "6" "25" "13" "33"))
=> 235

1

Japt -x、7バイト

äÏsnX}A

それを試してみてください

äÏsnX}A     :Implicit input of array
ä           :Take each consecutive pair of elements
 Ï          :Pass them through the following function as X & Y
  s         :  Convert Y to a base-10 string
   nX       :  Convert to an integer from base-X
     }      :End function
      A     :Before doing any of that, though, prepend 10 to the array
            :Implicit output of the sum of the resulting array
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.