База в миксе

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/ см. Контрольные примеры).
  • Тестовые случаи никогда не будут содержать целых чисел, текущее значение которых недопустимо для его предыдущей базы (т. Е. У вас никогда не будет ничего подобного 19 in base-6или 6 in base-6, поскольку в base-6 содержатся только цифры 0-5).
  • Вы можете принять входные данные любым удобным для вас способом. Может быть как массив int, как строка, разделенная запятыми / пробелами, и т. Д. Ваш вызов. (Вы также можете использовать 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 Почему бы и нет. Я уточню это в вызове. В основном речь идет о задачах и результатах, а не о формате ввода.
Кевин Круйссен

Ответы:

4

05AB1E , 7 6 5 байт

Использует кодировку 05AB1E .

Сохранено 1 байт с использованием нового встроенного в šсоответствии с предложением Кевина Круйссена

TšüöO

объяснение

Входной список принимается в обратном порядке, что допускается в спецификации вызова.

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

Попробуйте онлайн!

Модифицированный тестовый набор

Emigna
источник
2
Теперь может быть 5 байтов со встроенным šвместо ¸ì. Кроме того, ваше объяснение гласит « добавление » вместо « prepend ». :)
Кевин Круйссен
@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 цифр. Число xyв базе bпросто b*x+y. Я собираюсь использовать регулярное выражение, /.$/поэтому первая цифра заканчивается, $`а последняя цифра $&, поэтому вклад в сумму $&+$b*$`.

Я злоупотребляю тем фактом, что forнеправильно локализует переменные регулярного выражения (как, например, mapи 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 $_;
}

Что означает, $_будет неопределенным в печати, но это все равно добавляет, $\в котором я накопил сумму. Это также стандартная игра в гольф, чтобы получить пост-петлевую обработку

Тон Хоспел
источник
Я был бы действительно заинтересован в объяснении для тех из нас, у кого слабее перл-фу!
m-chrzan
2
@ m-chrzan Решение исправлено и добавлено объяснение
Тон Хоспел
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

Tweaks

  • На самом деле нет необходимости преобразовывать в строку, так как аргументы CLI уже являются строковыми. Сохранено 2 байта.
aross
источник
3

Желе , 7 байт

ṙ1DḅṖḌS

Попробуйте онлайн!

Деннис
источник
3
Вы можете заменить ṖḌнаF
Джонатан Аллан
4
К сожалению, это не будет работать в первом номере, состоящем из двух цифр.
Деннис
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

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

редактирование : 1 байт сохранен благодаря @ETHproductions

LMIS
источник
Ницца! Я думаю, что вы можете сохранить байт, заменив &&sна |s.
ETHproductions
Вы также можете заменить const gпростоg
Клайд Лобо
3

Чистая Баш, 38

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

Список ввода дается в командной строке. for i;автоматически перебирает входные параметры (эквивалентно for i in $@;).

Ideone.

Цифровая травма
источник
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];}

Гольф 20 байтов благодаря @cliffroot (из которых 12 из-за глупой ошибки я сделал сам).

Ungolfed & тестовый код:

Попробуй это здесь.

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 Ах, я идиот .. Когда я тестировал, я сделал ошибку и получил 10и pизменил. Я понял ошибку и исправил ее, но так как строковая часть теперь является обычной базой-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
Mego
источник
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

Haskell, 65 59 байт

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

Проверьте это на Ideone .

Damien
источник
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
ptev
источник
Вы можете сохранить один байт сfunction s=r(x);...
Луис Мендо
2

JavaScript (ES6), 54 48 40 байт

Я использовал рекурсивный подход.

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

Сохранено 6 байт, благодаря Lmis!
Спасено еще 8 байтов, благодаря Нейлу!

Huntro
источник
1
Я думаю, что вы можете сохранить 3 байта, используя parseInt(a,b)вместо, parseInt(a[0],b)поскольку parseIntпреобразует первый аргумент в строку и игнорирует все, начиная с первого недопустимого символа (то есть ',').
Lmis,
1
Я также думаю, что вы можете сохранить некоторые байты, используя a[0]?stuff():0вместоa.length&&stuff()
Lmis
@Lmis Спасибо, я обновил это :)
Huntro
1
Я думаю, что вы можете сократить это до 40 байтов:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Нил
@ Нейл хороший способ не использовать sliceфункцию
Huntro
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 $_
      }>"
    }
}
Брэд Гилберт b2gills
источник
1

Python 2, 52 байта

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

Проверьте это на Ideone .

Деннис
источник
1

Юлия, 63 байта

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

Разбирает каждое число (кроме первого), принимая предыдущий элемент в качестве базы и суммы. Добавляет первый элемент в конце

nyro_0
источник
1

Рубин, 52 байта

->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("+")
  )
}

использование

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
источник
1

Скала, 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
corvus_192
источник
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(ууу!) Преобразует каждую пару цифра-основание в целое число-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» , то ш итерации конструкций, где V представляет собой выражение, вычисляемыми в первый раз переменная итерации вычисляются, и ж это выражение будет оценено для последовательных итераций. Объявления оцениваются один за другим, поэтому baseсначала отображается «10», затем повторяется предыдущий элемент stringсписка list. sumКлючевое слово вычисляет сумму: целое число считывается из stringс основанием Ь , где Ь является целым числом разобрано из baseстроки, в базе 10 #1=и#1# является обозначением , чтобы определить и использовать переменные чтения: первое влияет на s-выражение переменной, другое заменяет ссылку тем же объектом. Это сохраняет некоторые символы для длинных имен.

пример

(base-mix '("4" "12" "34" "20" "14" "6" "25" "13" "33"))
=> 235
CoreDump
источник
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
мохнатый
источник