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]
, menghasilkan66
. 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 kode-golf , 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!
sumber
645321 -> 91
?645321
malah menulis654321
.Jawaban:
Haskell , 13 byte
Cobalah online!
Mengambil input sebagai daftar digit. Hitung jumlah kumulatif lalu jumlahkan.
sumber
Sekam ,
4̷2 byteTerima kasih @ H.Wiz untuk
-2
byte!Cobalah online!
"Tidak Disatukan" / Dijelaskan
sumber
Brain-Flak ,
65, 50,36 byteCobalah 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.
sumber
Pyth -
64 byteCobalah online di sini .
Bagus 6 byte yang tidak menggunakan awalan builtin:
sumber
s.e*bhk_
MATL , 3 byte
Cobalah online!
Mengambil input sebagai daftar digit.
sumber
Jelly , 3 byte
Cobalah online! Menggunakan teknik yang sama dengan jawaban Japt saya: penambahan kumulatif, lalu jumlah.
sumber
Haskell , 25 byte
Mengambil input sebagai daftar digit
Cobalah online!
Haskell , 41 byte
Mengambil input sebagai representasi string
Cobalah online!
sumber
Japt ,
764 byteCobalah online!
Penjelasan
Solusi lama:
Cobalah online!
Penjelasan
sumber
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 contoh123
,. Pada ambil pertama kita hanya mendapatkan 1 sehingga nilai kita adalah 1Pada ambil berikutnya kita mengembalikan 1 ditambah 2
Pada putaran terakhir kita memiliki ketiganya bersama
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.
sumber
Unfortunately for him I wasn't about to let him win at his own language :P
Saya berharap tidak kurang dari Anda. : DJavaScript (ES6), 28 byte
Mengambil input sebagai daftar digit.
sumber
Python 3 , 37 byte
Cobalah online!
sumber
len
untuksum
juga, meskipun saya tidak percaya yang membantu apa-apa.sum([])
0, tapi tidak ada yang datang bersama-sama ... mungkin ada caraC # (.NET Core) , 59 byte
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.
sumber
number
, bukan daftar digit?Python 3 , 35 byte
Saya hanya memperhatikan bahwa ini hanyalah sedikit jawaban dari jawaban Business Cat pada akhirnya!
Cobalah online!
sumber
J , 7 byte
Cobalah online! Mengambil daftar angka, seperti
f 6 5 4 3 2 1
.Penjelasan
Sedikit lebih benar untuk masalah aslinya
[:+/@,]/
, yaitu "jumlah"+/
(,
) awalan rata ( ) dari input (]\
).sumber
Vim ,
605932 penekanan tombolTerima kasih banyak @CowsQuack untuk tip dengan makro rekursif dan
h
triknya, ini menyelamatkan saya 27 byte!Cobalah online!
Tidak Dijelaskan / Dijelaskan
Ini akan membangun segitiga seperti yang dijelaskan (hanya itu yang membuatnya tetap rata):
Buffer terlihat seperti ini:
Gabungkan semua baris menjadi satu dan buat ekspresi yang dapat dievaluasi darinya:
The
"
daftar sekarang berisi string berikut (catatan hilang 0):Jadi yang perlu kita lakukan adalah menambahkan nol dan mengevaluasinya:
sumber
&
(seluruh pertandingan) alih-alih\1
dalam perintah penggantiqqYp$xq:exe"norm".col('.')."@q"⏎
bisa menjadiqqYp$xh@qq@q
. Makro rekursif ini akan mengalami kesalahan pemecahan ketika ada satu karakter di telepon, setelah itu akan berhenti.:s/./&+/g
. Juga:%j⏎
bisa menjadiV{J
. Dan,Di
bisa menjadiC
(saya sudah berkomentar tentang ini di salah satu jawaban Vim Anda). Cobalah online!Python 2 ,
4945 byte-4 byte terima kasih kepada Tn. Xcoder.
Cobalah online!
Mengambil input sebagai daftar digit.
sumber
Utilitas Bash + GNU,
3224Masukan dibaca dari STDIN.
Pembaruan: Saya melihat input dapat diberikan sebagai daftar angka. Daftar input saya dibatasi-baris baru.
Cobalah online .
Penjelasan
sumber
APL, 4 byte
Ini mengambil input sebagai daftar digit, misalnya:
Penjelasan
sumber
Taksi , 1478 byte
Cobalah online!
Tidak golf:
sumber
Perl 5 , 19 + 1 (
-p
) = 20 byteCobalah 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
-p
opsi.sumber
Python 2 , 56 byte
Cobalah online!
sumber
Jelly ,
54 byteTautan monadik yang mengambil daftar angka desimal dan mengembalikan segitiga dari angka yang diwakili oleh daftar.
Cobalah online!
Bagaimana?
sumber
€
masih akan bekerja. Kasihan ...Retina , 13 byte
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.
sumber
Mathematica, 49 byte
sumber
#.Range[Length@#,1,-1]&
#.Range[Tr[1^#],1,-1]&
Tr@*Accumulate
Neim , 3 byte
Penjelasan:
Cobalah online!
Jawaban alternatif:
Penjelasan:
Cobalah online!
sumber
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
Integer
keInteger
:Representasi string sebagai input (72 byte)
Lambda dari
String
keInteger
:Digit array sebagai input (54 byte)
Lambda dari
int[]
(digit, nilai tempat terbesar pertama) keInteger
:sumber
Pyt ,
96 bytePenjelasan:
sumber
Python 3,
945854 byteTerima kasih kepada Tn. Xcoder karena membantu saya menghemat beberapa byte!
Cobalah secara Online!
Mengambil input sebagai string. Ini hanya mengalikan setiap digit dengan berapa kali perlu ditambahkan dan mengembalikan jumlah mereka.
sumber
0
. Jikap
harus selalu0
, Anda harus menggantip
denganp=0
dalamlambda
deklarasi. Namun, Anda bisa menghapusp
seluruhnya untuk mendapatkan 54 byteSNOBOL4 (CSNOBOL4) , 79 byte
Cobalah online!
Input dari stdin, output ke stdout.
sumber
Common Lisp,
5352 byteInput sebagai daftar digit.
Cobalah online!
-1 byte terima kasih kepada @ceilingcat.
sumber
apply
diterapkan terhadap daftar yang sangat panjang karenacall-arguments-limit
.