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!

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
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!


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!


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.


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

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

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

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?

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



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.


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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.