Conteggio su e giù raddoppiando gli incrementi


14

Ingresso:

Un elenco non vuota / vettore in cui ogni elemento contiene un valore / carattere, indica se si contano su o giù . Userò 1e -1, ma puoi scegliere quello che ti piace. Puoi usare solo due valori, non puoi usare 1,2,3...e -1,-2,-3..., rispettivamente su e giù.

Sfida:

Potrai utilizzare i numeri nella serie geometrica 1, 2, 4, 8, 16, 32 ... . Ogni volta che inizi a contare su o giù, conterai con incrementi di 1 , quindi 2 , quindi 4 e così via. Se cambi e inizi a contare nell'altro modo, sottrarrai 1 , quindi 2 , quindi 4 e così via. L'output deve essere il numero che si ottiene alla fine.

Esempi:

Nell'esempio seguente, la prima riga è l'input, la seconda riga è i numeri che stai contando su / giù, la terza riga è la somma cumulativa e l'ultima riga è l'output.

Esempio 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

Esempio 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

Come puoi vedere, il primo 1o -1"ripristina" il valore che stiamo contando, e sequenze consecutive di 1o -1significa raddoppiare il valore.

Esempio 3:

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

Alcuni casi di test aggiuntivi per tenere conto di alcuni casi d'angolo potenziali.

L'ingresso è sulla prima riga. L'output è sul secondo.

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

Si tratta di quindi vince l'invio più breve in ogni lingua.

Risposte:



6

MATL , 6 byte

Y'Wq*s

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

Considera l'input [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 byte

-2 byte grazie a @ETHproductions

ò¦ xì2

Provalo online!

Spiegazione

Input implicito: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

Array di input della partizione ( ò) tra ¦elementi diversi ( ):
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Mappa ogni partizione su se stessa analizzata come una matrice di 2cifre di base ( ì):[7, -15, 3]

x

Ottieni la somma ( x) dell'array risultante:-5


Bella tecnica. Credo che tu possa passare ®ì2Ãxa xì2per salvare due byte.
ETHproductions,

@ETHproductions Amico, sei stato in tutti i miei post. Grazie ancora!
Justin Mariner,

5

Cubix , 65 byte

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

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

Guardalo correre

Come breve spiegazione di questo:

  • Leggi in ogni numero intero (1 o -1) e confrontalo con il precedente. Se:
    • lo stesso lo spinge verso il basso come l'inizio di un contatore
    • altrimenti porta il contatore in alto e lo incrementa / decrementa come appropriato.
  • Una volta che l'input è terminato, porta ogni contatore in alto e gestendo i negativi fai 2 ^ counter - 1
  • Somma i risultati e l'output

4

JavaScript (ES6), 38 byte

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

3

R , 32 byte

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

Provalo online!

Questo è lo stesso metodo di alcuni altri qui.

Con l'ingresso di -1 -1 1 1 -1 -1 -1

  • Esegui una codifica della lunghezza della corsa sull'input. Risultati con lunghezze di 2, 2, 3e valori-1, 1, -1
  • Fai 2 per la potenza delle lunghezze - 1. Risultati in 3, 3, 7
  • Moltiplicare per i valori RLE che danno -3, 3, -7
  • Restituisci la somma -7



2

C ++ 14, 58 byte

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

Accetta input tramite l' vargomento ( std::vectoro qualsiasi contenitore iterabile), output sall'argomento (per riferimento). Ogni elemento di vdeve essere 1o-1 .

Esempi di utilizzo e casi di test.


2

Brachylog , 13 byte

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

Provalo online!

Brachylog utilizza _invece di -.

Spiegazione:

?ḅ⟨{ȧᵐ~ḃ}×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 byte)

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

Suite di test online . Questo è un blocco (funzione) anonimo che accetta una matrice di ints sullo stack e lascia un int sullo stack. L'ultimo test mostra che gestisce correttamente un array vuoto, dando 0.

L'approccio è la codifica semplice della lunghezza della corsa seguita da una decodifica manuale della lunghezza della corsa di ogni corsa e conversione di base. Utilizzando la decodifica integrata per la durata, ottengo un byte in più con {e`1/:e~2fb1b}o {e`{ae~2b}%1b}.



1

Haskell, 54 53 byte

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

Provalo online!

Una semplice ricorsione che raddoppia l'accumulatore ko lo reimposta su 1/ -1e aggiunge i valori di ogni passaggio.


0

Mathematica, 60 byte

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


0

Java, 91 byte

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.