Jumlahkan deretan segitiga bersambung

16

Perhatikan segitiga berikut ini.

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

Seperti yang mungkin Anda perhatikan, baris pertama memiliki panjang 1, dan setiap baris sesudahnya adalah 1 digit lebih panjang daripada yang sebelumnya dan baris itu berisi digit bilangan bulat positif yang digabungkan.

Anda akan diberikan integer N . Tugas Anda adalah menemukan jumlah digit yang terletak pada baris ke- N dari segitiga di atas.

Aturan

  • Anda dapat memilih pengindeksan 0 atau 1. Silakan tentukan itu di jawaban Anda.

  • Berlaku celah default .

  • Anda dapat mengambil input dan memberikan output dengan cara standar apa pun , dan dalam format apa pun yang masuk akal.

  • Ini adalah OEIS A066548 , dan urutan ini adalah segitiga itu sendiri (kecuali bahwa kami tidak menghapus angka nol di depan).

  • Ini adalah , jadi kode terpendek dalam byte (dalam setiap bahasa) menang. Bersenang-senang bermain golf!

Uji Kasus

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

Perhatikan bahwa di atas adalah 0-diindeks. Jika Anda mencari kasus uji 1-indeks, tambahkan input dengan 1.

Pada catatan yang tidak berhubungan, saya baru-baru ini mengubah gambar profil saya dan itu mengilhami saya untuk menulis tantangan ini.

Tuan Xcoder
sumber

Jawaban:

8

Sekam , 7 byte

1-diindeks

Σ!CNṁdN

Cobalah online!

Penjelasan

    ṁ     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.Piz
sumber
4

Python 2 , 69 byte

Ini mungkin bisa sedikit lebih pendek.

1-diindeks

Edit: -7 byte terima kasih kepada @ Mr.Xcoder

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

Cobalah online!

Halvard Hummel
sumber
1
n**2adalah n*n.
Tn. Xcoder
69 byte . Menggunakan rumus Gauss,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Tn. Xcoder
1
@ Mr.Xcoder Saya rasa dia ...
Erik the Outgolfer
@EriktheOutgolfer Anda benar, salah saya
Tn. Xcoder
3

05AB1E , 8 byte

nLS¹L£θO

Cobalah online!

-1 terima kasih kepada Emigna .

Pengindeksan 1.

Erik the Outgolfer
sumber
Anda dapat menghapus Anda Sjika Anda mengganti Jdengan S.
Emigna
@Emigna duh ....
Erik the Outgolfer
2

Mathematica, 96 byte

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


Cobalah online! (untuk mengerjakan matematika "Tr" harus diganti dengan "Total")

J42161217
sumber
2

Jelly , 11 byte

²RDFṁRS$ṫCS

Cobalah online!

Menggunakan pengindeksan berbasis 1.

Penjelasan

²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
mil
sumber
2

Haskell, 69 64 byte

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

Cobalah online.

Disimpan 5 byte berkat Laikoni !

Berikut versi yang kurang golf:

-- 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
sumber
n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xbeberapa byte lebih pendek.
Laikoni
@Laikoni Terima kasih! Diedit. Saya tidak tahu mengapa saya pikir splitOnakan menghemat byte.
Cristian Lupascu
2

R, 119 109 108 93 88 byte

mulai bermain golf .... 1-diindeks

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

terima kasih @ Zakary. anggapan Anda sudah benar :) mencukur 1 byte tnx ke @Andrius dan 15 lainnya tnx ke @ user2390246

@Giuseppe - tnx untuk strtoi. baru bagi saya. 5 byte ke bawah :)

Zahiro Mor
sumber
2
Saya tidak berpikir Anda membutuhkan y=, atau parens di sekitar n*(n-1)/2+1, dan nama bahasa mungkin tidak [R].
Zacharý
1
Anda dapat menyimpan 1 byte dengan mengubahnya as.integerdenganas.double
AndriusZ
1
Daripada x, gunakan Fkarena ini sudah diinisialisasi ke 0.
user2390246
1
Juga, 1:n+a-1berikan sama dengan a:(a+n-1). Dalam hal ini, Anda tidak perlu mendefinisikan aterlebih dahulu, Anda bisa langsung mengatakannya for. Itu juga akan memungkinkan Anda untuk membatalkan +1 / -1.
user2390246
2
79 byte . Digunakan substringalih-alih substrkarena benar-benar ini hanya jumlah atas indeks substring. Juga, selalu baik untuk menyertakan tautan TIO untuk solusi Anda :) +1, kerja bagus.
Giuseppe
2

Emojicode , 182 byte

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

Menentukan metode yang disebut © yang mengambil 🚂 dan mengembalikan 🚂. 1-diindeks.

Cobalah online!

Penjelasan:

catatan: banyak pilihan emoji tidak masuk akal di Emojicode 0.5. Lagipula 0.x. 0,6 akan memperbaikinya, jadi jika Anda ingin mempelajari ini (karena siapa yang tidak mau), saya sarankan menunggu sebentar.

Emojicode adalah bahasa pemrograman berorientasi objek yang menampilkan generik, protokol, opsional, dan penutupan, tetapi program ini tidak menggunakan penutupan, dan semua generik dan protokol dapat dianggap implisit.

Program hanya beroperasi pada beberapa tipe: 🚂 adalah tipe integer dan 🔡 adalah tipe string. Selain itu, appear muncul dalam kondisi, yang dapat mengambil nilai 👍 (benar) atau 👎 (salah).

Saat ini tidak ada operator di Emojicode, jadi penambahan, perbandingan dan operasi lain yang biasanya operator diimplementasikan sebagai fungsi, secara efektif membuat ekspresi menggunakan notasi awalan . Operator juga direncanakan dalam 0,6.

🐖©a🚂➡🚂🍇

© mengambil satu 🚂 dipanggil adan mengembalikan 🚂.

 🍦l➗✖a➕a 1 2

Nyatakan angka beku ("konstan") lsama dengan angka segitiga ke-a (rumus dalam notasi awalan). Ini mewakili panjang string angka yang perlu kita hasilkan.

 🍮t🔤🔤

Tetapkan string kosong ke variabel t.

 🍮i 0

Tentukan i = 0.

 🔁▶l🐔t🍇

Sedangkan yang llebih besar dari panjangt

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Tambahkan representasi tekstual dari ibasis 10 ke t.

 🍉

Akhiri lingkaran

 🍮s 0

Menetapkan s = 0

 🔂g🔪t➖l a a🍇

Ambil substring tmulai dari l - a( a - 1angka segitiga th) panjang a, ulangi semua karakter

  🍮➕s 🍺🚂🔡g 10

Konversikan karakter menjadi string, parse integer di base-10, buka bungkusan opsional (ketiadaan dikembalikan jika string bukan angka) dan tambahkan ke svariabel.

 🍉

Akhiri lingkaran

 🍎s

Kembali s

🍉

Metode akhir.

NieDzejkob
sumber
1

PHP, 66 +1 byte

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

Jalankan sebagai pipa dengan -nRatau coba online .

membutuhkan PHP 5.4 atau yang lebih baru untuk mengindeks ekspresi.

Titus
sumber
1

APL, 28 26 25 byte

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

Menggunakan pengindeksan berbasis 1

Cobalah online!

Bagaimana?

  • ⍳⍵×⍵, 1 hingga input kuadrat
  • ⍕¨, ubah setiap elemen menjadi string
  • ∊,/, menyatukan mereka
  • (+/⍳⍵)↑, ambil baris hingga input
  • ⍵↑⌽, ambil baris yang diinginkan
  • ⍎¨, ubah setiap elemen menjadi angka
  • +/, jumlah
Zacharý
sumber
1

Clojure v1.8, 154 byte

1-diindeks

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

Cobalah online!

Penjelasan

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

Java 8, 116 98 byte

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-diindeks

-18 byte terima kasih kepada @Nevay

Penjelasan:

Coba di sini.

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
sumber
1
98 byte: 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 byte

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

1-diindeks

versi tanpa ungolfed

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

Coba di sini!

terima kasih kepada @Giuseppe karena telah menghemat 8 byte

AndriusZ
sumber
@Giuseppe dalam uraian disebutkan: "Anda akan diberi bilangan bulat N." dan N ini digunakan dalam solusi saya. Atau mungkin saya salah mengerti sesuatu.
AndriusZ
Lihat tautan "standar rata-rata apa pun" dalam deskripsi :)
Giuseppe
@Giuseppe ganti dan gunakan saran Anda tentangstrtoi
AndriusZ
1
97 byte , dengan pesan peringatan. Selalu baik untuk menyertakan tautan ke TIO dalam deskripsi Anda sehingga orang lain dapat mengujinya!
Giuseppe
@ Giuseppe Saya tidak tahu tidak ada R, tapi mungkin suatu fungsi akan menggunakan lebih sedikit byte?
NieDzejkob
1

Perl 6 , 44 byte

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

Menguji

Diperluas:

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

Jeli , 16 byte

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

Cobalah online!

1-diindeks.

Erik the Outgolfer
sumber
0

SOGL V0.12 , 15 13 byte

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

Coba Di Sini!
1-diindeks.

Saat mengerjakan ini, saya memperbaiki bug yang membuat tidak berfungsi pada array angka dan yang msalah mengambil input implisit.

Penjelasan:

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

C ++, 180 byte

-17 byte berkat Zacharý

Indeks mulai dari 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
sumber
Mengubah baris terakhir ke ini akan menghemat dua byte: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ý
Juga, jika Anda saat ini mengambil input sebagai terindeks 0, Anda dapat mengonversinya menjadi 1-indeks dan menjatuhkan++n;
Zacharý
@ Zacharý Terima kasih. Btw, kode Anda mengandung karakter unicode yang tak terlihat karena beberapa alasan
HatsuPointerKun
Yang mana, saran C ++ saya, atau APL saya? APL menggunakan codepage sendiri, dan mungkin tidak akan muncul dengan benar jika Anda tidak memiliki font yang tepat.
Zacharý
@ Zacharý Saran C ++ yang Anda tulis di komentar. Ada 2 karakter unicode sebelum nol, membuat kesalahan seperti "0" identifier is unknowndi visual studio. Hal yang sama untuk to_stringdan size. Anda dapat melihatnya jika Anda menyalin-tempel kode di notepad ++, dan mengonversi pengodean ke ANSI, Anda akan melihat beberapa ??di editor
HatsuPointerKun
0

Pyth ,  15 14  13 byte

s<>sMjkS^Q2sU

Coba di sini! atau Lihat suite tes.

Alternatif 13 byte :

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

Bagaimana?

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.
Tuan Xcoder
sumber
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-Diindeks

+ 2b untuk -v flag

Tio.run sepertinya tidak menyukai program saya> <> baru-baru ini ... Ini masih dapat diverifikasi di https://fishlanguage.com . Input masuk dalam 'tumpukan awal'.

Sunting: Ternyata tio.run tidak menyukainya karena menangani '[' dan ']' berbeda dengan fishlanguage.com. fishlanguage.com membalikkan tumpukan saat membuat atau menghapus tumpukan baru, tetapi tio.run tidak.

Sasha
sumber
0

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

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

Cobalah online!

Hasilnya 1 diindeks.

Bagaimana?

Menggabungkan lebih dari cukup digit bersama-sama, lalu lewati yang tidak relevan di awal (panjang lompatan adalah jumlah bilangan bulat dari 1 hingga n-1). Ambil ndigit berikutnya , letakkan a +di depan masing-masing, lalu evaluasi persamaan itu.

Xcali
sumber
0

JavaScript (ES6), 78 65 byte

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-diindeks. Sunting: Disimpan 13 byte berkat @tsh.

Neil
sumber
n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh
@ tsh Masih pegolf untuk join`+` mengakhiri ...
Neil