Artımları ikiye katlarken yukarı ve aşağı sayma


14

Giriş:

Her öğenin bir değer / karakter içerdiği, yukarı veya aşağı sayacağınızı belirten boş olmayan bir liste / vektör . Ben kullanacağız 1ve -1ancak ne gibi seçebilir. Yalnızca kullanamazsınız, iki değeri kullanabilir 1,2,3...ve -1,-2,-3...yukarı ve aşağı sırasıyla.

Meydan okuma:

1, 2, 4, 8, 16, 32 ... geometrik serilerindeki sayıları kullanacaksınız . Her yukarı veya aşağı saymaya başladığınızda, 1 , sonra 2 , sonra 4 ve benzeri artışlarla sayılırsınız . Değiştirir ve başka bir şekilde saymaya başlarsanız, 1 , sonra 2 , sonra 4 vb. Çıktı, sonunda ulaşacağınız sayı olacaktır.

Örnekler:

Aşağıdaki örnekte, ilk satır girdi, ikinci satır yukarı / aşağı saydığınız sayılar, üçüncü satır kümülatif toplam ve son satır çıktıdır.

Örnek 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

Örnek 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

Gördüğünüz gibi, ilk 1veya -1saydığımız değeri "sıfırlar" ve ardışık diziler 1veya -1değerin iki katına çıkması anlamına gelir.

Örnek 3:

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

Bazı potansiyel köşe durumlarını açıklamak için bazı ek test senaryoları.

Giriş ilk satırda. Çıkış ikinci sıradadır.

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

Bu böylece her dilde en kısa teslim kazanır.

Yanıtlar:



6

MATL , 6 bayt

Y'Wq*s

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

Girişi düşünün [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 bayt

@ETHproductions sayesinde -2 bayt

ò¦ xì2

Çevrimiçi deneyin!

açıklama

Örtük girdi: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

òFarklı ( ¦) öğeler arasındaki bölüm giriş dizisi ( ) :
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Her bir bölümü bir taban 2basamak dizisi olarak ayrıştırılmış olarak ( ì) eşleyin :[7, -15, 3]

x

xSonuçta elde edilen dizinin ( ) toplamını alın :-5


Güzel teknik. İki bayt tasarruf ®ì2Ãxetmek xì2için değişebileceğine inanıyorum .
ETHproductions

@ETHproductions Adamım, tüm yayınlarımın üstündesin. Tekrar teşekkürler!
Justin Mariner

5

Cubix , 65 bayt

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

Çevrimiçi deneyin!

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

Koşmasını izle

Bunun kısa bir açıklaması olarak:

  • Her tamsayıyı (1 veya -1) okuyun ve bir öncekiyle karşılaştırın. Eğer:
    • aynı sayacın başlangıcıyla aşağıya doğru itin
    • aksi halde sayacı yukarıya getirin ve uygun şekilde artırın / azaltın.
  • Giriş bittiğinde her sayacı en üste getirin ve negatifleri işlemek 2 ^ sayaç - 1 yapın
  • Sonuçları ve çıktıyı topla

4

JavaScript (ES6), 38 bayt

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

3

R , 32 bayt

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

Çevrimiçi deneyin!

Bu, burada birkaç yöntemle aynı yöntemdir.

Girişi ile -1 -1 1 1 -1 -1 -1

  • Girişte bir Çalışma Uzunluğu Kodlaması yapın. Uzunlukları 2, 2, 3ve değerleri olan sonuçlar-1, 1, -1
  • Uzunluk gücü 2 yapmak - 1. Sonuçlar 3, 3, 7
  • RLE değerleri ile çarpın -3, 3, -7
  • Toplamı iade et -7



2

C ++ 14, 58 bayt

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

Bağımsız vdeğişken ( std::vectorveya yinelenebilir herhangi bir kapsayıcı) üzerinden girdi alır, bağımsız değişkene çıktı gönderir s(referans olarak). Her bir elemanı vzorunluluk olarak mevcut 1ya da -1.

Örnek kullanım ve test senaryoları.


2

Brachylog , 13 bayt

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

Çevrimiçi deneyin!

Brachylog _yerine kullanır -.

Açıklama:

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

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

Çevrimiçi test paketi . Bu, yığında bir dizi ints alan ve yığında bir int bırakan anonim bir bloktur (işlev). Son test, boş bir diziyi doğru işlediğini ve 0 verdiğini gösterir.

Yaklaşım, doğrudan çalışma uzunluğu kodlaması ve ardından her çalışma ve taban dönüşümünün manuel çalışma uzunluğu kodlamasıdır. Çalışma uzunluğu kod çözme için yerleşik kullanarak {e`1/:e~2fb1b}veya ile bir bayt daha alırım {e`{ae~2b}%1b}.



1

Haskell, 54 53 bayt

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

Çevrimiçi deneyin!

Ya da akümülatör iki katına basit bir yineleme kbu veya sıfırlanır 1/ -1ve her bir aşamanın değerleri toplar.


0

Mathematica, 60 bayt

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


0

Java, 91 bayt

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;}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.