Suma las filas del triángulo concatenado

16

Considera el siguiente triángulo.

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

Como probablemente haya notado, la primera fila es de longitud 1, y cada fila posterior es 1 dígito más larga que la anterior y contiene los dígitos de los enteros positivos concatenados.

Se le dará un número entero N . Su tarea es encontrar la suma de los dígitos que se encuentran en la fila N del triángulo anterior.

Reglas

  • Puede elegir 0 o 1 indexación. Por favor, especifique eso en su respuesta.

  • Se aplican las lagunas predeterminadas .

  • Puede tomar entrada y proporcionar salida por cualquier medio estándar y en cualquier formato razonable.

  • Este es OEIS A066548 , y esta secuencia es el triángulo mismo (excepto que no eliminamos los ceros a la izquierda).

  • Este es el , por lo que gana el código más corto en bytes (en todos los idiomas). Diviértete jugando al golf!

Casos de prueba

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

Tenga en cuenta que los anteriores están indexados a 0. Si está buscando casos de prueba indexados en 1, incremente la entrada en 1.

En una nota bastante no relacionada, recientemente cambié mi foto de perfil y eso me inspiró a escribir este desafío.

Sr. Xcoder
fuente

Respuestas:

8

Casco , 7 bytes

1 indexado

Σ!CNṁdN

Pruébalo en línea!

Explicación

    ṁ     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
fuente
4

Python 2 , 69 bytes

Esto probablemente podría ser bastante más corto.

1 indexado

Editar: -7 bytes gracias a @ Mr.Xcoder

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

Pruébalo en línea!

Halvard Hummel
fuente
1
n**2es n*n.
Sr. Xcoder
69 bytes . Usando la fórmula de Gauss,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Mr. Xcoder
1
@ Mr.Xcoder Creo que sí ...
Erik the Outgolfer
@EriktheOutgolfer Tienes razón, mi mal
Sr. Xcoder
3

05AB1E , 8 bytes

nLS¹L£θO

Pruébalo en línea!

-1 gracias a Emigna .

1-indexación.

Erik el Outgolfer
fuente
Puede eliminar su Ssi lo reemplaza Jcon S.
Emigna
@Emigna duh ....
Erik the Outgolfer
2

Mathematica, 96 bytes

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


Pruébalo en línea! (para trabajar en matemáticas, "Tr" debe ser reemplazado por "Total")

J42161217
fuente
2

Jalea , 11 bytes

²RDFṁRS$ṫCS

Pruébalo en línea!

Utiliza indexación basada en 1.

Explicación

²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
millas
fuente
2

Haskell, 69 64 bytes

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

Pruébalo en línea.

¡Guardado 5 bytes gracias a Laikoni !

Aquí está la versión menos golfizada:

-- 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
fuente
n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xes algunos bytes más cortos.
Laikoni
@Laikoni ¡Gracias! Editado No sé por qué pensé splitOnque ahorraría bytes.
Cristian Lupascu
2

R, 119 109 108 93 88 bytes

empezando a jugar al golf .... 1 indexado

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

gracias @ Zachary. su presunción es correcta :) afeitó 1 byte tnx a @Andrius y 15 tnx más a @ user2390246

@Giuseppe - tnx para el strtoi. nuevo para mi 5 bytes hacia abajo :)

Zahiro Mor
fuente
2
No creo que necesites y=ni a los padres n*(n-1)/2+1, y el nombre del idioma probablemente no lo es [R].
Zacharý
1
puede guardar 1 byte cambiando as.integerconas.double
AndriusZ
1
En lugar de xusarlo, Fya que esto ya está inicializado a 0.
user2390246
1
Además, 1:n+a-1da lo mismo que a:(a+n-1). En ese caso, no necesita definir ade antemano, simplemente puede ponerlo directamente en la forexpresión. Eso también te permitirá cancelar un + 1 / -1.
user2390246
2
79 bytes . Utilizado en substringlugar de substrdesde entonces, esto es solo una suma sobre los índices de la subcadena. Además, siempre es bueno incluir un enlace TIO para sus soluciones :) +1, gran trabajo.
Giuseppe
2

Emojicode , 182 bytes

🐖©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🍉

Define un método llamado © que toma un 🚂 y devuelve un 🚂. 1 indexado.

Pruébalo en línea!

Explicación:

Nota: muchas opciones de emoji no tienen mucho sentido en Emojicode 0.5. Es 0.x, después de todo. 0.6 solucionará esto, así que si quieres aprender esto (porque quién no querría), te recomiendo que esperes un momento.

Emojicode es un lenguaje de programación orientado a objetos que presenta genéricos, protocolos, opcionales y cierres, pero este programa no utiliza cierres, y todos los genéricos y protocolos pueden considerarse implícitos.

El programa funciona solo con unos pocos tipos: 🚂 es el tipo entero y 🔡 es el tipo de cadena. Además, 👌s aparecen en condiciones, que pueden tomar un valor de 👍 (verdadero) o 👎 (falso).

Actualmente no hay operadores en Emojicode, por lo que además, las comparaciones y otras operaciones que normalmente son operadores se implementan como funciones, lo que hace que las expresiones utilicen la notación de prefijo . Los operadores también están previstos en 0.6.

🐖©a🚂➡🚂🍇

© toma una llamada 🚂 ay devuelve una 🚂.

 🍦l➗✖a➕a 1 2

Declare un congelado ("constante") ligual al número triangular a-ésimo (fórmula en notación de prefijo). Esto representa la longitud de la cadena de números que necesitamos generar.

 🍮t🔤🔤

Asigne una cadena vacía a la variable t.

 🍮i 0

Asignar i = 0.

 🔁▶l🐔t🍇

Mientras que el les mayor que la longitud det

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Agregue la representación textual de ien base 10 a t.

 🍉

Bucle final

 🍮s 0

Asignar s = 0

 🔂g🔪t➖l a a🍇

Tome una subcadena que tcomience en l - a( a - 1th número triangular) de longitud a, itere sobre todos los caracteres

  🍮➕s 🍺🚂🔡g 10

Convierta el carácter en cadena, analice el entero en base-10, desenvuelva lo opcional (no se devuelve nada si la cadena no es un número) y agréguelo a la svariable.

 🍉

Bucle final

 🍎s

Devoluciones

🍉

Método final

NieDzejkob
fuente
1

PHP, 66 + 1 bytes

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

Ejecutar como tubería con -nRo probarlo en línea .

requiere PHP 5.4 o posterior para indexar la expresión.

Titus
fuente
1

APL, 28 26 25 bytes

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

Utiliza indexación basada en 1

Pruébalo en línea!

¿Cómo?

  • ⍳⍵×⍵, 1 a través de la entrada al cuadrado
  • ⍕¨, convierte cada elemento en una cadena
  • ∊,/, concatenarlos juntos
  • (+/⍳⍵)↑, tome las filas hasta la entrada
  • ⍵↑⌽, toma la fila deseada
  • ⍎¨, convierte cada elemento en un número
  • +/suma
Zacharý
fuente
1

Clojure v1.8, 154 bytes

1 indexado

(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)))))

Pruébalo en línea!

Explicación

(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
fuente
1

Java 8, 116 98 bytes

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 indexado

-18 bytes gracias a @Nevay

Explicación:

Pruébalo aquí

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
fuente
1
98 Bytes: 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 bytes

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

1 indexado

versión sin golf

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

Pruébalo aquí!

gracias a @Giuseppe por guardar 8 bytes

AndriusZ
fuente
@Giuseppe en la descripción se menciona: "Se le dará un número entero N". y esta N se usa en mi solución. O tal vez no entendí algo.
AndriusZ
Vea el enlace "cualquier medio estándar" en la descripción :)
Giuseppe
@Giuseppe cambió y usó su sugerencia sobrestrtoi
AndriusZ
1
97 bytes , con un mensaje de advertencia. ¡Siempre es bueno incluir un enlace a TIO en tu descripción para que otros puedan probarlo!
Giuseppe
@Giuseppe No sé ninguna R, pero ¿tal vez una función usaría menos bytes?
NieDzejkob
1

Perl 6 , 44 bytes

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

Pruébalo

Expandido:

{
  [+]        # 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
fuente
0

SOGL V0.12 , 15 13 bytes

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

Pruébalo aquí!
1 indexado.

Mientras trabajaba en esto, solucioné un error que hacía que no funcionara en matrices de números y que mincorrectamente tomaba entrada implícita.

Explicación:

²              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
fuente
0

C ++, 180 bytes

-17 bytes gracias a Zacharý

El índice comienza en 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
fuente
Cambiar la última línea a esto debería ahorrar dos bytes: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ý
Además, si actualmente está tomando la entrada como índice 0, puede convertirla en índice 1 y soltar el++n;
Zacharý
@ Zacharý Gracias. Por cierto, su código contiene caracteres Unicode invisibles por algunas razones
HatsuPointerKun
¿Cuál, mi sugerencia de C ++ o mi APL? APL usa su propia página de códigos, y probablemente no se mostrará correctamente si no tiene la fuente correcta.
Zacharý
@ Zacharý La sugerencia de C ++ que escribiste en el comentario. Hay como 2 caracteres unicode antes de un cero, cometiendo errores como "0" identifier is unknownen Visual Studio. Lo mismo para to_stringy size. Puede verlo si copia y pega el código en notepad ++, y convierte la codificación a ANSI, verá algunos ??en el editor
HatsuPointerKun
0

Pyth ,  15 14  13 bytes

s<>sMjkS^Q2sU

Pruébalo aquí!o echa un vistazo a la suite de prueba.

13 bytesAlternativas de :

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

¿Cómo?

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.
Sr. Xcoder
fuente
0

> <>, 141 + 2 bytes

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

1-indexado

+ 2b para la bandera -v

A Tio.run realmente no parece gustarle mis programas> <> recientemente ... Sin embargo, todavía se puede verificar en https://fishlanguage.com . La entrada va en 'pila inicial'.

Editar: Resulta que a tio.run no le gusta porque maneja '[' y ']' de forma diferente a fishlanguage.com. fishlanguage.com invierte la pila al crear o eliminar una nueva pila, pero tio.run no.

Sasha
fuente
0

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

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

Pruébalo en línea!

El resultado es 1 indexado.

¿Cómo?

Concatenar más que suficientes dígitos juntos, luego omita los irrelevantes al principio (la longitud del salto es la suma de enteros de 1 a n-1). Tome los siguientes ndígitos, coloque un +frente a cada uno y luego evalúe esa ecuación.

Xcali
fuente
0

JavaScript (ES6), 78 65 bytes

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 indexado. Editar: Guardado 13 bytes gracias a @tsh.

Neil
fuente
n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh
@tsh Todavía golfista para poner el join`+` final ...
Neil