Menghitung naik dan turun sambil menggandakan kenaikan

14

Memasukkan:

Daftar / vektor yang tidak kosong di mana setiap elemen menyimpan nilai / karakter, yang menunjukkan apakah Anda akan menghitung naik atau turun . Saya akan menggunakan 1dan -1, tetapi Anda dapat memilih apa pun yang Anda suka. Anda hanya dapat menggunakan dua nilai, Anda tidak bisa menggunakan 1,2,3...dan -1,-2,-3..., masing-masing untuk naik dan turun.

Tantangan:

Anda akan menggunakan nomor dalam seri geometrik 1, 2, 4, 8, 16, 32 ... . Setiap kali Anda mulai menghitung naik atau turun, Anda akan menghitung secara bertahap dari 1 , lalu 2 , lalu 4 dan seterusnya. Jika Anda berubah dan mulai menghitung dengan cara lain maka Anda akan mengurangi 1 , lalu 2 , lalu 4 dan seterusnya. Hasilnya adalah angka yang Anda dapatkan pada akhirnya.

Contoh:

Pada contoh di bawah ini, baris pertama adalah input, baris kedua adalah angka yang Anda hitung naik / turun, baris ketiga adalah jumlah kumulatif, dan baris terakhir adalah output.

Contoh 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

Contoh 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

Seperti yang Anda lihat, yang pertama 1atau -1"me-reset" nilai yang kami hitung, dan urutan berurutan 1atau -1berarti menggandakan nilai.

Contoh 3:

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

Beberapa test case tambahan untuk memperhitungkan beberapa case corner potensial.

Masukan ada di baris pertama. Outputnya adalah yang kedua.

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

Ini adalah sehingga pengiriman terpendek dalam setiap bahasa menang.

Stewie Griffin
sumber

Jawaban:

19

Sekam , 3 byte

ṁḋg

Cobalah online!

Penjelasan

ṁḋg
  g  Group equal adjacent elements,
ṁ    take sum of
 ḋ   base-2 decoding of each group.
Zgarb
sumber
6

MATL , 6 byte

Y'Wq*s

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pertimbangkan input [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
sumber
6

Japt , 8 6 byte

-2 byte terima kasih kepada @ETHproductions

ò¦ xì2

Cobalah online!

Penjelasan

Masukan implisit: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

Array masukan partisi ( ò) antara berbagai ¦elemen ( ):
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Memetakan setiap partisi ke dirinya sendiri diuraikan sebagai array 2angka dasar ( ì):[7, -15, 3]

x

Dapatkan jumlah ( x) dari array yang dihasilkan:-5

Justin Mariner
sumber
Teknik yang bagus. Saya percaya Anda dapat mengubah ®ì2Ãxuntuk xì2menyelamatkan dua byte.
ETHproduk
@ ETHproductions Man, Anda sudah membaca semua posting saya. Terima kasih lagi!
Justin Mariner
5

Cubix , 65 byte

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

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

Lihat saja

Sebagai penjelasan singkat tentang ini:

  • Baca di setiap integer (1 atau -1) dan bandingkan dengan sebelumnya. Jika:
    • dorongan yang sama ke bawah sebagai awal penghitung
    • lain membawa counter ke atas dan menambah / mengurangi itu sesuai kebutuhan.
  • Setelah input selesai bawa setiap penghitung ke atas dan penanganan negatif lakukan 2 ^ penghitung - 1
  • Jumlahkan hasil dan keluaran
MickyT
sumber
4

JavaScript (ES6), 38 byte

a=>a.map(e=>r+=d=d*e>0?d+d:e,r=d=0)&&r
Neil
sumber
3

R , 32 byte

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

Cobalah online!

Ini adalah metode yang sama dengan beberapa orang lain di sini.

Dengan masukan dari -1 -1 1 1 -1 -1 -1

  • Lakukan Pengodean Durasi Jalankan pada input. Hasil dengan panjang 2, 2, 3dan nilai-1, 1, -1
  • Lakukan 2 sesuai kekuatan panjang - 1. Menghasilkan 3, 3, 7
  • Kalikan dengan pemberian nilai RLE -3, 3, -7
  • Kembalikan jumlahnya -7
MickyT
sumber
3

Python 3 , 57 56 byte

-1 byte terima kasih kepada @notjagan

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

Cobalah online!

ovs
sumber
-1 byte dengan ini atau ini .
notjagan
Itu s>()butuh waktu satu detik. Itu sangat pintar.
Morgan Thrapp
2

C ++ 14, 58 byte

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

Mengambil input melalui vargumen ( std::vector, atau wadah yang dapat diubah), menghasilkan sargumen (dengan referensi). Setiap elemen vharus berupa 1atau -1.

Contoh penggunaan dan uji kasus.

kubah
sumber
2

Brachylog , 13 byte

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

Cobalah online!

Penggunaan Brachylog _ sebagai gantinya -.

Penjelasan:

?ḅ⟨{ȧᵐ~ḃ}×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
sumber
1

Python, 76 72 byte

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

Cobalah online!

Uriel
sumber
1

PHP, 51 byte

while($d=$argv[++$i])$s+=$x=$d*$x>0?2*$x:$d;echo$s;

Jalankan dengan -natau coba online .

Titus
sumber
1

CJam (13 byte)

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

Test suite online . Ini adalah blok anonim (fungsi) yang mengambil array int pada stack dan meninggalkan int pada stack. Tes terakhir menunjukkan bahwa ia menangani array kosong dengan benar, memberikan 0.

Pendekatannya adalah pengkodean run-length langsung diikuti oleh decode run-length manual dari setiap konversi run dan base. Menggunakan built-in untuk run-length decode saya mendapatkan satu byte lebih banyak dengan {e`1/:e~2fb1b}atau {e`{ae~2b}%1b}.

Peter Taylor
sumber
1

05AB1E , 6 byte

γε2β}O

Cobalah online!

Erik the Outgolfer
sumber
Ahhh ... Konversi basis-2 ... dan saya pikir saya lucu dengan lift. γε¬sƶÄ<o*}OO
Magic Gurita Guci
1

Haskell, 54 53 byte

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

Cobalah online!

Rekursi sederhana yang menggandakan akumulator katau menyetel ulang ke 1/ -1dan menambahkan nilai dari setiap langkah.

nimi
sumber
0

Mathematica, 60 byte

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

Mathematica, 25 byte

Tr[Fold[#+##&]/@Split@#]&
ngenisis
sumber
0

Java, 91 byte

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
sumber
0

Pyth, 11 byte

s.b*t^2NYr8

Cobalah online

Bagaimana itu bekerja

         r8    run-length encode input
 .b            map (N, Y) ↦
     ^2N           2^N
    t              minus 1
   *    Y          times Y
s              sum
Anders Kaseorg
sumber