Reto
Dado un número entero positivo, determine si es un número triangular y, en consecuencia, genere uno de los dos valores constantes y distintos.
Definición
Un número triangular es un número que se puede expresar como la suma de enteros positivos consecutivos, comenzando en 1. También se pueden expresar con la fórmula n(n + 1) / 2
, donde n
hay algún entero positivo.
Casos de prueba
Verdad:
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
Reglas
- Su entrada puede ser una función o un programa.
- Puede suponer que la entrada es un entero positivo por debajo de 10 6 .
- Debe elegir dos salidas constantes y distintas para distinguir las dos categorías.
Este es el código de golf , por lo que gana el código más corto en bytes en cada idioma.
code-golf
number
decision-problem
ETHproducciones
fuente
fuente
Respuestas:
Haskell , 23 bytes
EDITAR:
$
.Una función anónima que toma un
Int
y devuelve aChar
.La salida es
'1'
para números triangulares y'0'
para otros.Pruébalo en línea!
((!!)$show.(10^)=<<[0..]) 998991
.Genera los números 1, 10, 100, 1000, ..., los convierte en cadenas y los concatena. Luego indexa en la cadena infinita resultante
fuente
(!!)$show.(10^)=<<[0..]
.Python , 24 bytes
Pruébalo en línea!
Salidas
False
para números triangulares,True
para el resto. Comprueba si8*n+1
es un cuadrado perfecto. Python tomará cuadrados perfectos para calcular flotantes enteros sin importar cuán grande sea, por lo que no hay problemas de coma flotante.fuente
(1<<10000)**.5
: OverflowError: int demasiado grande para convertir a flotanteJalea , 4 bytes
Pruébalo en línea!
¿Cómo?
fuente
/
y\
probablemente se encontraban entre los primeros cinco rápidos que se implementaron, anterior a la idea de lanzar argumentos enteros al rango.Retina , 10 bytes
La entrada está en unario. La salida es
0
o1
.Pruébalo en línea! (Como un conjunto de pruebas que realiza la conversión de decimal a unario por conveniencia).
Explicación
Este es el ejercicio más básico en referencias directas. La mayoría de las personas están familiarizadas con las referencias inversas en expresiones regulares, por ejemplo,
(.)\1
para que coincida con un carácter repetido. Sin embargo, algunos de los sabores más avanzados le permiten utilizar una referencia inversa antes o dentro del grupo al que se refiere. En ese caso, generalmente se denomina referencia directa. Esto puede tener sentido si la referencia se repite. Puede que no esté bien definido en la primera iteración, pero en las iteraciones posteriores, el grupo posterior o circundante ha capturado algo y puede reutilizarse.Esto se usa más comúnmente para implementar patrones recurrentes en cadenas unarias. En este caso, intentamos hacer coincidir la entrada como la suma de enteros consecutivos:
fuente
(^|1\1)+$
funciona?+
a{2,}
, debería funcionar. Esta optimización evita bucles infinitos, pero también es lo único que evita que la expresión regular de .NET se complete por sí sola.\G
!Python 2 , 25 bytes
Comprueba si ( 8x + 1 ) es un número cuadrado.
Pruébalo en línea!
fuente
Mathematica, 16 bytes
Esencialmente un puerto de la solución Python de xnor . Salidas
True
para números triangulares, de loFalse
contrario.fuente
JavaScript (ES6),
3027 bytesGuardado 2 bytes gracias a kamoroso94
Casos de prueba
Mostrar fragmento de código
Versión no recursiva (ES7), 19 bytes
La respuesta del puerto de Adnan .
fuente
f=(n,k=1)=>n>0?f(n-k,k+1):!n
?k
.undefined
valor inicial ; fue un placer leer su edición después de que llegué independientemente a su solución anterior.CJam , 11 bytes
Salidas
1
para triangular, de lo0
contrario.Pruébalo en línea!
Explicación
Considere la entrada
21
.fuente
Brain-Flak , 40 bytes
Wheat Wizard y yo tuvimos un duelo sobre esta pregunta. Cuando decidimos publicar nuestras soluciones, estábamos atados a 42 bytes, pero encontré un golf de 2 bytes de su solución. Decidimos que contaría como el desempate (mi solución está a continuación).
Pruébalo en línea!
Explicación:
Para obtener una explicación completa, consulte la respuesta de Wheat Wizard .
Brain-Flak , 42 bytes
Salidas
0\n
(nueva línea literal) para verdadero, y la cadena vacía para falso.La idea es restar 1, luego 2 y luego 3 hasta la entrada. Si presiona 0, entonces sabe que este es un número triangular, por lo que puede detenerse allí.
Pruébalo en línea! (verdad)
Pruébalo en línea! (falso)
Aquí hay una solución de 46 bytes que me pareció interesante.
Salidas
0\n
(nueva línea literal) para verdadero, la cadena vacía para falso.La idea es contar desde la entrada por números consecutivos, 1 a la vez. Por ej
input - (1) - (1,1) - (1,1,1)
. Cada vez que restamos, si aún no estamos en 0, dejamos un valor adicional en la pila. De esa manera, si estamos en 0 y seguimos restando cuando explotamos, eliminamos el último valor en la pila. Si la entrada fue un número triangular, terminaremos exactamente en 0 y no resaltaremos el 0.Pruébalo en línea! Truthy
Pruébalo en línea! falso
fuente
Jalea , 5 bytes
Pruébalo en línea!
Fondo
Deje n ser la entrada. Si n es el k número triangular, tenemos
lo que significa que habrá una solución natural si y solo si 1 + 8n es un cuadrado perfecto y extraño. Claramente, no se requiere verificar la paridad de 1 + 8n .
Cómo funciona
fuente
PowerShell ,
3130 bytesPruébalo en línea!
Agradable y lento método de fuerza bruta. Haga una matriz de cada suma de 1 a 10 6 , y vea si el argumento está ahí.
fuente
Brain-Flak , 42 bytes
Pruébalo en línea!
Explicación
El objetivo de este programa es crear un estado en dos pilas y realizar una operación constante en ambas pilas hasta que uno de ellos sea cero, entonces podemos generar resultados dependiendo de en qué pila nos encontremos. Esto es similar a los programas que determinan el signo de un número. Estos programas colocan
n
en una pila y-n
en la otra y agregan una y cambian las pilas hasta que una de las pilas sea cero. Si el número fue negativo en primer lugar, la primera pila llegará a cero, si el número fue positivo, la otra pila llegará a cero.Aquí creamos dos pilas, una que resta números consecutivos de la entrada y otra que solo resta uno. El que resta números consecutivos solo terminará si el número es triangular (de lo contrario, simplemente pasará cero y seguirá en los negativos). El otro siempre terminará para cualquier número positivo, pero siempre lo hará más lento que el primero, por lo que los números no triangulares terminarán en esa pila.
Entonces, ¿cómo configuramos pilas para que la misma operación reste números consecutivos en uno y reste uno en el otro? En cada pila tenemos la entrada en la parte superior para que pueda verificarse, debajo tenemos la diferencia y debajo tenemos la diferencia de la diferencia. Cada vez que corremos agregamos la "diferencia de la diferencia" a la "diferencia" normal y la restamos de la entrada. Para la pila que verifica la triangularidad, establecemos nuestra doble diferencia para
1
que obtengamos enteros consecutivos cada vez que corremos, para la otra pila la configuramos para0
que nunca cambiemos la diferencia, es decir, siempre permanece 1. Aquí está cómo se configura la pila al principio, dónden
está la entrada:Cuando finalmente terminamos, podemos usar estas diferencias para verificar en qué pila estamos, sacamos los dos valores superiores y obtenemos
1
un número triangular y0
un número no triangular.Código anotado
Aquí hay una solución de 50 bytes que también me gusta.
Pruébalo en línea!
fuente
Cubix , 23
2425bytes0 para veracidad y nada
0para falsey. Fuerzas brutas incrementando el contador, sumando a la suma acumulativa y comparando con la entrada.Ahora intenta colocarlo en un cubo de 2x2x2.¡Lo hizo!Pruébalo en línea!
/
Reflexiona para enfrentar.I10\
obtener entrada entera, presionar 1 (contador), presionar 0 (suma) y reflejar+s;p-
cuerpo de bucle Agregue suma y contador, suelte la suma anterior, aumente la entrada y reste?
Prueba el resultado de la resta\.uO@
refleja la cara inferior, sin operación, giro en U, salida y alto.@
deténgase;qWs)/su
resta de caída a la izquierda , coloque la entrada en la parte inferior, cambie a la izquierda, cambie el contador y la suma, incremente el contador, refleje, cambie la suma y el contador, gire en U en el cuerpo del bucle principal.fuente
.
en el cubo pero1
en su código.05AB1E ,
76 bytesEDITAR : Gracias a @Dennis: guardé un byte porque olvidé el operador de incremento
Pruébalo en línea!
n
es triangular sisqrt(8n + 1)
es un número enteroCómo funciona
fuente
t.ï
puede estarlo enŲ
estos días, lo cual es una opción para verificar si un número es un cuadrado.Perl 6 , 17 bytes
Simplemente verifica si
$_
, la entrada a la función, es igual a cualquiera de los elementos de la reducción de suma triangular(1, 1+2, ..., 1+2+...+$_)
.fuente
Alicia ,
3822 bytesMuchos bytes guardados gracias a Martin y Leo
Hay una nueva línea final. Salidas
1
para triangular, de lo0
contrario.Pruébalo en línea!
Explicación
Utiliza el mismo enfoque que mi respuesta de CJam , solo que más torpe. En forma linealizada, el programa se convierte
donde el
i
yo
están realmente en modo ordinal.Considere la entrada
21
como un ejemplo.fuente
...h*-no@
)Japt ,
107 bytesGuardado 3 bytes gracias a @Luke y @ETHproductions
Pruébalo en línea!
Explicación:
Explicación:
Pruébalo en línea!
fuente
*8Ä ¬u1 c
para 9B (salidas 0 si la entrada es triangular, 1 de lo contrario)u1 c
av1
, creo (conmutación de las salidas)R ,
2319 bytesEnfoque similar al de otras respuestas. Comprueba si
8x+1
es un cuadrado perfecto.-4 bytes gracias Giuseppe y MickyT.
Pruébalo en línea!
fuente
!
lugar de==0
!(8*scan()+1)^.5%%1
MATL , 5 bytes
Pruébalo en línea!
Explicación:
fuente
t:Ys=a
. Se olvidó dem
:-)m
hasta que vi esta respuesta . Es curioso cómo las dos respuestas son casi idénticas: DLote, 72 bytes.
Salidas 1 en caso de éxito, nada en caso de fracaso. También funciona para cero, aunque la pregunta no lo solicita por alguna razón.
fuente
JavaScript (ES7),
1918 bytesDe mi respuesta a una pregunta relacionada .
Salidas
false
para números triangulares otrue
no triangulares, según lo permitido por el OP.Intentalo
fuente
n=>(8*n+1)**.5%1>0
(que revertiría las salidas)PHP, 30 bytes
Imprime 1 para verdadero y nada para falso
Pruébalo en línea!
fmod
PHP, 37 bytes
Imprime 1 para verdadero y nada para falso
Pruébalo en línea!
fuente
Mathematica, 28 bytes
fuente
7!
por#
. Primero, es más corto; Más importante aún, la solución actual no es correcta, ya que impone artificialmente un límite en el tamaño de la entrada en la que trabaja.Pari / GP , 18 bytes
Pruébalo en línea!
Hay una función integrada para probar si un número es un número poligonal, pero es un byte más largo.
Pari / GP , 19 bytes
Pruébalo en línea!
fuente
Sobresalir,
3122 bytes9 bytes guardados gracias a Octopus
Salidas
TRUE
para números triangulares. De lo contrarioFALSE
. Comprueba si8*n+1
es un cuadrado perfecto.fuente
=MOD(SQRT(8*A1+1),1)=0
ahorra algunos bytesBrachylog , 5 bytes
Pruébalo en línea!
Explicación
fuente
Fourier , 26 bytes
Pruébalo en línea!
fuente
Python - 52 bytes
Nota: Sé que las otras dos respuestas de Python son mucho más cortas, pero esta es la forma de la vieja escuela, más un algoritmo manual
fuente
APL (Dyalog) , 6 bytes
Pruébalo en línea!
Explicación
Salidas
0
para falso y1
para verdadero.fuente
TI-BASIC,
107 bytes-3 gracias a @lirtosiast
Toma entrada en
X
. Comprueba si√(8X+1)
es un número enterofuente
not(fPart(√(8Ans+1
?