Basis dalam campuran

23

Input:
Daftar / array bilangan bulat untuk setiap item dalam kisaran 2-36.

Output:
Jumlah bilangan bulat (sebagai basis 10), di mana setiap integer berikutnya berada di dasar nilai sebelumnya (dimulai dengan basis reguler 10).

Contoh:
Misalkan kita memiliki input seperti ini: [4, 12, 34, 20, 14, 6, 25, 13, 33]
Kemudian kita memiliki jumlah seperti ini:

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

Basis matematika menjelaskan:
Saya menganggap asumsi semua orang tahu cara kerja basis, tapi saya akan memberikan contoh singkat bagaimana cara kerjanya, untuk berjaga-jaga. Mari kita ambil34 in base-12contohnya, bagaimana kita mendapatkannya40?

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

Ini mungkin kalkulator yang berguna.

Aturan tantangan:

  • Ukuran array akan berada dalam kisaran yang wajar (seperti 1-100/ lihat kasus uji).
  • Kasing uji tidak akan pernah berisi bilangan bulat yang nilai saat ini tidak valid untuk basis sebelumnya (yaitu Anda tidak akan pernah memiliki sesuatu seperti 19 in base-6atau 6 in base-6, karena basis-6 hanya berisi digit 0-5).
  • Anda dapat mengambil input dengan cara apa pun yang Anda inginkan. Dapat berupa int-array, sebagai string yang dipisahkan tanda koma / spasi, dll. Panggilan Anda. (Anda juga diizinkan untuk mengambil int-array terbalik, yang dapat berguna untuk bahasa pemrograman berbasis tumpukan.)

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda dari memposting jawaban dengan bahasa yang bukan golf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman apa pun.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

[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
Kevin Cruijssen
sumber
1
Untuk bahasa berbasis tumpukan yang memiliki wadah LIFO, dapatkah input diberikan dalam urutan terbalik? Dalam dc saya akan memerlukan ~ 30 byte hanya untuk membalik tumpukan untuk memiliki nomor pertama di input menjadi yang pertama untuk diproses, yang bahasa berbasis non-stack secara default.
seshoumara
@seshoumara Kenapa tidak. Saya akan mengklarifikasi ini dalam tantangan. Ini terutama tentang tantangan dan output, dan bukan tentang format input.
Kevin Cruijssen

Jawaban:

4

05AB1E , 7 6 5 byte

Menggunakan penyandian 05AB1E .

Disimpan 1 byte menggunakan built-in baru šseperti yang disarankan oleh Kevin Cruijssen

TšüöO

Penjelasan

Daftar input diambil terbalik, sebagaimana diizinkan oleh spesifikasi tantangan.

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

Cobalah online!

Testuite yang dimodifikasi

Emigna
sumber
2
Bisa 5 byte sekarang dengan builtin šbukan ¸ì. Juga, penjelasan Anda menyatakan " tambahkan " bukan " prepend ". :)
Kevin Cruijssen
@KevinCruijssen: Terima kasih :)
Emigna
9

Python 3, 40 byte

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

Tes ada di ideone

map(str, a)menciptakan generator,, Gyang memanggil strsetiap nilai dalam a, mengonversi ke string
map(int, G, [10]+a)menciptakan generator yang memanggil int(g, v)pasangan melintasi Gdan [10]+a
int(g, v)mengubah string gdari basis integer v(jika vada [2,36]dan gvalid)
summelakukan apa yang dikatakan di kaleng

Jonathan Allan
sumber
7

Python 2, 48 byte

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

Tes ada di ideone

zip(a,[10]+a)melintasi pasang nilai-nilai dalam a, dan nilai sebelumnya atau 10untuk pertama
yang backticksdi intpanggilan convert xke string, s
int(s, y)mengkonversi string sdari dasar bilangan bulat y(jika ydalam [2,36]dan sberlaku)
summelakukan apa yang tertulis di kaleng

Jonathan Allan
sumber
6

Perl, 35 34 33 byte

Termasuk +2 untuk -ap

Jalankan dengan daftar nomor di STDIN:

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

basemix.pl:

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

Saya sudah menunggu lama untuk menggunakan penyalahgunaan ini ...

Penjelasan

Nomor input dapat memiliki paling banyak 2 digit. Angka xydalam basis bsederhana b*x+y. Saya akan menggunakan regex /.$/sehingga angka pertama berakhir $`dan digit terakhir $&, jadi kontribusi untuk penjumlahannya adalah $&+$b*$`.

Saya menyalahgunakan fakta yang fortidak melokalkan variabel regex dengan benar (seperti misalnya mapdan whilelakukan) sehingga hasil kecocokan dalam loop sebelumnya masih tersedia di loop saat ini. Jadi jika saya berhati-hati tentang urutan operasi yang dilakukan, basis tersedia sebagai "$`$&", kecuali untuk loop pertama di mana saya membutuhkan basis menjadi 10. Jadi saya gunakan "$`$& 10"sebagai gantinya

Cara kerja pertama $&adalah penyalahgunaan juga karena sebenarnya diubah oleh /.$/sementara itu sudah di tumpukan menunggu untuk ditambahkan.

Penyalahgunaan terakhir adalah }{pada bagian akhir yang mengubah perulangan tersirat -pdari

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

untuk

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

Yang berarti $_akan tidak ditentukan dalam cetakan, tetapi masih menambahkan $\di mana saya mengumpulkan jumlahnya. Ini juga merupakan trik golf standar untuk mendapatkan pemrosesan post-loop

Ton Hospel
sumber
Saya akan sangat tertarik dengan penjelasan bagi kita yang memiliki perl-fu yang lebih lemah!
m-chrzan
2
@ m-chrzan Solusi diperbaiki dan penjelasan ditambahkan
Ton Hospel
4

PHP, 53 51 byte

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

Iterate atas input, mengubah setiap input menjadi varian string. Kemudian mengambil nilai integer menggunakan angka sebelumnya sebagai basis. Untuk angka pertama, basis tidak akan ditetapkan, PHP kemudian akan mulai dengan 10 (disimpulkan dari format angka).

Jalankan seperti ini ( -dditambahkan hanya untuk estetika):

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

Tweaks

  • Sebenarnya, tidak perlu mengkonversi ke string, karena argumen CLI sudah string. Disimpan 2 byte.
aross
sumber
3

Jelly , 7 byte

ṙ1DḅṖḌS

Cobalah online!

Dennis
sumber
3
Anda bisa menggantinya ṖḌdenganF
Jonathan Allan
4
Sayangnya, itu tidak akan berfungsi di angka pertama memiliki dua digit.
Dennis
3

Java, 86 byte

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

Menguji dan tidak berkhianat

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})));
  }
}
Olivier Grégoire
sumber
3

JavaScript ES6, 45 42 41 Bytes

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

Conventiently parseInt(x,0) === parseInt(x,10) .

sunting : Disimpan 1 byte berkat @ETHproductions

Lmis
sumber
Bagus! Saya pikir Anda dapat menyimpan byte dengan menggantinya &&sdengan |s.
ETHproduk
Anda juga dapat menggantinya const gdengan hanyag
Clyde Lobo
3

Bash murni, 38

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

Daftar input diberikan di baris perintah. for i;secara otomatis beralih pada parameter input (setara dengan for i in $@;).

Ideone.

Trauma Digital
sumber
3

Java 7, 109 89 86 byte

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

Golf 20 byte berkat @cliffroot (12 di antaranya karena kesalahan bodoh yang saya buat sendiri).

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

235
90
98
150
Kevin Cruijssen
sumber
Apakah Anda benar-benar membutuhkan p? Jumlahnya dapat dihitung seperti ini, bukankah itu r+=r.valueOf(""+a[i],a[i-1]):?
Olivier Grégoire
1
menggunakan konversi +""alih-alih valueOfdan menghapus variabel yang tidak perlu -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 Ah, saya idiot .. Ketika saya menguji saya membuat kesalahan dan memiliki 10dan pmembalikkannya. Saya menyadari kesalahan dan memperbaikinya, tetapi karena bagian String sekarang menjadi basis-10 biasa saya memang bisa menghapus toStringdan hanya menggunakan +"".. Terima kasih, dan juga terima kasih untuk bermain golf hal-hal lain, -20 byte. Saya benar-benar harus membuat jawaban Anda tidak bisa bermain golf lebih banyak (bukan karena saya tidak menghargai itu! Semakin pendek tentu saja lebih baik - dalam kode-golf yaitu; P)
Kevin Cruijssen
Hanya untuk membandingkan dengan jawaban saya, Anda dalam sintaks Java saat ini adalah 79 byte (panjang saya saat ini 86 byte). Tapi itu tidak menyenangkan mengambil kode orang lain;)
Olivier Grégoire
1
@KevinCruijssen, saya lebih baik dari itu :) Saya hanya merasa bahwa secara realistis Java tidak bersaing dengan semua solusi 5-6 byte itu, jadi saya tidak sering menambahkan jawaban saya sendiri, tapi saya masih merasa senang bermain golf bawah solusi orang lain.
cliffroot
2

Sebenarnya, 12 byte

;p(dX(♂$♀¿Σ+

Cobalah online!

Penjelasan:

;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
Mego
sumber
2

CJam , 15 byte

l~{A\:A10bb}%:+

Cobalah online!

Penjelasan

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.
Martin Ender
sumber
2

Haskell, 65 59 byte

b%x|x<1=x|y<-div x 10=b*b%y+x-10*y
sum.((10:)>>=zipWith(%))

Uji di Ideone .

Damien
sumber
2

Matlab, 68 byte

Bukan solusi yang sangat kreatif, tetapi ini dia:

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

Tes:

>> 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
ptev
sumber
Anda dapat menyimpan satu byte denganfunction s=r(x);...
Luis Mendo
2

JavaScript (ES6), 54 48 40 byte

Saya menggunakan pendekatan rekursif.

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

Disimpan 6 byte, terima kasih kepada Lmis!
Disimpan 8 byte lebih, terima kasih kepada Neil!

Huntro
sumber
1
Saya pikir Anda dapat menyimpan 3 byte dengan menggunakan parseInt(a,b)alih-alih parseInt(a[0],b)karena parseIntmengubah argumen pertama menjadi string dan mengabaikan semuanya mulai dari karakter pertama yang tidak valid (yaitu ',').
Lmis
1
Saya juga berpikir Anda dapat menyimpan beberapa byte dengan menggunakan a[0]?stuff():0bukana.length&&stuff()
Lmis
@Lm Terima kasih, saya telah memperbaruinya :)
Huntro
1
Saya pikir Anda dapat mempersingkat ini menjadi 40 byte:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Neil
@Neil cara yang bagus untuk tidak menggunakan slicefungsi
Huntro
2

Perl 6 ,  52  50 byte

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

Penjelasan:

# 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 $_
      }>"
    }
}
Brad Gilbert b2gills
sumber
1

Python 2, 52 byte

f=lambda x:x[1:]and int(`x.pop()`,x[-1])+f(x)or x[0]

Uji di Ideone .

Dennis
sumber
1

Julia, 63 Bytes

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

Mem-parsing setiap angka (kecuali yang pertama) dengan mengambil elemen sebelumnya sebagai basis dan jumlah. Menambahkan elemen pertama di akhir

nyro_0
sumber
1

Ruby, 52 byte

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

ungolfed

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

pemakaian

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
cia_rana
sumber
1

Scala, 67 byte

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

Penjelasan:

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
corvus_192
sumber
1

Mathematica, 59 byte

Saya berharap nama fungsi Mathematica lebih pendek. Tetapi sebaliknya saya senang.

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

Sebagai contoh,

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

hasil panen 235.

{##,0}adalah daftar argumen input dengan 0 ditambahkan (mewakili angka); {10,##}adalah daftar argumen input dengan 10 prepended (mewakili basis). Sepasang daftar tersebut adalah Transposed untuk mengaitkan masing-masing dengan angka dengan basisnya, dan FromDigits(yay!) Mengonversi setiap pasangan angka-basis menjadi bilangan bulat-10, yang hasilnya dijumlahkan oleh Tr.

Greg Martin
sumber
1

Common Lisp, 83

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

Detail

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

The loopkonstruk menerima "v kemudian w" konstruksi iterasi, di mana v adalah ekspresi akan dievaluasi pertama kalinya variabel iterasi dihitung, dan w adalah ekspresi akan dievaluasi untuk iterasi berturut-turut. Deklarasi dievaluasi satu demi satu, begitu basejuga pertama "10", maka elemen sebelumnya stringdari daftar listiterasi. Kata sumkunci menghitung jumlah: bilangan bulat dibaca dari stringdengan basis b , di mana b adalah bilangan bulat yang diuraikan dari basestring, dalam basis 10. #1=dan#1# merupakan notasi untuk menentukan dan menggunakan variabel pembaca: yang pertama mempengaruhi ekspresi-s ke variabel, yang lain menggantikan referensi dengan objek yang sama. Ini menghemat beberapa karakter untuk nama panjang.

Contoh

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

Japt -x , 7 byte

äÏsnX}A

Cobalah

äÏ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
Shaggy
sumber