Nomor segitiga terpotong
Properti umum dari bilangan segitiga adalah bahwa angka-angka itu dapat disusun dalam segitiga. Misalnya, ambil 21 dan susun menjadi segitiga o
s:
Hai oo ooo oooo ooooo oooooo
Mari kita mendefinisikan "pemotongan": memotong segitiga dengan ukuran yang sama dari setiap sudut. Salah satu cara untuk memotong 21 adalah sebagai berikut:
. . . ooo oooo . ooo. . . oo. .
(Segitiga .
dipotong dari aslinya).
Ada 12 o
detik yang tersisa, jadi 12 adalah angka segitiga terpotong.
Tugas
Tugas Anda adalah menulis program atau fungsi (atau yang setara) yang mengambil bilangan bulat dan mengembalikan (atau menggunakan salah satu metode output standar) apakah suatu bilangan adalah bilangan segitiga terpotong.
Aturan
- Tidak ada celah standar.
- Inputnya adalah bilangan bulat non-negatif.
- Potongan tidak boleh memiliki panjang sisi melebihi setengah dari segitiga asli (yaitu potongan tidak bisa tumpang tindih)
- Potongan dapat memiliki panjang sisi nol.
Uji kasus
Benar:
0
1
3
6
7
10
12
15
18
19
Falsy:
2
4
5
8
9
11
13
14
16
17
20
Kasing uji untuk semua bilangan bulat hingga 50: TIO Link
Ini adalah kode-golf , jadi pengiriman dengan jumlah byte terpendek di setiap bahasa akan menang!
sumber
Jawaban:
Haskell,
4645 byteCobalah online!
sumber
Haskell , 46 byte
Cobalah online!
Setelah melemparkan banyak teori bilangan pada masalah (terima kasih @ flawr), saya menemukan karakterisasi ini:
Ini berarti, misalnya, bahwa 4n-1 mungkin tidak dapat dibagi dengan 5 kecuali jika selanjutnya dapat dibagi dengan 5 2 = 25 dan jumlah total 5 faktor adalah genap.
Haskell tidak memiliki faktorisasi bawaan, tetapi kita dapat berimprovisasi. Jika kita bekerja dengan faktorisasi ke dalam bilangan prima seperti 12 = 3 * 4 , kita dapat menggunakan pernyataan yang setara:
Kita dapat mengekstrak kekuatan p prima yang muncul dalam k sebagai
gcd(p^k)k
. Kami kemudian memeriksa bahwa hasilnya r bukan 5 atau 7 modulo 12 sebagaimod(r-5)12>2
. Perhatikan bahwa r aneh. Kami juga memeriksa komposit sebagai p , tidak memiliki cara untuk memberi tahu mereka dari bilangan prima, tetapi pemeriksaan akan berlalu selama faktor-faktornya.Akhirnya, meniadakan
>2
ke<3
dan beralihTrue
/False
dalam output menghemat satu byte dengan membiarkan kami menggunakanor
bukanand
.Karakterisasi terkait adalah bahwa pembagi 4n-1 yang diambil modulo 12 memiliki total lebih banyak 1 dan 11 dari 5 dan 7.
53 byte
Cobalah online!
sumber
Python 2 , 52 byte
Cobalah online!
Output
True
/False
terbalik. Gunakan karakterisasi ini:Kami memeriksa apakah ada yang
8*n-2+3*b*b
merupakan kuadrat sempurna untuk siapa punb
dari1
hinggan+1
. Kami menghindarinyab=0
karena memberikan kesalahan untuk akar kuadrat dari waktu negatifn==0
, tetapi ini tidak ada salahnya karena hanya aneh yangb
bisa bekerja.Dilakukan secara non-rekursif:
Python 2 , 53 byte
Cobalah online!
sumber
range
. Ini dia dekat karenab>n+1
alasnya panjang dan0in
pendek.R ,
4543 byte-2 byte terima kasih kepada Vlo
Cobalah online!
Saya cukup yakin kita hanya perlu memeriksa
n
angka segitiga pertama untuk ini; brute force memeriksa apakahn
ada perbedaan berpasangan dari angka segitiga dan tiga kali lipatnya.sumber
scan()
n<-scan();n%in%outer(T<-cumsum(0:n),3*T,"-")
Jelly , 10 byte
Tautan monadik yang menerima bilangan bulat dan mengembalikan nilai kebenaran (daftar yang tidak kosong) atau nilai falsey (daftar kosong).
Cobalah online! (footer melakukan representasi Python untuk menunjukkan
[0]
hasilnya apa adanya)... atau melihat test-suite (berlaku untuk 0 hingga 20 inklusif)
Bagaimana?
Diberikan N, bentuk angka segitiga N pertama, kurangi N dari masing-masing, bagi setiap hasil dengan 3 dan simpan hasil apa pun yang merupakan salah satu dari angka segitiga N pertama.
sumber
Pyt , 10 byte
Cobalah online!
Penjelasan:
sumber
ɐ-
dilakukannyaHaskell , 48 byte
Cobalah online!
sumber
a==1
.J , 22 byte
Cobalah online!
Pendekatan langsung dan agak buruk golf.
Penjelasan
sumber
e.2,@(!-/3*!)[:i.2+]
e.2,@(!-/3*!)1+i.,]
mungkinMATL , 12 byte
Keluaran
1
untuk kebenaran,0
untuk kepalsuan.Cobalah online! Atau verifikasi semua kasus uji .
Cara kerjanya, misalnya
Pertimbangkan input
6
sumber
Ruby ,
65 57 5248 byteCobalah online!
Terinspirasi oleh jawaban python xnor
sumber
Python 3 , 84 byte
Cobalah online!
sumber
05AB1E , 11 byte
Cobalah online!
Penjelasan
Ini didasarkan pada fakta bahwa bilangan T berbentuk segitiga jika
8T+1
kuadrat sempurna ganjil.Kita mulai pada daftar segitiga yang dapat kita potong, hitung kemungkinan segitiga yang lebih besar berdasarkan padanya dan periksa apakah itu sebenarnya segitiga.
sumber
Japt , 16 byte
Cobalah | Periksa semua test case
Penjelasan
Alternatif
Cobalah
sumber
Tambahkan ++ , 36 byte
Cobalah online!
sumber