Aufwärts und abwärts zählen und dabei die Inkremente verdoppeln

14

Eingang:

Eine nicht-leere Liste / Vektor , wobei jedes Element einen Wert / Zeichen hält, die angibt , ob Sie sich verlassen werden auf oder nach unten . Ich benutze 1und -1, aber du kannst wählen, was du willst. Sie können nur zwei Werte verwenden, Sie können nicht 1,2,3...und -1,-2,-3...für oben bzw. unten verwenden.

Herausforderung:

Hier finden Sie die Zahlen in der geometrischen Reihe verwenden 1, 2, 4, 8, 16, 32 ... . Jedes Mal, wenn Sie mit dem Aufwärts- oder Abwärtszählen beginnen, zählen Sie in Schritten von 1 , dann 2 , dann 4 usw. Wenn Sie sich ändern und in die andere Richtung zählen, subtrahieren Sie zuerst 1 , dann 2 , dann 4 und so weiter. Die Ausgabe soll die Zahl sein, zu der Sie am Ende gelangen.

Beispiele:

Im folgenden Beispiel ist die erste Zeile die Eingabe, die zweite Zeile die Zahlen, die Sie hoch- / runterzählen, die dritte Zeile die kumulative Summe und die letzte Zeile die Ausgabe.

Beispiel 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

Beispiel 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

Wie Sie sehen können, wird der Wert, den wir zählen , durch das erste 1oder -1"Zurücksetzen" zurückgesetzt, und aufeinanderfolgende Sequenzen von 1oder -1bedeuten das Verdoppeln des Werts.

Beispiel 3:

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

Einige zusätzliche Testfälle, um einige potenzielle Eckfälle zu berücksichtigen.

Die Eingabe erfolgt in der ersten Zeile. Die Ausgabe erfolgt in der Sekunde.

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

Dies ist so dass die kürzeste Einsendung in jeder Sprache gewinnt.

Stewie Griffin
quelle

Antworten:

6

MATL , 6 Bytes

Y'Wq*s

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Betrachten Sie die Eingabe [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
quelle
6

Japt , 8 6 Bytes

-2 Bytes dank @ETHproductions

ò¦ xì2

Probieren Sie es online!

Erläuterung

Implizite Eingabe: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

Partitionseingabearray ( ò) zwischen verschiedenen ( ¦) Elementen:
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Ordnen Sie jede Partition sich selbst zu, die als Array von Basisziffern 2( ì) analysiert wird :[7, -15, 3]

x

Holen Sie sich die Summe ( x) des resultierenden Arrays:-5

Justin Mariner
quelle
Schöne Technik. Ich glaube , Sie können sich ändern , ®ì2Ãxum xì2zwei Bytes zu speichern.
ETHproductions
@ETHproductions Mann, du warst überall auf meinen Posts. Danke noch einmal!
Justin Mariner
5

Cubix , 65 Bytes

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

Probieren Sie es 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
\ . . . . . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

Schau es dir an

Als kurze Erklärung dafür:

  • Lesen Sie jede Ganzzahl (1 oder -1) ein und vergleichen Sie sie mit der vorherigen. Wenn:
    • das gleiche schieben Sie es nach unten wie der Start eines Zählers
    • Sonst Zähler nach oben bringen und gegebenenfalls erhöhen / verringern.
  • Sobald die Eingabe abgeschlossen ist, bringen Sie jeden Zähler nach oben, und bei Negativen wird 2 ^ counter - 1 ausgeführt
  • Summieren Sie die Ergebnisse und die Ausgabe
MickyT
quelle
4

JavaScript (ES6), 38 Byte

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

R , 32 Bytes

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

Probieren Sie es online!

Dies ist die gleiche Methode wie einige andere hier.

Mit der Eingabe von -1 -1 1 1 -1 -1 -1

  • Führen Sie eine Lauflängencodierung für die Eingabe durch. Ergebnisse mit Längen 2, 2, 3und Werten-1, 1, -1
  • Tun Sie 2 zur Potenz der Längen - 1. Ergebnisse in 3, 3, 7
  • Mit den angegebenen RLE-Werten multiplizieren -3, 3, -7
  • Gib die Summe zurück -7
MickyT
quelle
3

Python 3 , 57 56 Bytes

-1 Byte danke an @notjagan

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

Probieren Sie es online!

ovs
quelle
-1 Byte mit diesem oder diesem .
Notjagan
Das s>()hat mich eine Sekunde gekostet. Das ist wirklich schlau.
Morgan Thrapp
2

C ++ 14, 58 Bytes

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

Übernimmt die Eingabe über das vArgument ( std::vectoroder einen beliebigen iterierbaren Container) und gibt sie an das sArgument aus (als Referenz). Jedes Element von vmuss entweder 1oder sein -1.

Anwendungsbeispiele und Testfälle.

Vaultah
quelle
2

Brachylog , 13 Bytes

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

Probieren Sie es online!

Brachylog verwendet _ statt -.

Erläuterung:

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

CJam (13 Bytes)

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

Online-Testsuite . Dies ist ein anonymer Block (eine Funktion), der ein Array von Ints auf dem Stapel entgegennimmt und ein Int auf dem Stapel hinterlässt. Der letzte Test zeigt, dass ein leeres Array korrekt behandelt wird und 0 ergibt.

Der Ansatz ist eine einfache Lauflängencodierung, gefolgt von einer manuellen Lauflängendecodierung für jeden Lauf und jede Basiskonvertierung. Bei Verwendung der integrierten Lauflängendekodierung erhalte ich mit {e`1/:e~2fb1b}oder ein Byte mehr {e`{ae~2b}%1b}.

Peter Taylor
quelle
1

05AB1E , 6 Bytes

γε2β}O

Probieren Sie es online!

Erik der Outgolfer
quelle
Ahhh ... Base-2-Konvertierung ... und ich dachte, ich wäre süß mit Lift. γε¬sƶÄ<o*}OO
Magic Octopus Urn
1

Haskell, 54 53 Bytes

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

Probieren Sie es online!

Eine einfache Rekursion, die entweder den Akkumulator verdoppelt koder auf 1/ zurücksetzt -1und die Werte der einzelnen Schritte addiert.

nimi
quelle
0

Mathematica, 60 Bytes

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

Mathematica, 25 Bytes

Tr[Fold[#+##&]/@Split@#]&
Genisis
quelle
0

Java, 91 Bytes

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

Pyth, 11 Bytes

s.b*t^2NYr8

Probieren Sie es online aus

Wie es funktioniert

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