ผลรวมของแถวของสามเหลี่ยมที่ต่อกัน


16

พิจารณาสามเหลี่ยมต่อไปนี้

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

ดังที่คุณอาจสังเกตเห็นแถวแรกมีความยาว 1 และแต่ละแถวหลังจากนั้นจะมีความยาวมากกว่า 1 หลักก่อนหน้าและมันมีตัวเลขของจำนวนเต็มบวกที่ต่อกัน

คุณจะได้รับจำนวนเต็มN งานของคุณคือการหาผลรวมของตัวเลขที่อยู่ในแถวที่nของสามเหลี่ยมด้านบน

กฎระเบียบ

  • คุณสามารถเลือกการจัดทำดัชนี 0 หรือ 1 โปรดระบุว่าในคำตอบของคุณ

  • มีการใช้ช่องโหว่เริ่มต้น

  • คุณสามารถรับอินพุตและให้เอาต์พุตโดยใช้ค่าเฉลี่ยมาตรฐานและในรูปแบบที่เหมาะสม

  • นี่คือOEIS A066548และลำดับนี้คือสามเหลี่ยมเอง (ยกเว้นว่าเราจะไม่ลบเลขศูนย์นำหน้า)

  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ (ทุกภาษา) จะเป็นผู้ชนะ ขอให้สนุกกับการเล่นกอล์ฟ!

กรณีทดสอบ

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

โปรดทราบว่าข้างต้นเป็น 0 ดัชนี หากคุณกำลังมองหากรณีทดสอบที่จัดทำดัชนี 1 เพิ่มค่าอินพุต 1

ในโน้ตที่ไม่เกี่ยวข้องฉันเพิ่งเปลี่ยนรูปโปรไฟล์และนั่นเป็นแรงบันดาลใจให้ฉันเขียนความท้าทายนี้

คำตอบ:



4

Python 2 , 69 ไบต์

อาจสั้นกว่านี้เล็กน้อย

1 การจัดทำดัชนี

แก้ไข: -7 ไบต์ขอบคุณ@ Mr.Xcoder

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

ลองออนไลน์!


1
n**2n*nเป็น
Mr. Xcoder

69 ไบต์ ใช้สูตรของเกาส์sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Mr. Xcoder

1
@ Mr.Xcoder ฉันคิดว่าเขาทำ ...
Erik the Outgolfer

@EriktheOutgolfer คุณพูดถูกฉันไม่ดี
Mr. Xcoder




2

Mathematica, 96 ไบต์

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


ลองออนไลน์! (เพื่อที่จะทำงานกับคณิตศาสตร์ "Tr" จะต้องถูกแทนที่ด้วย "รวม")



2

Haskell, 69 64 ไบต์

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

ลองออนไลน์

บันทึก 5 ไบต์ขอบคุณLaikoni !

นี่คือเวอร์ชั่นที่ตีกอล์ฟน้อยกว่า:

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

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xบางไบต์สั้นลง
Laikoni

@Laikoni ขอบคุณ! แก้ไข ฉันไม่รู้ว่าทำไมฉันจึงคิดว่าsplitOnจะช่วยประหยัดไบต์
Cristian Lupascu

2

R, 119 109 108 93 88 ไบต์

เริ่มเล่นกอล์ฟ .... ทำดัชนี 1 รายการ

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

ขอบคุณ @Zachary ข้อสันนิษฐานของคุณถูกต้อง :) โกน 1 byte tnx ถึง @Andrius และอีก 15 tnx ไปที่ @ user2390246

@Giuseppe - tnx สำหรับ strtoi ใหม่สำหรับฉัน 5 ไบต์ลดลง :)


2
ผมไม่คิดว่าคุณต้องการy=, หรือ parens รอบและชื่อของภาษาคงจะไม่ได้n*(n-1)/2+1 [R]
Zacharý

1
คุณสามารถบันทึก 1 ไบต์โดยเปลี่ยนas.integerด้วยas.double
AndriusZ

1
แทนที่จะxใช้Fสิ่งนี้จะถูกกำหนดค่าเริ่มต้นเป็น 0
2390246

1
นอกจากนี้ยังช่วยให้เช่นเดียวกับ1:n+a-1 a:(a+n-1)ในกรณีนี้คุณไม่จำเป็นต้องกำหนดaล่วงหน้าคุณสามารถกำหนดมันลงไปในforนิพจน์ได้โดยตรง ซึ่งจะช่วยให้คุณยกเลิก +1 ได้
user2390246

2
79 ไบต์ ใช้substringแทนsubstrเนื่องจากจริง ๆ แล้วนี่เป็นเพียงผลรวมของดัชนีย่อย นอกจากนี้ยังเป็นเรื่องดีเสมอที่จะรวมลิงก์ TIO สำหรับโซลูชันของคุณ :) +1 ยอดเยี่ยม
Giuseppe

2

Emojicodeขนาด 182 ไบต์

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

กำหนดวิธีการที่เรียกว่า©ที่ใช้🚂และส่งกลับค่า🚂 1 การจัดทำดัชนี

ลองออนไลน์!

คำอธิบาย:

หมายเหตุ:ตัวเลือกอิโมจิจำนวนมากไม่สมเหตุสมผลใน Emojicode 0.5 มันคือ 0.x หลังจากทั้งหมด 0.6 จะแก้ไขสิ่งนี้ดังนั้นหากคุณต้องการเรียนรู้สิ่งนี้ (เพราะใครไม่ต้องการ) ฉันขอแนะนำให้รอสักครู่

Emojicode เป็นภาษาการเขียนโปรแกรมเชิงวัตถุที่มีชื่อสามัญ, โปรโตคอล, ตัวเลือกและการปิด แต่โปรแกรมนี้ไม่ได้ใช้การปิดใด ๆ และ generics และโปรโตคอลทั้งหมดสามารถพิจารณาได้โดยปริยาย

โปรแกรมทำงานได้เพียงไม่กี่ประเภท: 🚂เป็นประเภทจำนวนเต็มและ🔡เป็นประเภทสตริง นอกจากนี้ appears จะปรากฏในเงื่อนไขซึ่งสามารถรับค่าเป็น👍 (จริง) หรือ👎 (เท็จ)

ขณะนี้มีผู้ประกอบการในการ Emojicode ดังนั้นนอกจาก comparsions และการดำเนินงานอื่น ๆ ที่เป็นปกติผู้ประกอบการจะดำเนินการตามฟังก์ชั่นได้อย่างมีประสิทธิภาพทำให้การแสดงออกใช้คำนำหน้าสัญกรณ์ ผู้ประกอบการมีการวางแผนใน 0.6

🐖©a🚂➡🚂🍇

©รับหนึ่ง🚂ที่เรียกaและส่งคืน🚂

 🍦l➗✖a➕a 1 2

ประกาศการตรึง ("คงที่") lเท่ากับตัวเลขสามเหลี่ยมที่สาม (สูตรในรูปแบบของคำนำหน้า) นี่แสดงถึงความยาวของสตริงตัวเลขที่เราต้องการสร้าง

 🍮t🔤🔤

tกำหนดสตริงที่ว่างเปล่าให้กับตัวแปร

 🍮i 0

i = 0กำหนด

 🔁▶l🐔t🍇

ในขณะที่lมากกว่าความยาวของt

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

ผนวกแสดงเกี่ยวกับใจของiฐาน t10

 🍉

จบห่วง

 🍮s 0

กำหนด s = 0

 🔂g🔪t➖l a a🍇

ใช้สตริงย่อยของการtเริ่มต้นที่l - a( a - 1หมายเลขสามเหลี่ยมที่สาม) ของความยาว a, วนซ้ำอักขระทั้งหมด

  🍮➕s 🍺🚂🔡g 10

แปลงอักขระเป็นสตริงวิเคราะห์จำนวนเต็มใน base-10 แกะตัวเลือก (ไม่มีการคืนค่าหากสตริงไม่ใช่ตัวเลข) และเพิ่มลงในsตัวแปร

 🍉

จบห่วง

 🍎s

ส่งคืน

🍉

สิ้นสุดวิธีการ


1

PHP, 66 + 1 ไบต์

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

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

ต้องการ PHP 5.4 ขึ้นไปสำหรับการจัดทำดัชนีนิพจน์



1

APL, 28 26 25 ไบต์

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

ใช้การจัดทำดัชนีแบบอิง 1

ลองออนไลน์!

อย่างไร?

  • ⍳⍵×⍵1 ผ่านอินพุทกำลังสอง
  • ⍕¨เปลี่ยนองค์ประกอบให้เป็นสตริง
  • ∊,/รวมเข้าด้วยกัน
  • (+/⍳⍵)↑คว้าแถวขึ้นไปที่อินพุต
  • ⍵↑⌽คว้าแถวที่ต้องการ
  • ⍎¨เปลี่ยนองค์ประกอบให้เป็นตัวเลข
  • +/, ผลรวม

1

Clojure v1.8, 154 ไบต์

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

ลองออนไลน์!

คำอธิบาย

(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

1

Java 8, 116 98 ไบต์

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 การจัดทำดัชนี

-18 ไบต์ขอบคุณ@Nevay

คำอธิบาย:

ลองที่นี่

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

1
98 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 ไบต์

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

1 การจัดทำดัชนี

รุ่นที่ไม่ได้ถูกดัดแปลง

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

ลองที่นี่!

ขอบคุณ @Giuseppe สำหรับการบันทึก 8 ไบต์


@Giuseppe ในคำอธิบายที่กล่าวถึง: "คุณจะได้รับจำนวนเต็ม N. " และ N นี้ใช้ในการแก้ปัญหาของฉัน หรือบางทีฉันเข้าใจผิดบางอย่าง
AndriusZ

ดูการเชื่อมโยง "ใด ๆ หมายถึงมาตรฐาน" ในคำอธิบาย :)
จูเซปเป้

@Giuseppe เปลี่ยนและใช้คำแนะนำของคุณเกี่ยวกับstrtoi
AndriusZ

1
97 ไบต์พร้อมข้อความเตือน เป็นเรื่องที่ดีเสมอที่จะรวมลิงก์ไปยัง TIO ในคำอธิบายของคุณเพื่อให้ผู้อื่นสามารถทดสอบได้!
Giuseppe

@Giuseppe ฉันไม่ทราบว่า R แต่ฟังก์ชั่นอาจจะใช้น้อยกว่าไบต์?
NieDzejkob

1

Perl 6 , 44 ไบต์

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

ทดสอบมัน

ขยาย:

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


0

SOGL V0.12 , 15 13 ไบต์

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

ลองที่นี่!
1 การจัดทำดัชนี

ในขณะที่ทำงานนี้ฉันแก้ไขข้อผิดพลาดที่ไม่ทำงานในอาร์เรย์ตัวเลขและที่mป้อนข้อมูลโดยนัยไม่ถูกต้อง

คำอธิบาย:

²              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

0

C ++, 180 ไบต์

-17 ไบต์ขอบคุณZacharý

ดัชนีเริ่มต้นที่ 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;}

การเปลี่ยนบรรทัดสุดท้ายเป็นสิ่งนี้ควรประหยัดสองไบต์: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ý

นอกจากนี้หากคุณกำลังป้อนข้อมูลเป็นดัชนี 0 คุณสามารถแปลงเป็น 1 ดัชนีและปล่อย++n;
Zacharý

@ Zacharýขอบคุณ Btw โค้ดของคุณมีอักขระ Unicode ที่มองไม่เห็นด้วยเหตุผลบางอย่าง
HatsuPointerKun

ข้อเสนอแนะ C ++ ของฉันอันไหนหรือ APL ของฉัน APL ใช้เพจรหัสของตัวเองและอาจไม่ปรากฏขึ้นหากคุณไม่มีแบบอักษรที่ถูกต้อง
Zacharý

@ Zacharýข้อเสนอแนะ C ++ ที่คุณเขียนไว้ในความคิดเห็น มีอักขระยูนิโค้ด 2 ตัวอยู่หน้าเลขศูนย์ทำให้เกิดข้อผิดพลาดเหมือนกับ"0" identifier is unknownในสตูดิโอภาพ สิ่งเดียวกันสำหรับและto_string sizeคุณสามารถดูได้หากคุณคัดลอกวางรหัสใน notepad ++ และแปลงการเข้ารหัสเป็น ANSI คุณจะเห็นบางอย่าง??ในตัวแก้ไข
HatsuPointerKun

0

Pyth ,  15 14  13 ไบต์

s<>sMjkS^Q2sU

ลองที่นี่! หรือตรวจสอบชุดทดสอบ

ทางเลือก13 ไบต์ :

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

อย่างไร?

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.

0

> <>, 141 + 2 ไบต์

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

1 จัดทำดัชนี

+ 2b สำหรับแฟล็ก -v

Tio.run really doesn't seem to like my ><> programs recently... It can still be verified on https://fishlanguage.com though. Input goes in 'initial stack'.

Edit: It turns out tio.run doesn't like it because it handles '[' and ']' differently to fishlanguage.com. fishlanguage.com reverses the stack when creating or removing a new stack, but tio.run doesn't.


0

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

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

Try it online!

Result is 1 indexed.

How?

Concatenate more than enough digits together, then skip the irrelevant ones at the beginning (length of skip is sum of integers from 1 to n-1). Take the next n digits, place a + in front of each one, then evaluate that equation.


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-indexed. Edit: Saved 13 bytes thanks to @tsh.


n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh

@tsh Still golfier to put the join`+` at the end...
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.