S'agit-il d'un nombre triangulaire tronqué?

20

Séquence OEIS associée: A008867

Nombre triangulaire tronqué

Une propriété commune des nombres triangulaires est qu'ils peuvent être disposés en triangle. Par exemple, prenez 21 et disposez-les dans un triangle de os:

     o 
    oo
   ooo
  oooo
 ooooo
oooooo

Définissons une "troncature:" coupant des triangles de la même taille à partir de chaque coin. Une façon de tronquer 21 est la suivante:

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

(Les triangles de .sont coupés de l'original).

Il reste 12 os, donc 12 est un nombre triangulaire tronqué.

Tâche

Votre travail consiste à écrire un programme ou une fonction (ou équivalent) qui prend un entier et renvoie (ou utilise l'une des méthodes de sortie standard) si un nombre est un nombre triangulaire tronqué.

Règles

  • Pas de failles standard.
  • L'entrée est un entier non négatif.
  • Une coupe ne peut pas avoir une longueur de côté supérieure à la moitié de celle du triangle d'origine (c'est-à-dire que les coupes ne peuvent pas se chevaucher)
  • Une coupe peut avoir une longueur de côté nulle.

Cas de test

Vérité:

0
1
3
6
7
10
12
15
18
19

Falsy:

2
4
5
8
9
11
13
14
16
17
20

Cas de test pour tous les nombres entiers jusqu'à 50: TIO Link

Il s'agit de , donc les soumissions avec le plus petit nombre d'octets dans chaque langue gagnent!

JungHwan Min
la source
1
Doit-on produire des sorties véridiques et fausses ou deux valeurs cohérentes sont-elles correctes?
Wheat Wizard
@WheatWizard deux valeurs cohérentes sont acceptables.
JungHwan Min
Quelle que soit la superposition des troncatures, le résultat équivaut à un triangle plus petit avec des troncatures plus petites (si les troncatures peuvent avoir une longueur de côté 0).
Asone Tuhid

Réponses:

7

Haskell , 46 octets

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

Essayez-le en ligne!

Après avoir jeté un tas de théorie des nombres sur le problème (merci @flawr), j'ai trouvé cette caractérisation:

n est un nombre triangulaire tronqué exactement si dans la factorisation première de 4n-1 , tout nombre premier de la forme 5 mod 12 ou 7 mod 12 apparaît un nombre pair de fois.

Cela signifie, par exemple, que 4n-1 peut ne pas être divisible par 5 à moins qu'il ne soit divisible par 5 2 = 25 et le nombre total de 5 facteurs soit pair.

Haskell n'a pas de factorisation intégrée, mais nous pouvons improviser. Si nous travaillons avec des factorisations en puissances premières comme 12 = 3 * 4 , nous pouvons utiliser la déclaration équivalente:

n est un nombre triangulaire tronqué exactement si la factorisation de 4n-1 en puissances premières n'a pas de termes de forme 5 mod 12 ou 7 mod 12 .

On peut extraire la puissance d'un premier p apparaissant en k as gcd(p^k)k. On vérifie ensuite que le résultat r n'est pas 5 ou 7 modulo 12 as mod(r-5)12>2. Notez que r est impair. Nous vérifions également les composites comme p , sans moyen de les distinguer des nombres premiers, mais la vérification passera aussi longtemps que ses facteurs le feront.

Enfin, la négation >2de <3et la commutation True/ Falsesortie de sortie économise un octet en nous permettant d'utiliser orau lieu deand .


Une caractérisation connexe est que les diviseurs de 4n-1 pris modulo 12 ont plus de 1 et 11 au total que de 5 et 7.

53 octets

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

Essayez-le en ligne!

xnor
la source
Explication vraiment sympa!
Amphibologique
6

Python 2 , 52 octets

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

Essayez-le en ligne!

Sorties True/ Falseretournées. Utilise cette caractérisation:

n est un nombre triangulaire tronqué exactement si 8n-2 a la forme a 2 -3b 2 pour certains entiers a, b .

Nous vérifions si l'un d'entre eux 8*n-2+3*b*best un carré parfait pour n'importe lequel bde 1à n+1. Nous évitons b=0car cela donne une erreur pour une racine carrée d'un négatif quand n==0, mais cela ne peut pas faire de mal car seul le impair bpeut fonctionner.

Fait de façon non récursive:

Python 2 , 53 octets

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

Essayez-le en ligne!

xnor
la source
Les solutions récursives et non récursives sont-elles généralement si compétitives entre elles en python?
boboquack
@boboquack Habituellement, la solution récursive gagne de quelques octets range. Ici, c'est proche car b>n+1c'est un cas de base long et 0incourt.
xnor
5

R , 45 43 octets

-2 octets grâce à Vlo

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

Essayez-le en ligne!

Je suis assez sûr que nous devons seulement vérifier les premiers nnombres triangulaires pour cela; la force brute vérifie si se ntrouve dans les différences par paires des nombres triangulaires et de leurs triplets.

Giuseppe
la source
scan() n<-scan();n%in%outer(T<-cumsum(0:n),3*T,"-")
Vlo
@Vlo facepalm J'ai pris l'habitude d'utiliser des fonctions partout ...
Giuseppe
Et je viens de prendre l'habitude d'utiliser <- assignation au lieu de (n = scan ()) ...
tsk tsk
5

Gelée , 10 octets

0r+\ð_÷3f⁸

Un lien monadique acceptant un entier et renvoyant une valeur véridique (une liste non vide) ou une valeur de falsey (une liste vide).

Essayez-le en ligne! (le pied de page effectue une représentation Python pour afficher les[0]résultats tels qu'ils sont)
... ou voir une suite de tests (fonctionne de 0 à 20 inclus)

Comment?

Étant donné N, forme les N premiers nombres triangulaires, soustrait N de chacun, divise chaque résultat par 3 et conserve tous les résultats qui sont l'un des N premiers nombres triangulaires.

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
Jonathan Allan
la source
4

Pyt , 10 octets

Đř△Đ3*ɐ-Ƒ∈

Essayez-le en ligne!

Explication:

        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
mudkip201
la source
Vous me battez aussi, +1 GG
FantaC
@tfbninja J'aimerais avoir une meilleure explication de ce qui se ɐ-passe
mudkip201
1
ajouté, vous pouvez cependant revenir en arrière si vous le souhaitez
FantaC
3

Haskell , 48 octets

f a|u<-[0..a]=or[x^2+x-3*(y^2+y)==2*a|x<-u,y<-u]

Essayez-le en ligne!

Assistant de blé
la source
On dirait que votre chèque surplombe a==1.
xnor
@xnor je vois pourquoi. Il a été corrigé maintenant.
Wheat Wizard
3

J , 22 octets

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

Essayez-le en ligne!

Approche simple et assez peu golfée.

Explication

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?
cole
la source
e.2,@(!-/3*!)[:i.2+]
FrownyFrog
e.2,@(!-/3*!)1+i.,]peut
FrownyFrog
3

MATL , 12 octets

tQ:qYst!3*-m

Sorties 1pour véridique, 0pour fausse.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Comment ça marche, avec exemple

Tenez compte des commentaires 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
Luis Mendo
la source
1

05AB1E , 11 octets

ÅT3*+8*>ŲZ

Essayez-le en ligne!

Explication

Å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

Ceci est basé sur le fait qu'un certain nombre T est triangulaire si 8T+1est un carré parfait impair.
Nous commençons sur la liste des triangles que nous pourrions tronquer, calculons les triangles les plus grands possibles en fonction d'eux et vérifions s'il est en fait triangulaire.

Emigna
la source
1

Japt , 16 octets

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

Essayez-le | Vérifier tous les cas de test


Explication

                     :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

Alternative

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

Essayez-le

Hirsute
la source