¿Es este un número triangular truncado?


20

Secuencia OEIS relacionada: A008867

Número triangular truncado

Una propiedad común de los números triangulares es que se pueden organizar en un triángulo. Por ejemplo, tome 21 y organícelo en un triángulo de os:

     o 
    oo
   ooo
  oooo
 ooooo
oooooo

Definamos un "truncamiento:" cortando triángulos del mismo tamaño desde cada esquina. Una forma de truncar 21 es la siguiente:

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

(Los triángulos de .se cortan del original).

Quedan 12 os, por lo que 12 es un número de triángulo truncado.

Tarea

Su trabajo es escribir un programa o una función (o equivalente) que tome un número entero y devuelva (o use cualquiera de los métodos de salida estándar) si un número es un número de triángulo truncado.

Reglas

  • No hay lagunas estándar.
  • La entrada es un entero no negativo.
  • Un corte no puede tener una longitud lateral superior a la mitad de la del triángulo original (es decir, los cortes no pueden solaparse)
  • Un corte puede tener un lado de longitud cero.

Casos de prueba

Verdad:

0
1
3
6
7
10
12
15
18
19

Falsy

2
4
5
8
9
11
13
14
16
17
20

Casos de prueba para todos los enteros hasta 50: TIO Link

Este es el , por lo tanto, las presentaciones con el recuento de bytes más corto en cada idioma ganan.

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
¿Debemos generar resultados de verdad y falso o son dos valores consistentes?
Wheat Wizard

@WheatWizard son aceptables dos valores consistentes.
JungHwan Min

Por mucho que se superpongan las truncaciones, el resultado es equivalente a un triángulo más pequeño con truncaciones más pequeñas (si las truncaciones pueden tener una longitud lateral de 0).
Asone Tuhid

Respuestas:



7

Haskell , 46 bytes

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

Pruébalo en línea!

Después de haber arrojado un montón de teoría de números al problema (gracias @flawr), encontré esta caracterización:

n es un número triangular truncado exactamente si en la factorización prima de 4n-1 , cualquier primo de la forma 5 mod 12 o 7 mod 12 aparece un número par de veces.

Esto significa, por ejemplo, que 4n-1 puede no ser divisible por 5 a menos que sea más divisible por 5 2 = 25 y el número total de 5 factores sea par.

Haskell no tiene una factorización incorporada, pero podemos improvisar. Si trabajamos con factorizaciones en potencias primas como 12 = 3 * 4 , podemos usar la declaración equivalente:

n es un número triangular truncado exactamente si la factorización de 4n-1 en potencias primarias no tiene términos de forma 5 mod 12 o 7 mod 12 .

Podemos extraer el poder de un primer p que aparece en k como gcd(p^k)k. Luego verificamos que el resultado r no es 5 o 7 módulo 12 como mod(r-5)12>2. Tenga en cuenta que r es impar. También verificamos los compuestos como p , sin una forma de distinguirlos de los números primos, pero la verificación pasará siempre que lo hagan sus factores.

Por último, negando >2a <3y el cambio True/ Falsede la producción ahorra un byte por permitirnos usar oren lugar de and.


Una caracterización relacionada es que los divisores del módulo 12 tomado 4n-1 tienen más totales 1 y 11 que 5 y 7.

53 bytes

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

Pruébalo en línea!


Muy buena explicación!
Anfibológico

6

Python 2 , 52 bytes

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

Pruébalo en línea!

Salidas True/ Falsevolteado. Utiliza esta caracterización:

n es un número triangular truncado exactamente si 8n-2 ha formado un 2 -3b 2 para algunos enteros a, b .

Comprobamos si alguno 8*n-2+3*b*bes un cuadrado perfecto para cualquier bde 1a n+1. Lo evitamos b=0porque da un error para una raíz cuadrada de un negativo cuando n==0, pero esto no puede doler porque solo lo impar bpuede funcionar.

Hecho de forma no recursiva:

Python 2 , 53 bytes

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

Pruébalo en línea!


¿Las soluciones recursivas y no recursivas suelen ser tan competitivas entre sí en Python?
boboquack

@boboquack Por lo general, la solución recursiva gana unos pocos bytes range. Aquí está cerca porque b>n+1es un caso base largo y 0ines corto.
xnor

5

R , 45 43 bytes

-2 bytes gracias a Vlo

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

Pruébalo en línea!

Estoy bastante seguro de que solo necesitamos verificar los primeros nnúmeros triangulares para esto; la fuerza bruta verifica si nestá en las diferencias por pares de los números triangulares y sus triples.


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

@Vlo facepalm Me acostumbré a usar funciones en todas partes ...
Giuseppe

Y acabo de acostumbrarme a usar <- asignación en lugar de (n = scan ()) ... tsk tsk
Vlo

5

Jalea , 10 bytes

0r+\ð_÷3f⁸

Un enlace monádico que acepta un número entero y devuelve un valor verdadero (una lista no vacía) o un valor falsey (una lista vacía).

Pruébalo en línea! (el pie de página realiza una representación de Python para mostrar los[0]resultados tal como están)
... o ver un conjunto de pruebas (se ejecuta de 0 a 20 inclusive)

¿Cómo?

Dado N, forma los primeros N números de triángulo, resta N de cada uno, divide cada resultado entre 3 y mantiene cualquier resultado que sea uno de los primeros N números de triángulo.

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 bytes

Đř△Đ3*ɐ-Ƒ∈

Pruébalo en línea!

Explicación:

        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

Tú también me
ganaste

@tfbninja Ojalá tuviera una mejor explicación de lo que ɐ-hace
mudkip201

1
añadido, puede revertir si lo desea
FantaC


3

J , 22 bytes

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

Pruébalo en línea!

Enfoque directo y algo mal golfizado.

Explicación

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

3

MATL , 12 bytes

tQ:qYst!3*-m

Salidas 1para la verdad, 0para la falsedad.

Pruébalo en línea! O verificar todos los casos de prueba .

Como funciona, con ejemplo

Considerar entrada 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 bytes

ÅT3*+8*>ŲZ

Pruébalo en línea!

Explicación

Å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

Esto se basa en el hecho de que un número T es triangular si 8T+1es un cuadrado perfecto impar.
Comenzamos en la lista de triángulos que podríamos truncar, calculamos los posibles triángulos más grandes en función de ellos y verificamos si en realidad es triangular.


1

Japt , 16 bytes

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

Pruébalo | Verifique todos los casos de prueba


Explicación

                     :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

Alternativa

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

Intentalo


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.