Tantangan
Diberikan bilangan bulat positif, tentukan apakah itu bilangan segitiga, dan dengan demikian mengeluarkan salah satu dari dua nilai konstan dan berbeda.
Definisi
Angka segitiga adalah angka yang dapat dinyatakan sebagai jumlah dari bilangan bulat positif berturut-turut, dimulai dari 1. Mereka juga dapat dinyatakan dengan rumus n(n + 1) / 2
, di mana n
ada bilangan bulat positif.
Uji kasus
Benar:
1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991
Falsy:
2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999
Aturan
- Entri Anda mungkin fungsi atau program.
- Anda dapat berasumsi bahwa inputnya adalah bilangan bulat positif di bawah 10 6 .
- Anda harus memilih dua output konstan dan berbeda untuk membedakan kedua kategori.
Ini adalah kode-golf , jadi kode terpendek dalam byte di setiap bahasa menang.
code-golf
number
decision-problem
Produksi ETH
sumber
sumber
Jawaban:
Haskell , 23 byte
EDIT:
$
.Fungsi anonim mengambil
Int
dan mengembalikan aChar
.Output
'1'
untuk angka segitiga dan'0'
untuk yang lain.Cobalah online!
((!!)$show.(10^)=<<[0..]) 998991
.Menghasilkan angka 1, 10, 100, 1000, ..., mengonversinya menjadi string, dan menggabungkannya. Kemudian indeks ke dalam string tak terbatas yang dihasilkan
sumber
(!!)$show.(10^)=<<[0..]
.Python , 24 byte
Cobalah online!
Output
False
untuk angka segitiga,True
sisanya. Cek apakah8*n+1
kuadrat sempurna. Python akan mengambil kuadrat sempurna untuk mengapung float integer tidak peduli seberapa besar, jadi tidak ada masalah floating-point.sumber
(1<<10000)**.5
: OverflowError: int terlalu besar untuk dikonversi menjadi floatJelly , 4 byte
Cobalah online!
Bagaimana?
sumber
/
dan\
mungkin di antara lima quicks pertama yang akan diterapkan, mendahului ide untuk melemparkan argumen integer ke range.Retina , 10 byte
Masukan dalam bentuk unary. Output adalah
0
atau1
.Cobalah online! (Sebagai rangkaian uji coba yang melakukan konversi desimal ke unary untuk kenyamanan.)
Penjelasan
Ini adalah latihan paling mendasar dalam referensi ke depan. Kebanyakan orang terbiasa dengan referensi-ulang di regex, misalnya
(.)\1
untuk mencocokkan karakter yang diulang. Namun, beberapa dari rasa yang lebih maju memungkinkan Anda untuk menggunakan referensi balik sebelum atau di dalam grup yang dimaksud. Dalam hal ini, biasanya disebut referensi-maju. Ini masuk akal jika referensi diulang. Ini mungkin tidak didefinisikan dengan baik pada iterasi pertama, tetapi pada iterasi berikutnya, kelompok yang lebih baru atau sekitarnya telah menangkap sesuatu dan dapat digunakan kembali.Ini paling sering digunakan untuk menerapkan pola berulang pada string unary. Dalam hal ini, kami mencoba mencocokkan input sebagai jumlah dari bilangan bulat berturut-turut:
sumber
(^|1\1)+$
berhasil?+
ke{2,}
, itu harus berfungsi. Optimasi ini mencegah loop tak terbatas tetapi juga satu-satunya hal yang membuat .NET regex menjadi Turing-selesai sendiri.\G
!Python 2 , 25 byte
Cek apakah ( 8x +1 ) adalah angka kuadrat.
Cobalah online!
sumber
Mathematica, 16 byte
Pada dasarnya port dari solusi Python xnor . Output
True
untuk angka segitiga,False
jika tidak.sumber
JavaScript (ES6),
3027 byteDisimpan 2 byte berkat kamoroso94
Uji kasus
Tampilkan cuplikan kode
Versi non-rekursif (ES7), 19 byte
Jawaban Port of Adnan .
sumber
f=(n,k=1)=>n>0?f(n-k,k+1):!n
?k
.undefined
nilai awalnya ; hasil edit Anda adalah kesenangan untuk dibaca setelah saya secara mandiri tiba di solusi Anda sebelumnya.CJam , 11 byte
Output
1
untuk segitiga,0
jika tidak.Cobalah online!
Penjelasan
Pertimbangkan input
21
.sumber
Brain-Flak , 40 byte
Wheat Wizard dan saya berduel atas pertanyaan ini. Ketika kami memutuskan untuk memposting solusi kami, kami terikat pada 42 byte, tetapi saya menemukan 2 byte golf solusinya. Kami memutuskan bahwa akan dihitung sebagai pemutus dasi (solusi saya di bawah).
Cobalah online!
Penjelasan:
Untuk penjelasan lengkap silakan lihat jawaban Wheat Wizard .
Brain-Flak , 42 byte
Keluaran
0\n
(baris baru literal) untuk truey, dan string kosong untuk falsy.Idenya adalah untuk mengurangi 1 lalu 2 kemudian 3 sampai input. Jika Anda menekan 0, maka Anda tahu ini adalah angka segitiga, sehingga Anda bisa berhenti di situ.
Cobalah online! (jujur)
Cobalah online! (palsu)
Inilah solusi 46 byte yang menurut saya menarik.
Outputs
0\n
(baris baru literal) untuk truey, string kosong untuk falsy.Idenya adalah menghitung mundur dari input dengan angka berurutan, 1 pada satu waktu. Misalnya
input - (1) - (1,1) - (1,1,1)
. Setiap kali kita mengurangi, jika kita belum mencapai 0, kita meninggalkan nilai ekstra di stack. Dengan begitu, jika kita berada di 0 dan masih mengurangi ketika kita pop kita menghapus nilai terakhir pada stack. Jika inputnya berupa angka segitiga, kita akan berakhir tepat pada 0, dan tidak akan memunculkan 0.Cobalah online! jujur
Cobalah secara online! palsu
sumber
Jelly , 5 byte
Cobalah online!
Latar Belakang
Biarkan n menjadi input. Jika n adalah bilangan segitiga k , kita miliki
yang berarti akan ada solusi alami jika dan hanya jika 1 + 8n adalah kuadrat yang aneh dan sempurna. Jelas, memeriksa paritas 1 + 8n tidak diperlukan.
Bagaimana itu bekerja
sumber
PowerShell ,
3130 byteCobalah online!
Metode brute force yang bagus dan lambat. Buatlah array dari setiap jumlah 1 hingga 10 6 , dan lihat apakah argumennya ada di sana.
sumber
Brain-Flak , 42 byte
Cobalah online!
Penjelasan
Tujuan dari program ini adalah untuk membuat keadaan pada dua tumpukan dan melakukan operasi konstan pada kedua tumpukan sampai salah satu dari mereka nol, kita kemudian dapat output tergantung pada tumpukan kita berada. Ini mirip dengan program yang menentukan tanda angka. Program-program ini memakai
n
satu tumpukan dan-n
yang lain dan menambahkan satu dan beralih tumpukan sampai salah satu tumpukan adalah nol. Jika nomor itu negatif di tempat pertama tumpukan pertama akan mencapai nol, jika nomor itu positif tumpukan lainnya akan mencapai nol.Di sini kita membuat dua tumpukan yang mengurangi angka berurutan dari input dan satu yang hanya mengurangi satu. Yang mengurangkan angka berurutan hanya akan berakhir jika angkanya segitiga, (selain itu akan melewati nol dan terus ke negatif). Yang lain akan selalu berakhir untuk setiap angka positif, tetapi akan selalu melakukannya lebih lambat dari yang pertama, sehingga angka-angka non-segitiga akan berakhir pada tumpukan itu.
Jadi bagaimana kita mengatur tumpukan sehingga operasi yang sama mengurangi angka berturut-turut pada satu dan mengurangi satu di yang lain? Pada setiap tumpukan kita memiliki input di atas sehingga dalam dapat diperiksa, di bawah kita memiliki perbedaan dan di bawah itu kita memiliki perbedaan perbedaan. Setiap kali kita menjalankan, kita menambahkan "selisih perbedaan" ke "selisih" reguler dan kurangi dari input. Untuk stack yang memeriksa triangularity, kita atur double difference menjadi
1
sehingga kita mendapatkan integer berurutan setiap kali kita jalankan, untuk stack lain kita atur0
sehingga kita tidak pernah mengubah perbedaan, yang selalu tetap 1. Berikut ini adalah bagaimana tumpukan diatur di awal, di manan
input:Ketika kita akhirnya berhenti, kita dapat menggunakan perbedaan ini untuk memeriksa tumpukan mana kita berada, kita pop dua nilai teratas dan kita dapatkan
1
untuk nomor segitiga dan0
untuk nomor non-segitiga.Kode beranotasi
Berikut adalah solusi 50 byte yang saya suka juga.
Cobalah online!
sumber
Cubix , 23
2425byte0 untuk kebenaran dan tidak ada
0untuk falsey. Brute pasukan dengan menambah counter, menambah jumlah kumulatif dan membandingkan input.Sekarang untuk mencoba dan memasangnya di kubus 2x2x2.Melakukannya!Cobalah online!
/
Refleksikan ke wajah.I10\
dapatkan input integer, tekan 1 (penghitung), tekan 0 (jumlah) dan refleksikan+s;p-
lingkaran tubuh. Tambahkan penjumlahan dan penghitung, jatuhkan jumlah sebelumnya, tambah input dan kurangi?
Uji hasil pengurangan tersebut\.uO@
mencerminkan ke bawah, no-op, putar balik, output dan berhenti.@
berhenti;qWs)/su
, kurangi pengurangan drop kiri , masukkan input ke bawah, geser ke kiri, penghitung dan penjumlahan swap, penghitung kenaikan, pantulan, penukaran jumlah dan penghitung, putar-U ke badan loop utama.sumber
.
pada kubus tetapi1
dalam kode Anda.05AB1E ,
76 byteEDIT : Terima kasih kepada @ Dennis: Menyimpan satu byte karena saya lupa tentang operator kenaikan
Cobalah online!
n
adalah segitiga jikasqrt(8n + 1)
bilangan bulatBagaimana itu bekerja
sumber
t.ï
bisa jadiŲ
hari ini, yang merupakan builtin untuk memeriksa apakah angka adalah persegi.Perl 6 , 17 byte
Hanya memeriksa apakah
$_
, input ke fungsi, sama dengan salah satu elemen pengurangan penambahan segitiga(1, 1+2, ..., 1+2+...+$_)
.sumber
Alice ,
3822 byteBanyak byte yang disimpan berkat Martin dan Leo
Ada baris baru yang tertinggal. Output
1
untuk segitiga,0
jika tidak.Cobalah online!
Penjelasan
Ini menggunakan pendekatan yang sama dengan jawaban CJam saya , hanya clumsier. Dalam bentuk linier, program menjadi
di mana
i
dano
sebenarnya dalam mode ordinal.Pertimbangkan input
21
sebagai contoh.sumber
...h*-no@
)Japt ,
107 byteDisimpan 3 byte berkat @Luke dan @ETHproduksi
Cobalah online!
Penjelasan:
Penjelasan:
Cobalah online!
sumber
*8Ä ¬u1 c
untuk 9B (menghasilkan 0 jika input berbentuk segitiga, 1 jika tidak)u1 c
menjadiv1
, saya percaya (mengganti output)R ,
2319 bytePendekatan serupa dengan jawaban lain. Cek untuk melihat apakah
8x+1
kotak yang sempurna.-4 byte terima kasih Giuseppe dan MickyT.
Cobalah online!
sumber
!
sebagai ganti==0
!(8*scan()+1)^.5%%1
MATL , 5 byte
Cobalah online!
Penjelasan:
sumber
t:Ys=a
. Lupa tentangm
:-)m
sampai saya melihat jawaban ini . Lucu bagaimana kedua jawaban itu hampir identik: DBatch, 72 byte
Keluaran 1 pada kesuksesan, tidak ada pada kegagalan. Berfungsi untuk nol juga, meskipun tidak diminta oleh pertanyaan karena beberapa alasan.
sumber
JavaScript (ES7),
1918 byteDari jawaban saya untuk pertanyaan terkait .
Output
false
untuk angka segitiga atautrue
non-segitiga, seperti yang diizinkan oleh OP.Cobalah
sumber
n=>(8*n+1)**.5%1>0
(yang akan membalikkan output)PHP, 30 Bytes
Mencetak 1 untuk benar dan tidak ada untuk salah
Cobalah online!
fmod
PHP, 37 Bytes
Mencetak 1 untuk benar dan tidak ada untuk salah
Cobalah online!
sumber
Mathematica, 28 byte
sumber
7!
dengan#
. Pertama, lebih pendek; lebih penting lagi, solusi saat ini tidak benar, karena secara artifisial menetapkan batas pada ukuran input yang bekerja.Pari / GP , 18 byte
Cobalah online!
Ada built-in untuk menguji apakah suatu bilangan merupakan bilangan poligonal, tetapi bita itu lebih panjang satu byte.
Pari / GP , 19 byte
Cobalah online!
sumber
Excel,
3122 byte9 byte disimpan berkat Octopus
Output
TRUE
untuk angka segitiga. LainFALSE
. Cek apakah8*n+1
kuadrat sempurna.sumber
=MOD(SQRT(8*A1+1),1)=0
menghemat beberapa byteBrachylog , 5 byte
Cobalah online!
Penjelasan
sumber
Fourier , 26 byte
Cobalah online!
sumber
Python - 52 byte
Catatan: Saya tahu bahwa dua jawaban Python lainnya jauh lebih pendek, tapi ini adalah cara jadul, lebih merupakan algoritma dengan tangan
sumber
APL (Dyalog) , 6 byte
Cobalah online!
Penjelasan
Output
0
untuk false dan1
true.sumber
TI-BASIC,
107 byte-3 terima kasih kepada @ lirtosiast
Mengambil input aktif
X
. Cek apakah√(8X+1)
bilangan bulatsumber
not(fPart(√(8Ans+1
?