Chiffres similaires
Deux rectangles sont similaires si les rapports de leurs côtés sont identiques.
Considérez ces deux rectangles; un rectangle de 5 lignes de haut et 11 caractères de large:
===========
===========
===========
===========
===========
et un rectangle de 10 lignes de haut et 22 caractères de large:
======================
======================
======================
======================
======================
======================
======================
======================
======================
======================
Ces formes sont similaires car les rapports de leurs côtés sont les mêmes. Pour le dire formellement ( étant le côté le plus court et étant le côté le plus long):
Vous pouvez également faire:
Le défi
Écrivez un programme ou une fonction qui prend un rectangle "principal" et quelques "autres" rectangles et imprime ceux des "autres" qui sont similaires à "principaux".
L'entrée
Une forme et une liste de formes. Chaque forme se compose de 2 entiers positifs non nuls, qui indiquent la largeur et la hauteur du rectangle. Par exemple, ceci:
(4,2), (3,9)
désigne deux rectangles, un 4x2 et un 3x9. Le format exact de l'entrée peut être celui que vous désirez.
Le résultat
Les indices des «autres» formes qui sont similaires à «principales». Vous pouvez choisir si les indices sont basés sur 0 ou 1, ainsi que le format et l'ordre exacts de la sortie.
Exemple de programme
En Python:
main = eval(raw_input()) # The main rectangle.
rects = eval(raw_input()) # The list of rectangles.
similar = set()
for i, rect in enumerate(rects):
if max(main)*min(rect) == min(main)*max(rect): # Cross-multiply
# They are similar.
similar.add(i)
print similar
Exemple d'entrée et de sortie
Contribution:
(1, 2)
[(1, 2), (2, 4)]
Sortie:
set([0, 1])
Contribution:
(1, 2)
[(1, 9), (2, 5), (16, 8)]
Sortie:
set([2])
Gagnant
Il s'agit de code-golf, donc la soumission la plus courte l'emporte.
Remarques
- Cela va sans dire, mais les failles standard sont interdites .
- Aucun élément intégré pour localiser des figures similaires ne peut être utilisé. (Je ne sais même pas si cela existe, mais je ne serais pas surpris!)
la source
[1.0 2.0]
un format d'entrée acceptable?[(1,2), (2,4), (1,9), (2,5), (16,8)]
, est seulement[0,1,4]
et[1,2,5]
autorisé, ou pourrions-nous également produire[1,1,0,0,1]
ou[(1,2), (2,4), (16,8)]
?Réponses:
Pyth, 15 octets
la source
Python, 61 octets
Oui, j'utilise 9 caractères pour écrire
enumerate
. Prend l'entrée comme1, 2, [(1, 9), (3,6), (2, 5), (16, 8)]
. Pour Python 2, les valeurs d'entrée doivent être écrites sous forme de flottants.Un caractère plus long (62) en Python 3:
la source
i
comme index et(x,y)
comme point. Il vérifie ensuite si la valeurx/y
est égale au quotient (a/b
) des deux nombres initiaux ou à sa réciproque (b/a
). S'il est égal à l'une de ces valeurs, cette valeur dei
est ajoutée à la liste, sinon elle est supprimée.CJam,
222019 octetsCe qui précède est une fonction anonyme qui extrait un seul tableau de paires à virgule flottante (la première paire est aiguille) de la pile et pousse le tableau d'index basés sur 1 en retour.
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça marche
la source
Haskell , 48 octets
Essayez-le en ligne!
Appelez ça comme
(!) 1 2 [(1, 9), (3,6), (2, 5), (16, 8)]
.Un port proche de ma réponse Python . L'expression
zip[0..]l
énumère la liste avec ses indices.L'expression
x/y+y/x==a/b+b/a
vérifie que le rapportx/y
est soita/b
oub/a
, puisque la fonctionf(z) = z + 1/z
af(z) = f(1/z)
et aucune autre collision.la source
h
un opérateur prenant trois arguments? Cela économiserait un octet, et je pense que cela resterait dans les règles.Snowman 1.0.2 , 61 caractères
Du charabia pur (à moins que vous ne connaissiez Snowman), c'est-à-dire exactement conforme à l'objectif de conception du langage d'être aussi déroutant que possible.
Le format d'entrée est le même que dans la publication, le format de sortie est également le même moins
set(
et)
.Non golfé (ou non minimisé, vraiment):
Je suis assez fier de certaines des astuces que j'ai utilisées dans celui-ci:
J'ai utilisé le même format d'entrée que dans le post. Mais au lieu d'essayer de l'analyser d'une manière ou d'une autre, ce qui deviendrait vraiment compliqué, j'ai simplement enchaîné les deux lignes et ensuite utilisé une expression régulière pour extraire tous les nombres dans un grand tableau (avec lequel j'ai ensuite fait
2aG
, c'est-à-dire obtenir chaque groupe de 2).:nD;aF
est assez chic. Il prend simplement un tableau de deux éléments et divise le premier par le second. Ce qui semble assez simple, mais le faire de manière intuitive (a[0]/a[1]
) serait beaucoup, beaucoup plus long dans Snowman:0aa`NiN`aA|,nD
(et c'est en supposant que nous n'avons pas à nous soucier de jouer avec d'autres variables existantes). Au lieu de cela, j'ai utilisé la méthode "fold" avec un prédicat de "divide" qui, pour un tableau de deux éléments, réalise la même chose.0AAgaA
semble assez inoffensif, mais ce qu'il fait réellement est de stocker un0
dans les variables, puis prend toutes les variables avec un indice supérieur à celui (donc, toutes les variables sauf la première). Mais l'astuce est, au lieu deAaG
(ce qui éliminerait le tableau d'origine et le0
), j'ai utiliséAAg
, ce qui garde les deux. MaintenantaA
, j'utilise , at-index, en utilisant la même chose0
pour obtenir le premier élément du tableau - en outre, c'est en mode consommation (aA
au lieu deaa
), donc il se débarrasse du0
tableau d'origine et aussi, qui sont maintenant des ordures pour nous.Hélas,
0AAgaA*|
fait essentiellement la même chose que GolfScript fait dans un seul caractère:(
. Cependant, je pense toujours que c'est plutôt sympa, selon les normes de Snowman. :)la source
Mathematica, 41 octets
Usage:
la source
Pyth - 14 octets
Filtre en comparant les quotients, puis mappe
indexOf
.Suite de tests .
la source
1,2
et[(1, 2), (2, 4), (1, 2)]
donnera[0, 1, 0]
plutôt que le correct[0, 1, 2]
.APL (Dyalog Unicode) ,
1613 octets SBCSEssayez-le en ligne!
-3 grâce à @ngn!
Explication:
Le format de sortie est un vecteur binaire comme celui
1 1 0 0 1
dont "l'autre" rectangle est une ressemblance.APL (Dyalog Extended) , 11 octets SBCS
Essayez-le en ligne!
Explication:
Le format de sortie est le même que la réponse Dyalog principale.
Merci à Adám pour l'aide golf + Extended.
la source
(=.×∘⌽∨=.×)⍤1
Julia, 62 octets
La
find
fonction localise les vrais éléments dans un vecteur booléen..*
effectue la multiplication par élément des vecteurs.Non golfé:
Usage:
la source
K5, 19 octets
Je pense que cela fera l'affaire:
Prend une liste de paires où le premier est le "principal". Calcule le rapport en divisant les dimensions triées de chaque paire. Renvoie une liste des positions indexées 0 des paires correspondantes. (sans doute le format d'entrée que j'ai choisi rend ce -1 indexé- si cela est considéré comme un point non valide sur un
1+
au début et ajoutez deux caractères à la taille de mon programme.)Exemple d'utilisation:
Cela fonctionne en oK - notez que je dépend implicitement de la division produisant toujours des résultats en virgule flottante. Cela fonctionnerait dans Kona si vous ajoutiez un point décimal à tous les nombres dans l'entrée et ajoutiez un espace après le
_
.la source
Octave / Matlab, 44 octets
Utilisation d'une fonction anonyme:
Le résultat est une indexation basée sur 1.
Pour l'utiliser, définissez la fonction
et appelez-le au format suivant
Vous pouvez l' essayer en ligne .
Si le résultat peut être dans l'indexation logique (
0
indique pas similaire,1
indique similaire): 38 octets :Même exemple que ci-dessus:
la source
Brachylog , 14 octets
Essayez-le en ligne!
Prend l'entrée comme une liste contenant une liste contenant le rectangle principal et la liste des autres rectangles (donc le cas de test 1 l'est
[[[1,2]],[[1,2],[2,4]]]
), et génère une liste d'index basés sur 0 via la variable de sortie.Si ce type de formatage étrange et spécifique triche, c'est un peu plus long ...
Brachylog , 18 octets
Essayez-le en ligne!
Prend l'entrée comme une liste contenant le rectangle principal et la liste des autres rectangles (donc le cas de test 1 est le plus évident
[[1,2],[[1,2],[2,4]]]
), et génère une liste d'index basés sur 0 via la variable de sortie.Pour déterminer si deux paires largeur-hauteur représentent des rectangles similaires, il suffit de prendre les quatre octets
pᵐ/ᵛ
(qui produisent le rapport partagé ou sa réciproque). Tout le reste gère les multiples rectangles à comparer, et la sortie étant des indices.la source
dzaima / APL , 7 octets
Essayez-le en ligne!
8 octets produisant une liste d'index au lieu d'un vecteur booléen
la source
[0,1,4]
ou[1,2,5]
(vous ne savez pas si votre langue est indexée 0 ou 1). Cela aurait été un meilleur défi à mon humble avis si les trois formats de sortie étaient autorisés: les indices; filtre pour garder les valeurs véridiques; liste des valeurs truey / falsey (comme vous l'avez maintenant), au lieu des seuls indices autorisés.[0,1,4]
,[1,2,5]
,4\n0\n1
,5 2 1
, etc. , etc., car il encore déclaré indices . Mais j'ai demandé à OP de clarifier (s'ils répondent, car c'est un défi de 4 ans). Dans ma réponse 05AB1E, cela signifierait 14 octets si les indices sont obligatoires contre 8 octets si l'une des deux autres options est autorisée. Quoi qu'il en soit, j'ai voté pour votre réponse. :)Haskell, 75 octets
la source
PowerShell , 57 octets
Essayez-le en ligne!
Les indices sont basés sur 1.
la source
PowerShell ,
5856 octets-2 octets grâce à mazzy x2
Essayez-le en ligne!
Cela abuse légèrement de la
input may be however you desire
clause en faisant venir séparément les composants de la première forme pour économiser 3 octets.PowerShell ,
6159 octetsEssayez-le en ligne!
Utilise l'indexation conditionnelle pour permuter entre l'index de base zéro actuel et null selon que les ratios sont alignés ou non. Heureusement dans ce cas,
$i
incrémente indépendamment du fait qu'il soit imprimé ou non.la source
-
place-ne
.Javascript (ES6), 75
Alternative, aussi 75
L'entrée est considérée comme un objet JSON et un tableau d'objets JSON
la source
05AB1E ,
1514 octetsEssayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Les
J
oins sont là parce que 05AB1E ne peut pas déterminer les indices sur les listes multidimensionnelles afaikSi la sortie des paires largeur / hauteur qui sont véridiques, ou la sortie d'une liste de valeurs véridiques / falsey basée sur la liste d'entrée, cela pourrait être de 8 octets à la place:
Essayez-le en ligne ou vérifiez tous les cas de test .
Essayez-le en ligne ou vérifiez tous les cas de test .
la source