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 .

M. Xcoder
la source
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

Arnauld
la source
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.

Uriel
la source
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)
Erik le Outgolfer
la source
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.

H.PWiz
la source
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.

Lynn
la source
3

Mathematica, 71 octets

Tr@Differences[TakeList[Join@@IntegerDigits[Range[#^2]],Range@#][[#]]]&

Essayez-le en ligne!

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

Neil
la source
1

Python 2 , 104 octets

def f(N):A=map(int,"".join(map(str,range(1,N*N)))[~-N*N/2:][:N]);return sum(a-b for a,b in zip(A[1:],A))

Essayez-le en ligne!

Jonathan Frech
la source
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
}
Brad Gilbert b2gills
la source
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

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

Pyth , 29 27 octets

Enregistré 2 octets grâce à @ Mr.Xcoder.

s.+msdc:sm+hd""U*QQKsUQ+QK1

Essayez-le en ligne!

Ian H.
la source
1
27 octets à peu près sûr qu'il peut être joué plus loin ...
M. Xcoder
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.

dylnan
la source
+²HRDFṫЀ³ḶḣЀRS€‘¤ṪðḣIStentative originale (réussie mais longue)
dylnan