Compter de haut en bas tout en doublant les incréments

14

Contribution:

Une liste / un vecteur non vide où chaque élément contient une valeur / un caractère, indiquant si vous comptez vers le haut ou vers le bas . Je vais utiliser 1et -1, mais vous pouvez choisir ce que vous voulez. Vous ne pouvez utiliser que deux valeurs, vous ne pouvez pas utiliser 1,2,3...et -1,-2,-3..., respectivement pour monter et descendre.

Défi:

Vous utiliserez les numéros de la série géométrique 1, 2, 4, 8, 16, 32 ... . Chaque fois que vous commencez à compter vers le haut ou vers le bas, vous comptez par incréments de 1 , puis 2 , puis 4 et ainsi de suite. Si vous changez et commencez à compter dans l'autre sens, vous soustrayez 1 , puis 2 , puis 4 et ainsi de suite. La sortie doit être le nombre auquel vous arrivez à la fin.

Exemples:

Dans l'exemple ci-dessous, la première ligne est l'entrée, la deuxième ligne est les nombres que vous comptez en haut / en bas, la troisième ligne est la somme cumulée et la dernière ligne est la sortie.

Exemple 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

Exemple 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

Comme vous pouvez le voir, le premier 1ou -1"réinitialise" la valeur que nous comptons, et des séquences consécutives de 1ou -1signifie doubler la valeur.

Exemple 3:

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

Quelques cas de test supplémentaires pour tenir compte de certains cas de coin potentiels.

L'entrée est sur la première ligne. La sortie est sur la seconde.

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

Il s'agit de donc la soumission la plus courte dans chaque langue gagne.

Stewie Griffin
la source

Réponses:

19

Husk , 3 octets

ṁḋg

Essayez-le en ligne!

Explication

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

MATL , 6 octets

Y'Wq*s

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

Tenez compte des commentaires [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
la source
6

Japt , 8 6 octets

-2 octets grâce à @ETHproductions

ò¦ xì2

Essayez-le en ligne!

Explication

Saisie implicite: [1, 1, 1, -1, -1, -1, -1, 1, 1]

ò¦

Partitionner le tableau d'entrée ( ò) entre différents ¦éléments ( ):
[[1, 1, 1], [-1, -1, -1, -1], [1, 1]]

ì2

Mappez chaque partition sur elle-même analysée comme un tableau de 2chiffres de base ( ì):[7, -15, 3]

x

Obtenez la somme ( x) du tableau résultant:-5

Justin Mariner
la source
Belle technique. Je crois que vous pouvez changer ®ì2Ãxpour xì2sauver deux octets.
ETHproductions du
@ETHproductions Man, vous avez été partout dans mes messages. Merci encore!
Justin Mariner
5

Cubix , 65 octets

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

Essayez-le en ligne!

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

Regardez-le courir

Voici une brève explication:

  • Lisez chaque entier (1 ou -1) et comparez-le au précédent. Si:
    • la même poussée vers le bas que le début d'un compteur
    • sinon amener le compteur en haut et l'incrémenter / décrémenter comme il convient.
  • Une fois la saisie terminée, amenez chaque compteur en haut et la gestion des négatifs fait 2 ^ counter - 1
  • Additionner les résultats et la sortie
MickyT
la source
4

JavaScript (ES6), 38 octets

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

R , 32 octets

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

Essayez-le en ligne!

C'est la même méthode que quelques autres ici.

Avec l’entrée de -1 -1 1 1 -1 -1 -1

  • Faites un encodage de longueur sur l'entrée. Résultats avec longueurs 2, 2, 3et valeurs-1, 1, -1
  • Faites 2 à la puissance des longueurs - 1. Résultats en 3, 3, 7
  • Multiplier par les valeurs RLE donnant -3, 3, -7
  • Rendre la somme -7
MickyT
la source
3

Python 3 , 57 56 octets

-1 octet grâce à @notjagan

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

Essayez-le en ligne!

ovs
la source
-1 octet avec ceci ou cela .
notjagan
Cela s>()m'a pris une seconde. C'est vraiment intelligent.
Morgan Thrapp
2

C ++ 14, 58 octets

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

Prend l'entrée via l' vargument ( std::vector, ou tout conteneur itérable), renvoie à l' sargument (par référence). Chaque élément de vdoit être soit 1ou -1.

Exemples d'utilisation et de cas de test.

vaultah
la source
2

Brachylog , 13 octets

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

Essayez-le en ligne!

Brachylog utilise à la _place de -.

Explication:

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

CJam (13 octets)

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

Suite de tests en ligne . Il s'agit d'un bloc anonyme (fonction) qui prend un tableau d'ints sur la pile et laisse un int sur la pile. Le dernier test montre qu'il gère correctement un tableau vide, donnant 0.

L'approche est un codage de longueur de cycle simple suivi d'un décodage manuel de la longueur de chaque exécution et conversion de base. En utilisant le intégré pour le décodage de longueur, j'obtiens un octet de plus avec {e`1/:e~2fb1b}ou {e`{ae~2b}%1b}.

Peter Taylor
la source
1

05AB1E , 6 octets

γε2β}O

Essayez-le en ligne!

Erik le Outgolfer
la source
Ahhh ... Conversion Base-2 ... et je pensais que j'étais mignon avec l'ascenseur. γε¬sƶÄ<o*}OO
Magic Octopus Urn
1

Haskell, 54 53 octets

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

Essayez-le en ligne!

Une récursivité simple qui double l'accumulateur kou le réinitialise à 1/ -1et ajoute les valeurs de chaque étape.

nimi
la source
0

Mathematica, 60 octets

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

Mathematica, 25 octets

Tr[Fold[#+##&]/@Split@#]&
ngenisis
la source
0

Java, 91 octets

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
la source
0

Pyth, 11 octets

s.b*t^2NYr8

Essayez-le en ligne

Comment ça fonctionne

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