Estamos acostumbrados al término "cuadrar" n para significar calcular n 2 . También estamos acostumbrados al término "cubicación" n que significa n 3 . Dicho esto, ¿por qué no podríamos también triangular un número?
¿Cómo hacer un triángulo con un número?
En primer lugar, escojamos un número
53716
,.Colóquelo en un paralelogramo, cuya longitud lateral sea igual al número de dígitos del número, y tenga dos lados colocados en diagonal, como se muestra a continuación.
53716 53716 53716 53716 53716
Ahora, queremos ∆ eso, ¿verdad? Para hacerlo, recorte los lados que no encajan en un triángulo rectángulo:
5 5 53 537 5371 53716
Tome las sumas de cada fila, para este ejemplo resulta en
[5, 8, 15, 16, 22]
:5 -> 5 53 -> 8 537 -> 15 5371 -> 16 53716 -> 22
Suma la lista
[5, 8, 15, 16, 22]
, resultando en66
. Este es el triángulo de este número!
Especificaciones y Reglas
La entrada será un número entero no negativo n ( n ≥ 0, n ∈ Z ).
Puede tomar entrada y proporcionar salida por cualquier medio permitido .
La entrada puede formatearse como un entero, una representación de cadena del entero o una lista de dígitos.
Lagunas predeterminadas no permitidas.
Este es el código de golf , por lo que gana el código más corto en bytes.
Más casos de prueba
Entrada -> Salida 0 -> 0 1 -> 1 12 -> 4 123 -> 10 999 -> 54 100000 -> 6 654321 -> 91
Inspiración. ¡Se alientan las explicaciones!
fuente
645321 -> 91
?645321
lugar de654321
.Respuestas:
Haskell , 13 bytes
Pruébalo en línea!
Toma la entrada como una lista de dígitos. Calcula las sumas acumulativas y luego las suma.
fuente
De cáscara ,
42 bytesGracias @ H.PWiz por
-2
bytes!Pruébalo en línea!
"Ungolfed" / Explicado
fuente
Brain-Flak ,
65, 50,36 bytesPruébalo en línea!
Después de muchas revisiones, ahora estoy muy orgulloso de esta respuesta. Me gusta el algoritmo y lo bien que se puede expresar en cerebro-flak.
La mayor parte del recuento de bytes proviene del manejo de 0 en la entrada. De hecho, si pudiéramos suponer que no hubo 0 en la entrada, sería una respuesta maravillosamente corta de 20 bytes:
Pruébalo en línea!
Pero desafortunadamente, el ataque cerebral es notorio por el mal manejo de los casos extremos.
Explicación
Primero, una observación mía:
Si la entrada tiene n dígitos, el primer dígito aparecerá en el triángulo n veces, el segundo dígito aparecerá n-1 veces, y así sucesivamente en el último dígito, que aparecerá una vez. Podemos aprovechar esto, ya que es realmente fácil calcular cuántos dígitos de entrada quedan en el cerebro-flak, a saber
Así es como funciona el código.
fuente
Pyth -
64 bytesPruébelo en línea aquí .
Bonito 6 byte uno que no usa prefijo incorporado:
fuente
s.e*bhk_
MATL , 3 bytes
Pruébalo en línea!
Toma la entrada como una lista de dígitos.
fuente
Jalea , 3 bytes
Pruébalo en línea! Utiliza la misma técnica que mi respuesta de Japt: suma acumulativa, luego suma.
fuente
Haskell , 25 bytes
Toma entrada como lista de dígitos
Pruébalo en línea!
Haskell , 41 bytes
Toma entrada como representación de cadena
Pruébalo en línea!
fuente
Japt ,
764 bytesPruébalo en línea!
Explicación
Vieja solución:
Pruébalo en línea!
Explicación
fuente
Brain-Flak , 28 bytes
Pruébalo en línea!
14 bytes si no necesitamos admitir ceros (lo que hacemos)
Pruébalo en línea!
DJMcMayhem tiene una respuesta genial aquí que deberías consultar. Desafortunadamente para él, no estaba dispuesto a dejarlo ganar en su propio idioma: P
¿Como funciona?
Comencemos con la versión simple.
La acción principal aquí es
({}<>{})<>
, que toma la parte superior de la pila izquierda y se agrega a la parte superior de la pila derecha. Al repetir esta operación, resumimos la pila actual (hasta que llega a cero) colocando la suma en la pila desactivada. Eso es bastante mundano, lo interesante es que resumimos los resultados de todas estas ejecuciones como nuestro resultado. Esto calculará el valor deseado. ¿Por qué? Bueno, echemos un vistazo a un ejemplo123
,. En la primera toma, solo obtenemos 1, por lo que nuestro valor es 1En el siguiente agarre devolvemos 1 más el 2
En la última carrera tenemos los tres juntos
¿Ves el triángulo? La suma de todas las ejecuciones es el "triángulo" de la lista.
Ok, pero ahora necesitamos que funcione para ceros, aquí usé el mismo truco que DJMcMayhem, además de un juego de pies elegante. En lugar de repetir hasta que lleguemos a cero, repetimos hasta que la pila esté vacía.
Luego utilicé este consejo , escrito por nada menos que el suyo, para jugar otros 2 bytes.
Y ahí lo tenemos. Me sorprendería si hubiera una solución más corta, pero de nuevo han sucedido cosas más extrañas.
fuente
Unfortunately for him I wasn't about to let him win at his own language :P
No espero menos de ti. : DJavaScript (ES6), 28 bytes
Toma la entrada como una lista de dígitos.
fuente
Python 3 , 37 bytes
Pruébalo en línea!
fuente
len
parasum
así, aunque no creo que ayuda a nada.sum([])
es 0, pero nada se estaba uniendo ... aunque podría haber una maneraC # (.NET Core) , 59 bytes
Pruébalo en línea!
Sustancialmente diferente de las otras respuestas de C #. La entrada es una lista de dígitos. Todos los casos de prueba incluidos en el enlace TIO.
Podría guardar un montón de bytes si se le permite tomar la entrada como una lista de dígitos hacia atrás con un 0 inicial.
fuente
number
, no una lista de dígitos?Python 3 , 35 bytes
¡Sin embargo, acabo de darme cuenta de que esto es solo un pequeño golf de la respuesta de Business Cat al final!
Pruébalo en línea!
fuente
J , 7 bytes
Pruébalo en línea! Toma una lista de dígitos, como
f 6 5 4 3 2 1
.Explicación
Un poco más fiel al problema original sería
[:+/@,]/
, que es "sum" (+/
) los,
prefijos aplanados ( ) de input (]\
).fuente
Vim ,
605932 pulsaciones de teclasMuchas gracias @CowsQuack por el consejo con la macro recursiva y el
h
truco, ¡esto me ahorró 27 bytes!Pruébalo en línea!
Sin golf / Explicado
Esto construirá el triángulo como se describe (solo que lo mantiene alineado a la izquierda):
El buffer ahora se ve así:
Une todas las líneas en una y crea una expresión evaluable a partir de ella:
El
"
registro ahora contiene la siguiente cadena (nota falta 0):Entonces, todo lo que tenemos que hacer es agregar un cero y evaluarlo:
fuente
&
(todo el partido) en lugar de\1
en el comando sustitutoqqYp$xq:exe"norm".col('.')."@q"⏎
puede llegar a serqqYp$xh@qq@q
. Esta macro recursiva encontrará un error de ruptura cuando haya un carácter en la línea, después de lo cual se detendrá.:s/./&+/g
. También:%j⏎
puede hacerseV{J
. YDi
puede convertirseC
(ya he comentado sobre esto en otra de sus respuestas de Vim). Pruébalo en línea!Python 2 ,
4945 bytes-4 bytes gracias al Sr. Xcoder.
Pruébalo en línea!
Toma la entrada como una lista de dígitos.
fuente
Bash + GNU utilidades,
3224Entrada leída desde STDIN.
Actualización: veo que la entrada puede darse como una lista de dígitos. Mi lista de entrada está delimitada por nueva línea.
Pruébalo en línea .
Explicación
fuente
APL, 4 bytes
Esto toma la entrada como una lista de dígitos, por ejemplo:
Explicación
fuente
Taxi , 1478 bytes
Pruébalo en línea!
Sin golf:
fuente
Perl 5 , 19 + 1 (
-p
) = 20 bytesPruébalo en línea!
¿Cómo?
$ \ contiene el total acumulado, $ p contiene el total de los dígitos en la línea actual. Cada línea del paralelogramo es simplemente la línea anterior con el siguiente dígito del número agregado. Por lo tanto, es la suma de la línea anterior más el nuevo dígito. Esto itera sobre todos los dígitos, calculando las sumas a medida que avanza. La sustitución real es irrelevante; es solo un medio para iterar sobre los dígitos sin crear un bucle real. Al final, $ \ se imprime implícitamente por la
-p
opción.fuente
Python 2 , 56 bytes
Pruébalo en línea!
fuente
Jalea ,
54 bytesUn enlace monádico que toma una lista de dígitos decimales y devuelve el triángulo del número que esa lista representa.
Pruébalo en línea!
¿Cómo?
fuente
€
aún funcionaría. Lástima ...Retina , 13 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación: La primera etapa genera todos los prefijos del número original, la segunda etapa convierte cada dígito en unario y la tercera etapa toma el total.
fuente
Mathematica, 49 bytes
fuente
#.Range[Length@#,1,-1]&
#.Range[Tr[1^#],1,-1]&
Tr@*Accumulate
Neim , 3 bytes
Explicación:
Pruébalo en línea!
Respuesta alternativa:
Explicación:
Pruébalo en línea!
fuente
Java 8, 53 bytes
Implementé una lambda para cada tipo de entrada aceptable. Cada uno itera a través de los dígitos del número, agregando el múltiplo apropiado de cada uno a un acumulador.
Entero como entrada (53 bytes)
Lambda de
Integer
aInteger
:Representación de cadena como entrada (72 bytes)
Lambda de
String
aInteger
:Matriz de dígitos como entrada (54 bytes)
Lambda de
int[]
(de dígitos, el valor posicional más grande primero) aInteger
:fuente
Pyt ,
96 bytesExplicación:
fuente
Python 3,
945854 bytes¡Gracias al Sr. Xcoder por ayudarme a ahorrar algunos bytes!
¡Pruébelo en línea!
Toma la entrada como una cadena. Simplemente multiplica cada dígito por la cantidad de veces que necesita agregarse y devuelve su suma.
fuente
0
. Sip
siempre debe ser así0
, debe reemplazarlop
conp=0
en lalambda
declaración. Sin embargo, puede eliminar porp
completo para obtener 54 bytesSNOBOL4 (CSNOBOL4) , 79 bytes
Pruébalo en línea!
Entrada de stdin, salida a stdout.
fuente
Lisp común,
5352 bytesEntrada como lista de dígitos.
Pruébalo en línea!
-1 byte gracias a @ceilingcat.
fuente
apply
se apliquen en listas muy largas debido acall-arguments-limit
.