Tam giác một số!


28

Chúng ta đã quen với thuật ngữ "bình phương" n có nghĩa là tính n 2 . Chúng ta cũng quen với thuật ngữ "cubing" n có nghĩa là n 3 . Điều đó đang được nói, tại sao chúng ta cũng không thể tam giác một số?

Làm thế nào để tam giác một số?

  • Trước hết, hãy chọn một số , 53716.

  • Đặt nó trong một hình bình hành, có chiều dài cạnh bằng số chữ số của số và có hai cạnh được định vị theo đường chéo, như hình dưới đây.

        53716
       53716
      53716
     53716
    53716
    
  • Bây giờ, chúng tôi muốn ∆ nó, phải không? Để làm như vậy, cắt các cạnh không khớp với hình tam giác vuông:

        5
       53
      537
     5371
    53716
    
  • Lấy tổng của mỗi hàng, cho ví dụ này dẫn đến [5, 8, 15, 16, 22]:

        5 -> 5
       53 -> 8
      537 -> 15
     5371 -> 16
    53716 -> 22
    
  • Tổng hợp danh sách [5, 8, 15, 16, 22], kết quả là 66. Đây là tam giác của số này!

Thông số kỹ thuật

  • Đầu vào sẽ là số nguyên không âm n ( n ≥ 0, n Z ).

  • Bạn có thể lấy đầu vào và cung cấp đầu ra bằng bất kỳ phương tiện được phép nào .

  • Đầu vào có thể được định dạng dưới dạng số nguyên, biểu diễn chuỗi của số nguyên hoặc danh sách các chữ số.

  • Lỗ hổng mặc định không được phép.

  • Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Thêm trường hợp kiểm tra

Đầu vào -> Đầu ra

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

Cảm hứng. Giải thích được khuyến khích!


bạn có chắc 645321 -> 91không
Rod

@Rod Xin lỗi, bạn nói đúng. Tôi đã viết 645321thay vì 654321.
Ông Xcoder

1
Tôi có thể lấy đầu vào làm danh sách các chữ số không?
hoàn toàn là

@totallyhuman Vâng, xem thông số kỹ thuật thứ hai.
Ông Xcoder

1
Thử thách thú vị. Vui mừng bạn đã được truyền cảm hứng của tôi!
Gryphon - Phục hồi Monica

Câu trả lời:




12

Brain-Flak , 65, 50, 36 byte

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

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

Sau rất nhiều lần sửa đổi, giờ tôi rất tự hào về câu trả lời này. Tôi thích thuật toán này, và nó có thể được thể hiện độc đáo như thế nào trong bộ não.

Hầu hết số byte đến từ việc xử lý 0 trong đầu vào. Trong thực tế, nếu chúng ta có thể giả sử không có 0 trong đầu vào, thì đó sẽ là một câu trả lời 20 byte ngắn đẹp mắt:

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

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

Nhưng thật không may, flak não nổi tiếng với việc xử lý xấu các trường hợp cạnh.

Giải trình

Đầu tiên, một quan sát của tôi:

Nếu đầu vào dài n chữ số, chữ số đầu tiên sẽ xuất hiện trong tam giác n lần, chữ số thứ hai sẽ xuất hiện n-1 lần, và cứ thế vào chữ số cuối cùng, sẽ xuất hiện một lần. Chúng ta có thể tận dụng lợi thế này, vì thực sự dễ dàng để tính toán có bao nhiêu chữ số đầu vào còn lại trong não bộ, cụ thể là

[]

Vì vậy, đây là cách mã hoạt động.

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

Mẹo của tôi ở đây có thể giúp bạn tiết kiệm hai byte
Wheat Wizard





7

Japt , 7 6 4 byte

å+ x

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

Giải trình

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

Giải pháp cũ:

å+ ¬¬x

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

Giải trình

å+ ¬¬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

Uh sandbox nhiều? Hoặc bạn đọc câu hỏi, viết mã và đăng tất cả trong vòng một phút?!
Jonathan Allan

@Jonathan ALLan Đây không phải là hộp cát. Nó dễ dàng hơn nhiều so với bạn nghĩ.
Ông Xcoder

1
Uh, tôi thậm chí không thể đọc câu hỏi trong thời gian đó
Jonathan Allan

@Jonathan ALLan Không đọc hộp cát, chỉ tình cờ bắt được câu hỏi ngay sau khi được đăng và đưa ra thuật toán gần như ngay lập tức.
Sản xuất

Giúp tôi mất ~ 4 phút để đọc câu hỏi, vì vậy +1 để đọc tốc độ / hiểu tốc độ :)
Jonathan Allan

7

Brain-Flak , 28 byte

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

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

14 byte nếu chúng ta không cần hỗ trợ các số không (mà chúng ta làm)

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

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

DJMcMayhem có một câu trả lời thú vị ở đây bạn nên kiểm tra. Thật không may cho anh ta, tôi đã không để anh ta chiến thắng bằng ngôn ngữ của mình: P

Làm thế nào nó hoạt động?

Hãy bắt đầu với phiên bản đơn giản.

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

Hành động chính ở đây là ({}<>{})<>, lấy đỉnh của ngăn xếp bên trái và thêm vào đầu ngăn xếp bên phải. Bằng cách lặp lại thao tác này, chúng tôi tổng hợp ngăn xếp hiện tại (cho đến khi nó về 0) đặt tổng số trên ngăn xếp tắt. Điều đó khá trần tục, phần thú vị là chúng tôi tổng hợp kết quả của tất cả những lần chạy này là kết quả của chúng tôi. Điều này sẽ tính giá trị mong muốn. Tại sao? Vâng, hãy xem một ví dụ , 123. Trong lần lấy đầu tiên, chúng tôi chỉ nhận được 1 vì vậy giá trị của chúng tôi là 1

1

Trong lần lấy tiếp theo, chúng tôi trả lại 1 cộng với 2

1
1+2

Trên đường chạy cuối cùng, chúng ta có cả ba cùng nhau

1
1+2
1+2+3

Bạn có thấy hình tam giác không? Tổng của tất cả các lần chạy là "tam giác" của danh sách.


Ok nhưng bây giờ chúng tôi cần nó để làm việc cho số không, ở đây tôi đã sử dụng thủ thuật tương tự như DJMcMayhem, cộng với một số bước chân lạ mắt. Thay vì lặp cho đến khi chúng tôi đạt đến số 0, chúng tôi lặp cho đến khi ngăn xếp trống.

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

Sau đó, tôi đã sử dụng mẹo này , được viết bởi không ai khác ngoài bạn thực sự, để đánh golf thêm 2 byte.

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

Và chúng tôi đã có nó. Tôi sẽ ngạc nhiên nếu có một giải pháp ngắn hơn, nhưng sau đó một lần nữa những điều kỳ lạ đã xảy ra.


Unfortunately for him I wasn't about to let him win at his own language :PTôi không mong đợi gì từ bạn. : D
DJMcMayhem


5

Python 3 , 37 byte

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

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


5
... Tại sao các downvote?
Mèo kinh doanh

Tôi nghĩ rằng bạn có thể thay đổi lenđể sumlà tốt, mặc dù tôi không tin rằng bất cứ điều gì giúp.
Sản phẩm ETH

@ETHproductions Vâng. Tôi đã hy vọng tôi có thể sử dụng thực tế sum([])là 0, nhưng không có gì hoàn toàn kết hợp với nhau ... có thể có một cách mặc dù
Business Cat

Không thấy điều này nếu không tôi đã cho bạn sự cải thiện của tôi.
Jonathan Allan

@Jonathan ALLan Không phải lo lắng: P
Business Cat

5

C # (.NET Core) , 59 byte

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

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

Thực chất khác với các câu trả lời C # khác. Đầu vào là một danh sách các chữ số. Tất cả các trường hợp thử nghiệm có trong liên kết TIO.

Có thể lưu một loạt byte nếu được phép lấy đầu vào làm danh sách các chữ số ngược với số 0 đứng đầu.


Ý kiến ​​hay! Một số mã hóa dữ dội trong C #.
Grzegorz Puławski

Giải pháp tốt đẹp! Nhưng không phải đầu vào được chỉ định là không âm number, không phải là danh sách các chữ số?
Ian H.

@IanH. Quy tắc 2: Bạn có thể lấy đầu vào và cung cấp đầu ra theo bất kỳ giá trị trung bình được phép nào. Khi nói đến định dạng, bạn có thể lấy đầu vào làm số nguyên, dưới dạng biểu diễn Chuỗi của số nguyên hoặc làm danh sách các chữ số.
Kamil Drakari


4

J , 7 byte

[:+/+/\

Hãy thử trực tuyến! Có một danh sách các chữ số, chẳng hạn như f 6 5 4 3 2 1.

Giải trình

[:+/+/\    (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

Đúng hơn một chút với vấn đề ban đầu sẽ [:+/@,]/là "tổng" +/( ,) tiền tố dẹt ( ) của đầu vào ( ]\).


4

Vim , 60 59 32 tổ hợp phím

Cảm ơn rất nhiều @CowsQuack về mẹo với macro đệ quy và hmẹo, điều này đã tiết kiệm cho tôi 27 byte!

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

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

Ungolfed / Giải thích

Điều này sẽ xây dựng hình tam giác như được mô tả (chỉ có điều nó giữ cho nó được căn trái):

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

Bộ đệm trông như thế này:

53716
5371
537
53
5

Nối tất cả các dòng thành một và xây dựng một biểu thức có thể đánh giá từ nó:

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

Thanh "ghi hiện chứa chuỗi sau (ghi chú thiếu 0):

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

Vì vậy, tất cả những gì chúng ta cần làm là nối số 0 và đánh giá nó:

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

bên trong vim


Bạn có thể sử dụng &(toàn bộ trận đấu) thay vì \1trong lệnh thay thế
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎có thể trở thành qqYp$xh@qq@q. Macro đệ quy này sẽ gặp lỗi phá vỡ khi có một ký tự trên dòng, sau đó nó sẽ dừng lại.
Kritixi Lithos

Vì vậy, sự thay thế chỉ có thể trở thành :s/./&+/g. Cũng :%j⏎có thể trở thành V{J. Và, Dicó thể trở thành C(Tôi đã nhận xét về điều này trong một câu trả lời Vim khác của bạn). Hãy thử trực tuyến!
Kritixi Lithos


3

Tiện ích Bash + GNU, 32 24

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

Đầu vào đọc từ STDIN.

Cập nhật: Tôi thấy đầu vào có thể được đưa ra dưới dạng danh sách các chữ số. Danh sách đầu vào của tôi là giới hạn dòng mới.

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

Giải trình

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 byte

+/+\

Cái này lấy đầu vào là một danh sách các chữ số, vd:

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

Giải trình

+/    sum of
  +\  partial sums of input

3

Taxi , 1478 byte

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.

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

Chưa chơi gôn:

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

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

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

Làm sao?

$ \ giữ tổng số tích lũy, $ p giữ tổng số các chữ số trên dòng hiện tại. Mỗi dòng của hình bình hành chỉ đơn giản là dòng trước đó với chữ số tiếp theo của số được nối thêm. Do đó, nó là tổng của dòng trước đó cộng với chữ số mới. Điều này lặp đi lặp lại trên tất cả các chữ số, tính toán các khoản tiền khi nó đi. Sự thay thế thực tế là không liên quan; nó chỉ là một phương tiện để lặp lại các chữ số mà không tạo ra một vòng lặp thực sự. Cuối cùng, $ \ được in ngầm bởi -ptùy chọn.



2

Thạch ,  5  4 byte

Ṛæ.J

Một liên kết đơn âm lấy một danh sách các chữ số thập phân và trả về tam giác của số mà danh sách đó đại diện.

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

Làm sao?

Ṛæ.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

Tôi đã nghĩ loại bỏ vẫn sẽ làm việc. Đáng tiếc ...
Sản phẩm ETH

@ETHproductions ... nhưng vẫn có sẵn để trợ giúp!
Jonathan Allan

... được rồi, wow ...
Sản phẩm ETH

@ETHproductions ooops đã phải đảo ngược nó> _ <
Jonathan Allan

2

Võng mạc , 13 byte

.
$`$&
.
$*
1

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải thích: Giai đoạn đầu tiên tạo ra tất cả các tiền tố của số ban đầu, giai đoạn thứ hai chuyển đổi từng chữ số thành đơn vị và giai đoạn thứ ba lấy tổng số.


2

Toán học, 49 byte

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

Bạn có thể lấy đầu vào là một danh sách các chữ số. #.Range[Length@#,1,-1]&
alephalpha

Cải thiện giải pháp của @alephalpha:#.Range[Tr[1^#],1,-1]&
JungHwan Min

Tr@*Accumulate
alephalpha

2

Neim , 3 byte

𝐗𝐂𝐬

Giải trình:

𝐗        Get prefixes of input, including itself
 𝐂       Implicitly join elements together, and create an array with all the digits
  𝐬      Sum

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

Câu trả lời thay thế:

𝐗𝐣𝐬

Giải trình:

𝐗       Get prefixes of input, including itself
 𝐣       Join
  𝐬      Implicitly convert to a digit array, and sum

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


2

Java 8, 53 byte

Tôi đã triển khai lambda cho từng loại đầu vào chấp nhận được. Mỗi lần lặp lại thông qua các chữ số của số, thêm bội số thích hợp của từng số vào một bộ tích lũy.

Số nguyên làm đầu vào (53 byte)

Lambda từ Integerđến Integer:

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

Biểu diễn chuỗi dưới dạng đầu vào (72 byte)

Lambda từ Stringđến Integer:

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

Mảng chữ số làm đầu vào (54 byte)

Lambda từ int[](của các chữ số, giá trị vị trí lớn nhất đầu tiên) đến Integer:

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • -7 byte nhờ Olivier Grégoire

1
a -> {int l = a.length, s = 0; for (int n: a) s + = n * l -; return s;} 54 byte cho phiên bản mảng.
Olivier Grégoire

2

Pyt , 9 6 byte

ąĐŁř↔·

Giải trình:

                 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

Python 3, 94 58 54 byte

Cảm ơn ông Xcoder đã giúp tôi tiết kiệm khá nhiều byte!

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

Dùng thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi. Nó chỉ đơn giản là nhân mỗi chữ số với số lần cần thêm và trả về tổng của chúng.


Câu trả lời đầu tiên rất hay, nhưng vui lòng biến bài đăng của bạn thành một ứng cử viên nghiêm túc bằng cách xóa các khoảng trắng không cần thiết và làm cho tất cả các tên biến / hàm dài 1 byte. 69 byte
Ông Xcoder


@ Mr.Xcoder Cảm ơn. Tôi sẽ giữ cho rằng trong tâm trí.
Manish Kundu

1
Bạn có thể không cho rằng nó sẽ luôn được gọi với0 . Nếu pphải luôn luôn 0, bạn nên thay thế pbằng p=0trong lambdakhai báo. Tuy nhiên, bạn chỉ có thể xóa phoàn toàn để nhận 54 byte
caird coinheringaahing


2

Lisp thông thường, 53 52 byte

(loop as(x . y)on(reverse(read))sum(+(reduce'+ y)x))

Nhập dưới dạng danh sách các chữ số.

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

-1 byte nhờ @ceilingcat.


@ceilingcat, một số trình biên dịch Lisp thông thường sẽ thực sự thất bại khi applyđược áp dụng cho các danh sách rất dài vì call-arguments-limit.
Renzo
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.