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.

Réponses:



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

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


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

4

JavaScript (ES6), 38 octets

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

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



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.


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




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



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.


0

Mathematica, 60 octets

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.