Contando hacia arriba y hacia abajo mientras duplica los incrementos

14

Entrada:

Una lista / vector no vacío donde cada elemento contiene un valor / carácter, que indica si contará hacia arriba o hacia abajo . Usaré 1y -1, pero puedes elegir lo que quieras. Solo puede usar dos valores, no puede usar 1,2,3...y -1,-2,-3..., para arriba y abajo respectivamente.

Desafío:

Vamos a usar los números de la serie geométrica 1, 2, 4, 8, 16, 32 ... . Cada vez que comience a contar hacia arriba o hacia abajo, contará en incrementos de 1 , luego 2 , luego 4 y así sucesivamente. Si cambia y comienza a contar de otra manera, restará 1 , luego 2 , luego 4 y así sucesivamente. La salida será el número al que llegue al final.

Ejemplos:

En el ejemplo a continuación, la primera línea es la entrada, la segunda línea son los números que está contando hacia arriba / hacia abajo, la tercera línea es la suma acumulativa y la última línea es la salida.

Ejemplo 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

Ejemplo 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

Como puede ver, el primero 1o -1"restablece" el valor que estamos contando, y las secuencias consecutivas de 1o -1significa duplicar el valor.

Ejemplo 3

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

Algunos casos de prueba adicionales para dar cuenta de algunos casos de esquina potenciales.

La entrada está en la primera línea. La salida está en el segundo.

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

Este es el por lo que gana la presentación más corta en cada idioma.

Stewie Griffin
fuente

Respuestas:

19

Casco , 3 bytes

ṁḋg

Pruébalo en línea!

Explicación

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

MATL , 6 bytes

Y'Wq*s

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

Considere la entrada [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
fuente
6

Japt , 8 6 bytes

-2 bytes gracias a @ETHproductions

ò¦ xì2

Pruébalo en línea!

Explicación

Entrada implícita: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

Partición de matriz de entrada ( ò) entre diferentes ¦elementos ( ):
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Asigne cada partición a sí misma analizada como una matriz de 2dígitos base ( ì):[7, -15, 3]

x

Obtenga la suma ( x) de la matriz resultante:-5

Justin Mariner
fuente
Buena técnica Creo que puede cambiar ®ì2Ãxa xì2para guardar dos bytes.
ETHproductions
@ETHproductions Hombre, has estado en todas mis publicaciones. ¡Gracias de nuevo!
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\

Pruébalo en línea!

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

Míralo correr

Como una breve explicación de esto:

  • Lea en cada entero (1 o -1) y compárelo con el anterior. Si:
    • lo mismo empujarlo al fondo como el inicio de un contador
    • de lo contrario, coloque el contador en la parte superior e increméntelo / decremente según corresponda.
  • Una vez que haya finalizado la entrada, coloque cada contador en la parte superior y maneje los negativos haciendo 2 ^ contador - 1
  • Suma los resultados y resultados
MickyT
fuente
4

JavaScript (ES6), 38 bytes

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

R , 32 bytes

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

Pruébalo en línea!

Este es el mismo método que algunos otros aquí.

Con la entrada de -1 -1 1 1 -1 -1 -1

  • Realice una codificación de longitud de ejecución en la entrada. Resultados con longitudes 2, 2, 3y valores-1, 1, -1
  • Haz 2 al poder de longitudes - 1. Resultados en 3, 3, 7
  • Multiplicar por los valores RLE dando -3, 3, -7
  • Devuelve la suma -7
MickyT
fuente
3

Python 3 , 57 56 bytes

-1 byte gracias a @notjagan

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

Pruébalo en línea!

ovs
fuente
-1 byte con esto o esto .
notjagan
Eso s>()me llevó un segundo. Eso es realmente inteligente.
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;}

Toma entrada a través del vargumento ( std::vectoro cualquier contenedor iterable), salidas al sargumento (por referencia). Cada elemento de vdebe ser 1o -1.

Ejemplo de uso y casos de prueba.

vaultah
fuente
2

Brachylog , 13 bytes

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

Pruébalo en línea!

Usos de Brachylog _ lugar de -.

Explicación:

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

Python, 76 72 bytes

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

Pruébalo en línea!

Uriel
fuente
1

CJam (13 bytes)

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

Conjunto de pruebas en línea . Este es un bloque anónimo (función) que toma una matriz de entradas en la pila y deja un int en la pila. La última prueba muestra que maneja una matriz vacía correctamente, dando 0.

El enfoque es la codificación directa de la longitud de ejecución seguida de una decodificación de longitud de ejecución manual de cada ejecución y conversión de base. Usando el decodificador incorporado para la longitud de ejecución obtengo un byte más con {e`1/:e~2fb1b}o {e`{ae~2b}%1b}.

Peter Taylor
fuente
1

05AB1E , 6 bytes

γε2β}O

Pruébalo en línea!

Erik el Outgolfer
fuente
Ahhh ... conversión de Base-2 ... y pensé que estaba siendo linda con el ascensor γε¬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

Pruébalo en línea!

Una recursión simple que dobla el acumulador ko lo restablece a 1/ -1y agrega los valores de cada paso.

nimi
fuente
0

Mathematica, 60 bytes

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

Mathematica, 25 bytes

Tr[Fold[#+##&]/@Split@#]&
ngenisis
fuente
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
fuente
0

Pyth, 11 bytes

s.b*t^2NYr8

Pruébalo en línea

Cómo funciona

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