Tính tổng các hàng của tam giác nối


16

Xét tam giác sau.

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

Như bạn có thể nhận thấy, hàng đầu tiên có độ dài 1 và mỗi hàng sau đó dài hơn 1 chữ số so với hàng trước và nó chứa các chữ số của các số nguyên dương được nối.

Bạn sẽ được cung cấp một số nguyên N . Nhiệm vụ của bạn là tìm tổng các chữ số nằm trên hàng thứ N của tam giác trên.

Quy tắc

  • Bạn có thể chọn 0 hoặc 1 lập chỉ mục. Hãy xác định rằng trong câu trả lời của bạn.

  • Lỗ hổng mặc định áp dụng.

  • Bạn có thể lấy đầu vào và cung cấp đầu ra theo bất kỳ giá trị trung bình tiêu chuẩn nào và ở bất kỳ định dạng hợp lý nào.

  • Đây là OEIS A066548chuỗi này là chính tam giác (ngoại trừ việc chúng tôi không loại bỏ các số 0 đứng đầu).

  • Đây là , vì vậy mã ngắn nhất tính bằng byte (bằng mọi ngôn ngữ) sẽ thắng. Chúc bạn chơi golf vui vẻ!

Các trường hợp thử nghiệm

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

Lưu ý rằng ở trên là 0 chỉ mục. Nếu bạn đang tìm kiếm các trường hợp kiểm tra 1 chỉ mục, hãy tăng đầu vào thêm 1.

Trên một ghi chú khá không liên quan, gần đây tôi đã thay đổi ảnh đại diện của mình và điều đó đã thôi thúc tôi viết thử thách này.

Câu trả lời:


8

Husk , 7 byte

1 chỉ mục

Σ!CNṁdN

Hãy thử trực tuyến!

Giải trình

    ṁ     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

4

Python 2 , 69 byte

Điều này có lẽ có thể ngắn hơn một chút.

1 chỉ mục

Chỉnh sửa: -7 byte nhờ @ Mr.Xcoder

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

Hãy thử trực tuyến!


1
n**2n*n.
Ông Xcoder

69 byte . Sử dụng công thức của Gauss,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Ông Xcoder

1
@ Mr.Xcoder Tôi nghĩ rằng anh ấy làm ...
Erik the Outgolfer

@EriktheOutgolfer Bạn nói đúng, xấu của tôi
Ông Xcoder




2

Toán học, 96 byte

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


Hãy thử trực tuyến! (để làm việc trên toán học "Tr" phải được thay thế bằng "Tổng số")


2

Thạch , 11 byte

²RDFṁRS$ṫCS

Hãy thử trực tuyến!

Sử dụng lập chỉ mục 1 dựa trên.

Giải trình

²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

2

Haskell, 69 64 byte

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

Hãy thử trực tuyến.

Đã lưu 5 byte nhờ Laikoni !

Đây là phiên bản ít chơi gôn hơn:

-- 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 xlà một số byte ngắn hơn.
Laikoni

@Laikoni Cảm ơn! Đã chỉnh sửa. Tôi không biết tại sao tôi nghĩ rằng splitOnsẽ tiết kiệm byte.
Cristian Lupascu

2

R, 119 109 108 93 88 byte

bắt đầu chơi gôn .... 1 chỉ số

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

cảm ơn @Zachary. giả định của bạn là chính xác :) đã cạo 1 byte tnx thành @Andrius và thêm 15 tnx vào @ user2390246

@Giuseppe - tnx cho strtoi. mới với tôi. Giảm 5 byte :)


2
Tôi không nghĩ rằng bạn cần y=, cũng như các parens xung quanh n*(n-1)/2+1, và tên của ngôn ngữ có lẽ là không [R].
Zacharý

1
bạn có thể tiết kiệm 1 byte bằng cách thay đổi as.integervớias.double
AndriusZ

1
Thay vì xsử dụng Fvì điều này đã được khởi tạo thành 0.
user2390246

1
Ngoài ra, 1:n+a-1cho giống như a:(a+n-1). Trong trường hợp đó, bạn không cần xác định atrước, bạn chỉ cần đặt thẳng vào forbiểu thức. Điều đó cũng sẽ cho phép bạn hủy bỏ + 1 / -1.
dùng2390246

2
79 byte . Được sử dụng substringthay substrvì thực sự đây chỉ là một tổng số trên các chỉ số của chuỗi con. Ngoài ra, luôn luôn tốt khi bao gồm một liên kết TIO cho các giải pháp của bạn :) +1, công việc tuyệt vời.
Giuseppe

2

Biểu tượng cảm xúc , 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🍉

Xác định một phương thức gọi là © lấy và trả về 🚂. 1 chỉ mục.

Hãy thử trực tuyến!

Giải trình:

Lưu ý: rất nhiều lựa chọn biểu tượng cảm xúc không có nhiều ý nghĩa trong Biểu tượng cảm xúc 0,5. Đó là 0.x, sau tất cả. 0.6 sẽ khắc phục điều này, vì vậy nếu bạn muốn tìm hiểu điều này (vì ai sẽ không muốn), tôi khuyên bạn nên chờ một lát.

Biểu tượng cảm xúc là một ngôn ngữ lập trình hướng đối tượng bao gồm các tổng quát, giao thức, tùy chọn và đóng, nhưng chương trình này không sử dụng các bao đóng, và tất cả các tổng quát và giao thức có thể được coi là ẩn.

Chương trình chỉ hoạt động trên một vài loại: là loại số nguyên và 🔡 là loại chuỗi. Ngoài ra, xuất hiện trong các điều kiện, có thể lấy giá trị là 👍 (đúng) hoặc (sai).

Hiện tại không có toán tử nào trong Biểu tượng cảm xúc, do đó, phép cộng và các phép toán khác thường là toán tử được triển khai dưới dạng hàm, làm cho các biểu thức sử dụng ký hiệu tiền tố một cách hiệu quả . Các nhà khai thác cũng được lên kế hoạch trong 0,6.

🐖©a🚂➡🚂🍇

© lấy một được gọi avà trả về một.

 🍦l➗✖a➕a 1 2

Khai báo một số đông ("hằng số") lbằng số tam giác thứ a (công thức trong ký hiệu tiền tố). Điều này thể hiện độ dài của chuỗi số chúng ta cần tạo.

 🍮t🔤🔤

Gán một chuỗi rỗng cho biến t.

 🍮i 0

Chỉ định i = 0.

 🔁▶l🐔t🍇

Trong khi llớn hơn chiều dài củat

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Nối biểu diễn văn bản của icơ sở 10 vào t.

 🍉

Kết thúc vòng lặp

 🍮s 0

Chỉ định s = 0

 🔂g🔪t➖l a a🍇

Lấy một chuỗi con tbắt đầu từ l - a( a - 1số tam giác thứ) có độ dài a, lặp lại trên tất cả các ký tự

  🍮➕s 🍺🚂🔡g 10

Chuyển đổi ký tự thành chuỗi, phân tích số nguyên trong cơ sở 10, hủy bỏ tùy chọn (không có gì được trả về nếu chuỗi không phải là số) và thêm vào sbiến.

 🍉

Kết thúc vòng lặp

 🍎s

Trả lại s

🍉

Phương pháp kết thúc.


1

PHP, 66 + 1 byte

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

Chạy như ống với -nRhoặc thử trực tuyến .

yêu cầu PHP 5.4 trở lên để lập chỉ mục biểu thức.



1

APL, 28 26 25 byte

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

Sử dụng lập chỉ mục dựa trên 1

Hãy thử trực tuyến!

Làm sao?

  • ⍳⍵×⍵, 1 thông qua bình phương đầu vào
  • ⍕¨, biến mỗi phần tử thành một chuỗi
  • ∊,/, nối chúng lại với nhau
  • (+/⍳⍵)↑, lấy các hàng lên đến đầu vào
  • ⍵↑⌽, lấy hàng mong muốn
  • ⍎¨, biến mỗi phần tử thành một số
  • +/, Tổng

1

Clojure v1.8, 154 byte

1 chỉ mục

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

Hãy thử trực tuyến!

Giải trình

(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 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 chỉ mục

-18 byte nhờ @Nevay

Giải trình:

Hãy thử nó ở đây.

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 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 chỉ mục

phiên bản vô văn hóa

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

Hãy thử nó ở đây!

cảm ơn @Giuseppe vì đã tiết kiệm 8 byte


@Giuseppe trong phần mô tả được đề cập: "Bạn sẽ được cấp một số nguyên N." và N này được sử dụng trong giải pháp của tôi. Hoặc có thể tôi đã hiểu nhầm điều gì đó.
AndriusZ

Xem "bất kỳ ý nghĩa tiêu chuẩn" được liên kết trong mô tả :)
Giuseppe

@Giuseppe thay đổi và sử dụng đề xuất của bạn vềstrtoi
AndriusZ

1
97 byte , với một thông báo cảnh báo. Luôn luôn tốt khi bao gồm một liên kết đến TIO trong mô tả của bạn để người khác có thể kiểm tra nó!
Giuseppe

@Giuseppe Tôi không biết không có R, nhưng có lẽ một hàm sẽ sử dụng ít byte hơn?
NieDzejkob

1

Perl 6 , 44 byte

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

Kiểm tra nó

Mở rộng:

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

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

Hãy thử nó ở đây!
1 chỉ mục.

Trong khi làm việc với điều này, tôi đã sửa một lỗi không hoạt động trên mảng số và đó làm không đúng đã nhập vào.

Giải trình:

²              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 byte

-17 byte nhờ Zacharý

Chỉ số bắt đầu từ 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;}

Thay đổi dòng cuối cùng thành dòng này sẽ tiết kiệm được hai 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ý

Ngoài ra, nếu bạn hiện đang lấy đầu vào là 0 chỉ mục, bạn có thể chuyển đổi nó thành 1 chỉ mục và thả++n;
Zacharý

@ Zacharý Cảm ơn. Btw, mã của bạn chứa ký tự unicode vô hình vì một số lý do
HatsuPulumKun

Cái nào, gợi ý C ++ của tôi, hoặc APL của tôi? APL sử dụng bảng mã riêng của mình và có thể sẽ không hiển thị đúng nếu bạn không có phông chữ phù hợp.
Zacharý

@ Zacharý Gợi ý C ++ mà bạn đã viết trong bình luận. Có 2 ký tự unicode trước 0, mắc lỗi như "0" identifier is unknowntrong studio hình ảnh. Điều tương tự cho to_stringsize. Bạn có thể thấy nó nếu bạn sao chép-dán mã trong notepad ++ và chuyển đổi mã hóa sang ANSI, bạn sẽ thấy một số ??trong trình chỉnh sửa
HatsuPulumKun

0

Bình thường ,  15 14  13 byte

s<>sMjkS^Q2sU

Hãy thử nó ở đây! hoặc Kiểm tra bộ thử nghiệm.

13 byte thay thế:

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

Làm sao?

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 byte

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

1-Index

+ 2b cho cờ -v

Tio.run thực sự dường như không thích các chương trình> <> của tôi gần đây ... Mặc dù vậy, nó vẫn có thể được xác minh trên https: //fishl Language.com . Đầu vào đi vào 'ngăn xếp ban đầu'.

Chỉnh sửa: Hóa ra tio.run không thích nó vì nó xử lý '[' và ']' khác với fishl Language.com. fishl Language.com đảo ngược ngăn xếp khi tạo hoặc xóa một ngăn xếp mới, nhưng tio.run thì không.


0

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

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

Hãy thử trực tuyến!

Kết quả là 1 chỉ số.

Làm sao?

Ghép nhiều hơn đủ các chữ số với nhau, sau đó bỏ qua các chữ số không liên quan ở đầu (độ dài bỏ qua là tổng các số nguyên từ 1 đến n-1). Lấy các nchữ số tiếp theo , đặt một chữ cái +trước mỗi chữ số , sau đó đánh giá phương trình đó.


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 chỉ mục. Chỉnh sửa: Đã lưu 13 byte nhờ @tsh.


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

@tsh Vẫn chơi gôn để join`+` kết thúc ...
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.