È un numero triangolare troncato?


20

Sequenza OEIS correlata: A008867

Numero triangolare troncato

Una proprietà comune dei numeri triangolari è che possono essere disposti in un triangolo. Ad esempio, prendi 21 e disponi in un triangolo di os:

     o 
    oo
   ooo
  oooo
 ooooo
oooooo

Definiamo un "troncamento:" tagliando triangoli della stessa dimensione da ogni angolo. Un modo per troncare 21 è il seguente:

     . 
    . .
   ooo
  oooo
 . ooo
. . oo .

(I triangoli di .sono tagliati dall'originale).

Restano 12 os, quindi 12 è un numero di triangolo troncato.

Compito

Il tuo compito è quello di scrivere un programma o una funzione (o equivalente) che accetta un numero intero e restituisce (o utilizza uno dei metodi di output standard) se un numero è un numero di triangolo troncato.

Regole

  • Nessuna scappatoia standard.
  • L'input è un numero intero non negativo.
  • Un taglio non può avere una lunghezza laterale superiore alla metà di quella del triangolo originale (ovvero i tagli non possono sovrapporsi)
  • Un taglio può avere lunghezza lato zero.

Casi test

Truthy:

0
1
3
6
7
10
12
15
18
19

Falsy:

2
4
5
8
9
11
13
14
16
17
20

Casi di test per tutti i numeri interi fino a 50: TIO Link

Si tratta di , quindi vincono gli invii con il numero di byte più breve in ogni lingua!

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
Dobbiamo produrre output veritieri e falsi o due valori coerenti sono ok?
Wheat Wizard

@WheatWizard sono accettabili due valori coerenti.
JungHwan Min

Per quanto i troncamenti si sovrappongano, il risultato equivale a un triangolo più piccolo con troncamenti più piccoli (se i troncamenti possono avere una lunghezza laterale 0).
Solo Tuhid,

Risposte:



7

Haskell , 46 byte

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

Provalo online!

Avendo lanciato un sacco di teoria dei numeri al problema (grazie a @flawr), ho trovato questa caratterizzazione:

n è un numero triangolare troncato esattamente se nella fattorizzazione in primo piano di 4n-1 , qualsiasi numero primo della forma 5 mod 12 o 7 mod 12 appare un numero pari di volte.

Ciò significa, ad esempio, che 4n-1 potrebbe non essere divisibile per 5 a meno che non sia ulteriormente divisibile per 5 2 = 25 e il numero totale di 5 fattori sia pari.

Haskell non ha una fattorizzazione integrata, ma possiamo improvvisare. Se lavoriamo con fattorizzazione in poteri primi come 12 = 3 * 4 , possiamo usare la dichiarazione equivalente:

n è un numero triangolare troncato esattamente se la fattorizzazione di 4n-1 in poteri primi non ha termini di forma 5 mod 12 o 7 mod 12 .

Possiamo estrarre il potere di un primo p che appare in k come gcd(p^k)k. Quindi controlliamo che il risultato r non sia 5 o 7 modulo 12 come mod(r-5)12>2. Nota che r è dispari. Controlliamo anche i compositi come p , mancando di un modo per distinguerli dai numeri primi, ma il controllo passerà finché i suoi fattori lo fanno.

Infine, negando >2a <3e commutazione True/ Falsein uscita salva un byte, consentendo di usare orinvece and.


Una caratterizzazione correlata è che i divisori di 4n-1 presi modulo 12 hanno più 1 e 11 totali di 5 e 7.

53 byte

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

Provalo online!


Spiegazione davvero bella!
Anfibologico,

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)

Provalo online!

Uscite True/ Falsecapovolte. Usa questa caratterizzazione:

n è un numero triangolare troncato esattamente se 8n-2 ha formare un 2 -3B 2 per alcuni interi a, b .

Controlliamo se uno 8*n-2+3*b*bè un quadrato perfetto per qualsiasi bda 1a n+1. Evitiamo b=0perché dà un errore per una radice quadrata di un negativo quando n==0, ma questo non può far male perché solo dispari bpuò funzionare.

Fatto in modo non ricorsivo:

Python 2 , 53 byte

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

Provalo online!


Le soluzioni ricorsive e non ricorsive sono generalmente così competitive tra loro in Python?
Boboquack,

@boboquack Di solito la soluzione ricorsiva vince di qualche byte in più range. Qui è vicino perché b>n+1è un case base lungo ed 0inè corto.
xnor

5

R , 45 43 byte

-2 byte grazie a Vlo

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

Provalo online!

Sono abbastanza sicuro che dobbiamo solo controllare i primi nnumeri triangolari per questo; la forza bruta controlla se si ntrova nelle differenze a coppie dei numeri triangolari e delle loro triple.


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

@Vlo facepalm Ho preso l'abitudine di usare le funzioni ovunque ...
Giuseppe

E ho appena preso l'abitudine di usare <- assegnazione anziché (n = scan ()) ... tsk tsk
Vlo

5

Jelly , 10 byte

0r+\ð_÷3f⁸

Un collegamento monadico che accetta un numero intero e restituisce un valore di verità (un elenco non vuoto) o un valore di falso (un elenco vuoto).

Provalo online! (il piè di pagina esegue la rappresentazione Python per mostrare i[0]risultati così come sono)
... o vedere una suite di test (funziona da 0 a 20 inclusi)

Come?

Dato N, forma i primi numeri del triangolo N, sottrae N da ciascuno, divide ogni risultato per 3 e mantiene tutti i risultati che sono uno dei primi numeri del triangolo N.

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*ɐ-Ƒ∈

Provalo online!

Spiegazione:

        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

Mi hai battuto anche io, +1 GG
FantaC

@tfbninja Vorrei avere una spiegazione migliore di ciò che ɐ-fa
mudkip201

1
aggiunto, puoi
tornare indietro


3

J , 22 byte

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

Provalo online!

Approccio semplice e piuttosto scarsamente golfato.

Spiegazione

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

3

MATL , 12 byte

tQ:qYst!3*-m

Uscite 1per verità, 0per falsità.

Provalo online! Oppure verifica tutti i casi di test .

Come funziona, con l'esempio

Considera l'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

Provalo online!

Spiegazione

Å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

Questo si basa sul fatto che un numero T è triangolare se 8T+1è un quadrato dispari perfetto.
Iniziamo dall'elenco dei triangoli che potremmo troncare, calcoliamo i possibili triangoli più grandi basati su di essi e controlliamo se in realtà è triangolare.


1

Japt , 16 byte

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

Provalo | Controlla tutti i casi di test


Spiegazione

                     :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

Provalo


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.