Desafio
Dado um número inteiro positivo, determine se é um número triangular e, consequentemente, produza um dos dois valores constantes e distintos.
Definição
Um número triangular é um número que pode ser expresso como a soma dos números inteiros positivos consecutivos, iniciando em 1. Eles também podem ser expressos com a fórmula n(n + 1) / 2
, onde n
está um número inteiro positivo.
Casos de teste
Verdade:
1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991
Falsy:
2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999
Regras
- Sua entrada pode ser uma função ou um programa.
- Você pode assumir que a entrada é um número inteiro positivo abaixo de 10 6 .
- Você deve escolher duas saídas distintas e constantes para distinguir as duas categorias.
Isso é código-golfe , então o código mais curto em bytes em cada idioma vence.
code-golf
number
decision-problem
ETHproductions
fonte
fonte
Respostas:
Haskell , 23 bytes
EDITAR:
$
.Uma função anônima pegando
Int
e retornando aChar
.A saída é
'1'
para números triangulares e'0'
para outros.Experimente online!
((!!)$show.(10^)=<<[0..]) 998991
.Gera os números 1, 10, 100, 1000, ..., converte-os em seqüências de caracteres e concatena-os. Em seguida, indexa a sequência infinita resultante
fonte
(!!)$show.(10^)=<<[0..]
.Python , 24 bytes
Experimente online!
Saídas
False
para números triangulares,True
para o resto. Verifica se8*n+1
é um quadrado perfeito. O Python usará quadrados perfeitos para flutuações exatas de números inteiros, independentemente do tamanho, portanto, não há problemas de ponto flutuante.fonte
(1<<10000)**.5
: OverflowError: int muito grande para converter a flutuarGelatina , 4 bytes
Experimente online!
Quão?
fonte
/
e\
provavelmente estavam entre as cinco primeiras rápidas a serem implementadas, anteriores à idéia de converter argumentos inteiros no intervalo.Retina , 10 bytes
A entrada está unária. A saída é
0
ou1
.Experimente online! (Como um conjunto de testes que faz conversão de decimal para unário por conveniência.)
Explicação
Este é o exercício mais básico em referências futuras. A maioria das pessoas está familiarizada com as referências anteriores na regex, por exemplo,
(.)\1
para corresponder a um caractere repetido. No entanto, alguns dos sabores mais avançados permitem que você use uma referência anterior antes ou dentro do grupo ao qual está se referindo. Nesse caso, geralmente é chamado de referência direta. Isso pode fazer sentido se a referência for repetida. Pode não estar bem definido na primeira iteração, mas nas iterações subseqüentes, o grupo posterior ou o próximo capturou algo e pode ser reutilizado.Isso é mais comumente usado para implementar padrões recorrentes em cadeias unárias. Nesse caso, tentamos corresponder a entrada como a soma dos números inteiros consecutivos:
fonte
(^|1\1)+$
funciona?+
para{2,}
, deve funcionar. Essa otimização evita loops infinitos, mas também é a única coisa que impede que o regex .NET seja completo por Turing por conta própria.\G
!Python 2 , 25 bytes
Verifica se ( 8x + 1 ) é um número quadrado.
Experimente online!
fonte
Mathematica, 16 bytes
Essencialmente uma porta da solução Python da xnor . Saídas
True
para números triangulares,False
caso contrário.fonte
JavaScript (ES6),
3027 bytesGuardado 2 bytes graças a kamoroso94
Casos de teste
Mostrar snippet de código
Versão não recursiva (ES7), 19 bytes
Resposta do porto de Adnan .
fonte
f=(n,k=1)=>n>0?f(n-k,k+1):!n
?k
.undefined
valor inicial ; sua edição foi um prazer de ler depois que cheguei à sua solução anterior.CJam , 11 bytes
Saídas
1
para triangular,0
caso contrário.Experimente online!
Explicação
Considere entrada
21
.fonte
Flak cerebral , 40 bytes
Assistente de trigo e eu tivemos um duelo sobre esta questão. Quando decidimos postar nossas soluções, estávamos atados a 42 bytes, mas encontrei um golf de 2 bytes de sua solução. Decidimos que contaria como desempate (minha solução está abaixo).
Experimente online!
Explicação:
Para uma explicação completa, consulte a resposta do Assistente de Trigo .
Flak cerebral , 42 bytes
Saídas
0\n
(literal newline) para truthy e a string vazia para falsy.A idéia é subtrair 1 e 2 e 3 até a entrada. Se você pressionar 0, sabe que este é um número triangular, para que você possa parar por aí.
Experimente online! (verdade)
Experimente online! (falso)
Aqui está uma solução de 46 bytes que eu achei interessante.
Saídas
0\n
(literal newline) para truthy, a string vazia para falsy.A idéia é fazer a contagem regressiva da entrada por números consecutivos, 1 de cada vez. Por exemplo
input - (1) - (1,1) - (1,1,1)
. Cada vez que subtraímos, se ainda não estamos em 0, deixamos um valor extra na pilha. Dessa forma, se estivermos em 0 e ainda subtrairmos quando aparecermos, removemos o último valor da pilha. Se a entrada for um número triangular, terminaremos exatamente em 0 e não exibiremos o 0.Experimente online! truthy
Experimente online! falsear
fonte
Gelatina , 5 bytes
Experimente online!
fundo
Seja n a entrada. Se n é o k- ésimo número triangular, temos
o que significa que haverá uma solução natural se e somente se 1 + 8n for um quadrado ímpar e perfeito. Claramente, a verificação da paridade de 1 + 8n não é necessária.
Como funciona
fonte
PowerShell ,
3130 bytesExperimente online!
Método de força bruta agradável e lento. Faça uma matriz de cada soma de 1 a 10 6 e veja se o argumento está lá.
fonte
Flak cerebral , 42 bytes
Experimente online!
Explicação
O objetivo deste programa é criar um estado em duas pilhas e executar uma operação constante em ambas as pilhas até que um deles seja zeros. Podemos então produzir dependendo da pilha em que estamos. Isso é semelhante aos programas que determinam o sinal de um número. Esses programas colocam
n
uma pilha e-n
a outra e adicionam uma e alterna as pilhas até que uma delas seja zero. Se o número foi negativo em primeiro lugar, a primeira pilha atingirá zero, se o número for positivo, a outra pilha atingirá zero.Aqui, criamos duas pilhas, uma que subtrai números consecutivos da entrada e outra que apenas subtrai um. Aquele que subtrai números consecutivos só terminará se o número for triangular (caso contrário, passará zero e continuará indo para os negativos). O outro sempre terminará para qualquer número positivo, mas sempre será mais lento que o primeiro, portanto, números não triangulares terminarão nessa pilha.
Então, como configuramos pilhas para que a mesma operação subtraia números consecutivos em um e subtraia um no outro? Em cada pilha, temos a entrada no topo para que possa ser verificado, abaixo disso temos a diferença e abaixo temos a diferença da diferença. Cada vez que executamos, adicionamos a "diferença da diferença" à "diferença" regular e subtraímos isso da entrada. Para a pilha que verifica a triangularidade, configuramos nossa dupla diferença para
1
que possamos obter números inteiros consecutivos cada vez que executamos, para a outra pilha que configuramos para0
que nunca alteremos a diferença, ou seja, ela sempre permanece 1. Aqui está como a pilha é configurada no início, onden
está a entrada:Quando finalmente terminamos, podemos usar essas diferenças para verificar em qual pilha estamos, exibimos os dois principais valores e obtemos
1
um número triangular e0
um número não triangular.Código anotado
Aqui está uma solução de 50 bytes que eu gosto também.
Experimente online!
fonte
Cubix , 23
2425bytes0 para verdade e nada
0para falsey. Forças brutas incrementando o contador, adicionando à soma acumulada e comparando à entrada.Agora, tente encaixá-lo em um cubo 2x2x2.Fiz isso!Experimente online!
/
Reflita para enfrentar.I10\
obter entrada inteira, pressione 1 (contador), pressione 0 (soma) e reflita+s;p-
corpo do laço. Adicione soma e contador, reduza a soma anterior, aumente a entrada e subtraia?
Teste o resultado da subtração\.uO@
reflete na face inferior, no-op, inversão de marcha, saída e parada.@
pare;qWs)/su
subtração da gota esquerda , coloque a entrada para baixo, mude para a esquerda, contador e somatório de trocas, contador de incremento, refletido, soma e contador de trocas, giro em U no corpo do loop principal.fonte
.
no cubo, mas um1
no seu código.05AB1E ,
76 bytesEDIT : Graças a @Dennis: salvei um byte porque esqueci o operador de incremento
Experimente online!
n
é triangular sesqrt(8n + 1)
é um número inteiroComo funciona
fonte
t.ï
pode estarŲ
nos dias de hoje, que é um recurso interno para verificar se um número é um quadrado.Perl 6 , 17 bytes
Apenas verifica se
$_
, a entrada da função é igual a qualquer um dos elementos da redução de adição triangular(1, 1+2, ..., 1+2+...+$_)
.fonte
Alice ,
3822 bytesMuitos bytes salvos graças a Martin e Leo
Há uma nova linha à direita. Saídas
1
para triangular,0
caso contrário.Experimente online!
Explicação
Isso usa a mesma abordagem da minha resposta CJam , apenas mais desajeitada. De forma linearizada, o programa se torna
onde o
i
eo
está realmente no modo ordinal.Considere a entrada
21
como um exemplo.fonte
...h*-no@
)Japonês ,
107 bytesEconomizou 3 bytes graças a @Luke e @ETHproductions
Experimente online!
Explicação:
Explicação:
Experimente online!
fonte
*8Ä ¬u1 c
para 9B (saídas 0 se a entrada for triangular, 1 caso contrário)u1 c
parav1
, acredito (alternar as saídas)R ,
2319 bytesAbordagem semelhante a outras respostas. Verifica se
8x+1
é um quadrado perfeito.-4 bytes graças a Giuseppe e MickyT.
Experimente online!
fonte
!
vez de==0
!(8*scan()+1)^.5%%1
MATL , 5 bytes
Experimente online!
Explicação:
fonte
t:Ys=a
. Esqueceu-se dem
:-)m
até que vi esta resposta . Engraçado como as duas respostas são quase idênticas: DLote, 72 bytes
Saídas 1 em caso de sucesso, nada em caso de falha. Também funciona para zero, embora não seja solicitado pela pergunta por algum motivo.
fonte
JavaScript (ES7),
1918 bytesDa minha resposta a uma pergunta relacionada .
Saídas
false
para números triangulares outrue
não triangulares, conforme permitido pelo OP.Tente
fonte
n=>(8*n+1)**.5%1>0
(que iria inverter as saídas)PHP, 30 bytes
Imprime 1 para verdadeiro e nada para falso
Experimente online!
fmod
PHP, 37 bytes
Imprime 1 para verdadeiro e nada para falso
Experimente online!
fonte
Mathematica, 28 bytes
fonte
7!
por#
. Primeiro, é mais curto; mais importante, a solução atual não está correta, pois impõe artificialmente um limite no tamanho da entrada em que trabalha.Pari / GP , 18 bytes
Experimente online!
Há um built-in para testar se um número é um número poligonal, mas é mais um byte.
Pari / GP , 19 bytes
Experimente online!
fonte
Excel,
3122 bytes9 bytes salvos graças ao Octopus
Saídas
TRUE
para números triangulares. Outra coisaFALSE
. Verifica se8*n+1
é um quadrado perfeito.fonte
=MOD(SQRT(8*A1+1),1)=0
salva alguns bytesBraquilog , 5 bytes
Experimente online!
Explicação
fonte
Fourier , 26 bytes
Experimente online!
fonte
Python - 52 bytes
Nota: Eu sei que as outras duas respostas Python são muito mais curtas, mas esta é a maneira antiga, mais um algoritmo manual
fonte
APL (Dyalog) , 6 bytes
Experimente online!
Explicação
Saídas
0
para false e1
true.fonte
TI-BASIC,
107 bytes-3 graças a @lirtosiast
Ativa a entrada
X
. Verifica se√(8X+1)
é um número inteirofonte
not(fPart(√(8Ans+1
?