Cơ sở trong hỗn hợp


23

Dữ liệu vào:
Một danh sách / mảng các số nguyên mà mỗi mục nằm trong phạm vi 2-36.

Đầu ra:
Tổng các số nguyên (dưới dạng cơ sở 10), trong đó mỗi số nguyên tiếp theo nằm trong cơ sở của giá trị trước đó (bắt đầu bằng cơ sở 10 thông thường).

Ví dụ:
Giả sử chúng ta có một đầu vào như thế này: [4, 12, 34, 20, 14, 6, 25, 13, 33]
Sau đó, chúng ta có một số tiền như thế này:

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

Cơ sở toán học đã giải thích:
Tôi đã xem xét giả định rằng mọi người đều biết cơ sở hoạt động như thế nào, nhưng tôi sẽ đưa ra một ví dụ ngắn gọn về cách thức hoạt động của nó, chỉ trong trường hợp. Hãy lấy34 in base-12ví dụ, làm thế nào chúng ta có được40?

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

Đây có lẽ là một máy tính hữu ích.

Quy tắc thử thách:

  • Kích thước mảng sẽ nằm trong phạm vi hợp lý (như 1-100/ xem các trường hợp thử nghiệm).
  • Các trường hợp thử nghiệm sẽ không bao giờ chứa số nguyên trong đó giá trị hiện tại là không hợp lệ vì nó là cơ sở trước (tức là Bạn sẽ không bao giờ có cái gì đó như 19 in base-6hoặc 6 in base-6, bởi vì cơ sở-6 chỉ chứa các chữ số 0-5).
  • Bạn có thể lấy đầu vào theo bất kỳ cách nào bạn muốn. Có thể là một mảng int, như một chuỗi được phân tách bằng dấu phẩy / dấu cách, v.v. Cuộc gọi của bạn. (Bạn cũng được phép thực hiện đảo ngược mảng int, có thể hữu ích cho các ngôn ngữ lập trình dựa trên ngăn xếp.)

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không chơi gôn. Cố gắng đưa ra một câu trả lời ngắn nhất có thể cho bất kỳ ngôn ngữ lập trình nào.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

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

[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
Đối với các ngôn ngữ dựa trên ngăn xếp có bộ chứa LIFO, đầu vào có thể được cung cấp theo thứ tự đảo ngược không? Trong dc, tôi sẽ yêu cầu ~ 30 byte chỉ để lật ngăn xếp để có số đầu tiên trong đầu vào là số đầu tiên được xử lý, theo ngôn ngữ không dựa trên ngăn xếp có mặc định.
seshoumara

@seshoumara Tại sao không. Tôi sẽ làm rõ điều này trong thử thách. Nó chủ yếu là về thách thức và đầu ra, và không thực sự về định dạng đầu vào.
Kevin Cruijssen

Câu trả lời:


4

05AB1E , 7 6 5 byte

Sử dụng mã hóa 05AB1E .

Đã lưu 1 byte bằng cách sử dụng tích hợp mới štheo đề xuất của Kevin Cruijssen

TšüöO

Giải trình

Danh sách đầu vào được thực hiện đảo ngược, như được cho phép bởi đặc điểm kỹ thuật thách thức.

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

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

Kiểm tra sửa đổi


2
Có thể là 5 byte bây giờ với nội dung šthay vì ¸ì. Ngoài ra, lời giải thích của bạn nêu " chắp thêm " thay vì "trả trước ". :)
Kevin Cruijssen

@KevinCruijssen: Cảm ơn bạn :)
Emigna

9

Python 3, 40 byte

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

Các bài kiểm tra đang ở trạng thái bình thường

map(str, a)tạo một trình tạo, Ggọi strmỗi giá trị trong a, chuyển đổi thành chuỗi
map(int, G, [10]+a)tạo ra một trình tạo gọi int(g, v)các cặp ngang G[10]+a
int(g, v)chuyển đổi chuỗi gtừ cơ sở số nguyên v(nếu v[2,36]ghợp lệ)
sumthực hiện những gì nó nói trên hộp thiếc


7

Python 2, 48 byte

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

Các bài kiểm tra đang ở trạng thái bình thường

zip(a,[10]+a)đi qua cặp các giá trị trong a, và giá trị trước đó hoặc 10cho người đầu tiên
trong backtickstrong intchuyển đổi cuộc gọi xđến một chuỗi, s
int(s, y)chuyển đổi chuỗi stừ cơ sở số nguyên y(nếu ylà trong [2,36]scó giá trị)
sumlàm những gì nó nói trên tin


6

Perl, 35 34 33 byte

Bao gồm +2 cho -ap

Chạy với danh sách các số trên STDIN:

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

basemix.pl:

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

Tôi đã chờ đợi từ lâu để có cơ hội sử dụng sự lạm dụng này ...

Giải trình

Các số đầu vào có thể có tối đa 2 chữ số. Một số xytrong cơ sở blà đơn giản b*x+y. Tôi sẽ sử dụng regex /.$/để chữ số đầu tiên kết thúc $`và chữ số cuối cùng $&, vì vậy đóng góp cho tổng là $&+$b*$`.

Tôi lạm dụng thực tế là forkhông bản địa hóa đúng các biến regex (ví dụ như mapwhilelàm) vì vậy kết quả của một trận đấu trong vòng lặp trước vẫn có sẵn trong vòng lặp hiện tại. Vì vậy, nếu tôi cẩn thận về thứ tự thực hiện các thao tác thì cơ sở có sẵn như vậy "$`$&", ngoại trừ vòng lặp đầu tiên mà tôi cần cơ sở là 10. Vì vậy, tôi sử dụng "$`$& 10"thay thế

Cách thức $&hoạt động đầu tiên cũng là một sự lạm dụng vì nó thực sự được thay đổi /.$/trong khi nó đã ở trên ngăn xếp chờ được thêm vào.

Lạm dụng cuối cùng là }{ở cuối thay đổi vòng lặp ngụ ý -ptừ

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

đến

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

Có nghĩa là $_sẽ không được xác định trong bản in, nhưng nó vẫn thêm $\vào đó tôi đã tích lũy tổng. Đây cũng là một mẹo chơi gôn tiêu chuẩn để xử lý sau vòng lặp


Tôi thực sự quan tâm đến một lời giải thích cho những người trong chúng ta có perl-fu yếu hơn!
m-chrzan

2
@ m-chrzan Giải pháp cố định và giải thích được thêm vào
TonMedel

4

PHP, 53 51 byte

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

Lặp lại qua đầu vào, chuyển đổi từng đầu vào thành biến thể chuỗi. Sau đó lấy giá trị nguyên sử dụng số trước làm cơ sở. Đối với số đầu tiên, cơ sở sẽ không được đặt, PHP sau đó sẽ bắt đầu với 10 (suy ra từ định dạng số).

Chạy như thế này (chỉ -dthêm tính thẩm mỹ):

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

Tinh chỉnh

  • Trên thực tế, không cần phải chuyển đổi thành chuỗi, vì các đối số CLI đã là chuỗi. Đã lưu 2 byte.


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

Kiểm tra và không có người

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 byte

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

Thông thường parseInt(x,0) === parseInt(x,10).

chỉnh sửa : Đã lưu 1 byte nhờ @ETHproductions


Tốt đẹp! Tôi nghĩ bạn có thể tiết kiệm một byte bằng cách thay thế &&sbằng |s.
Sản xuất ETH

Bạn cũng có thể thay thế const gchỉ bằngg
Clyde Lobo

3

Bash tinh khiết, 38

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

Danh sách đầu vào được đưa ra tại dòng lệnh. for i;tự động lặp lại qua các tham số đầu vào (tương đương for i in $@;).

Ideone.


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

Chơi golf 20 byte nhờ @cliffroot (trong đó 12 vì một lỗi ngu ngốc tôi đã tự làm).

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

235
90
98
150

Bạn có thực sự cần p? Tổng có thể được tính như thế này, phải không : r+=r.valueOf(""+a[i],a[i-1])?
Olivier Grégoire

1
sử dụng chuyển đổi +""thay vì valueOfvà loại bỏ các biến không cần thiết -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, tôi là một thằng ngốc .. Khi tôi đã được thử nghiệm tôi đã phạm sai lầm và đã có 10pngược lại. Tôi đã nhận ra lỗi và sửa nó, nhưng vì phần String bây giờ là cơ sở-10 thông thường, tôi thực sự có thể loại bỏ toStringvà chỉ sử dụng +"".. Cảm ơn, và cũng cảm ơn vì đã chơi golf những thứ khác, -20 byte. Tôi thực sự phải đưa ra một câu trả lời mà bạn không thể chơi gôn nhiều hơn (không phải là tôi không đánh giá cao nó! Tất nhiên càng ngắn càng tốt - trong môn đánh gôn bằng mã; P)
Kevin Cruijssen

Chỉ cần so sánh với câu trả lời của tôi, cú pháp của Java hiện tại dài 79 byte (hiện tại của tôi dài 86 byte). Nhưng điều đó không vui khi lấy mã của người khác;)
Olivier Grégoire

1
@KevinCruijssen, tôi rất ổn với nó :) Tôi chỉ cảm thấy rằng Java thực tế không cạnh tranh với tất cả giải pháp 5-6 byte đó, vì vậy tôi không thường xuyên thêm câu trả lời của mình, nhưng tôi vẫn thấy nó thú vị khi chơi golf xuống giải pháp của người khác.
cliffroot

2

Trên thực tế, 12 byte

;p(dX(♂$♀¿Σ+

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

Giải trình:

;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 byte

l~{A\:A10bb}%:+

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

Giải trình

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

Haskell, 65 59 byte

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

Kiểm tra nó trên Ideone .


2

Matlab, 68 byte

Không phải là một giải pháp rất sáng tạo, nhưng đây là:

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

Các xét nghiệm:

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

Bạn có thể lưu một byte vớifunction s=r(x);...
Luis Mendo

2

JavaScript (ES6), 54 48 40 byte

Tôi đã sử dụng một cách tiếp cận đệ quy.

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

Đã lưu 6 byte, nhờ Lmis!
Đã lưu thêm 8 byte, nhờ Neil!


1
Tôi nghĩ rằng bạn có thể lưu 3 byte bằng cách sử dụng parseInt(a,b)thay vì parseInt(a[0],b)kể từ khi parseIntchuyển đổi đối số đầu tiên thành chuỗi và bỏ qua mọi thứ bắt đầu từ ký tự không hợp lệ đầu tiên (ví dụ ',').
Lmis

1
Tôi cũng nghĩ rằng bạn có thể lưu một số byte bằng cách sử dụng a[0]?stuff():0thay vìa.length&&stuff()
Lmis

@Lmis Cảm ơn, tôi đã cập nhật nó :)
Huntro

1
Tôi nghĩ bạn có thể rút ngắn điều này xuống còn 40 byte:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Neil

@ Không có cách nào tốt để không sử dụng slicechức năng
Huntro

2

Perl 6 ,  52  50 byte

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

Giải trình:

# 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

Python 2, 52 byte

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

Kiểm tra nó trên Ideone .


1

Julia, 63 byte

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

Phân tích từng số (trừ số đầu tiên) lấy phần tử trước làm cơ sở và tổng. Thêm phần tử đầu tiên vào cuối


1

Ruby, 52 byte

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

vô dụng

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

sử dụng

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 byte

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

Giải trình:

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

Toán học, 59 byte

Tôi muốn tên hàm của Mathicala ngắn hơn. Nhưng nếu không thì tôi hạnh phúc.

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

Ví dụ,

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

năng suất 235.

{##,0}là danh sách các đối số đầu vào có 0 được nối thêm (đại diện cho các chữ số); {10,##}là danh sách các đối số đầu vào với 10 đối số được chuẩn bị trước (đại diện cho các cơ sở). Cặp danh sách đó là Transposed để liên kết từng số với cơ sở của nó và FromDigits(yay!) Chuyển đổi từng cặp số cơ sở thành số nguyên cơ số 10, kết quả được tính tổng Tr.


1

Lisp thường gặp, 83

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

Chi tiết

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

Cấu looptrúc chấp nhận các cấu trúc lặp "v then w" , trong đó v là một biểu thức được đánh giá lần đầu tiên biến lặp được tính toán và w là biểu thức được ước tính cho các lần lặp kế tiếp. Các khai báo được đánh giá lần lượt từng cái, vì vậy baseđầu tiên là "10", sau đó phần tử trước stringcủa danh sách listđược lặp lại. Các sumtừ khóa tính một khoản tiền: số nguyên đọc từ stringvới cơ sở b , nơi b là số nguyên phân tích cú pháp từ basechuỗi, trong cơ số 10.#1=#1#là ký hiệu để xác định và sử dụng các biến đọc: cái đầu tiên ảnh hưởng đến một biểu thức s đến một biến, cái còn lại thay thế tham chiếu bởi cùng một đối tượng. Điều này lưu một số ký tự cho tên dài.

Thí dụ

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

1

Japt -x , 7 byte

äÏsnX}A

Thử nó

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