Soma as linhas do triângulo concatenado

16

Considere o seguinte triângulo.

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

Como você provavelmente notou, a primeira linha tem o comprimento 1, e cada linha a seguir é 1 dígito a mais que a anterior e contém os dígitos dos números inteiros positivos concatenados.

Vai ser dado um número inteiro N . Sua tarefa é encontrar a soma dos dígitos que se encontram em N ª linha do triângulo acima.

Regras

  • Você pode escolher 0 ou 1 indexação. Especifique isso na sua resposta.

  • Aplicam-se lacunas padrão .

  • Você pode receber e fornecer saída por qualquer média padrão e em qualquer formato razoável.

  • Este é o OEIS A066548 e essa sequência é o próprio triângulo (exceto que não removemos zeros à esquerda).

  • Isso é , então o código mais curto em bytes (em todos os idiomas) vence. Divirta-se jogando golfe!

Casos de teste

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

Observe que os itens acima são indexados em 0. Se você estiver procurando por casos de teste indexados em 1, aumente a entrada em 1.

Em uma nota não relacionada, mudei recentemente minha foto de perfil e isso me inspirou a escrever esse desafio.

Mr. Xcoder
fonte

Respostas:

8

Casca , 7 bytes

Indexado 1

Σ!CNṁdN

Experimente online!

Explicação

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

Python 2 , 69 bytes

Provavelmente isso poderia ser um pouco mais curto.

Indexado 1

Edit: -7 bytes graças a @ Mr.Xcoder

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

Experimente online!

Halvard Hummel
fonte
1
n**2é n*n.
Mr. Xcoder
69 bytes . Usando a fórmula de Gauss,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Sr. Xcoder
1
@ Mr.Xcoder Eu acho que ele faz ...
Erik o Outgolfer
@EriktheOutgolfer Você está certo, meu mau
Mr. Xcoder
3

05AB1E , 8 bytes

nLS¹L£θO

Experimente online!

-1 graças a Emigna .

Indexação 1.

Erik, o Outgolfer
fonte
Você pode remover o seu Sse substituir Jpor 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,#}])&  


Experimente online! (para trabalhar em matemática, "Tr" deve ser substituído por "Total")

J42161217
fonte
2

Gelatina , 11 bytes

²RDFṁRS$ṫCS

Experimente online!

Usa indexação baseada em 1.

Explicação

²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
milhas
fonte
2

Haskell, 69 64 bytes

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

Experimente online.

Guardado 5 bytes graças a Laikoni !

Aqui está a versão menos golfe:

-- 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
fonte
n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xé alguns bytes mais curto.
Laikoni
@Laikoni Thanks! Editado. Não sei por que pensei que splitOnisso salvaria bytes.
Cristian Lupascu
2

R, 119 109 108 93 88 bytes

começando a jogar golfe .... 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}

obrigado @Zachary. sua presunção está correta :) raspou 1 byte tnx para @Andrius e 15 mais tnx para @ user2390246

@Giuseppe - tnx para o strtoi. novo para mim. 5 bytes abaixo :)

Zahiro Mor
fonte
2
Não acho que você precise y=nem parens n*(n-1)/2+1, e o nome da língua provavelmente não é [R].
Zacharý
1
você pode economizar 1 byte alterando as.integercomas.double
AndriusZ 4/17
1
Em vez de x, uso F, pois isso já é inicializado para 0.
user2390246
1
Além disso, 1:n+a-1dá o mesmo que a:(a+n-1). Nesse caso, você não precisa definir acom antecedência, basta colocá-lo diretamente na forexpressão. Isso também permitirá que você cancele um + 1 / -1.
user2390246
2
79 bytes . Utilizado em substringvez de, substrna verdade, isso é apenas uma soma sobre os índices da substring. Além disso, é sempre bom incluir um link TIO para suas soluções :) +1, ótimo trabalho.
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 um método chamado © que leva a returns e retorna a 🚂. 1 indexado.

Experimente online!

Explicação:

Nota: muitas opções de emoji não fazem muito sentido no Emojicode 0.5. É 0.x, afinal. O 0.6 corrigirá isso. Portanto, se você quiser aprender isso (porque quem não gostaria), recomendo aguardar um momento.

O Emojicode é uma linguagem de programação orientada a objetos com genéricos, protocolos, opcionais e fechamentos, mas este programa não usa fechamentos, e todos os genéricos e protocolos podem ser considerados implícitos.

O programa opera em apenas alguns tipos: 🚂 é o tipo inteiro e 🔡 é o tipo de sequência. Além disso, appears aparecem em condições, que podem assumir um valor de 👍 (verdadeiro) ou 👎 (falso).

Atualmente, não há operadores no Emojicode, portanto, adição, comparsões e outras operações que normalmente são operadores são implementadas como funções, fazendo com que as expressões usem a notação de prefixo . Os operadores também estão planejados em 0,6.

🐖©a🚂➡🚂🍇

© pega um 🚂 chamado ae retorna um 🚂.

 🍦l➗✖a➕a 1 2

Declare um congelado ("constante") ligual ao a-ésimo número triangular (fórmula na notação de prefixo). Isso representa o comprimento da sequência de números que precisamos gerar.

 🍮t🔤🔤

Atribua uma sequência vazia à variável t .

 🍮i 0

Atribuir i = 0 .

 🔁▶l🐔t🍇

Enquanto o lfor maior que o comprimento det

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Anexar a representação textual de i base 10 em t.

 🍉

Laço final

 🍮s 0

Atribuir s = 0

 🔂g🔪t➖l a a🍇

Pegue uma substring tcomeçando em l - a(a - 1 th número triangular) de comprimento a, itere sobre todos os caracteres

  🍮➕s 🍺🚂🔡g 10

Converta o caractere em sequência, analise o número inteiro na base 10, desembrulhe o opcional (nada será retornado se a sequência não for um número) e adicione à svariável.

 🍉

Laço final

 🍎s

Return s

🍉

Método final.

NieDzejkob
fonte
1

PHP, 66 + 1 bytes

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

Execute como pipe -nRou experimente on-line .

requer PHP 5.4 ou posterior para indexar a expressão.

Titus
fonte
1

Pitão, 24 bytes

u+GsH<>jkS+*QQ2/*QhQ2hQ0

Experimente aqui: http://pyth.herokuapp.com/

Karan Elangovan
fonte
1

APL, 28 26 25 bytes

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

Usa indexação baseada em 1

Experimente online!

Quão?

  • ⍳⍵×⍵, 1 através da entrada ao quadrado
  • ⍕¨, transforme cada elemento em uma sequência
  • ∊,/, concatená-los juntos
  • (+/⍳⍵)↑, pegue as linhas até a entrada
  • ⍵↑⌽, pegue a linha desejada
  • ⍎¨, transforme cada elemento em um número
  • +/soma
Zacharý
fonte
1

Clojure v1.8, 154 bytes

Indexado 1

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

Experimente online!

Explicação

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

Indexado 1

-18 bytes graças a @Nevay

Explicação:

Experimente aqui.

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
fonte
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])

Indexado 1

versão ungolfed

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

Experimente aqui!

graças a @ Giuseppe por salvar 8 bytes

AndriusZ
fonte
@Giuseppe na descrição é mencionado: "Você receberá um número inteiro N." e esse N é usado na minha solução. Ou talvez eu tenha entendido algo errado.
AndriusZ
Veja o ligado "qualquer meio padrão" na descrição :)
Giuseppe
Mudança @Giuseppe e usou a sua sugestão sobrestrtoi
AndriusZ
1
97 bytes , com uma mensagem de aviso. É sempre bom incluir um link para o TIO em sua descrição para que outros possam testá-lo!
Giuseppe
@ Giuseppe Eu não conheço nenhum R, mas talvez uma função usaria menos bytes?
NieDzejkob 04/09
1

Perl 6 , 44 bytes

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

Teste-o

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
fonte
0

Gelatina , 16 bytes

Ṭ€Ẏ0;œṗ²D€Ẏ$$⁸ịS

Experimente online!

1 indexado.

Erik, o Outgolfer
fonte
0

SOGL V0.12 , 15 13 bytes

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

Experimente aqui!
1 indexado.

Enquanto trabalhava nisso, corrigi um bug que não funcionava em matrizes numéricas e que mincorretamente recebia entradas implícitas.

Explicação:

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

C ++, 180 bytes

-17 bytes graças a Zacharý

Índice começa em 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
fonte
Alterar a última linha para isso deve salvar dois 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ý
Além disso, se você está tomando atualmente entrada como 0-indexada, você pode convertê-lo em um índice e soltar o++n;
Zachary
@ Zacharý Obrigado. Btw, o código contém caracteres Unicode invisíveis por algumas razões
HatsuPointerKun
Qual deles, minha sugestão de C ++ ou meu APL? O APL usa sua própria página de códigos e provavelmente não aparecerá corretamente se você não tiver a fonte correta.
Zacharý
@ Zacharý A sugestão de C ++ que você escreveu no comentário. Existem dois caracteres unicode antes de zero, cometendo erros como "0" identifier is unknownno visual studio. A mesma coisa para to_stringe size. Você pode vê-lo se você copiar e colar o código no bloco de notas ++, e codificação convertido para ANSI, você vai ver alguns ??no editor
HatsuPointerKun
0

Pitão ,  15 14  13 bytes

s<>sMjkS^Q2sU

Experimente aqui! ou Confira a suíte de testes.

Alternativas de 13 bytes :

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

Quão?

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.
Mr. Xcoder
fonte
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 sinalizador -v

O Tio.run realmente não parece gostar dos meus programas <> recentemente ... Ainda pode ser verificado em https://fishlanguage.com . A entrada entra na 'pilha inicial'.

Edit: Acontece que tio.run não gosta, porque lida com '[' e ']' de maneira diferente para fishlanguage.com. O fishlanguage.com inverte a pilha ao criar ou remover uma nova pilha, mas o tio.run não.

Sasha
fonte
0

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

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

Experimente online!

O resultado é 1 indexado.

Quão?

Concatene mais que o suficiente dígitos juntos e pule os irrelevantes no início (a duração do salto é a soma dos números inteiros de 1 a n-1). Pegue os próximos ndígitos, coloque um +na frente de cada um e avalie essa equação.

Xcali
fonte
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: salvou 13 bytes graças a @tsh.

Neil
fonte
n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh
@tsh Ainda golfista para colocar join`+` no final ...
Neil