Segitiga angka!


28

Kita terbiasa dengan istilah "kuadrat" n yang berarti menghitung n 2 . Kita juga terbiasa dengan istilah "cubing" n berarti n 3 . Yang sedang berkata, mengapa kita tidak bisa juga segitiga angka?

Bagaimana cara membuat segitiga suatu angka?

  • Pertama, mari kita pilih nomor 53716,.

  • Posisikan dalam jajaran genjang, yang panjang sisinya sama dengan jumlah digit angka, dan memiliki dua sisi yang diposisikan secara diagonal, seperti yang ditunjukkan di bawah ini.

        53716
       53716
      53716
     53716
    53716
    
  • Sekarang, kami ingin ∆ kan? Untuk melakukannya, potong sisi-sisi yang tidak masuk ke dalam segitiga siku-siku:

        5
       53
      537
     5371
    53716
    
  • Ambil jumlah setiap baris, untuk contoh ini menghasilkan [5, 8, 15, 16, 22]:

        5 -> 5
       53 -> 8
      537 -> 15
     5371 -> 16
    53716 -> 22
    
  • Jumlahkan daftar [5, 8, 15, 16, 22], menghasilkan 66. Ini adalah segitiga dari angka ini!

Spesifikasi & Aturan

  • Input akan berupa bilangan bulat non-negatif n ( n ≥ 0, n ∈ Z ).

  • Anda dapat mengambil input dan memberikan output dengan cara apa pun yang diizinkan .

  • Input dapat diformat sebagai integer, representasi string dari integer, atau daftar digit.

  • Celah default tidak diizinkan.

  • Ini adalah , jadi kode terpendek dalam byte menang!

Lebih Banyak Kasus Uji

Input -> Output

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

Inspirasi. Penjelasan didorong!


Apakah Anda yakin bahwa 645321 -> 91?
Rod

@ Maaf, kamu benar. Saya 645321malah menulis 654321.
Tn. Xcoder

1
Bisakah saya mengambil input sebagai daftar digit?
totallyhuman

@ sebenarnya manusia, lihat spec kedua.
Tn. Xcoder

1
Tantangan yang menarik. Senang Anda terinspirasi oleh saya!
Gryphon - Reinstate Monica

Jawaban:




12

Brain-Flak , 65, 50, 36 byte

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

Cobalah online!

Setelah banyak merevisi, saya sekarang sangat bangga dengan jawaban ini. Saya suka algoritme, dan betapa bagusnya bisa diekspresikan dalam brain-flak.

Sebagian besar jumlah byte berasal dari penanganan 0 pada input. Bahkan, jika kita bisa berasumsi tidak ada 0 di input, itu akan menjadi jawaban 20 byte pendek yang indah:

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

Cobalah online!

Namun sayangnya, brain-flak terkenal karena penanganan kasus tepi yang buruk.

Penjelasan

Pertama, pengamatan saya:

Jika input panjang n digit, digit pertama akan muncul di segitiga n kali, digit kedua akan muncul n-1 kali, dan seterusnya ke digit terakhir, yang akan muncul sekali. Kita dapat mengambil keuntungan dari ini, karena sangat mudah untuk menghitung berapa banyak digit input yang tersisa di brain-flak, yaitu

[]

Jadi, inilah cara kerjanya.

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

Tip saya di sini dapat menghemat dua byte
Wheat Wizard





7

Japt , 7 6 4 byte

å+ x

Cobalah online!

Penjelasan

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

Solusi lama:

å+ ¬¬x

Cobalah online!

Penjelasan

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

Kotak pasir banyak? Atau Anda membaca pertanyaan, menulis kode, dan memposting semuanya dalam satu menit ?!
Jonathan Allan

@ JonathanAllan Ini bukan kotak pasir. Ini jauh lebih mudah daripada yang Anda kira.
Tn. Xcoder

1
Eh, ya saya bahkan tidak bisa membaca pertanyaan pada waktu yang dibutuhkan
Jonathan Allan

@ JonathanAllan Tidak ada kotak pasir membaca, kebetulan menangkap pertanyaan tepat setelah itu diposting dan muncul dengan algoritma segera.
ETHproduk

Welp butuh saya ~ 4 menit untuk membaca pertanyaan, jadi +1 untuk membaca cepat / memahami kecepatan :)
Jonathan Allan

7

Brain-Flak , 28 byte

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

Cobalah online!

14 byte jika kita tidak perlu mendukung nol (yang kita lakukan)

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

Cobalah online!

DJMcMayhem punya jawaban keren di sini Anda harus memeriksa. Sayangnya untuknya saya tidak akan membiarkan dia menang dalam bahasanya sendiri: P.

Bagaimana cara kerjanya?

Mari kita mulai dengan versi sederhana.

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

Tindakan utama di sini adalah ({}<>{})<>, yang mengambil bagian atas tumpukan kiri dan menambah ke atas tumpukan kanan. Dengan mengulangi operasi ini, kami menjumlahkan tumpukan saat ini (sampai menyentuh nol) menempatkan jumlah pada tumpukan off. Itu cukup biasa, bagian yang menarik adalah bahwa kita merangkum hasil dari semua ini berjalan sebagai hasil kita. Ini akan menghitung nilai yang diinginkan. Mengapa? Mari kita lihat sebuah contoh 123,. Pada ambil pertama kita hanya mendapatkan 1 sehingga nilai kita adalah 1

1

Pada ambil berikutnya kita mengembalikan 1 ditambah 2

1
1+2

Pada putaran terakhir kita memiliki ketiganya bersama

1
1+2
1+2+3

Apakah Anda melihat segitiga? Jumlah semua run adalah "segitiga" dari daftar.


Ok tapi sekarang kita perlu untuk bekerja untuk nol, di sini saya menggunakan trik yang sama dengan DJMcMayhem, ditambah beberapa gerak kaki mewah. Alih-alih mengulang sampai kita mencapai nol kita mengulang sampai tumpukan kosong.

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

Saya kemudian menggunakan tip ini , yang ditulis oleh orang lain, untuk membuat 2 byte lagi.

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

Dan di sana kita memilikinya. Saya akan terkejut jika ada solusi yang lebih pendek, tetapi sekali lagi hal-hal aneh telah terjadi.


Unfortunately for him I wasn't about to let him win at his own language :PSaya berharap tidak kurang dari Anda. : D
DJMcMayhem

6

JavaScript (ES6), 28 byte

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

Mengambil input sebagai daftar digit.


5

Python 3 , 37 byte

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

Cobalah online!


5
... Mengapa downvote?
Bisnis Cat

Saya pikir Anda bisa mengubah lenuntuk sumjuga, meskipun saya tidak percaya yang membantu apa-apa.
ETHproduk

@ ETProduk Ya. Saya berharap saya bisa memanfaatkan fakta yang sum([])0, tapi tidak ada yang datang bersama-sama ... mungkin ada cara
Bisnis Cat

Tidak melihat ini kalau tidak saya akan memberi Anda peningkatan saya.
Jonathan Allan

@JonathanAllan Jangan khawatir: P
Business Cat

5

C # (.NET Core) , 59 byte

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

Cobalah online!

Secara substansial berbeda dari jawaban C # lainnya. Input adalah daftar digit. Semua kasus uji termasuk dalam tautan TIO.

Dapat menyimpan banyak byte jika diizinkan untuk mengambil input sebagai daftar angka di belakang dengan angka 0.


Ide bagus! Beberapa codegolfing sengit di C #.
Grzegorz Puławski

Solusi bagus! Tetapi bukankah input yang ditentukan bukan-negatif number, bukan daftar digit?
Ian H.

@IanH. Aturan 2: Anda dapat mengambil input dan memberikan output dengan cara apa pun yang diizinkan. Ketika datang ke format, Anda dapat mengambil input sebagai integer, sebagai representasi String dari integer atau sebagai daftar digit.
Kamil Drakari


4

J , 7 byte

[:+/+/\

Cobalah online! Mengambil daftar angka, sepertif 6 5 4 3 2 1 .

Penjelasan

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

Sedikit lebih benar untuk masalah aslinya [:+/@,]/, yaitu "jumlah" +/( ,) awalan rata ( ) dari input ( ]\).


4

Vim , 60 59 32 penekanan tombol

Terima kasih banyak @CowsQuack untuk tip dengan makro rekursif dan htriknya, ini menyelamatkan saya 27 byte!

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

Cobalah online!

Tidak Dijelaskan / Dijelaskan

Ini akan membangun segitiga seperti yang dijelaskan (hanya itu yang membuatnya tetap rata):

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

Buffer terlihat seperti ini:

53716
5371
537
53
5

Gabungkan semua baris menjadi satu dan buat ekspresi yang dapat dievaluasi darinya:

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

The "daftar sekarang berisi string berikut (catatan hilang 0):

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

Jadi yang perlu kita lakukan adalah menambahkan nol dan mengevaluasinya:

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

di dalam vim


Anda dapat menggunakan &(seluruh pertandingan) alih-alih \1dalam perintah pengganti
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎bisa menjadi qqYp$xh@qq@q. Makro rekursif ini akan mengalami kesalahan pemecahan ketika ada satu karakter di telepon, setelah itu akan berhenti.
Kritixi Lithos

Jadi substitusi bisa menjadi begitu saja :s/./&+/g. Juga :%j⏎bisa menjadi V{J. Dan, Dibisa menjadi C(saya sudah berkomentar tentang ini di salah satu jawaban Vim Anda). Cobalah online!
Kritixi Lithos


3

Utilitas Bash + GNU, 32 24

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

Masukan dibaca dari STDIN.

Pembaruan: Saya melihat input dapat diberikan sebagai daftar angka. Daftar input saya dibatasi-baris baru.

Cobalah online .

Penjelasan

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

+/+\

Ini mengambil input sebagai daftar digit, misalnya:

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

Penjelasan

+/    sum of
  +\  partial sums of input

3

Taksi , 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.

Cobalah online!

Tidak golf:

[ 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}{

Cobalah online!

Bagaimana?

$ \ memegang total kumulatif, $ p memegang total digit pada baris saat ini. Setiap baris jajaran genjang hanyalah garis sebelumnya dengan digit nomor berikutnya ditambahkan. Oleh karena itu, ini adalah jumlah dari baris sebelumnya ditambah digit baru. Ini mengulangi semua digit, menghitung jumlah saat berjalan. Substitusi yang sebenarnya tidak relevan; itu hanya sarana untuk beralih pada digit tanpa membuat loop yang sebenarnya. Pada akhirnya, $ \ dicetak secara implisit oleh -popsi.



2

Jelly ,  5  4 byte

Ṛæ.J

Tautan monadik yang mengambil daftar angka desimal dan mengembalikan segitiga dari angka yang diwakili oleh daftar.

Cobalah online!

Bagaimana?

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

Saya pikir menghapus masih akan bekerja. Kasihan ...
ETHproduk

@ ETHproductions ... namun ada built-in untuk membantu!
Jonathan Allan

... oke, wow ...
ETHproduk

@ETHproductions ooops harus membalikkannya> _ <
Jonathan Allan

2

Retina , 13 byte

.
$`$&
.
$*
1

Cobalah online! Tautan termasuk kasus uji. Penjelasan: Tahap pertama menghasilkan semua awalan dari angka asli, tahap kedua mengubah setiap digit menjadi unary, dan tahap ketiga mengambil total.


2

Mathematica, 49 byte

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

Anda dapat mengambil input sebagai daftar digit. #.Range[Length@#,1,-1]&
alephalpha

Solusi Meningkatkan @alephalpha:#.Range[Tr[1^#],1,-1]&
JungHwan Min

Tr@*Accumulate
alephalpha

2

Neim , 3 byte

𝐗𝐂𝐬

Penjelasan:

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

Cobalah online!

Jawaban alternatif:

𝐗𝐣𝐬

Penjelasan:

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

Cobalah online!


2

Java 8, 53 byte

Saya menerapkan lambda untuk setiap jenis input yang dapat diterima. Mereka masing-masing beralih melalui angka angka, menambahkan kelipatan masing-masing ke akumulator.

Integer sebagai input (53 byte)

Lambda dari Integerke Integer:

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

Representasi string sebagai input (72 byte)

Lambda dari Stringke Integer:

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

Digit array sebagai input (54 byte)

Lambda dari int[](digit, nilai tempat terbesar pertama) ke Integer:

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

1
a -> {int l = a.length, s = 0; untuk (int n: a) s + = n * l -; return s;} 54 byte untuk versi array.
Olivier Grégoire

2

Pyt , 9 6 byte

ąĐŁř↔·

Penjelasan:

                 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

Terima kasih kepada Tn. Xcoder karena membantu saya menghemat beberapa byte!

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

Cobalah secara Online!

Mengambil input sebagai string. Ini hanya mengalikan setiap digit dengan berapa kali perlu ditambahkan dan mengembalikan jumlah mereka.


Jawaban pertama yang bagus, tapi tolong buat kiriman Anda sebagai pesaing serius dengan menghapus spasi yang tidak perlu, dan buat semua nama variabel / fungsi sepanjang 1 byte. 69 byte
Tn. Xcoder


@ Mr.Xcoder Terima kasih. Saya akan mengingatnya.
Manish Kundu

1
Anda tidak boleh berasumsi bahwa itu akan selalu dipanggil dengan0 . Jika pharus selalu 0, Anda harus mengganti pdengan p=0dalam lambdadeklarasi. Namun, Anda bisa menghapus pseluruhnya untuk mendapatkan 54 byte
caird coinheringaahing


2

Common Lisp, 53 52 byte

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

Input sebagai daftar digit.

Cobalah online!

-1 byte terima kasih kepada @ceilingcat.


@ceilingcat, beberapa kompiler Lisp Umum benar-benar akan gagal ketika applyditerapkan terhadap daftar yang sangat panjang karena call-arguments-limit.
Renzo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.