Считать вверх и вниз, удваивая приращения


14

Входные данные:

Непустой список / вектор, где каждый элемент содержит значение / символ, указывающий, будете ли вы считать вверх или вниз . Я буду использовать 1и -1, но вы можете выбрать все, что вам нравится. Вы можете использовать только два значения, вы не можете использовать 1,2,3...и -1,-2,-3...для вверх и вниз соответственно.

Вызов:

Вы будете использовать эти цифры в геометрической прогрессии 1, 2, 4, 8, 16, 32 ... . Каждый раз, когда вы начинаете считать вверх или вниз, вы будете считать с шагом 1 , затем 2 , затем 4 и так далее. Если вы измените и начнете считать иначе, то вычтете 1 , затем 2 , затем 4 и так далее. Выводом будет число, которое вы получите в конце.

Примеры:

В приведенном ниже примере первая строка - это ввод, вторая строка - это числа, которые вы считаете вверх / вниз, третья строка - накопленная сумма, а последняя строка - выход.

Пример 1:

1   1   1   1   1   1   1   1   1   1   
1   2   4   8   16  32  64  128 256 512 
1   3   7   15  31  63  127 255 511 1023
1023

Пример 2:

1   1   1   1   1   1   -1  -1  -1  -1  1   1   1
1   2   4   8   16  32  -1  -2  -4  -8  1   2   4
1   3   7   15  31  63  62  60  56  48  49  51  55
55

Как вы можете видеть, первое 1или -1«сбрасывает» значение, которое мы рассчитываем, и последовательные последовательности 1или-1 означают удвоение значения.

Пример 3:

-1  -1  1   1   -1  -1  -1
-1  -2  1   2   -1  -2  -4
-1  -3  -2  0   -1  -3  -7
-7

Некоторые дополнительные тестовые случаи для учета некоторых потенциальных угловых случаев.

Ввод на первой строке. Выход на второй.

1
1
-------    
-1
-1
-------
-1   1  -1   1  -1   1  -1   1  -1   1  -1   1
0

Это поэтому выигрывает самая короткая подача на каждом языке.

Ответы:



6

MATL , 6 байтов

Y'Wq*s

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Рассмотрим ввод [1 1 1 1 1 1 -1 -1 -1 -1 1 1 1].

     % Implicit input
     % STACK: [1 1 1 1 1 1 -1 -1 -1 -1 1 1 1]
Y'   % Run-length encoding
     % STACK: [1 -1 1], [6 4 3]
W    % Exponentiation with base 2, element-wise
     % STACK: [1 -1 1], [64 16 8]
q    % Subtract 1
     % STACK: [1 -1 1], [63 15 7]
*    % Multiply, element-wise
     % STACK: [63 -15 7]
s    % sum of array
     % STACK: 55
     % Implicit display

6

Japt , 8 6 байт

-2 байта благодаря @ETHproductions

ò¦ xì2

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

объяснение

Неявный ввод: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

Разделение входного массива ( ò) между различными ¦элементами ( ):
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Сопоставьте каждый раздел с самим собой, проанализированный как массив base- 2digits ( ì):[7, -15, 3]

x

Получить сумму ( x) результирующего массива:-5


Хорошая техника. Я считаю , что вы можете изменить , ®ì2Ãxчтобы xì2спасти два байта.
ETHproductions

@ETHproductions Человек, ты был на всех моих постах. Еще раз спасибо!
Джастин Маринер

5

Cubix , 65 байт

W(?\q.p)w.;0.w;/0>I!U-unP(nwUs;q\^q:;^!u?P(w!u+w.;;>2p!u/@Os..sr\

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

        W ( ? \
        q . p )
        w . ; 0
        . w ; /
0 > I ! U - u n P ( n w U s ; q
\ ^ q : ; ^ ! u ? P ( w ! u + w
. ; ; > 2 p ! u / @ O s . . s r
\ . . . . . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

Смотреть это беги

Как краткое объяснение этого:

  • Прочитайте каждое целое число (1 или -1) и сравните его с предыдущим. Если:
    • тот же толчок вниз, как начало счетчика
    • иначе доведите счетчик до вершины и увеличьте / уменьшите его соответствующим образом.
  • Как только ввод закончен, приведите каждый счетчик к вершине, а для обработки негативов сделайте 2 ^ counter - 1
  • Подведите итоги и результаты


3

R , 32 байта

sum((2^(R=rle(scan()))$l-1)*R$v)

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

Это тот же метод, что и несколько других здесь.

С вводом -1 -1 1 1 -1 -1 -1

  • Выполните кодировку длины пробега на входе. Результаты с длинами 2, 2, 3и значениями-1, 1, -1
  • До 2 до степени длины - 1. Результат в 3, 3, 7
  • Умножьте на значения RLE, давая -3, 3, -7
  • Вернуть сумму -7




2

Брахилог , 13 байт

ḅ⟨{ȧᵐ~ḃ}×h⟩ᵐ+

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

Брахилог использует _вместо -.

Объяснение:

?ḅ⟨{ȧᵐ~ḃ}×h⟩ᵐ+. Predicate (implicit ?.)
?               The input
 ḅ              A list where its elements' elements are equal, and when concatenated is ?
            ᵐ   The result of mapping this predicate over ?
  ⟨        ⟩      The result of forking two predicates over ? with a third
   {    }           The result of this predicate on ?
     ᵐ                The result of mapping this predicate over ?
    ȧ                   The absolute value of ?
      ~               An input where the result of this predicate over it is ?
       ḃ                A list that represents the digits of ? in base I (default 2)
          h         An object that is the first element of ?
         ×          A number that is the product of ?
             +  A number that is the sum of ?
              . The output




1

CJam (13 байт)

{e`{(*2b}%1b}

Набор онлайн-тестов . Это анонимный блок (функция), который принимает массив стеков в стеке и оставляет int в стеке. Последний тест показывает, что он правильно обрабатывает пустой массив, давая 0.

Подход заключается в простом кодировании по длинам серий, за которым следует ручное декодирование по длинам серий каждого преобразования и базового преобразования. Используя встроенное декодирование по длине прогона, я получаю еще один байт с помощью {e`1/:e~2fb1b}или {e`{ae~2b}%1b}.



1

Haskell, 54 53 байта

k#(a:b:c)=k+last(b:[k*2|a==b])#(b:c)
k#_=k
(#)=<<head

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

Простая рекурсия, которая удваивает аккумулятор kили сбрасывает его в 1/ -1и добавляет значения каждого шага.




0

Java, 91 байт

int f(int[]a){int s=0,r=0,i=-1;while(++i<a.length)r+=s=s!=0&s>0==a[i]>0?2*s:a[i];return r;}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.