Contando para cima e para baixo enquanto dobra os incrementos

14

Entrada:

Uma lista / vetor não vazio em que cada elemento contém um valor / caractere, indicando se você vai contar para cima ou para baixo . Vou usar 1e -1, mas você pode escolher o que quiser. Você pode usar apenas dois valores, não pode usar 1,2,3...e -1,-2,-3..., para cima e para baixo, respectivamente.

Desafio:

Você vai usar os números na série geométrica 1, 2, 4, 8, 16, 32 ... . Toda vez que você começar a contar para cima ou para baixo, contará em incrementos de 1 , depois 2 , depois 4 e assim por diante. Se você mudar e começar a contar da outra maneira, subtrairá 1 , depois 2 , depois 4 e assim por diante. A saída deve ser o número que você obtém no final.

Exemplos:

No exemplo abaixo, a primeira linha é a entrada, a segunda linha são os números que você está contando para cima / para baixo, a terceira linha é a soma acumulada e a última linha é a saída.

Exemplo 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

Exemplo 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 você pode ver, o primeiro 1ou -1"redefine" o valor que estamos contando e sequências consecutivas 1ou -1meios duplicando o valor.

Exemplo 3:

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

Alguns casos de teste adicionais para explicar alguns casos de canto em potencial.

A entrada está na primeira linha. A saída está no segundo.

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

Este é o pelo que a submissão mais curta em cada idioma vence.

Stewie Griffin
fonte

Respostas:

19

Casca , 3 bytes

ṁḋg

Experimente online!

Explicação

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

MATL , 6 bytes

Y'Wq*s

Experimente online! Ou verifique todos os casos de teste .

Explicação

Considere 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
fonte
6

Japonês , 8 6 bytes

-2 bytes graças a @ETHproductions

ò¦ xì2

Experimente online!

Explicação

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

ò¦

Matriz de entrada de partição ( ò) entre diferentes ¦elementos ( ):
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Mapeie cada partição para si mesma, analisada como uma matriz de 2dígitos base ( ì):[7, -15, 3]

x

Obtenha a soma ( x) da matriz resultante:-5

Justin Mariner
fonte
Boa técnica. Eu acredito que você pode mudar ®ì2Ãxpara xì2salvar dois bytes.
ETHproductions
@ETHproductions Cara, você esteve em todos os meus posts. Obrigado novamente!
23717 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\

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

Assista correr

Como uma breve explicação disso:

  • Leia cada número inteiro (1 ou -1) e compare-o com o anterior. E se:
    • empurre o mesmo para o fundo como o início de um contador
    • caso contrário, leve o contador para cima e aumente / diminua conforme apropriado.
  • Quando a entrada estiver concluída, traga cada contador para o topo e o tratamento de negativos faz 2 ^ counter - 1
  • Soma os resultados e a saída
MickyT
fonte
4

JavaScript (ES6), 38 bytes

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

R , 32 bytes

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

Experimente online!

Este é o mesmo método que alguns outros aqui.

Com a entrada de -1 -1 1 1 -1 -1 -1

  • Faça uma codificação de comprimento de execução na entrada. Resultados com comprimentos 2, 2, 3e valores-1, 1, -1
  • Faça 2 com a potência dos comprimentos - 1. Resultados em 3, 3, 7
  • Multiplique pelos valores de RLE, fornecendo -3, 3, -7
  • Retorna a soma -7
MickyT
fonte
3

Python 3 , 57 56 bytes

-1 byte graças a @notjagan

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

Experimente online!

ovs
fonte
-1 byte com isto ou isto .
notjagan
Isso s>()me levou um segundo. Isso é 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;}

Recebe entrada por meio do vargumento (std::vector , ou qualquer contêiner iterável), gera saída para o sargumento (por referência). Cada elemento de vdeve ser 1ou -1.

Exemplo de uso e casos de teste.

vaultah
fonte
2

Brachylog , 13 bytes

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

Experimente online!

Usos de Brachylog _ vez de -.

Explicação:

?ḅ⟨{ȧᵐ~ḃ}×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, o Outgolfer
fonte
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))

Experimente online!

Uriel
fonte
1

PHP, 51 bytes

while($d=$argv[++$i])$s+=$x=$d*$x>0?2*$x:$d;echo$s;

Corra com -nou experimente online .

Titus
fonte
1

CJam (13 bytes)

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

Conjunto de testes online . Este é um bloco anônimo (função) que pega uma matriz de entradas na pilha e deixa um int na pilha. O último teste mostra que ele lida com uma matriz vazia corretamente, fornecendo 0.

A abordagem é a codificação direta do comprimento da execução, seguida por uma decodificação manual da duração da execução de cada execução e conversão de base. Usando o built-in para decodificação de execução, recebo mais um byte com {e`1/:e~2fb1b}ou {e`{ae~2b}%1b}.

Peter Taylor
fonte
1

05AB1E , 6 bytes

γε2β}O

Experimente online!

Erik, o Outgolfer
fonte
Ahhh ... Conversão Base-2 ... e eu pensei que estava sendo fofo com elevador. γε¬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

Experimente online!

Uma recursão simples que dobra o acumulador kou o redefine para 1/ -1e adiciona os valores de cada etapa.

nimi
fonte
0

Mathematica, 60 bytes

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

Mathematica, 25 bytes

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

Pitão, 11 bytes

s.b*t^2NYr8

Experimente online

Como funciona

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