Apakah ini bilangan segitiga terpotong?


20

Urutan OEIS terkait: A008867

Nomor segitiga terpotong

Properti umum dari bilangan segitiga adalah bahwa angka-angka itu dapat disusun dalam segitiga. Misalnya, ambil 21 dan susun menjadi segitiga os:

     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 odetik 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 , jadi pengiriman dengan jumlah byte terpendek di setiap bahasa akan menang!

code-golf  math  decision-problem  number-theory  integer  code-golf  number  decision-problem  functional-programming  code-golf  array-manipulation  matrix  code-golf  string  classification  string  code-challenge  binary  compression  decode  code-golf  string  string  code-challenge  balanced-string  encode  code-golf  number-theory  integer  base-conversion  code-golf  math  number-theory  geometry  abstract-algebra  code-golf  array-manipulation  sorting  optimization  code-golf  math  geometry  image-processing  generation  code-golf  string  cops-and-robbers  repeated-transformation  grammars  cops-and-robbers  repeated-transformation  grammars  code-challenge  restricted-source  tips  source-layout  javascript  code-challenge  kolmogorov-complexity  restricted-source  code-golf  combinatorics  counting  math  fastest-code  linear-algebra  code-golf  math  permutations  matrix  linear-algebra  code-golf  string  decision-problem  restricted-source  code-golf  number  array-manipulation  subsequence  code-golf  number  array-manipulation  matrix  code-golf  brainfuck  code-golf  color  code-golf  quine  source-layout  code-golf  subsequence  code-golf  string  ascii-art  code-golf  string  ascii-art  alphabet  code-golf  decision-problem  interpreter  hexagonal-grid  halting-problem  code-golf  string  polynomials  calculus  code-golf  math  decision-problem  matrix  complex-numbers  code-golf  random  code-golf  number  arithmetic 

1
Apakah kita akan menampilkan output yang benar dan salah atau dua nilai yang konsisten ok?
Wheat Wizard

@WheatWizard dua nilai konsisten dapat diterima.
JungHwan Min

Betapapun pemotongannya tumpang tindih, hasilnya setara dengan segitiga yang lebih kecil dengan pemotongan yang lebih kecil (jika pemotongan dapat memiliki panjang sisi 0).
Asone Tuhid

Jawaban:



7

Haskell , 46 byte

f n=or[mod(gcd(p^n)(4*n-1)-5)12<3|p<-[1..4*n]]

Cobalah online!

Setelah melemparkan banyak teori bilangan pada masalah (terima kasih @ flawr), saya menemukan karakterisasi ini:

n adalah bilangan segitiga terpotong persis jika dalam faktorisasi prima dari 4n-1 , bilangan prima apa pun dari bentuk 5 mod 12 atau 7 mod 12 muncul bilangan genap.

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:

n adalah bilangan segitiga terpotong tepat jika faktorisasi 4n-1 menjadi kekuatan utama tidak memiliki syarat bentuk 5 mod 12 atau 7 mod 12 .

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 sebagai mod(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 >2ke <3dan beralih True/ Falsedalam output menghemat satu byte dengan membiarkan kami menggunakan orbukan and.


Karakterisasi terkait adalah bahwa pembagi 4n-1 yang diambil modulo 12 memiliki total lebih banyak 1 dan 11 dari 5 dan 7.

53 byte

f n=sum[abs(mod k 12-6)-3|k<-[1..4*n],mod(4*n)k==1]<0

Cobalah online!


Penjelasan yang sangat bagus!
Amfibologis

6

Python 2 , 52 byte

f=lambda n,b=1:b>n+1or(8*n-2+3*b*b)**.5%1>0<f(n,b+1)

Cobalah online!

Output True/ Falseterbalik. Gunakan karakterisasi ini:

n adalah dipotong sejumlah segitiga persis jika 8N-2 memiliki membentuk sebuah 2 -3b 2 untuk beberapa bilangan bulat a, b .

Kami memeriksa apakah ada yang 8*n-2+3*b*bmerupakan kuadrat sempurna untuk siapa pun bdari 1hingga n+1. Kami menghindarinya b=0karena memberikan kesalahan untuk akar kuadrat dari waktu negatif n==0, tetapi ini tidak ada salahnya karena hanya aneh yang bbisa bekerja.

Dilakukan secara non-rekursif:

Python 2 , 53 byte

lambda n:0in[(8*n-2+3*b*b)**.5%1for b in range(~n,0)]

Cobalah online!


Apakah solusi rekursif dan non-rekursif biasanya saling bersaing dengan python?
boboquack

@ Boboquack Biasanya solusi rekursif menang beberapa byte lebih range. Ini dia dekat karena b>n+1alasnya panjang dan 0inpendek.
xnor

5

R , 45 43 byte

-2 byte terima kasih kepada Vlo

(n=scan())%in%outer(T<-cumsum(0:n),3*T,"-")

Cobalah online!

Saya cukup yakin kita hanya perlu memeriksa nangka segitiga pertama untuk ini; brute force memeriksa apakah nada perbedaan berpasangan dari angka segitiga dan tiga kali lipatnya.


scan() n<-scan();n%in%outer(T<-cumsum(0:n),3*T,"-")
Vlo

@Vlo facepalm saya terbiasa menggunakan fungsi di mana-mana ...
Giuseppe

Dan saya baru saja terbiasa menggunakan <- tugas alih-alih (n = scan ()) ... tsk tsk
Vlo

5

Jelly , 10 byte

0r+\ð_÷3f⁸

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.

0r+\ð_÷3f⁸ - Link: integer, N             e.g. 7
0r         - zero inclusive range N            [    0, 1, 2,   3,    4, 5,   6,   7]
  +\       - cumulative reduce with addition   [    0, 1, 3,   6,   10,15,  21,  28]
    ð      - start a new dyadic link with that, t, on the left and N on the right
     _     - t subtract N (vectorises)         [   -7,-6,-3,  -1,    3, 8,  14,  21]
      ÷3   - divivde by three (vectorises)     [-2.33,-2,-1.33,-0.33,1,2.67,4.67, 7]
         ⁸ - chain's left argument, t          [    0, 1, 3,   6,   10,15,  21,  28]
        f  - filter keep                       [                     1             ]
                                               - a non-empty list, so truthy

4

Pyt , 10 byte

Đř△Đ3*ɐ-Ƒ∈

Cobalah online!

Penjelasan:

        Implicit input
Đ       Duplicate input
ř       Push [1,2,...,input]
△       For each element k in the array, get the kth triangle number
Đ       Duplicate the top of the stack
3*      Multiply by 3
ɐ       ɐ - All possible:
 -                       subtractions between elements of the two arrays  
Ƒ       Flatten the nested array
∈       Is the input in the array

Anda juga mengalahkan saya, +1 GG
FantaC

@tfbninja Saya berharap saya memiliki penjelasan yang lebih bagus untuk apa yang ɐ-dilakukannya
mudkip201

1
menambahkan, Anda dapat
mengembalikan


3

J , 22 byte

e.[:,@(-/3*])2![:i.2+]

Cobalah online!

Pendekatan langsung dan agak buruk golf.

Penjelasan

e.[:,@(-/3*])2![:i.2+]
             2![:i.2+]  Range of triangular numbers up to N
      (-/3*])           All possible subtractions of 3T from T 
                        where T is triangular up to the Nth triangular number
    ,@                  Flattened into a single list
e.                      Is N in the list?

e.2,@(!-/3*!)[:i.2+]
FrownyFrog

e.2,@(!-/3*!)1+i.,]mungkin
FrownyFrog

3

MATL , 12 byte

tQ:qYst!3*-m

Keluaran 1untuk kebenaran, 0untuk kepalsuan.

Cobalah online! Atau verifikasi semua kasus uji .

Cara kerjanya, misalnya

Pertimbangkan input 6

t      % Implicit input. Duplicate
       % STACK: 6, 6
Q:q    % Increase, range, decrease element-wise. Gives [0 1 ... n]
       % STACK: 6, [0 1 ... 6]
Ys     % Cumulative sum
       % STACK: 6, [0 1 3 6 10 15]
t!     % Duplicate, transpose
       % STACK: 6, [0 1 3 6 10 15], [0;
                                     1;
                                     3;
                                     6;
                                     10;
                                     15]
3*     % Times 3, element-wise
       % STACK: 6, [0 1 3 6 10 15 21 28 36 45 55], [0;
                                                    3;
                                                    9;
                                                    18;
                                                    30;
                                                    45]
-      % Subtract, element-wise with broadcast
       % STACK: 6, [  0   1   3   6  10  15  21;
                     -3  -2   0   3   7  12  18;
                     -9  -8  -6  -3   1   6  12;
                    -18 -17 -15 -12  -8  -3   3;
                    -30 -29 -27 -24 -20 -15  -9;
                    -45 -44 -42 -39 -35 -30 -24;
                     -63 -62 -60 -57 -53 -48 -42]
m      % Ismember. Implicit display
       % STACK: 1



1

05AB1E , 11 byte

ÅT3*+8*>ŲZ

Cobalah online!

Penjelasan

ÅT            # get a list of triangle numbers upto input
  3*          # multiply each by 3
    +         # add input to each
     8*       # multiply each by 8
       >      # increment each
        Ų    # check each for squareness
          Z   # max

Ini didasarkan pada fakta bahwa bilangan T berbentuk segitiga jika 8T+1kuadrat 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.


1

Japt , 16 byte

ò å+ d@Zd_-3*X¶U

Cobalah | Periksa semua test case


Penjelasan

                     :Implicit input of integer U
ò                    :Range [0,U]
  å+                 :Cumulative reduction by addition
     d@              :Does any X in array Z return true when passed through this function?
       Zd_           :  Does any element in Z return true when passe through this function?
          -3*X       :    Subtract 3*X
              ¶U     :    Check for equality with U

Alternatif

ò å+ £Zm-3*XÃdøU

Cobalah


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.