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.

Respuestas:



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

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


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

4

JavaScript (ES6), 38 bytes

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)

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



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.


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




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



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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.