Numéros alternés


12

Considérez le tableau d'entiers positifs:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ...

Ensuite, concaténez-les:

1234567891011121314151617181920212223242526...

Et puis les diviser en morceaux de longueur variable, chaque longueur étant égale au N ème entier positif:

[1][23][456][7891][01112][131415][1617181][92021222][324252627][2829303132] ...
---------------------------------------------------------------------------
 1  2    3     4     5       6       7        8          9          10      ...

Tâche

Étant donné un entier N (positif pour l'indexation 1 ou non négatif pour l'indexation 0), votre tâche consiste à générer la somme des deltas des chiffres dans le N ème bloc (les différences entre les chiffres consécutifs).

Exemples et cas de test

Cas de test indexés 1. Si vous voulez des index 0, décrémentez simplement N.

N, Chunk, Deltas, Sum

1  -> 1          -> []                               -> 0
2  -> 23         -> [1]                              -> 1
3  -> 456        -> [1, 1]                           -> 2
4  -> 7891       -> [1, 1, -8]                       -> -6
5  -> 01112      -> [1, 0, 0,1]                      -> 2
6  -> 131415     -> [2, -2, 3, -3, 4]                -> 4
7  -> 1617181    -> [5, -5, 6, -6, 7, -7]            -> 0
8  -> 92021222   -> [-7, -2, 2, -1, 1, 0, 0]         -> -7
9  -> 324252627  -> [-1, 2, -2, 3, -3, 4, -4, 5]     -> 4
10 -> 2829303132 -> [6, -6, 7, -6, -3, 3, -2, 2, -1] -> 0

Puzzle 2 sur CodeGolf-Hackathon (je suis l'auteur original là aussi, donc je suis autorisé à republier). Connexes, Inspiration . Connexes .



1
La somme de toutes les différences entre les chiffres consécutifs n'est que la différence entre le dernier et le premier.
KSmarts

Réponses:


5

JavaScript (ES6), 54 53 51 50 octets

1 octet enregistré grâce à @tsh

0 indexé.

k=>-(n=1,g=s=>s[x=k*-~k/2]-s[x+k]-n||g(s+n++))``-n

Cas de test


Zéro indexé:k=>-(n=1,g=s=>s[x=k*-~k/2]-s[x+k]-n||g(s+n++))""-n
tsh

4

APL (Dyalog) , 32 octets

{+/2-⍨/⍎¨⍵↑(+/⍳⍵-1)↓' '~⍨⍕⍳+/⍳⍵}

Essayez-le en ligne!

Comment?

+/⍳⍵- somme de 1àn

- faire de la gamme de cela

' '~⍨⍕ - en chaîne, sans espaces

(+/⍳⍵-1)↓- supprimer d'abord (somme des 1to n-1) caractères

⍵↑- garder les prochains ncaractères

⍎¨ - transformer chaque caractère en entier

2-⍨/ - liste des différences (soustraction en arrière pour tous les 2 éléments)

+/ - résumer.


4

Coque , 9 octets

ΣẊ-!SCṁdN

Essayez-le en ligne!

Ma solution au Hackathon.

Explication:

ΣẊ-!SCṁdN⁰
    S      (x -> y -> z):f -> (x -> y):g -> x:x :: return f(x, g(x))
     C      f= [num]:x -> [x]:y -> [x] :: cut y in pieces where each piece has its respective length in x
      ṁ     g= (x -> [y]):f -> ([x]:x -> [y]) :: maps f over x then concatenate
       d     f= num:x -> [num] :: return decimal digits of x
        N   x= sequence of natural numbers [1..]
   !     ⁰ [x]:x -> num:y -> x :: get yth (impl. input) element of x (above result)
 Ẋ         (x -> x -> y):f -> [x]:x -> [y] :: map f over overlapping pairs of x (above result)
  -         f= num:x -> num:y -> num :: return y - x
Σ          [num]:x -> num :: return sum of x (above result)

4

Haskell , 61 60 octets

l=fromEnum<$>(show=<<[1..])
f n|t<-sum[2..n]=l!!t-l!!(t-n+1)

Essayez-le en ligne!

Explication:

La somme des deltas d'une liste est la même que la différence entre le dernier et le premier élément.

Le dernier élément (zéro indexé) est t, triangle(n)-1 = sum[2..n]. Le premier élément est donc t-n+1, car la liste a des néléments.


4

Python 2 , 80 octets

n=input()
s=map(int,''.join(map(str,range(2**n))))
print s[n*-~n/2]-s[~-n*n/2+1]

Essayez-le en ligne!

2**nest beaucoup trop exagéré, bien sûr, mais c'est un octet plus court que quelque chose comme ça n*n+1.



3

JavaScript (ES6), 60 57 53 octets

f=(n,s=i='',m=n*-~n/2)=>s[m]?s[m]-s[m-n+1]:f(n,s+i++)
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

1 indexé. Version précédente non récurrente de 60 octets:

f=
(n,s=[...Array(n*n+1).keys()].join``)=>s[m=n*-~n/2]-s[m-n+1]
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>





1

Perl 6 ,  58  55 octets

{[+] ($_=(1..*).map(|*.comb).rotor(1..*)[$^a])[1..*]Z-@$_}

Essaye-le

{[+] ($_=(1..*).map(|*.comb)[^$^a+[+] ^$a])[1..*]Z-@$_}

Essaye-le

Étendu:

{ # bare block lambda with placeholder parameter 「$a」
  [+]  # reduce using &infix:«+» the following


    (
      $_ =                # store into 「$_」 for later use

        ( 1 .. * )        # Range of all positive integers
        .map( | *.comb )\ # split into digits and flatten into single list

        [                 # index into the sequence (1 based)

          ^$^a            # Range up to (and excluding) the input
                          # 「0 ..^ $a」 or 「0 .. $a-1」

          +               # shift it up by
          [+] ^$a         # the sum of the values up to (and excluding) the input

        ]

    )[ 1 .. *]            # skip the first value

    Z-                    # zip using &infix:«-»

    @$_                   # 「$_」 used as a List
}

1

PHP , 163 147 octets

$v=$argv[1];for($i=1;$i<=$v*$v;$i++){$s.=$i;$j+=$i<$v?$i:0;}$s=array_slice(str_split($s),$j,$v);for($i=0;$i<$v-1;$i++){$k+=$s[$i+1]-$s[$i];}echo$k;

Essayez-le en ligne!

Ma première tentative de golf à code ... j'ai le sentiment que cela peut être plus court

Edit: économisé 16 octets en supprimant plusieurs instanciations


Bienvenue sur le site! Vous pouvez consulter ces conseils pour jouer au golf en PHP
caird coinheringaahing



0

Gelée , 14 octets

²RDFṫ³ḶS‘¤ðḣIS

Essayez-le en ligne!

Explication

²RDFṫ³ḶS‘¤ðḣIS    Main Link
²                  Square input
 R                 Range: [1,2,3,..,n^2]
  D                Digits: [1,2,...,[1,0],[1,1],...]
   F               Flatten list
     ³ḶS‘¤         n(n-1)/2+1
    ṫ              Remove the first n(n-1)/2+1 elements from the list of digits
          ðḣ       Take the first n digits of the list. ð is needed to prevent I from acting on n.
            I      Increment. Take the diferences
             S     Sum

J'ai d'abord commencé par prendre la plage (n (n + 1) / 2) mais comme vous pouvez avoir des chiffres supplémentaires à la fin de la liste avant de la découper, je l'ai changé en plage (n ^ 2). Vous avez quand même des chiffres supplémentaires après 1-9.


+²HRDFṫЀ³ḶḣЀRS€‘¤ṪðḣIStentative originale (réussie mais longue)
dylnan
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.