Additionner les rangées du triangle concaténé

16

Considérez le triangle suivant.

1
23
456
7891
01112
131415
1617181
92021222
324252627
2829303132
33343536373
839404142434
4454647484950
51525354555657
585960616263646
5666768697071727
37475767778798081

Comme vous l'avez probablement remarqué, la première ligne est de longueur 1, et chaque ligne par la suite est 1 chiffre plus longue que la précédente et qu'elle contient les chiffres des entiers positifs concaténés.

Vous recevrez un entier N . Votre tâche consiste à trouver la somme des chiffres qui se trouvent sur la N ème ligne du triangle ci-dessus.

Règles

  • Vous pouvez choisir l'indexation 0 ou 1. Veuillez préciser cela dans votre réponse.

  • Les échappatoires par défaut s'appliquent.

  • Vous pouvez prendre des entrées et fournir des sorties par tout moyen standard et dans tout format raisonnable.

  • Il s'agit d' OEIS A066548 , et cette séquence est le triangle lui-même (sauf que nous ne supprimons pas les zéros en tête).

  • Il s'agit de , donc le code le plus court en octets (dans toutes les langues) l'emporte. Amusez-vous au golf!

Cas de test

Input  |  Output

0  |  1
1  |  5
2  |  15
3  |  25
4  |  5
5  |  15
6  |  25
7  |  20
8  |  33
9  |  33
10 |  43
11 |  46
12 |  64

Notez que ce qui précède est indexé 0. Si vous recherchez des cas de test indexés 1, incrémentez l'entrée de 1.

Sur une note assez indépendante, j'ai récemment changé ma photo de profil et cela m'a inspiré pour écrire ce défi.

M. Xcoder
la source

Réponses:

8

Husk , 7 octets

1 indexé

Σ!CNṁdN

Essayez-le en ligne!

Explication

    ṁ     Map then concatenate
     d    Integer digits
      N   Over the natural numbers
  CN      Cut into lists of lengths corresponding to the natural numbers
 !        Index it
Σ         Sum
H.PWiz
la source
4

Python 2 , 69 octets

Cela pourrait probablement être un peu plus court.

1 indexé

Edit: -7 octets grâce à @ Mr.Xcoder

lambda n:sum(map(int,"".join(map(str,range(1,n*n+1)))[~-n*n/2:][:n]))

Essayez-le en ligne!

Halvard Hummel
la source
1
n**2est n*n.
M. Xcoder, le
69 octets . En utilisant la formule de Gauss,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
M. Xcoder
1
@ Mr.Xcoder Je pense qu'il le fait ...
Erik the Outgolfer
@EriktheOutgolfer Vous avez raison, ma mauvaise
M. Xcoder
3

05AB1E , 8 octets

nLS¹L£θO

Essayez-le en ligne!

-1 merci à Emigna .

1-indexation.

Erik le Outgolfer
la source
Vous pouvez supprimer votre Ssi vous le remplacez Jpar S.
Emigna
@Emigna duh ....
Erik the Outgolfer
2

Mathematica, 96 octets

(d=Flatten[IntegerDigits/@Range[#^2]];Last@Table[Tr@Take[d,{i(i+1)/2+1,(i+1)(i+2)/2}],{i,0,#}])&  


Essayez-le en ligne! (pour travailler en mathématiques, "Tr" doit être remplacé par "Total")

J42161217
la source
2

Gelée , 11 octets

²RDFṁRS$ṫCS

Essayez-le en ligne!

Utilise l'indexation basée sur 1.

Explication

²RDFṁRS$ṫCS  Input: n
²            Square
 R           Range, [1, n^2]
  D          Decimal digits
   F         Flatten
    ṁ        Reshape to
       $     Monadic chain
     R         Range, [1, n]
      S        Sum
        ṫ    Tail
         C   Complement, 1-n
          S  Sum
miles
la source
2

Haskell, 69 64 octets

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n x
f=(1%(show=<<[1..])!!)

Essayez-le en ligne.

5 octets enregistrés grâce à Laikoni !

Voici la version la moins golfée:

-- continuous stream of digits representing
-- the concatenation of positive integers in
-- order: 1234567891011...
digitstream = show=<<[1..]

-- sequence that yields the rows of the triangle
triangle n xs |(a,b)<-splitAt n xs=a:triangle(n+1)b

digitSum xs = sum[read[d]|d<-xs]

-- sequence that sums up the digits in each row
rowSumSequence = map digitSum (triangle 1 digitstream)

-- the final function that just shows the value 
-- at a given index
g=(rowSumSequence!!)
Cristian Lupascu
la source
n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xest quelques octets plus court.
Laikoni
@Laikoni Merci! Édité. Je ne sais pas pourquoi je pensais que splitOncela économiserait des octets.
Cristian Lupascu
2

R, 119 109 108 108 93 88 octets

commencer à jouer au golf .... 1 index

function(n){for(i in 1:n+n*(n-1)/2){F=F+strtoi(substr(paste(1:n^2,collapse=""),i,i))};F}

merci @Zachary. votre présomption est correcte :) rasé 1 octet tnx à @Andrius et 15 autres tnx à @ user2390246

@Giuseppe - tnx pour le strtoi. nouveau pour moi. 5 octets vers le bas :)

Zahiro Mor
la source
2
Je ne pense pas que vous ayez besoin du y=ni des parens n*(n-1)/2+1, et le nom de la langue ne l'est probablement pas [R].
Zacharý
1
vous pouvez économiser 1 octet en changeant as.integeravecas.double
AndriusZ
1
Plutôt que d' xutiliser, Fcar cela est déjà initialisé à 0.
user2390246
1
En outre, 1:n+a-1donne le même que a:(a+n-1). Dans ce cas, vous n'avez pas besoin de définir aà l'avance, vous pouvez simplement le mettre directement dans l' forexpression. Cela vous permettra également d'annuler un + 1 / -1.
user2390246
2
79 octets . Utilisé à la substringplace de substrcar en réalité c'est juste une somme sur les indices de la sous-chaîne. De plus, il est toujours bon d'inclure un lien TIO pour vos solutions :) +1, excellent travail.
Giuseppe
2

Emojicode , 182 octets

🐖©a🚂➡🚂🍇🍦l➗✖a➕a 1 2🍮t🔤🔤🍮i 0🔁▶l🐔t🍇🍮➕i 1🍮t🍪t🔡i 10🍪🍉🍮s 0🔂g🔪t➖l a a🍇🍮➕s 🍺🚂🔡g 10🍉🍎s🍉

Définit une méthode appelée © qui prend un 🚂 et retourne un 🚂. 1 indexé.

Essayez-le en ligne!

Explication:

Remarque: beaucoup de choix d'emoji n'a pas beaucoup de sens dans Emojicode 0.5. C'est 0.x, après tout. 0.6 corrigera cela, donc si vous voulez apprendre cela (car qui ne voudrait pas), je vous recommande d'attendre un moment.

Emojicode est un langage de programmation orienté objet comprenant des génériques, des protocoles, des options et des fermetures, mais ce programme n'utilise aucune fermeture, et tous les génériques et protocoles peuvent être considérés comme implicites.

Le programme ne fonctionne que sur quelques types: 🚂 est le type entier et 🔡 est le type chaîne. De plus, les 👌 apparaissent dans les conditions, qui peuvent prendre une valeur de 👍 (vrai) ou 👎 (faux).

Il n'y a actuellement aucun opérateur dans Emojicode, donc l'addition, les comparaisons et d'autres opérations qui sont normalement des opérateurs sont implémentées en tant que fonctions, ce qui fait que les expressions utilisent la notation de préfixe . Des opérateurs sont également prévus en 0.6.

🐖©a🚂➡🚂🍇

© prend un 🚂 appelé aet renvoie un 🚂.

 🍦l➗✖a➕a 1 2

Déclarez un gelé ("constant") légal au nombre triangulaire (formule en notation de préfixe). Cela représente la longueur de la chaîne de nombres que nous devons générer.

 🍮t🔤🔤

Attribuez une chaîne vide à la variable t.

 🍮i 0

Attribuer i = 0.

 🔁▶l🐔t🍇

Bien que le lsoit supérieur à la longueur det

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Ajoutez la représentation textuelle de la ibase 10 à t.

 🍉

Boucle de fin

 🍮s 0

Attribuer s = 0

 🔂g🔪t➖l a a🍇

Prenez une sous-chaîne de tdépart à l - a( a - 1e nombre triangulaire) de longueur a, parcourez tous les caractères

  🍮➕s 🍺🚂🔡g 10

Convertissez le caractère en chaîne, analysez l'entier en base-10, déballez l'option (rien est renvoyé si la chaîne n'est pas un nombre) et ajoutez à la svariable.

 🍉

Boucle de fin

 🍎s

Retour

🍉

Méthode de fin.

NieDzejkob
la source
1

PHP, 66 + 1 octets

for($p=($n=$argn)*-~$n/2;$n--;)$r+=join(range(1,$p))[--$p];echo$r;

Exécutez en tant que pipe avec -nRou essayez-le en ligne .

nécessite PHP 5.4 ou une version ultérieure pour l'indexation de l'expression.

Titus
la source
1

APL, 28 26 25 octets

{+/⍎¨⍵↑⌽(+/⍳⍵)↑∊,/⍕¨⍳⍵×⍵}

Utilise l'indexation basée sur 1

Essayez-le en ligne!

Comment?

  • ⍳⍵×⍵, 1 par l'entrée au carré
  • ⍕¨, transformez chaque élément en chaîne
  • ∊,/, les concaténer ensemble
  • (+/⍳⍵)↑, saisissez les lignes jusqu'à l'entrée
  • ⍵↑⌽, prenez la ligne souhaitée
  • ⍎¨, transformez chaque élément en nombre
  • +/, somme
Zacharý
la source
1

Clojure v1.8, 154 octets

1 indexé

(fn[n](loop[i 1 s(clojure.string/join""(take(* n n)(iterate inc 1)))](if(= i n)(apply +(map #(Character/digit % 10)(take n s)))(recur(inc i)(subs s i)))))

Essayez-le en ligne!

Explication

(take(* n n)(iterate inc 1))  Take the first N*N numbers
(clojure.string/join""...)    Combine them into a string
(loop[i 1 ...](if(= i n)...)  Loop N times
(apply +(map #(Character/digit % 10)(take n s)))  Take N characters from the string, convert to integers and add them
(recur(inc i)(subs s i))      Increment iterator, remove i characters from string
Chris
la source
1

Java 8, 116 98 octets

n->{String t="";int r=0,i=0;for(;i++<n*n;t+=i);for(i=0;i<n;r+=t.charAt(i+++~-n*n/2)-48);return r;}

1 indexé

-18 octets grâce à @Nevay

Explication:

Essayez-le ici.

n->{                             // Method with integer as both parameter and return-type
  String t="";                   //  Triangle-String
  int r=0,                       //  Result-integer
      i=0;                       //  Index-integer
  for(;i++<n*n;                  //  Loop (1) from 0 to `n^2` (exclusive)
    t+=i                         //   And append String `t` with all the numbers
  );                             //  End of loop (1)
  for(i=0;i<n;                   //  Loop (2) from 0 to `n` (exclusive)
    r+=t.charAt(i+++~-n*n/2)-48  //   And raise the sum `r` by the digits
  );                             //  End of loop (2)
  return r;                      //  Return the resulting sum of digits
}                                // End of method
Kevin Cruijssen
la source
1
98 octets: n->{String r="";int i=0,x=0;for(;x++<n*n;r+=x);for(x=0;x<n;)i+=r.charAt(x+++~-n*n/2)-48;return i;}.
Nevay
1

R, 99 , 105 , 97 octets

a=diag(N<-scan());a[upper.tri(a,T)]=strtoi(strsplit(paste(1:N^2,collapse=""),"")[[1]]);sum(a[,N])

1 indexé

version non golfée

a <- diag(N<-scan())
a[upper.tri(a, diag=TRUE)] <- strtoi(strsplit(paste(1:N^2, 
                                                  collapse=""),
                                            "")[[1]])
sum(a[,N])

Essayez-le ici!

merci à @Giuseppe pour avoir économisé 8 octets

AndriusZ
la source
@Giuseppe dans la description est mentionné: "Vous recevrez un entier N." et ce N est utilisé dans ma solution. Ou peut-être que j'ai mal compris quelque chose.
AndriusZ
Voir le lien "toute moyenne standard" dans la description :)
Giuseppe
@Giuseppe change et utilise ta suggestion concernantstrtoi
AndriusZ
1
97 octets , avec un message d'avertissement. Il est toujours bon d'inclure un lien vers TIO dans votre description afin que d'autres puissent le tester!
Giuseppe
@Giuseppe Je ne connais pas de R, mais peut-être qu'une fonction utiliserait moins d'octets?
NieDzejkob
1

Perl 6 , 44 octets

{[+] (1..*).flatmap(*.comb).rotor(1..*)[$_]}

Essaye-le

Étendu:

{
  [+]        # reduce the result of the following using &infix«+»

  ( 1 .. * ) # infinite range starting at 1

  .flatmap(  # map, then flatten
    *.comb   # split into digits (100 ⇒ 1,0,0)
  )

  .rotor(    # break the sequence into pieces
    1 .. *   # start with 1 value, then 2 values, then 3, etc.
  )\

  [$_]       # index into that infinite sequence
}
Brad Gilbert b2gills
la source
0

SOGL V0.12 , 15 13 octets

²Δr∑.δ∑⌡kmčr∑

Essayez-le ici!
1 indexé.

En travaillant là-dessus, j'ai corrigé un bogue qui empêchait les tableaux de chiffres de fonctionner et qui mprenait incorrectement des entrées implicites.

Explication:

²              square the input
 Δ             get a range from 1 to that
  r∑           join as a string
    .δ         create a range 0 - input-1
      ∑        sum that
       ⌡       that many times do
        k        remove the 1st character of the joined string
         m     mold to the length of the input
          č    chop into characters
           r∑  convert to numbers and sum
dzaima
la source
0

C ++, 180 octets

-17 octets grâce à Zacharý

L'index commence à 1

#include<string>
int s(int n){std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p).substr(p-n);i=0;for(auto&a:t)i+=a-48;return i;}
HatsuPointerKun
la source
Changer la dernière ligne en ceci devrait économiser deux octets:int s(int n){++n;std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p);t=t.substr(t.size()-n);i=0;for(auto&a:t)i+=a-48;return i;}
Zacharý
De plus, si vous prenez actuellement une entrée en tant ++n;
qu'index
@ Zacharý Merci. Btw, votre code contient un caractère Unicode invisible pour certaines raisons
HatsuPointerKun
Laquelle, ma suggestion C ++ ou mon APL? APL utilise sa propre page de code et ne s'affichera probablement pas correctement si vous ne disposez pas de la bonne police.
Zacharý
@ Zacharý La suggestion C ++ que vous avez écrite dans le commentaire. Il y a comme 2 caractères Unicode avant un zéro, ce qui fait des erreurs comme "0" identifier is unknowndans Visual Studio. Même chose pour to_stringet size. Vous pouvez le voir si vous copiez-collez le code dans notepad ++ et convertissez l'encodage en ANSI, vous en verrez ??dans l'éditeur
HatsuPointerKun
0

Pyth ,  15 14  13 octets

s<>sMjkS^Q2sU

Essayez-le ici! ou Découvrez la suite de tests.

Alternatives à 13 octets :

ssM<>jkS^Q2sU
ssM<>jkS*QQsU
s<>sMjkS^Q2sU

Comment?

s<>sMjkS^Q2sU    Full program. Q means input.

       S^Q2      The range [1, Q^2].
     jk          Join as a String.
   sM            Convert each character to integer.
  >              All the elements of the above, but the first Q*(Q-1)/2.
 <               All the element of the above but the last Q.
s                Sum.
                 Output implicitly.
M. Xcoder
la source
0

> <>, 141 + 2 octets

::1+* 2,01\
@}})?/:0$\>$:@{{:
:%a:/?(1:< ,a-]{+1[4
  /~/     \+1~\
1:<]{+1[+4@:-1\?(
{1-}>{:}1(?\@1-@+
    \0}~{{\\n;
@:{{:<-1~$\!?)}}
     ~

1-indexé

+ 2b pour le drapeau -v

Tio.run ne semble vraiment pas aimer mes programmes <<> récemment ... Il peut cependant être vérifié sur https://fishlanguage.com . L'entrée va dans la «pile initiale».

Edit: Il s'avère que tio.run ne l'aime pas car il gère '[' et ']' différemment de fishlanguage.com. fishlanguage.com inverse la pile lors de la création ou de la suppression d'une nouvelle pile, mais pas tio.run.

Sasha
la source
0

Perl 5 , 62 + 1 (-p) = 63 octets

$_=eval(substr((join'',1..$_*$_),($_**2-$_)/2,$_)=~s/./+$&/gr)

Essayez-le en ligne!

Le résultat est 1 indexé.

Comment?

Concaténez plus de suffisamment de chiffres ensemble, puis sautez ceux qui ne sont pas pertinents au début (la longueur du saut est la somme des entiers de 1 à n-1). Prenez les nchiffres suivants , placez un +devant chacun, puis évaluez cette équation.

Xcali
la source
0

JavaScript (ES6), 78 65 octets

f=
n=>eval([...(g=n=>n?g(n-1)+n:``)(n*n).substr(n*~-n/2,n)].join`+`)
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

1 indexé. Edit: 13 octets enregistrés grâce à @tsh.

Neil
la source
n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh
@tsh Toujours golfeur pour mettre la join`+` fin ...
Neil