연결된 삼각형의 행을 합산


16

다음 삼각형을 고려하십시오.

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

아시다시피, 첫 번째 행의 길이는 1이고 이후의 각 행은 이전 행보다 1 자리 더 길고 연결된 양의 정수 자릿수가 포함되어 있습니다.

정수 N 이 주어집니다 . 당신의 임무는 위의 삼각형의 N 번째 행 에있는 숫자의 합계를 찾는 것 입니다.

규칙

  • 0 또는 1 인덱싱을 선택할 수 있습니다. 답에 명시하십시오.

  • 기본 허점이 적용됩니다.

  • 표준 mean 과 합리적인 형식으로 입력하고 출력 할 수 있습니다 .

  • 이다 OEIS A066548 하고, 이 순서는 삼각형 자체 (우리가 맨 앞에 0을 제거하지 않는 것이 제외)이다.

  • 이것은 이므로 모든 언어에서 바이트 단위의 가장 짧은 코드가 이깁니다. 즐거운 골프 되세요!

테스트 사례

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

파이썬 2 , 69 바이트

이것은 아마도 조금 더 짧을 수 있습니다.

1- 색인

편집 : @ Mr.Xcoder 덕분에 -7 바이트

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

온라인으로 사용해보십시오!


1
n**2입니다 n*n.
Mr. Xcoder

69 바이트 . 가우스 공식 사용sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Mr. Xcoder

1
@ Mr.Xcoder 그가 생각하는 것은 ...
Outgolfer Erik

@EriktheOutgolfer 당신 말이 맞아요
Xcoder 씨





2

젤리 , 11 바이트

²RDFṁRS$ṫCS

온라인으로 사용해보십시오!

1 기반 인덱싱을 사용합니다.

설명

²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

하스켈, 69 64 바이트

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

온라인으로 사용해보십시오.

Laikoni 덕분에 5 바이트 절약 !

덜 골프 버전은 다음과 같습니다.

-- 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 바이트 tnx를 @Andrius로 면도하고 15 tnx를 @ user2390246로 면도했습니다.

@Giuseppe-strtoi를위한 tnx. 나에게 새로운. 5 바이트 다운 :)


2
난 당신이 필요하다고 생각하지 y=않으며, 주위에 괄호 n*(n-1)/2+1및 언어의 이름은 아마도되지 않습니다 [R].
Zacharý

1
as.integeras.double
AndriusZ

1
대신 이 값이 이미 0으로 초기화되었으므로 x사용하십시오.F
user2390246

1
또한와 1:n+a-1동일합니다 a:(a+n-1). 이 경우 a사전 에 정의 할 필요가 없으며 for표현식 에 바로 넣을 수 있습니다 . 또한 + 1 / -1을 취소 할 수 있습니다.
user2390246

2
79 바이트 . 실제로 이것은 부분 문자열의 인덱스에 대한 합계 일뿐이므로 substring대신 사용 됩니다 substr. 또한 솔루션에 대한 TIO 링크를 항상 포함시키는 것이 좋습니다 :) +1, 훌륭한 작업.
주세페

2

이모티콘 코드 , 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🍉

called를 가져와 🚂을 반환하는 ©라는 메서드를 정의합니다. 1- 색인.

온라인으로 사용해보십시오!

설명:

노트 : Emojicode 0.5에서는 많은 이모 지 선택이 의미가 없습니다. 결국 0.x입니다. 0.6이 이것을 고칠 것이므로, 배우고 싶지 않다면 (누군가 원하지 않기 때문에) 잠시 기다리십시오.

Emojicode는 제네릭, 프로토콜, 옵션 및 클로저를 특징으로하는 객체 지향 프로그래밍 언어이지만이 프로그램은 클로저를 사용하지 않으며 모든 제네릭과 프로토콜은 암시 적으로 간주 될 수 있습니다.

프로그램은 몇 가지 유형에서만 작동합니다. 🚂는 정수 유형이고 🔡는 문자열 유형입니다. 또한 👌은 👍 (true) 또는 👎 (false) 값을 가질 수있는 조건에 나타납니다.

Emojicode에는 현재 연산자가 없으므로 일반적으로 연산자 인 비교, 비교 및 ​​기타 작업은 함수로 구현되어 표현식에 접두사 표기법을 효과적으로 사용 합니다 . 운영자는 0.6에 계획되어 있습니다.

🐖©a🚂➡🚂🍇

©는 하나의 🚂을 호출 a하고 🚂 를 반환합니다.

 🍦l➗✖a➕a 1 2

a l번째 삼각형 숫자 (접두사 표기법의 공식 )와 같은 고정 ( "일정한")을 선언합니다 . 이것은 우리가 생성해야하는 문자열의 길이를 나타냅니다.

 🍮t🔤🔤

변수에 빈 문자열을 할당하십시오 t.

 🍮i 0

할당합니다 i = 0.

 🔁▶l🐔t🍇

는 동안 l의 길이보다 큰t

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

i밑 10 의 텍스트 표현을 에 추가하십시오 t.

 🍉

엔드 루프

 🍮s 0

양수인 s = 0

 🔂g🔪t➖l a a🍇

길이 a의 ( 삼각수) t에서 시작하여 모든 문자를 반복 하는 부분 문자열을 가져옵니다.l - aa - 1

  🍮➕s 🍺🚂🔡g 10

문자를 문자열로 변환하고 base-10의 정수를 구문 분석하고 선택 사항을 풀고 (문자열이 숫자가 아닌 경우 아무것도 반환되지 않음) s변수에 추가 하십시오.

 🍉

엔드 루프

 🍎s

s를 반환

🍉

최종 방법.




1

APL, 28 26 25 바이트

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

1 기반 인덱싱 사용

온라인으로 사용해보십시오!

어떻게?

  • ⍳⍵×⍵, 1-입력 제곱
  • ⍕¨각 요소를 문자열로 바꿉니다.
  • ∊,/함께 연결
  • (+/⍳⍵)↑입력까지 행을 가져옵니다.
  • ⍵↑⌽원하는 행을 잡고
  • ⍎¨각 요소를 숫자로 바꿉니다.
  • +/, 합계

1

클로저 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

자바 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- 색인

@Nevay 덕분에 -18 바이트

설명:

여기에서 시도하십시오.

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- 색인

ungolfed 버전

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

여기 사용해보십시오!

8 바이트를 절약 한 @Giuseppe에게 감사드립니다.


설명에서 @Giuseppe가 언급됩니다 : "정수 N이 주어질 것입니다." 이 N은 내 솔루션에 사용됩니다. 아니면 뭔가 잘못 이해했을 수도 있습니다.
AndriusZ

설명에서 연결된 "모든 표준 평균"을 참조하십시오.)
Giuseppe

@Giuseppe 님이 다음에 대한 제안을 변경하고 사용 strtoi
하셨습니다

1
경고 메시지와 함께 97 바이트 . 다른 사람이 테스트 할 수 있도록 항상 설명에 TIO 링크를 포함시키는 것이 좋습니다!
주세페

@ Giuseppe R을 모르지만 함수가 더 적은 바이트를 사용합니까?
NieDzejkob

1

펄 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 바이트

Zacharý 덕분에 -17 바이트

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

마지막 줄을 이것으로 바꾸면 2 바이트가 절약됩니다 :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, 코드에는 몇 가지 이유로 보이지 않는 유니 코드 문자가 포함되어 있습니다
HatsuPointerKun

내 C ++ 제안 또는 APL 중 어느 것입니까? APL은 자체 코드 페이지를 사용하며 올바른 글꼴이 없으면 제대로 표시되지 않을 수 있습니다.
Zacharý

@ Zacharý 댓글에 쓴 C ++ 제안. 0 앞에 2 개의 유니 코드 문자가 있으므로 "0" identifier is unknownVisual Studio 와 같은 오류가 발생합니다 . 대한 똑같은 to_string하고 size. 당신이 ANSI로 ++ 메모장에 코드 및 변환 인코딩을 복사 - 붙여 넣기하면 당신은 당신이 어떤 볼, 볼 수 ??에디터
HatsuPointerKun


0

> <>, 141 + 2 바이트

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

1- 색인

-v 플래그의 경우 + 2b

Tio.run은 최근에 내> <> 프로그램을 좋아하지 않는 것 같습니다 ... https://fishlanguage.com 에서 여전히 확인할 수 있습니다 하지만. 입력은 '초기 스택'에 들어갑니다.

편집 : tio.run은 fishlanguage.com과 다르게 '['및 ']'를 처리하기 때문에 마음에 들지 않습니다. fishlanguage.com은 새 스택을 만들거나 제거 할 때 스택을 되돌 리지만 tio.run은 그렇지 않습니다.


0

Perl 5 , 62 + 1 (-p) = 63 바이트

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

온라인으로 사용해보십시오!

결과는 1 인덱싱됩니다.

어떻게?

충분한 자릿수를 함께 연결 한 다음 처음에 관련없는 숫자는 건너 뜁니다 (스킵 길이는 1에서 1까지의 정수의 합입니다. n-1 ). 다음 n숫자를 가져 와서 각 숫자 +앞에 a 를 놓고 해당 방정식을 평가하십시오.


0

자바 스크립트 (ES6), 78 65 바이트

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- 색인. 편집 : @tsh 덕분에 13 바이트가 절약되었습니다.


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

@tsh 아직도 골퍼 join`+` 는 마지막 에 넣어 ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.