숫자를 삼각형!


28

"제곱" n 이라는 용어는 n 2 계산을 의미 합니다. 또한 "큐빙" n 이라는 용어 는 n 3 을 의미하는 것으로 사용된다 . 그것은 왜 우리도 숫자를 삼각형으로 만들 수 없었습니까?

숫자를 삼각형으로 만드는 방법?

  • 먼저 숫자를 골라 봅시다 53716.

  • 아래 그림과 같이 변의 길이가 숫자의 자릿수와 같고 대각선으로 두 변이있는 평행 사변형에 배치합니다.

        53716
       53716
      53716
     53716
    53716
    
  • 이제 우리는 그것을 원합니다. 이렇게하려면 직각 삼각형에 맞지 않는면을 자르십시오.

        5
       53
      537
     5371
    53716
    
  • 각 행의 합계를 가져 와서이 예제의 결과는 [5, 8, 15, 16, 22]다음 과 같습니다.

        5-> 5
       53-> 8
      537-> 15
     5371-> 16
    53716-> 22
    
  • 목록을 합산하여 [5, 8, 15, 16, 22]결과를 얻습니다 66. 이것은이 숫자의 삼각형입니다!

사양 및 규칙

  • 입력은 음이 아닌 정수 n ( n ≥ 0, n ∈ Z )이됩니다.

  • 허용모든 수단으로 입력을 받고 출력 할 수 있습니다 .

  • 입력은 정수, 정수의 문자열 표현 또는 숫자 목록으로 형식화 될 수 있습니다.

  • 기본 허점은 허용되지 않습니다.

  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

더 많은 테스트 사례

입력-> 출력

0-> 0
1-> 1
12-> 4
123-> 10
999-> 54 
100000-> 6
654321-> 91

영감. 설명이 권장됩니다!


확실 645321 -> 91합니까?
Rod

@로드 죄송합니다, 당신이 맞아요. 645321대신에 썼습니다 654321.
Mr. Xcoder

1
숫자 목록으로 입력 할 수 있습니까?
완전히 인간적인

@totallyhuman 예, 두 번째 사양을 참조하십시오.
Mr. Xcoder

1
재미있는 도전. 당신이 내에서 영감을 받아 다행입니다!
그리폰-복원 모니카

답변:




12

Brain-Flak , 65, 50, 36 바이트

([])({<{}>{<({}[()])>[]}{}<([])>}{})

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

많은 수정 후, 나는이 답변을 매우 자랑스럽게 생각합니다. 나는 알고리즘이 마음에 들며, 그것은 뇌-플랙에서 얼마나 멋지게 표현 될 수 있는가.

바이트 수의 대부분은 입력에서 0을 처리 할 때 발생합니다. 실제로 입력에 0이 없다고 가정 할 수 있다면 20 바이트 대답이 아름답습니다.

({{<({}[()])>[]}{}})

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

그러나 안타깝게도 뇌파는 엣지 케이스를 잘못 처리 한 것으로 유명합니다.

설명

첫째, 내 관찰 :

입력 길이 가 n 자리 인 경우 첫 번째 자리는 삼각형으로 n 번 나타나고 두 번째 자리는 n-1 번으로 나타나며 마지막 자리에는 한 번 나타납니다. 우리는 뇌-플래 크에 얼마나 많은 숫자의 입력이 남아 있는지 계산하기가 쉽기 때문에 이것을 이용할 수 있습니다.

[]

코드 작동 방식은 다음과 같습니다.

# Push the size of the input (to account for 0's)
([])

# Push...
(

    # While True
    {

        # Pop the stack height (evaluates to 0)
        <{}>

        # For each digit *D*...

        # While true
        {

            # Decrement the counter (the current digit we're evaluating), 
            # but evaluate to 0
            <({}[()])>

            # Evaluate the number of digits left in the input
            []

        # Endwhile
        }

        # This whole block evaluates to D * len(remaining_digits), but 
        # without affecting the stack

        # Since we looped D times, D is now 0 and there is one less digit.
        # Pop D (now 0)
        {}

        # Push the stack height (again, evaluating it as 0)
        <([])>

    # End while
    }

    # Pop a 0 off (handles edge case of 0)
    {}

# end push
)

내 팁 여기가 당신을 절약 할 수 있습니다 두 바이트
밀 마법사





7

Japt , 7 6 4 바이트

å+ x

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

설명

å+ x    Implicit: input = digit list
å+      Cumulative reduce by addition. Gives the sum of each prefix.
   x    Sum.

오래된 해결책 :

å+ ¬¬x

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

설명

å+ ¬¬x   Implicit: input = string
å+       Cumulative reduce by concatenation. Gives the list of prefixes.
   ¬     Join into a single string of digits.
    ¬    Split back into digits.
     x   Sum.
         Implicit: output result of last expression

샌드 박스 많이? 아니면 질문을 읽고 코드를 작성하여 1 분 안에 게시 했습니까?!
Jonathan Allan

@JonathanAllan 샌드 박스가 아닙니다. 생각보다 훨씬 쉽습니다.
Mr. Xcoder

1
글쎄, 나는 심지어 시간이 걸리던 질문을 읽을 수조차
Jonathan Allan

@JonathanAllan 샌드 박스 읽기가 없으므로 게시 직후에 질문을 잡아 거의 즉시 알고리즘을 생각해 냈습니다.
ETHproductions

질문을 읽는 데 약 4 분이 걸렸습니다. 그래서 속도 읽기 / 속도 이해를 위해 +1 :)
Jonathan Allan

7

Brain-Flak , 28 바이트

(([]){[{}]({}<>{})<>([])}{})

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

0을 지원할 필요가없는 경우 14 바이트

({({}<>{})<>})

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

DJMcMayhem에는 멋진 답변이 있습니다 . 불행히도 나는 그를 자신의 언어로 이길 수 없었습니다. : P

어떻게 작동합니까?

간단한 버전부터 시작하겠습니다.

({({}<>{})<>})

여기에서 주요 동작 ({}<>{})<>은 왼쪽 스택의 상단을 차지하고 오른쪽 스택의 상단에 추가됩니다. 이 작업을 반복함으로써 현재 스택을 합산합니다 (0이 될 때까지). 그것은 매우 평범한 일입니다. 흥미로운 부분은 우리가이 러한 모든 결과를 우리의 결과로 요약한다는 것입니다. 원하는 값을 계산합니다. 왜? 글쎄, 예를 보자 123. 첫 번째 잡아에 우리는 단지 1을 얻습니다. 그래서 우리의 가치는 1입니다.

1

다음 잡아에서 우리는 1 더하기 2를 반환

1
1+2

마지막 실행에서 우리는 함께 세

1
1+2
1+2+3

삼각형이 보입니까? 모든 런의 합은 목록의 "삼각형"입니다.


좋아, 이제 우리는 0으로 작동해야합니다. 여기서 DJMcMayhem과 같은 트릭과 멋진 발자국을 사용했습니다. 0에 도달 할 때까지 반복하는 대신 스택이 비워 질 때까지 반복합니다.

([])({<{}>({}<>{})<><([])>}{})

그런 다음 이 팁 을 사용 하여 다른 2 바이트에서 골프를하기 위해 진정으로 다른 사람이 작성하지 않았습니다.

(([]){[{}]({}<>{})<>([])}{})

그리고 우리는 그것을 가지고 있습니다. 더 짧은 해결책이 있다면 놀랐지 만 다시 낯선 일이 일어났습니다.


Unfortunately for him I wasn't about to let him win at his own language :P나는 당신에게서 아무것도 기대하지 않습니다. : D
DJMcMayhem

6

자바 스크립트 (ES6), 28 바이트

a=>a.map(d=>t+=c+=d,t=c=0)|t

숫자 목록으로 입력을받습니다.


5

파이썬 3 , 37 바이트

f=lambda n:len(n)and sum(n)+f(n[:-1])

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


5
... 왜 downvote입니까?
비즈니스 고양이

난 당신이 바꿀 수 있다고 생각 lensum난 아무것도 할 수 있다고 생각하지 않습니다하지만,뿐만 아니라.
ETHproductions

@ETHproductions 예. 나는 사실의 사용을 만들 수있는 기대했다 sum([])방법이 생각이있을 수 있습니다 ... 0을,하지만 아무것도 꽤 함께오고 있었다
비즈니스 고양이

그렇지 않으면 내가 당신에게 내 개선점을 주었을 것입니다.
Jonathan Allan

@JonathanAllan 걱정하지 마십시오 : P
비즈니스 고양이

5

C # (. NET 코어) , 59 바이트

using System.Linq;N=>N.Reverse().Select((d,i)=>i*d+d).Sum()

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

다른 C # 답변과는 상당히 다릅니다. 입력은 자릿수 목록입니다. TIO 링크에 포함 된 모든 테스트 사례.

선행 0을 포함하는 하위 자릿수 목록으로 입력을 허용하면 많은 바이트를 저장할 수 있습니다.


좋은 생각! C #의 일부 치열한 코드 골프.
Grzegorz Puławski

좋은 해결책! 그러나 입력 number이 숫자 가 아닌 음수가 아닌 것으로 지정되어 있지 않습니까?
Ian H.

@IanH. 규칙 2 : 귀하는 허용 된 모든 수단으로 의견을 수렴하고 결과를 제공 할 수 있습니다. 형식에 관해서는 정수의 문자열 표현 또는 숫자 목록으로 입력을 정수로 취할 수 있습니다.
Kamil Drakari


4

J , 7 바이트

[:+/+/\

온라인으로 사용해보십시오! 와 같은 숫자 목록을 가져옵니다 f 6 5 4 3 2 1.

설명

[:+/+/\    (for explanation, input = 6 5 4 3 2 1)
      \    over the prefixes of the input:
     /         reduce:
    +              addition (summation)
           this gives is the cumulative sum of the input:  6 11 15 18 20 21
[:         apply to the result:
  +/           summation
           this gives the desired result:   90

원래 문제에 대해 좀 더 진실한 것은 입력 ( ) 의 평평한 ( ) 접두사 [:+/@,]/"sum" ( )입니다.+/,]\


4

정력 , 60 59 32 키 스트로크

재귀 매크로와 h트릭이 있는 팁에 대해 @CowsQuack에게 감사드립니다. 이는 27 바이트를 절약했습니다!

qqYp$xh@qq@qVHJ:s/./&+/g⏎
C<C-r>=<C-r>"0⏎

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

언 골프 / 설명

이렇게하면 설명대로 삼각형이 만들어집니다 (왼쪽 정렬 상태로만 유지).

qq       q    " record the macro q:
  Yp          "   duplicate the line
    $x        "   remove last character
      h       "   move to the left (this is solely that the recursive macro calls stop)
       @q     "   run the macro recursively
          @q  " run the macro

버퍼는 이제 다음과 같습니다 :

53716
5371
537
53
5

모든 줄을 하나로 묶어 평가 가능한 표현을 만드십시오.

VH             " mark everything
  J            " join into one line
   :s/./&+/g⏎  " insert a + between all the characters

"레지스터는 현재 다음과 같은 문자열을 (주 0 누락) 포함

5+3+7+1+6+ +5+3+7+1+ +5+3+7+ +5+3+ +5+ +

따라서 우리가해야 할 일은 0을 추가하고 평가하는 것입니다.

 C                " delete line and store in " register
  <C-r>=       ⏎  " insert the evaluated expression from
        <C-r>"    " register "
              0   " append the missing 0

inside vim


대체 명령 &대신 (전체 경기)를 사용할 수 있습니다\1
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎될 수 있습니다 qqYp$xh@qq@q. 이 재귀 매크로는 줄에 한 문자가 있으면 중단 오류가 발생하며 그 후에는 중지됩니다.
Kritixi Lithos

따라서 대체는 그냥 될 수 있습니다 :s/./&+/g. 또한 :%j⏎될 수 있습니다 V{J. 그리고, Di될 수 있습니다 C(나는 이미 Vim 답변 중 다른 것에 이것에 대해 언급했습니다). 온라인으로 사용해보십시오!
Kritixi Lithos


3

배쉬 + GNU 유틸리티, 32 24

tac|nl -s*|paste -sd+|bc

STDIN에서 입력을 읽습니다.

업데이트 : 입력이 숫자 목록으로 제공 될 수 있습니다. 입력 목록은 줄 바꿈으로 구분됩니다.

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

설명

tac                       # reverse digit list
   |nl -s*                # prefix line numbers; separate with "*" operator
          |paste -sd+     # join lines onto one line, separated with "+" operator
                     |bc  # arithmetically evaluate

3

APL, 4 바이트

+/+\

다음과 같이 입력을 숫자 목록으로 사용합니다. 예 :

      (+/+\) 5 3 7 1 6
66

설명

+/    sum of
  +\  partial sums of input

3

택시 , 1478 바이트

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[a]Switch to plan "b" if no one is waiting.Pickup a passenger going to The Babelfishery.Go to Zoom Zoom:n 1 l 3 r.1 is waiting at Starchild Numerology.Go to Starchild Numerology:w 4 l 2 r.Pickup a passenger going to Addition Alley.Go to Addition Alley:w 1 r 3 r 1 r 1 r.Pickup a passenger going to Addition Alley.Go to The Babelfishery:n 1 r 1 r.Go to Chop Suey:n 6 r 1 l.Switch to plan "a".[b]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to Cyclone.[c]Go to Zoom Zoom:n 1 l 1 r.Go to Cyclone:w.Pickup a passenger going to The Underground.Pickup a passenger going to Multiplication Station.Go to The Babelfishery:s 1 l 2 r 1 r.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:n 1 r 2 l.Pickup a passenger going to Addition Alley.Go to The Underground:n 2 l 1 r.Switch to plan "d" if no one is waiting.Pickup a passenger going to Cyclone.Go to Addition Alley:n 3 l 1 l.Switch to plan "c".[d]Go to Addition Alley:n 3 l 1 l.[e]Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Switch to plan "f" if no one is waiting.Switch to plan "e".[f]Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

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

언 골프 :

[ Pickup stdin and split into digits ]
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
[a]
[ Count the digits ]
Switch to plan "b" if no one is waiting.
Pickup a passenger going to The Babelfishery.
Go to Zoom Zoom: north 1st left 3rd right.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: west 4th left 2nd right.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: west 1st right 3rd right 1st right 1st right.
Pickup a passenger going to Addition Alley.
Go to The Babelfishery: north 1st right 1st right.
Go to Chop Suey: north 6th right 1st left.
Switch to plan "a".
[b]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to Cyclone.
[c]
[ Multiply each digits by Len(stdin)-Position(digit) ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Cyclone: west.
Pickup a passenger going to The Underground.
Pickup a passenger going to Multiplication Station.
Go to The Babelfishery: south 1st left 2nd right 1st right.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: north 1st right 2nd left.
Pickup a passenger going to Addition Alley.
Go to The Underground: north 2nd left 1st right.
Switch to plan "d" if no one is waiting.
Pickup a passenger going to Cyclone.
Go to Addition Alley: north 3rd left 1st left.
Switch to plan "c".
[d]
Go to Addition Alley: north 3rd left 1st left.
[e]
[ Sum all the products ]
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Switch to plan "f" if no one is waiting.
Switch to plan "e".
[f]
[ Output the results ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

3

Perl 5 , 19 + 1 ( -p) = 20 바이트

s/./$\+=$p+=$&/ge}{

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

방법?

$ \는 누적 합계를, $ p는 현재 행의 자릿수를 유지합니다. 평행 사변형의 각 줄은 단순히 다음 숫자가 추가 된 이전 줄입니다. 따라서 이전 줄과 새로운 숫자의 합입니다. 이것은 모든 자릿수를 반복하여 합계를 계산합니다. 실제 대체는 관련이 없습니다. 실제 루프를 만들지 않고 숫자를 반복하는 수단 일뿐입니다. 결국 $ \는 -p옵션에 의해 암시 적으로 인쇄됩니다 .



2

젤리 ,  5  4 바이트

Ṛæ.J

소수 자릿수 목록을 가져 와서 목록이 나타내는 숫자의 삼각형을 반환하는 모나드 링크.

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

방법?

Ṛæ.J - Link: list of numbers (the decimal digits), d   e.g. [9,4,5,0]
Ṛ    - reverse d                                            [0,5,4,9]
   J - range(length(d))                                     [1,2,3,4]
 æ.  - dot-product            (0*1 + 5*2 + 4*3 + 9*4 = 58)  58

나는 제거 가 여전히 효과 가 있다고 생각했다 . 동정 ...
ETHproductions

@ETHproductions ...하지만 아직 내장되어 있습니다!
Jonathan Allan

... 좋아, 와우 ...
ETHproductions

@ETHproductions ooops는 그것을 뒤집어 야했습니다> _ <
Jonathan Allan

2

레티 나 , 13 바이트

.
$`$&
.
$*
1

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명 : 첫 번째 단계는 원래 숫자의 모든 접 두부를 생성하고 두 번째 단계는 각 숫자를 단항으로 변환하며 세 번째 단계는 총계를 취합니다.


2

Mathematica, 49 바이트

Tr@Array[Tr@s[[;;#]]&,Length[s=IntegerDigits@#]]&

숫자 목록으로 입력을 취할 수 있습니다. #.Range[Length@#,1,-1]&
alephalpha

@alephalpha의 솔루션 개선 :#.Range[Tr[1^#],1,-1]&
JungHwan Min

Tr@*Accumulate
alephalpha


2

자바 8, 53 바이트

허용되는 각 입력 유형마다 람다를 구현했습니다. 그들은 각각 숫자의 숫자를 반복하여 각 배수를 누산기에 추가합니다.

입력으로서의 정수 (53 바이트)

에서 람다 IntegerInteger:

n->{int s=0,i=1;for(;n>0;n/=10)s+=n%10*i++;return s;}

입력으로 문자열 표현 (72 바이트)

에서 람다 StringInteger:

s->{int l=s.length(),n=0;for(int b:s.getBytes())n+=(b-48)*l--;return n;}

입력으로서의 자릿수 배열 (54 바이트)

람다 int[](자리수, 가장 큰 장소 값부터)까지 Integer:

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • Olivier Grégoire 덕분에 -7 바이트

1
a-> {int l = a.length, s = 0; for (int n : a) s + = n * l-; return s;} 배열 버전의 경우 54 바이트입니다.
Olivier Grégoire

2

Pyt , 9 6 바이트

ąĐŁř↔·

설명:

                 Implicit input
ą                Convert to array of digits
 Đ               Duplicate digit array
   Łř↔           Create a new array [len(array),len(array)-1,...,1]
      ·          Dot product with digit array
                 Implicit output

2

파이썬 3, 94 58 54 바이트

Mr. Xcoder 에게 감사합니다꽤 많은 바이트를 절약 할 수 있도록 도와 준 에게 합니다!

lambda n:sum(int(v)*(len(n)-i)for i,v in enumerate(n))

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

입력을 문자열로받습니다. 단순히 각 숫자에 더해야 할 횟수를 곱하고 합계를 반환합니다.


좋은 첫 번째 대답이지만 불필요한 공백을 제거하고 모든 변수 / 함수 이름을 1 바이트 길이로 만들어 제출을 심각한 경쟁자로 만드십시오. 69 바이트
Mr. Xcoder


@ Mr.Xcoder 감사합니다. 나는 그것을 명심할 것이다.
Manish Kundu

1
항상로 호출한다고 가정하지 않을 수도 있습니다0 . 경우 p반드시이 항상 0, 당신은 교체해야 pp=0에서 lambda선언. 그러나 54 바이트p 를 얻기 위해 완전히 제거 할 수 있습니다
caird coinheringaahing


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.