Bueno, aunque este desafío resultó ser un gran éxito, también resultó ser muy trivial de resolver. Por lo tanto, para aquellos que buscan más desafíos, creé una secuela de este desafío en el que ahora deben contar la cantidad de rectángulos únicos . ¡Echale un vistazo!
Ahora, para aquellos de ustedes que buscan resolver este desafío, aquí viene.
Bueno, todavía no tenemos un desafío como este, así que aquí vamos.
Considere esta 3 x 3
cuadrícula de rectángulos:
¿Cuántos rectángulos hay? Bueno, contando visualmente, podemos ver que en realidad hay 36
rectángulos, incluido todo el plano, que se muestran en el GIF animado a continuación:
La tarea
El conteo de rectángulos como se muestra arriba es la tarea. En otras palabras, dados 2 enteros mayores o iguales que0
, m
y n
, donde m
representa el ancho y n
representa la altura, genera el número total de rectángulos en esa m x n
cuadrícula de rectángulos.
Reglas
El uso de cualquier incorporado que resuelva directamente este problema está explícitamente prohibido.
Este desafío no se trata de encontrar la respuesta más corta, sino de encontrar la respuesta más corta en todos los idiomas. Por lo tanto, no se aceptará ninguna respuesta.
Las lagunas estándar están prohibidas.
Casos de prueba
Presentado en el formato Array of Integers Input -> Integer Output
:
[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588
Referencias
Recuerde, este es el código de golf , ¡así que el código más corto gana!
588
para el último caso de prueba.Respuestas:
Python, 22 bytes
La fórmula
m*n*(m+1)*(n+1)/4
se acorta usando el complemento de bits~m=-(m+1)
, expresándose(m+1)*(n+1)
como~m*~n
.¿Por qué es el número de rectángulos
m*n*(m+1)*(n+1)/4
? Cada rectángulo se especifica mediante la elección de dos líneas horizontales (superior e inferior) y dos líneas verticales (izquierda y derecha). Haym+1
líneas horizontales, de las cuales elegimos un subconjunto de dos distintas. Entonces, el número de opciones eschoose(m+1,2)
, que esm*(m+1)/2
. Multiplicar por lasn*(n+1)/2
opciones para las líneas verticales da el resultado.fuente
Jalea , 4 bytes
Pruébalo en línea!
Alternativamente, también 4 bytes
Pruébalo en línea!
fuente
בHP
y‘c2P
quizás otras alternativas de 4 bytes.nth
ymth
número triangular.R
convierte cada número en el índice 1 basado:[1, 2, ..., n]
.S
es suma y€
medios 'cada uno' por lo que cada lista se suman, dando una lista como:[nth triangle number, mth triangle number]
. LuegoP
toma el producto de esa lista, que da el resultado deseado.Javascript (ES6), 17 bytes
Un tenedor de esta respuesta .
fuente
Mathematica, 15 bytes
Esta es una función sin nombre que toma dos argumentos enteros y devuelve el número de rectángulos.
Explicación
La implementación es básicamente una forma muy golfística del producto de los dos números triangulares. Puede valer la pena leer la sección "Secuencias de argumentos" en esta publicación para obtener detalles, pero trataré de resumir la esencia aquí.
##
se expande a una secuencia de todos los argumentos. Esto es similar a las salpicaduras en otros idiomas. Por ejemplo, si los argumentos son3
y4
, entonces{1, 2, ##, 5}
te darán{1, 2, 3, 4, 5}
. Pero esto no solo funciona en las listas, sino en cualquier expresión, por ejemplof[1, 2, ##, 5]
, también lo seríaf[1, 2, 3, 4, 5]
.Esto se pone interesante cuando se combina
##
con operadores. Todos los operadores en Mathematica son solo manos cortas para algunaf[...]
expresión similar (posiblemente anidada). Por ejemplo,a+b
esPlus[a, b]
ya-b
realmente representaPlus[a, Times[-1, b]]
. Ahora, cuando se combina##
con operadores, lo que hace Mathematica es expandir los operadores primero, tratándolos##
como un solo operando, y expandirlos solo al final. Al insertar##
en los lugares correctos, podemos usarlo tanto para multiplicar como para agregar los operandos.Hagamos esto para el código anterior:
Expandiéndolo a su forma completa, obtenemos esto:
Insertemos los argumentos de la función
a
yb
:Y ahora lo convertimos nuevamente en notación matemática estándar:
Un poco de reorganización muestra que este es el producto de los números triangulares:
Dato curioso: esta implementación es tan deportiva que tiene la misma longitud que la integrada para calcular un solo número triangular
PolygonalNumber
.fuente
C, 25 bytes
Versión purista (27):
Versión ISO-er (35):
fuente
Medusa , 16 bytes
El formato de entrada es
[x y]
, la salida es solo el resultado.Pruébalo en línea!
Solución alternativa, mismo recuento de bytes:
Explicación
¡Es hora de darle a Jellyfish la presentación que se merece! :)
Jellyfish es el lenguaje de Zgarb basado en su desafío de sintaxis 2D . La semántica está inspirada en gran medida por J, pero la sintaxis es una obra de arte. Todas las funciones son caracteres individuales y se presentan en una cuadrícula. Las funciones toman sus argumentos de la siguiente ficha al sur y al este de ellos y devuelven el resultado al norte y al oeste. Esto le permite crear una red interesante de llamadas a funciones donde reutiliza valores pasándolos a varias funciones desde múltiples direcciones.
Si ignoramos el hecho de que algunos de los tokens en el programa anterior son operadores especiales (funciones de nivel superior), el programa anterior se escribiría algo así en un lenguaje sensato:
Veamos el código de abajo hacia arriba. La entrada es alimentada por
i
, que por lo tanto se evalúa como[x y]
.La
+
parte superior recibe esta entrada junto con el literal1
y, por lo tanto, incrementa ambos elementos para dar[(x+1) (y+1)]
(la mayoría de las operaciones se enhebran automáticamente en las listas).El otro valor de
i
se envía a la izquierda, pero lasE
divisiones son argumentos orientales norte y oeste. Eso significa que las entradas a la derecha*
son en realidad[x y]
y[(x+1) (y+1)]
esto calcula[x*(x+1) y*(y+1)]
.El siguiente
*
es modificado por el precedente, lo/
que lo convierte en una operación de plegado. Doblar*
sobre un par simplemente lo multiplica, para que podamos obtenerx*(x+1)*y*(y+1)
.Ahora
%
es solo división, así que computax*(x+1)*y*(y+1)/4
. Desafortunadamente, esto da como resultado un flotador, por lo que debemos redondearlo con el unario|
. Finalmente, se alimenta este valorp
que imprime el resultado final.fuente
R,
4035 bytesBueno, ¡es hora de saltar al fondo! Aquí está mi código R , inspirado en la respuesta @xnor:
EDITAR : En esta versión, R pedirá dos veces entradas.
fuente
cat(prod(choose(scan()+1,2)))
es de 29 bytes.CJam,
1210 Bytes2 bytes guardados gracias a Martin.
Pruébalo en línea!
Este es un bloque que toma una lista de 2 elementos de la pila y deja la solución en la pila. Programa completo utilizable para la prueba:
riari+{_:)+:*4/}~
.Basado en la excelente solución python de xnor.
Explicación:
fuente
{_:~+:*4/}
~
en CJam. Solo úsalo)
.Matlab
2319 bytesImplementación de la fórmula
m*n*(m+1)*(n+1)/4
Uso:
ans([m,n])
fuente
MATL , 6 bytes
La entrada es una matriz de la forma
[m,n]
.Pruébalo en línea!
Explicación
Cálculo directo basado en la fórmula
m*(m+1)*n*(n+1)/4
.fuente
J, 8 bytes
Uso:
fuente
Java 7,
3938 bytesJava 8,
2625191817 bytesBasado en la excelente respuesta de @xnor . Múltiples bytes guardados gracias a @DavidConrad . Pruébalo aquí.
Código de prueba (Java 7):
Pruébalo aquí.
Salida:
fuente
return
ya->b->
es un byte más corto que(a,b)->
.Function<Integer, Function<Integer, Integer>>
como parámetro, no sería seguido por un punto y coma.;
en una sola declaración J8 lambdas.return
.. Además, casi nunca programo en Java 8 (de ahí todas mis respuestas de Java 7), pero ¿cómo me pongoa->b->
a trabajar? Aquí está la ideona para el caso actual.MathOperation.operation
para tomar solo unoint
, devolver aFunction<Integer, Integer>
, y cuando lo llama, inicialmente pasa solo el primer parámetroa
, y luego llama.apply(b)
alFunction
. También necesitas importarjava.util.function.Function
. Aquí hay una idea con los cambios.Ruby, 22 bytes
Robando el truco de @xnor y haciendo una lambda stabby
Llamada de ejemplo:
O como proceso, también 22 bytes:
A lo que luego podríamos llamar:
fuente
Laberinto ,
1311 bytesPruébalo en línea!
Explicación
Esto también calcula el producto de los números triangulares como la mayoría de las respuestas. El bloque principal de 2x2 es un pequeño bucle:
En la primera iteración
*
no hace nada, por lo que el orden de bucle real es este:El código restante es solo lineal:
Labyrinth luego intenta ejecutarse
/
nuevamente, lo que termina el programa debido a una división por cero.fuente
Pyke, 6 bytes
Pruébalo aquí!
fuente
05AB1E, 4 bytes
Explicación
Utiliza la fórmula descrita en A096948
Toma la entrada como [n, m] .
Pruébalo en línea
fuente
Pyth
86 bytesDos bytes guardados gracias a @DenkerAffe.
La entrada se espera como una lista como
[m,n]
. Pruébalo aquí .Explicación:
fuente
F
lugar de.*
y eliminar elQ
ya que se agrega implícitamente.F
pero no sabía cómo usarlo y pensé que tenía que usarlo.*
en su lugar ... ¡Gracias!C #, 19 bytes
Una función anónima basada en la respuesta de @ xnor.
fuente
Lua,
7463 bytesLa función toma la entrada como parámetros numéricos.
Debido a la forma en que se implementa Lua, esta es técnicamente una función, con argumentos variables, que se puede invocar envolviéndola en una declaración de "función", o cargándola desde el código fuente usando "cargas de cadena"
fuente
Cheddar , 23 bytes
fuente
n*(n+1)
se puede jugar al golfn^2+n
m->n->...
Brain-Flak ,
8480 bytesPruébalo en línea!
Probablemente muy subóptimo, especialmente debido a la reutilización del código con respecto a los números de triángulo, pero al menos tenemos una solución Brain-Flak que funciona.
Lamentablemente, parece fallar haciendo un bucle infinito con el caso de
0 0
prueba, pero todos los demás funcionan bien.fuente
Convexo, 7 bytes
Sé que esto puede ser más pequeño, pero no puedo entender cómo ...
Pruébalo en línea! . Utiliza la codificación CP-1252.
fuente
APL (Dyalog) , 9 bytes
Pruébalo en línea!
fuente
Pyt , 3 bytes
Explicación:
Pruébalo en línea!
fuente