Підрахунок вгору і вниз при подвоєнні приросту


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

Зіставляйте кожен розділ на себе, проаналізований як масив базових 2цифр ( ì):[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 ^ лічильник - 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}

Інтернет-тестовий набір . Це анонімний блок (функція), який бере масив ints на стек і залишає 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

Математика, 60 байт

Tr[Last@*Accumulate/@(#[[1]]2^(Range@Tr[1^#]-1)&/@Split@#)]&


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.