Eh bien, bien que ce défi se soit avéré un énorme succès, il s'est également avéré très trivial à résoudre. Par conséquent, pour ceux qui recherchent plus d'un défi, j'ai créé une suite à ce défi dans laquelle vous devez maintenant compter le nombre de rectangles uniques . Vérifiez-le!
Maintenant, pour ceux d'entre vous qui cherchent à résoudre ce défi, le voici.
Eh bien, nous n'avons pas encore vraiment de défi comme celui-ci, alors c'est parti.
Considérez cette 3 x 3
grille de rectangles:
Combien de rectangles y a-t-il? Eh bien, en comptant visuellement, nous pouvons voir qu'il existe en fait des 36
rectangles, y compris le plan entier lui-même, qui sont tous montrés dans le GIF animé ci-dessous:
La tâche
Le comptage des rectangles comme indiqué ci-dessus est la tâche. En d'autres termes, étant donné 2 entiers supérieurs ou égaux à 0
, m
et n
, où m
représente la largeur et n
la hauteur, affiche le nombre total de rectangles dans cette m x n
grille de rectangles.
Règles
L'utilisation de tout module intégré qui résout directement ce problème est explicitement interdite.
Ce défi ne consiste pas à trouver la réponse la plus courte, mais à trouver la réponse la plus courte dans toutes les langues. Par conséquent, aucune réponse ne sera acceptée.
Les failles standard sont interdites.
Cas de test
Présenté dans le format Array of Integers Input -> Integer Output
:
[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588
Les références
Rappelez-vous, c'est le code-golf , donc le code le plus court gagne!
588
pour le dernier cas de test.Réponses:
Python, 22 octets
La formule
m*n*(m+1)*(n+1)/4
est raccourcie en utilisant le complément de bits~m=-(m+1)
, exprimant(m+1)*(n+1)
comme~m*~n
.Pourquoi le nombre de rectangles
m*n*(m+1)*(n+1)/4
? Chaque rectangle est spécifié par le choix de deux lignes horizontales (haut et bas) et deux lignes verticales (gauche et droite). Il y a desm+1
lignes horizontales, dont nous choisissons un sous-ensemble de deux lignes distinctes. Donc, le nombre de choix estchoose(m+1,2)
, ce qui estm*(m+1)/2
. La multiplication par lesn*(n+1)/2
choix des lignes verticales donne le résultat.la source
Gelée , 4 octets
Essayez-le en ligne!
Alternativement, également 4 octets
Essayez-le en ligne!
la source
בHP
et‘c2P
et peut-être d'autres alternatives de 4 octets.nth
etmth
nombre triangulaire.R
convertit chaque nombre dans l'index de base 1:[1, 2, ..., n]
.S
est somme et€
signifie «chacun», donc chaque liste est additionnée, donnant une liste comme:[nth triangle number, mth triangle number]
. Prend ensuiteP
le produit de cette liste, ce qui donne le résultat souhaité.Javascript (ES6), 17 octets
Une fourchette de cette réponse .
la source
Mathematica, 15 octets
Il s'agit d'une fonction sans nom prenant deux arguments entiers et renvoyant le nombre de rectangles.
Explication
L'implémentation est fondamentalement une forme très golfique du produit des deux nombres triangulaires. Il vaut peut-être la peine de lire la section "Séquences d'arguments" dans ce post pour les détails, mais je vais essayer de résumer l'essentiel ici.
##
se développe en une séquence de tous les arguments. C'est similaire à l' éclaboussure dans d'autres langues. Par exemple, si les arguments sont3
et4
,{1, 2, ##, 5}
vous obtiendrez{1, 2, 3, 4, 5}
. Mais cela ne fonctionne pas seulement dans les listes, mais dans n'importe quelle expression, par exemple,f[1, 2, ##, 5]
serait égalementf[1, 2, 3, 4, 5]
.Cela devient intéressant lorsque vous combinez
##
avec des opérateurs. Tous les opérateurs de Mathematica ne sont que des raccourcis pour unef[...]
expression similaire (éventuellement imbriquée). Par exemple,a+b
estPlus[a, b]
eta-b
représente réellementPlus[a, Times[-1, b]]
. Maintenant, lorsque vous combinez##
avec des opérateurs, Mathematica fait d'abord développer les opérateurs, en les traitant##
comme un opérande unique, et en les développant uniquement à la fin. En insérant##
aux bons endroits, on peut donc l'utiliser à la fois pour multiplier et pour ajouter les opérandes.Faisons cela pour le code ci-dessus:
En l'étendant à sa pleine forme, nous obtenons ceci:
Insérons les arguments de la fonction
a
etb
:Et maintenant, nous le reconvertissons en notation mathématique standard:
Un petit réarrangement montre que c'est le produit des nombres triangulaires:
Fait d'amusement: cette mise en œuvre est si Golfy, c'est la même longueur que le intégré pour le calcul d' un seul numéro triangulaire,
PolygonalNumber
.la source
C, 25 octets
Version puriste (27):
Version ISO-er (35):
la source
Méduse , 16 octets
Le format d'entrée est
[x y]
, la sortie n'est que le résultat.Essayez-le en ligne!
Solution alternative, même nombre d'octets:
Explication
Il est temps de donner à Jellyfish l'introduction qu'il mérite! :)
La méduse est Zgarb de basé sur son défi de syntaxe 2D . La sémantique est largement inspirée de J, mais la syntaxe est une œuvre d'art. Toutes les fonctions sont des caractères uniques et disposées sur une grille. Les fonctions prennent leurs arguments du prochain jeton au sud et à l'est et retournent le résultat au nord et à l'ouest. Cela vous permet de créer un réseau intéressant d'appels de fonctions où vous réutilisez des valeurs en les passant dans plusieurs fonctions de plusieurs directions.
Si nous ignorons le fait que certains des jetons du programme ci-dessus sont des opérateurs spéciaux (fonctions de niveau supérieur), le programme ci-dessus serait écrit quelque chose comme ceci dans un langage sain:
Passons en revue le code de bas en haut. L'entrée est alimentée par le
i
, qui est donc évalué à[x y]
.Le
+
dessus reçoit cette entrée avec le littéral1
et incrémente donc les deux éléments pour donner[(x+1) (y+1)]
(la plupart des opérations sont enfilées automatiquement sur les listes).L'autre valeur de
i
est envoyée à gauche, mais laE
division est l'argument est nord et ouest. Cela signifie que les entrées à droite*
sont en fait[x y]
et[(x+1) (y+1)]
donc cela calcule[x*(x+1) y*(y+1)]
.Le suivant
*
est en fait modifié par le précédent/
qui le transforme en opération de pliage. Se replier*
sur une paire la multiplie simplement, pour que nous obtenionsx*(x+1)*y*(y+1)
.Maintenant,
%
c'est juste la division, donc ça calculex*(x+1)*y*(y+1)/4
. Malheureusement, cela se traduit par un flotteur, nous devons donc l'arrondir avec l'unaire|
. Enfin, cette valeur est fournie àp
laquelle imprime le résultat final.la source
R,
4035 octetsEh bien, il est temps de sauter au plus profond! Voici mon code R , inspiré de la réponse @xnor:
EDIT : Dans cette version, R demandera deux fois les entrées.
la source
cat(prod(choose(scan()+1,2)))
est de 29 octets.CJam,
1210 octets2 octets économisés grâce à Martin.
Essayez-le en ligne!
Il s'agit d'un bloc qui prend une liste de 2 éléments de la pile et laisse la solution sur la pile. Utilisable programme complet pour les tests:
riari+{_:)+:*4/}~
.Basé sur la solution python exceptionnelle de xnor.
Explication:
la source
{_:~+:*4/}
~
du tout dans CJam. Utilisez simplement)
.Matlab,
2319 octetsMise en œuvre de la formule
m*n*(m+1)*(n+1)/4
Utilisation:
ans([m,n])
la source
MATL , 6 octets
L'entrée est un tableau du formulaire
[m,n]
.Essayez-le en ligne!
Explication
Calcul direct basé sur la formule
m*(m+1)*n*(n+1)/4
.la source
J, 8 octets
Usage:
la source
Java 7,
3938 octetsJava 8,
2625191817 octetsBasé sur l'excellente réponse de @xnor . Plusieurs octets enregistrés grâce à @DavidConrad .Essayez-le ici.
Code de test (Java 7):
Essayez-le ici.
Sortie:
la source
return
eta->b->
est un octet plus court que(a,b)->
.Function<Integer, Function<Integer, Integer>>
un paramètre, il ne serait pas suivi d'un point-virgule.;
sur une seule déclaration J8 lambdas.return
.. De plus, je ne programme presque jamais en Java 8 (d'où toutes mes réponses Java 7), mais comment puis-jea->b->
travailler? Voici l'idéone du cas actuel.MathOperation.operation
pour n'en prendre qu'unint
, retourner unFunction<Integer, Integer>
, et lorsque vous l'appelez, vous ne passez initialement que le premier paramètre,a
puis appelez.apply(b)
leFunction
. Vous devez également importerjava.util.function.Function
. Voici une idée avec les changements.Rubis, 22 octets
Voler le truc de @ xnor et faire un stabby-lambda:
Exemple d'appel:
Ou en tant que proc, également 22 octets:
Que nous pourrions alors appeler:
la source
Labyrinthe ,
1311 octetsEssayez-le en ligne!
Explication
Cela calcule également le produit des nombres triangulaires comme la plupart des réponses. Le bloc 2x2 de tête est une petite boucle:
Sur la première itération
*
ne fait rien, de sorte que l'ordre de boucle réel est le suivant:Le code restant est juste linéaire:
Labyrinth essaie ensuite de s'exécuter à
/
nouveau, ce qui met fin au programme en raison d'une division par zéro.la source
Pyke, 6 octets
Essayez-le ici!
la source
05AB1E, 4 octets
Explication
Utilise la formule décrite au A096948
Prend l'entrée comme [n, m] .
Essayez-le en ligne
la source
Pyth,
86 octetsDeux octets enregistrés grâce à @DenkerAffe.
L'entrée est attendue comme une liste comme
[m,n]
. Essayez-le ici .Explication:
la source
F
lieu de.*
et enlever leQ
car il est ajouté implictly.F
mais je ne savais pas comment l'utiliser et j'ai pensé que je devais l'utiliser à la.*
place ... Merci!C #, 19 octets
Une fonction anonyme basée sur la réponse de @ xnor.
la source
Lua,
7463 octetsLa fonction prend l'entrée comme paramètres numériques.
En raison de la façon dont Lua est implémentée, il s'agit techniquement d'une fonction, avec des arguments variables, qui peut être appelée en l'enveloppant dans une instruction "function", ou en la chargeant à partir du code source en utilisant "loadstring"
la source
Cheddar , 23 octets
la source
n*(n+1)
peut être joué aun^2+n
m->n->...
Brain-Flak ,
8480 octetsEssayez-le en ligne!
Probablement très sous-optimal, en particulier à cause de la réutilisation du code concernant les nombres triangulaires, mais au moins nous avons une solution Brain-Flak qui fonctionne.
Malheureusement, il semble échouer en bouclant à l'infini avec le
0 0
boîtier de test, mais tous les autres fonctionnent bien.la source
Convexe, 7 octets
Je sais que cela peut être plus petit, je ne sais pas encore comment ...
Essayez-le en ligne! . Utilise l'encodage CP-1252.
la source
APL (Dyalog), 9 bytes
Try it online!
la source
Pyt, 3 bytes
Explanation:
Try it online!
la source