Основа в суміші


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).
  • Ви можете взяти вклад будь-яким способом. Може бути як внутрішній масив, як рядок, розділений комою / пробілом і т. Д. Ваш дзвінок. (Вам також дозволяється приймати внутрішній масив, перевернутий, що може бути корисним для мов програмування на основі стека.)

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей на не-гольф мовах. Спробуйте створити якомога коротку відповідь на будь-яку мову програмування.
  • Для вашої відповіді застосовуються стандартні правила , тому вам дозволяється використовувати 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 Чому ні. Я уточню це у виклику. Йдеться головним чином про виклик та вихід, а не насправді про формат введення.
Кевін Круїссен

Відповіді:


4

05AB1E , 7 6 5 байт

Використовує кодування 05AB1E .

Збережено 1 байт, використовуючи новий вбудований, šяк запропонував Кевін Круїссен

TšüöO

Пояснення

Список вводу приймається зворотним шляхом, як це дозволено специфікацією виклику.

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

Спробуйте в Інтернеті!

Змінений тестовий набір


2
Тепер може бути 5 байтів šзамість вбудованого ¸ì. Крім того , ваше пояснення свідчить « Append » замість « препенда ». :)
Кевін Круїссен

@KevinCruijssen: Дякую :)
Emigna

9

Python 3, 40 байт

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

Тести у ideone

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

Тести у ideone

zip(a,[10]+a)переходить пари значень у a, а попереднє значення або 10перше
значення backticksу intвиклику перетворюється xу рядок, s
int(s, y)перетворює рядок sіз цілої бази y(якщо вона yє [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

Налаштування

  • Насправді не потрібно перетворювати на рядок, оскільки аргументи 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).

редагувати : Збережено 1 байт завдяки @ETHproductions


Приємно! Я думаю, ви можете зберегти байт, замінивши &&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];}

Поле в байтах 20 байтів завдяки @cliffroot (з них 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 Ах, я ідіот .. Коли я тестував, я допустив помилку, 10і pзмінив, і змінив. Я зрозумів помилку і виправив її, але оскільки частина String зараз є регулярною базою-10, я дійсно можу видалити toStringта просто використовувати +"".. Дякую, а також дякую за те, що гольфували інші речі, -20 байт. Я дійсно повинен відповісти, що ви не можете більше грати в гольф (не те, що я не ціную це!
Чим

Тільки для порівняння з моєю відповіддю, у вашому синтаксисі поточної 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

Матлаб, 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

Зберегти один байт можна за допомогоюfunction s=r(x);...
Луїс Мендо

2

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

Я використовував рекурсивний підхід.

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

Збережено 6 байт, завдяки Лмісу!
Збережено ще 8 байт, завдяки Нілу!


1
Я думаю , що ви можете зберегти 3 байта, використовуючи parseInt(a,b)замість того , parseInt(a[0],b)так як parseIntновонавернених перший аргумент в рядок і ігнорує всі , починаючи з першого неприпустимого символу (тобто «»).
Лміс

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
Ніл

@Neil приємний спосіб не використовувати 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 $_
      }>"
    }
}


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

Скала, 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

Математика, 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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.