Liczenie w górę i w dół przy podwojeniu przyrostów

14

Wejście:

Niepusta lista / wektor, w którym każdy element zawiera wartość / znak wskazujący, czy policzysz w górę, czy w dół . Użyję 1i -1, ale możesz wybrać, co chcesz. Można użyć tylko dwie wartości, nie można używać 1,2,3...i -1,-2,-3...na górę i dół odpowiednio.

Wyzwanie:

Będziesz korzystać z numerów w geometrycznym serii 1, 2, 4, 8, 16, 32 ... . Za każdym razem, gdy zaczniesz liczyć w górę lub w dół, będziesz liczyć co 1 , potem 2 , potem 4 itd. Jeśli zmienisz i zaczniesz liczyć w drugą stronę, odejmiesz 1 , następnie 2 , a następnie 4 i tak dalej. Dane wyjściowe będą liczbą, którą otrzymasz na końcu.

Przykłady:

W poniższym przykładzie pierwszy wiersz to dane wejściowe, drugi wiersz to liczby, które liczysz w górę / w dół, trzeci wiersz to suma skumulowana, a ostatni to wynik.

Przykład 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

Przykład 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

Jak widać, pierwsza 1lub -1„resetuje” liczoną przez nas wartość, a kolejne sekwencje 1lub -1oznaczają podwojenie wartości.

Przykład 3:

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

Niektóre dodatkowe przypadki testowe uwzględniające niektóre potencjalne przypadki narożne.

Dane wejściowe znajdują się w pierwszym wierszu. Wyjście jest na drugim.

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

To jest więc wygrywa najkrótsze zgłoszenie w każdym języku.

Stewie Griffin
źródło

Odpowiedzi:

19

Łuska , 3 bajty

ṁḋg

Wypróbuj online!

Wyjaśnienie

ṁḋg
  g  Group equal adjacent elements,
ṁ    take sum of
 ḋ   base-2 decoding of each group.
Zgarb
źródło
6

MATL , 6 bajtów

Y'Wq*s

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Rozważ wejście [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
Luis Mendo
źródło
6

Japt , 8 6 bajtów

-2 bajty dzięki @ETHproductions

ò¦ xì2

Wypróbuj online!

Wyjaśnienie

Domniemane dane wejściowe: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

Podziel tablicę wejściową ( ò) na różne ¦elementy ( ):
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Odwzoruj każdą partycję na siebie przeanalizowaną jako tablicę 2cyfr podstawowych ( ì):[7, -15, 3]

x

Uzyskaj sumę ( x) wynikowej tablicy:-5

Justin Mariner
źródło
Niezła technika. Wierzę, że można zmienić ®ì2Ãx, aby xì2zapisać dwa bajty.
ETHprodukcje
@ETHproductions Człowieku, byłeś już na moich postach. Dzięki jeszcze raz!
Justin Mariner
5

Cubix , 65 bajtów

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

Wypróbuj online!

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

Zobacz, jak biegnie

Jako krótkie wyjaśnienie tego:

  • Przeczytaj każdą liczbę całkowitą (1 lub -1) i porównaj z poprzednią. Gdyby:
    • to samo zepchnij na dół jak na początku licznika
    • w przeciwnym razie przenieś licznik na górę i zwiększ / zmniejsz odpowiednio.
  • Po zakończeniu wprowadzania umieść każdy licznik na górze, a obsługa negatywów równa 2 ^ licznik - 1
  • Zsumuj wyniki i wyniki
MickyT
źródło
4

JavaScript (ES6), 38 bajtów

a=>a.map(e=>r+=d=d*e>0?d+d:e,r=d=0)&&r
Neil
źródło
3

R , 32 bajty

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

Wypróbuj online!

Jest to ta sama metoda, jak kilka innych tutaj.

Z wejściem -1 -1 1 1 -1 -1 -1

  • Wykonaj kodowanie długości przebiegu wejściowego. Wyniki z długościami 2, 2, 3i wartościami-1, 1, -1
  • Wykonaj 2 do potęgi długości - 1. Wyniki w 3, 3, 7
  • Pomnóż przez podane wartości RLE -3, 3, -7
  • Zwróć sumę -7
MickyT
źródło
3

Python 3 , 57 56 bajtów

-1 bajt dzięki @notjagan

f=lambda a,*s,m=1:m*a+(s>()and f(*s,m=(m*2)**(a==s[0])))

Wypróbuj online!

ovs
źródło
-1 bajt z tym lub tamtym .
notjagan
Że s>()zajęło mi chwilę. To naprawdę sprytne.
Morgan Thrapp
2

C ++ 14, 58 bajtów

[](auto v,int&s){int p=s=0;for(auto x:v)s+=p=x*p<1?x:2*p;}

Pobiera dane wejściowe za pośrednictwem vargumentu ( std::vectorlub dowolnego kontenera iterowalnego), dane wyjściowe do sargumentu (przez odniesienie). Każdy element vmusi być albo 1albo -1.

Przykładowe zastosowania i przypadki testowe.

sklepienie
źródło
2

Brachylog , 13 bajtów

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

Wypróbuj online!

Brachylog używa _zamiast -.

Wyjaśnienie:

?ḅ⟨{ȧᵐ~ḃ}×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
Erik the Outgolfer
źródło
1

Python, 76 72 bajtów

f=lambda s,k=1:len(s)and(f(s,s[0])if s[0]*abs(k)/k-1else k+f(s[1:],2*k))

Wypróbuj online!

Uriel
źródło
1

CJam (13 bajtów)

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

Zestaw testów online . Jest to anonimowy blok (funkcja), który pobiera tablicę liczb całkowitych na stos i pozostawia liczbę całkowitą na stosie. Ostatni test pokazuje, że poprawnie obsługuje pustą tablicę, dając 0.

Podejście polega na prostym kodowaniu długości przebiegu, a następnie ręcznym dekodowaniu długości przebiegu dla każdej serii i konwersji podstawowej. Korzystając z wbudowanego dekodowania długości przebiegu, otrzymuję jeszcze jeden bajt z {e`1/:e~2fb1b}lub {e`{ae~2b}%1b}.

Peter Taylor
źródło
1

05AB1E , 6 bajtów

γε2β}O

Wypróbuj online!

Erik the Outgolfer
źródło
Ahhh ... konwersja Base-2 ... i myślałem, że jestem słodki z windą. γε¬sƶÄ<o*}OO
Magic Octopus Urn
1

Haskell, 54 53 bajtów

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

Wypróbuj online!

Prosta rekurencja, która podwaja akumulator klub resetuje go do 1/ -1i dodaje wartości z każdego kroku.

nimi
źródło
0

Mathematica, 60 bajtów

Tr[Last@*Accumulate/@(#[[1]]2^(Range@Tr[1^#]-1)&/@Split@#)]&
J42161217
źródło
0

Mathematica, 25 bajtów

Tr[Fold[#+##&]/@Split@#]&
ngenisis
źródło
0

Java, 91 bajtów

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;}
RCB
źródło
0

Pyth, 11 bajtów

s.b*t^2NYr8

Wypróbuj online

Jak to działa

         r8    run-length encode input
 .b            map (N, Y) ↦
     ^2N           2^N
    t              minus 1
   *    Y          times Y
s              sum
Anders Kaseorg
źródło