Bu kesik üçgen bir sayı mı?


20

İlgili OEIS dizisi: A008867

Kesilmiş üçgen sayı

Üçgen sayıların ortak bir özelliği, üçgen şeklinde düzenlenebilmeleridir. Örneğin, 21'i alın ve bir üçgen şeklinde düzenleyin o:

     Ö 
    oo
   ooo
  oooo
 ooooo
oooooo

Her köşeden aynı boyutta bir "kesme:" kesme üçgenleri tanımlayalım. 21'i kısaltmanın bir yolu şöyledir:

     . 
    . .
   ooo
  oooo
 . ooo.
. . oo. .

(Üçgenleri .orijinalden kesilir).

12 osn kaldı, bu yüzden 12 kesik üçgen numarası.

Görev

İşiniz, tamsayı alan ve bir sayının kesilmiş üçgen numarası olup olmadığını döndüren (veya standart çıktı yöntemlerinden herhangi birini kullanan) bir program veya işlev (veya eşdeğeri) yazmaktır.

kurallar

  • Standart boşluklar yok.
  • Giriş, negatif olmayan bir tamsayıdır.
  • Bir kesimin kenar uzunluğu orijinal üçgenin yarısını geçemez (yani kesimler üst üste binemez)
  • Bir kesimin yan uzunluğu sıfır olabilir.

Test senaryoları

Doğru:

0
1
3
6
7
10
12
15
18
19

Falsy:

2
4
5
8
9
11
13
14
16
17
20

50'ye kadar tüm tamsayılar için test senaryoları : TIO Link

Bu , bu yüzden her dil kazanmak en kısa bayt sayımları ile gönderme!

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
Doğru ve tahrif edilmiş çıktılar mı çıkarmalıyız yoksa iki tutarlı değer iyi mi?
Buğday Büyücüsü

@WeatWizard iki tutarlı değer kabul edilebilir.
JungHwan Min

Ancak, kesilmelerin çoğu örtüşürse, sonuç daha küçük kesiklere sahip daha küçük bir üçgene eşdeğerdir (kesiklerin yan uzunluğu 0 ise).
Asone Tuhid

Yanıtlar:



7

Haskell , 46 bayt

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

Çevrimiçi deneyin!

Soruna bir miktar sayı teorisi fırlattıktan sonra (teşekkürler @flawr), bu karakterizasyonu buldum:

n , 4n-1'in asal çarpanlarına ayırma işleminde , 5 mod 12 veya 7 mod 12 formunun herhangi bir asalının eşit sayıda göründüğü takdirde kesilmiş bir üçgen sayıdır .

Bu, örneğin, 4n-1'in 5 2 = 25 ile daha fazla bölünemez ve toplam 5 faktör sayısı eşit olmadığı sürece 5'e bölünemeyebileceği anlamına gelir .

Haskell'in yerleşik bir çarpanlara ayırması yoktur, ancak doğaçlama yapabiliriz. 12 = 3 * 4 gibi asal güçlere çarpanlara ayırma ile çalışırsak , eşdeğer ifadeyi kullanabiliriz:

n , tam olarak 4n-1'in ana güçlere çarpanlarına ayrılması , biçim 5 mod 12 veya 7 mod 12 terimlerine sahip değilse, kesilmiş bir üçgen sayıdır .

K olarak görünen asal bir p'nin gücünü elde edebiliriz . Daha sonra r sonucunun 5 veya 7 modulo 12 olmadığını kontrol ediyoruz . Not r garip. Ayrıca kompozitleri p olarak kontrol ediyoruz , onları asallardan anlatmanın bir yolu yok, ancak kontrol faktörleri olduğu sürece geçecektir.gcd(p^k)kmod(r-5)12>2

Son olarak, olumsuzlayarak >2için <3ve anahtarlama True/ Falseçıktıda bize kullanmalarına izin vererek bir byte kaydeder oryerine and.


Bununla ilgili bir karakterizasyon, modülo 12 alınan 4n-1'in bölücülerinin, 5 ve 7'lerden daha fazla toplam 1 ve 11'e sahip olmasıdır.

53 bayt

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

Çevrimiçi deneyin!


Gerçekten güzel bir açıklama!
Amfibolojik

6

Python 2 , 52 bayt

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

Çevrimiçi deneyin!

Çıkışlar True/ Falseçevrilmiş. Bu karakterizasyonu kullanır:

n, tam olarak, eğer bir kesik üçgen sayıdır 8n-2 formu olan bir 2 -3b'yi 2 bir tamsayı için a, b .

8*n-2+3*b*bHerhangi bbirinden 1diğerine mükemmel bir kare olup olmadığını kontrol ediyoruz n+1. Kaçınıyoruz b=0çünkü bir negatifin karekökü için bir hata veriyor n==0, ancak bu acı veremez çünkü sadece garip bçalışabilir.

Yinelemesiz olarak yapılır:

Python 2 , 53 bayt

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

Çevrimiçi deneyin!


Özyinelemeli ve özyinelemesiz çözümler genellikle python'da birbirleriyle bu kadar rekabetçi midir?
Mart'ta boboquack

@boboquack Genellikle özyinelemeli çözüm birkaç bayt kazanır range. Burada yakın çünkü b>n+1uzun bir taban kasası ve 0inkısa.
xnor

5

R , 45 43 bayt

Vlo sayesinde -2 bayt

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

Çevrimiçi deneyin!

Bunun için sadece ilk nüçgen sayıları kontrol etmemiz gerektiğinden eminim ; kaba kuvvet n, üçgen sayıların ve üçlülerin ikili farkları arasında olup olmadığını kontrol eder .


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

@Vlo facepalm İşlevleri her yerde kullanma alışkanlığına girdim ...
Giuseppe

Ve sadece (n = scan ()) yerine <- atama kullanma alışkanlığına girdim ... tsk tsk
Vlo

5

Jöle , 10 bayt

0r+\ð_÷3f⁸

Bir tamsayıyı kabul eden ve bir doğruluk değeri (boş olmayan bir liste) veya bir falsey değeri (boş bir liste) döndüren monadik bir bağlantı.

Çevrimiçi deneyin! (altbilgi,[0]sonuçları oldukları gibigöstermek için Python temsilini gerçekleştirir)
... veya bir test paketini görün (0 ila 20 dahil çalışır)

Nasıl?

N verildiğinde, ilk N üçgen sayısını oluşturur, N'yi her birinden çıkarır, her sonucu 3'e böler ve ilk N üçgen numaralarından biri olan tüm sonuçları tutar.

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 bayt

Đř△Đ3*ɐ-Ƒ∈

Çevrimiçi deneyin!

Açıklama:

        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

Sen de beni yendin, +1 GG
FantaC

@tfbninja Ben ne için güzel bir açıklamam olsa ɐ-yapar
mudkip201

1
ancak, isterseniz geri alabilirsiniz
FantaC


3

J , 22 bayt

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

Çevrimiçi deneyin!

Basit ve biraz zayıf golfçü yaklaşım.

açıklama

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.,]maybe
FrownyFrog

3

MATL , 12 bayt

tQ:qYst!3*-m

Çıkışlar 1truthy için, 0falsy için.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

Nasıl çalışır, örneğin

Girişi düşünün 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 bayt

ÅT3*+8*>ŲZ

Çevrimiçi deneyin!

açıklama

Å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

Bu, tuhaf bir mükemmel kare ise T sayısının üçgen olması gerçeğine dayanır 8T+1.
Kesebileceğimiz üçgenler listesinde başlıyoruz, olası büyük üçgenleri onlara göre hesaplıyoruz ve aslında üçgen olup olmadığını kontrol ediyoruz.


1

Japt , 16 bayt

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

Deneyin | Tüm test senaryolarını kontrol edin


açıklama

                     :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

Dene


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.