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.

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

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


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

4

JavaScript (ES6), 38 Byte

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

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



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.


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




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



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.


0

Mathematica, 60 Bytes

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.