Écrivez une fonction qui prend 4 points sur le plan en entrée et renvoie vrai si les 4 points forment un carré. Les points auront des coordonnées intégrales avec des valeurs absolues <1000.
Vous pouvez utiliser toute représentation raisonnable des 4 points en entrée. Les points ne sont pas fournis dans un ordre particulier.
Le code le plus court gagne.
Exemples de carrés:
(0,0),(0,1),(1,1),(1,0) # standard square
(0,0),(2,1),(3,-1),(1,-2) # non-axis-aligned square
(0,0),(1,1),(0,1),(1,0) # different order
Exemple de non-carrés:
(0,0),(0,2),(3,2),(3,0) # rectangle
(0,0),(3,4),(8,4),(5,0) # rhombus
(0,0),(0,0),(1,1),(0,0) # only 2 distinct points
(0,0),(0,0),(1,0),(0,1) # only 3 distinct points
Vous pouvez retourner vrai ou faux pour le carré dégénéré (0,0),(0,0),(0,0),(0,0)
Réponses:
Python
1769079 octetsLa fonction S prend une liste de nombres complexes comme entrée (A). Si nous connaissons à la fois le centre et un coin d'un carré, nous pouvons reconstruire le carré en tournant le coin de 90 180 et 270 degrés autour du point central (c). Sur le plan complexe, la rotation de 90 degrés autour de l'origine se fait en multipliant le point par i . Si notre forme d'origine et le carré reconstruit ont les mêmes points, cela doit être un carré.
la source
J, 28
172527J n'a pas vraiment de fonctions, mais voici un verbe monadique qui prend un vecteur de points du plan complexe:
La méthode est un mélange de Michael Spencer (travail uniquement sur les longueurs inter-vertex; mais il échoue actuellement à mon losange2) et Eelvex (vérifiez les tailles des ensembles). Lecture de droite à gauche:
-/~
calculer toutes les différences de points,
aplatir|
extraire la magnitude/:~
Trier#/.~
nub and count4 8 4 -:
doit avoir exactement 4 équidistances (à 0), 8 un peu plus grandes (longueur 1, côtés), 4 plus grandes encore (longueursqrt 2
, diagonales)Manifestation:
Pour mémoire, ma méthode précédente (requis sommets ordonnés, mais pouvait détecter des polygones réguliers de n'importe quel ordre):
Voir l'historique pour l'explication et la démo. La méthode actuelle pourrait probablement être étendue à d'autres polygones, ce
4 8 4
qui ressemble beaucoup à une distribution binomiale.la source
3 :'4 8 4-:#/.~/:~|,-/~y'
Python, 71
42Mise à jour 1) pour exiger 4 points différents (donnerait auparavant des faux positifs pour les points répétés - y en a-t-il d'autres?) 2) pour définir une fonction par spécification
Pour un carré, le vecteur entre deux points quelconques doit être 0 (le même point), un côté ou une diagonale. Ainsi, l'ensemble de la magnitude de ces vecteurs doit avoir une longueur de 3.
la source
Haskell, 100 caractères
Voici comment j'écrirais la solution J de JB dans Haskell. Sans aucune tentative de nuire à la lisibilité en supprimant les caractères non essentiels, il s'agit d'environ 132 caractères:
Vous pouvez le réduire à 100 en supprimant les espaces en excès et en renommant certaines choses
Utilisons QuickCheck pour nous assurer qu'il accepte des carrés arbitraires, avec un sommet en (x, y) et un vecteur de bord (a, b):
L'essayer dans ghci:
Oh oui, le carré vide n'est pas considéré comme un carré ici, nous allons donc réviser notre test:
Et réessayez:
la source
d
.s l=[4,8,4]==(map length.group.sort)[(x-a)^2+(y-b)^2|(x,y)<-l,(a,b)<-l]
Facteur
Une implémentation dans le langage de programmation Factor :
Et quelques tests unitaires:
la source
OCaml, 145
164Courez comme ceci:
Désobfusquons et expliquons un peu.
Nous définissons d'abord une norme:
Vous remarquerez qu'il n'y a pas d'appel à sqrt, ce n'est pas nécessaire ici.
Ici a, b, c et d sont des points. Nous supposons que ces points sont présentés comme suit:
Si nous avons un carré, toutes ces conditions doivent être remplies:
Notez que ce qui suit est toujours valable:
Nous utiliserons cela pour simplifier notre fonction de test ci-dessous.
Puisque notre entrée n'est pas ordonnée, nous devons également vérifier toutes les permutations. Sans perte de généralité on peut éviter de permuter le premier point:
Après simplification:
Edit: suivi les conseils de M.Giovannini.
la source
n
une réduction de 20 caractères:let t a b c d=a%b+a%c=b%c&&d%c+d%b=b%c&&a%b=a%c&&d%c=d%b
.Python (105)
Les points sont représentés par des
(x,y)
tuples. Les points peuvent être dans n'importe quel ordre et n'acceptent que les carrés. Crée une listes
,, de paires (non nulles) de distances entre les points. Il devrait y avoir 12 distances au total, en deux groupes uniques.la source
f([(0,0),(0,4),(2,2),(-2,2)])
est un carréPython - 42 caractères
On dirait que c'est une amélioration d'utiliser des nombres complexes pour les points
où A = [(11 + 13j), (14 + 12j), (13 + 9j), (10 + 10j)]
ancienne réponse:
Les points sont spécifiés dans n'importe quel ordre sous forme de liste, par exemple
la source
>>> A=[(0,0),(0,0),(1,1),(0,0)] >>> len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2 True
A=[(0,0),(0,4),(2,2),(-2,2)]; len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2
C # - pas exactement court. Abuser de LINQ. Sélectionne deux combinaisons distinctes de points dans l'entrée, calcule leurs distances, puis vérifie qu'exactement quatre d'entre eux sont égaux et qu'il n'y a qu'une seule autre valeur de distance distincte. Point est une classe avec deux membres doubles, X et Y. Pourrait facilement être un tuple, mais meh.
la source
PHP, 82 caractères
la source
K - 33
Traduction de la solution J par JB :
K souffre ici de ses mots réservés (
_sqr
et_sqrt
).Essai:
la source
OCaml + Batteries, 132 caractères
(regardez, Ma, pas d'espaces!) La compréhension de
q
la liste forme la liste des normes au carré pour chaque paire distincte de points non ordonnés. Un carré a quatre côtés égaux et deux diagonales égales, les longueurs carrées de ce dernier étant le double des longueurs carrées du premier. Puisqu'il n'y a pas de triangles équilatéraux dans le réseau entier, le test n'est pas vraiment nécessaire, mais je l'inclus pour être complet.Tests:
la source
Mathematica
65 80 6966Vérifie que le nombre de distances inter-points distinctes (sans compter la distance d'un point à lui-même) est 2 et que la plus courte des deux n'est pas 0.
Usage
NB:
\[And]
est un caractère unique dans Mathematica.la source
Gelée , 8 octets
Essayez-le en ligne!
Prend une liste de nombres complexes comme argument de ligne de commande. Imprime
1
ou0
.Cela semble être un défi agréable à revivre!
la source
Haskell (212)
Première tentative naïve. Vérifie les deux conditions suivantes pour toutes les permutations de la liste de points d'entrée (où une permutation donnée représente, disons, un ordre des points dans le sens horaire):
Code et tests désobfusqués
la source
Scala (146 caractères)
la source
JavaScript 144 caractères
Mathématiquement égal à la réponse J Bs. Il génère les 6 longueurs et affirme que les 2 plus grandes sont égales et que les 4 plus petites sont égales. L'entrée doit être un tableau de tableaux.
la source
PHP,
161158 caractèresPreuve (1x1): http://codepad.viper-7.com/ZlBpOB
Ceci est basé sur la réponse JavaScript d' eBuisness .
la source
JavaScript 1.8, 112 caractères
Mise à jour: enregistré 2 caractères en repliant les compréhensions de tableau ensemble.
Une autre réimplémentation de la réponse de JB. Exploite les fonctionnalités JavaScript 1.7 / 1.8 (fermetures d'expressions, compréhensions de tableaux, affectation de déstructuration). Abuse également
~~
(double opérateur pas au niveau du bit) pour contraindreundefined
au numérique, avec une contrainte tableau-chaîne et une expression rationnelle pour vérifier que le nombre de longueurs est[4, 8, 4]
(il suppose que exactement 4 points sont passés). L'abus de l'opérateur virgule est un vieux truc C obscurci.Tests:
la source
GoRuby - 66 caractères
étendu:
Même algorithme que la réponse de JB .
Testez comme:
Sorties
true
pour vrai et vide pour fauxla source
ruby -r ./golf-prelude.rb FILE_TO_RUN.rb
et cela fonctionnera exactement de la même manière.sort
avantgroup_by
..sort.group_by {...}
devrait être écrit comme.group_by {...}
Python 97 (sans points complexes)
Cela prendra des listes de tuples de points dans [(x, y), (x, y), (x, y), (x, y)] dans n'importe quel ordre, et peut gérer les doublons ou le mauvais nombre de points. Il ne nécessite PAS de points complexes comme les autres réponses python.
Vous pouvez le tester comme ceci:
Cela prendra un peu d'explication, mais l'idée générale est qu'il n'y a que trois distances entre les points d'un carré (Side, Diagonal, Zero (point par rapport à lui-même)):
Pour enregistrer les caractères du code, je suis:
Je crains que quelqu'un ne trouve un test qui casse cela. Alors s'il vous plaît, faites-le et je vais corriger. Par exemple, le fait que je vérifie simplement trois distances, au lieu de faire un abs () et de vérifier la longueur du côté et l'hypoténuse, semble être une erreur.
La première fois que j'ai essayé le golf à code. Soyez gentil si j'ai enfreint les règles de la maison.
la source
Clojure, 159 caractères.
Edit: Pour expliquer aussi un peu.
(Remarque: l'enracinement carré n'est pas nécessaire et donc dans le code enregistré ci-dessus.)
la source
C #, 107 caractères
Où points est la liste de Vector3D contenant les points.
Calcule toutes les distances au carré entre tous les points, et s'il existe exactement trois types distincts (doit être 0, une valeur a et 2 * a) et 4 points distincts, alors les points forment un carré.
la source
Python, 66
Amélioration de la réponse de Paperhorse de 76 à 66:
la source
Python 2 , 49 octets
Essayez-le en ligne!
Prend une liste de quatre nombres complexes en entrée. Fait pivoter chaque point de 90 degrés autour de la moyenne et vérifie que chaque point résultant figure dans la liste d'origine.
Même longueur (mais plus courte en Python 3 avec
{*l}
).Essayez-le en ligne!
la source
^
peut être utilisé à la place de==
.Wolfram Language (Mathematica) ,
3231 octetsEssayez-le en ligne!
Prend une liste de points représentés par des nombres complexes, calcule les deuxième et troisième moments centraux et vérifie que les deux sont nuls.
Non-golfé:
ou
preuve
Ce critère fonctionne sur tout le plan complexe, pas seulement sur les entiers gaussiens .
Tout d'abord, nous notons que les moments centraux ne changent pas lorsque les points sont traduits ensemble. Pour un ensemble de points
les moments centraux sont tous indépendants de
c
(c'est pourquoi ils sont appelés centraux ):Deuxièmement, les moments centraux dépendent simplement de la mise à l'échelle complexe globale (mise à l'échelle et rotation) de l'ensemble de points:
Cela signifie que si un moment central est nul, la mise à l'échelle et / ou la rotation de l'ensemble de points maintiendra le moment central égal à zéro.
Troisièmement, prouvons le critère pour une liste de points où les deux premiers points sont fixes:
Dans quelles conditions les parties réelle et imaginaire des deuxième et troisième moments centraux sont-elles nulles?
Toutes ces six solutions représentent des carrés: Par conséquent, la seule façon dont une liste de points de la forme
{0, 1, x[3] + I*y[3], x[4] + I*y[4]}
peut avoir zéro seconde et troisième moments centraux est lorsque les quatre points forment un carré.En raison des propriétés de translation, de rotation et de mise à l'échelle démontrées aux points 1 et 2, cela signifie que chaque fois que les deuxième et troisième moments centraux sont nuls, nous avons un carré dans un état de translation / rotation / mise à l'échelle. ∎
généralisation
Le k-ième moment central d'un n-gon régulier est nul si k n'est pas divisible par n. Il faut combiner suffisamment de ces conditions pour constituer un critère suffisant pour détecter les n-gons. Pour le cas n = 4, il suffisait de détecter des zéros dans k = 2 et k = 3; pour détecter, par exemple, des hexagones (n = 6), il peut être nécessaire de vérifier k = 2,3,4,5 pour les zéros. Je n'ai pas prouvé ce qui suit, mais je soupçonne qu'il détectera tout n-gon régulier:
Le défi du code est essentiellement ce code spécialisé pour les listes de longueur 4.
la source
J,
31 29 2726vérifie si les 8 plus petites distances entre les points sont identiques.vérifie s'il existe exactement trois types de distances entre les points (zéro, longueur latérale et longueur diagonale).4 2 $
est une façon d'écrire un tableau en J.la source
Smalltalk pour 106 caractères
où p est un ensemble de points, par exemple
Je pense que les maths sont solides ...
la source
Mathematica, 123 caractères (mais vous pouvez faire mieux):
Où 'a' est l'entrée sous forme de liste Mathematica, par exemple:
a={{0,0},{3,4},{8,4},{5,0}}
La clé est de regarder les produits scalaires entre tous les vecteurs et de noter qu'ils doivent avoir exactement trois valeurs: 0, x et 2 * x pour une valeur de x. Le produit scalaire vérifie à la fois la perpendicularité ET la longueur en un seul gonflement.
Je sais qu'il existe des raccourcis Mathematica qui peuvent rendre cela plus court, mais je ne sais pas ce qu'ils sont.
la source
Union
au lieu deSort@DeleteDuplicates
. J'ai mis vos 3 lignes ensemble également:#[[1]] == 0 && #[[3]]/#[[2]] == 2 &[ Union@Abs@Flatten[Table[c.d, {c, #}, {d, #}]] &[ Flatten[Table[x - y, {x, a}, {y, a}], 1]]]
Haskell, "wc -c" rapporte 110 caractères. Ne vérifie pas que l'entrée a 4 éléments.
J'ai testé sur
la source