Figuras similares
Dos rectángulos son similares si las proporciones de sus lados son las mismas.
Considere estos dos rectángulos; un rectángulo de 5 líneas de alto y 11 caracteres de ancho:
===========
===========
===========
===========
===========
y un rectángulo de 10 líneas de alto y 22 caracteres de ancho:
======================
======================
======================
======================
======================
======================
======================
======================
======================
======================
Estas formas son similares porque las proporciones de sus lados son las mismas. Para decirlo formalmente (siendo el lado más corto el lado más largo):
También puedes hacer:
El reto
Escriba un programa o función que tome un rectángulo "principal" y algunos "otros" rectángulos e imprima cuáles de "otros" son similares a "principal".
La entrada
Una forma y una lista de formas. Cada forma consta de 2 enteros positivos distintos de cero, que denotan el ancho y la altura del rectángulo. Por ejemplo, esto:
(4,2), (3,9)
denota dos rectángulos, un 4x2 y un 3x9. El formato exacto de la entrada puede ser el que desee.
La salida
Los índices de las "otras" formas que son similares a "principal". Puede elegir si los índices están basados en 0 o 1, así como el formato exacto y el orden de la salida.
Programa de muestra
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
Muestra de entrada y salida
Entrada:
(1, 2)
[(1, 2), (2, 4)]
Salida:
set([0, 1])
Entrada:
(1, 2)
[(1, 9), (2, 5), (16, 8)]
Salida:
set([2])
Victorioso
Este es el código de golf, por lo que gana la presentación más corta.
Notas
- Esto debería ser evidente, pero las lagunas estándar están prohibidas .
- No se pueden usar constructores para localizar figuras similares. (¡Ni siquiera sé si eso existe, pero no me sorprendería!)
fuente
[1.0 2.0]
Sería un formato de entrada aceptable?[(1,2), (2,4), (1,9), (2,5), (16,8)]
, es solo[0,1,4]
y[1,2,5]
permitido, ¿o también podríamos generar[1,1,0,0,1]
o[(1,2), (2,4), (16,8)]
?Respuestas:
Pyth, 15 bytes
fuente
Python, 61 bytes
Sí, estoy usando 9 caracteres para escribir
enumerate
. Toma entrada como1, 2, [(1, 9), (3,6), (2, 5), (16, 8)]
. Para Python 2, los valores de entrada deben escribirse como flotantes.Un char más largo (62) en Python 3:
fuente
i
como índice y(x,y)
como punto. Luego verifica si el valorx/y
es igual al cociente inicial de dos números (a/b
) o su recíproco (b/a
). Si es igual a uno de esos valores, ese valor dei
se agrega a la lista; de lo contrario, se descarta.CJam,
222019 bytesLo anterior es una función anónima que saca una matriz única de pares de coma flotante (el primer par es una aguja) de la pila y empuja la matriz de índices basados en 1 a cambio.
Pruébelo en línea en intérprete de CJam .
Cómo funciona
fuente
Haskell , 48 bytes
Pruébalo en línea!
Llama a esto como
(!) 1 2 [(1, 9), (3,6), (2, 5), (16, 8)]
.Una respuesta cercana a mi puerto de Python . La expresión
zip[0..]l
enumera la lista con sus índices.La expresión
x/y+y/x==a/b+b/a
verifica que la relaciónx/y
seaa/b
ob/a
, ya que la funciónf(z) = z + 1/z
tienef(z) = f(1/z)
y ninguna otra colisión.fuente
h
un operador tome tres argumentos? Eso ahorraría un byte, y creo que se mantendría dentro de las reglas.Muñeco de nieve 1.0.2 , 61 caracteres
Puro galimatías (a menos que conozcas a Snowman), también conocido exactamente en línea con el objetivo de diseño del lenguaje de de ser lo más confuso posible.
El formato de entrada es el mismo que en la publicación, el formato de salida también es el mismo menos
set(
y)
.Sin golf (o sin minar, de verdad):
Estoy bastante orgulloso de algunos de los trucos que utilicé en este:
Usé el mismo formato de entrada que en la publicación. Pero en lugar de intentar analizarlo de alguna manera, lo que se volvería realmente desordenado, simplemente concatenaba las dos líneas y luego usaba una expresión regular para extraer todos los números en una gran matriz (con lo que luego hice
2aG
, es decir, cada grupo de 2).:nD;aF
Es muy elegante. Simplemente toma una matriz de dos elementos y divide el primero por el segundo. Lo que parece bastante simple, pero hacerlo de forma intuitiva (a[0]/a[1]
) sería mucho, mucho más tiempo en Snowman:0aa`NiN`aA|,nD
(y eso es asumiendo que no tenemos que preocuparnos de jugar con otras variables existentes). En cambio, utilicé el método "fold" con un predicado de "divide", que, para una matriz de dos elementos, logra lo mismo.0AAgaA
se ve lo suficientemente inocuo, pero lo que realmente hace es almacenar un0
a las variables, luego toma todas las variables con un índice mayor que eso (entonces, todas las variables excepto la primera). Pero el truco es que, en lugar deAaG
(que eliminaría la matriz original y la0
), utilicéAAg
, lo que mantiene ambos. Ahora usoaA
, at-index, usando lo mismo0
para obtener el primer elemento de la matriz; además, esto está en modo consumo (enaA
lugar deaa
), por lo que también elimina la0
matriz original y, que ahora son basura para nosotros.Por desgracia,
0AAgaA*|
lo hace esencialmente lo mismo que GolfScript hace en un personaje:(
. Sin embargo, todavía creo que es bastante agradable, para los estándares de Snowman. :)fuente
Mathematica, 41 bytes
Uso:
fuente
Pyth - 14 bytes
Filtra comparando cocientes, luego mapas
indexOf
.Test Suite .
fuente
1,2
y[(1, 2), (2, 4), (1, 2)]
dará en[0, 1, 0]
lugar de lo correcto[0, 1, 2]
.APL (Dyalog Unicode) ,
1613 bytes SBCSPruébalo en línea!
-3 gracias a @ngn!
Explicación:
El formato de salida es un vector binario
1 1 0 0 1
del cual "otro" rectángulo es similar.APL (Dyalog Extended) , SBCS de 11 bytes
Pruébalo en línea!
Explicación:
El formato de salida es el mismo que la respuesta principal de Dyalog.
Gracias a Adám por la ayuda de golf + extendido.
fuente
(=.×∘⌽∨=.×)⍤1
Julia, 62 bytes
La
find
función localiza elementos verdaderos en un vector booleano..*
realiza la multiplicación por elementos de vectores.Sin golf:
Uso:
fuente
K5, 19 bytes
Creo que esto hará el truco:
Toma una lista de pares donde el primero es el "principal". Calcula la razón dividiendo las dimensiones ordenadas de cada par. Devuelve una lista de las posiciones indexadas en 0 de los pares coincidentes. (podría decirse que el formato de entrada que elegí hace que este -1 esté indexado, si esto se considera una tachuela no válida en un
1+
al principio y agrega dos caracteres al tamaño de mi programa).Ejemplo de uso:
Esto se ejecuta en OK ; tenga en cuenta que implícitamente dependo de que la división siempre produzca resultados de coma flotante. Funcionaría en Kona si agrega un punto decimal a todos los números en la entrada y agrega un espacio después de
_
.fuente
Octava / Matlab, 44 bytes
Usando una función anónima:
El resultado está en indexación basada en 1.
Para usarlo, defina la función
y llámalo con el siguiente formato
Puedes probarlo en línea .
Si el resultado puede estar en indexación lógica (
0
indica que no es similar,1
indica que es similar): 38 bytes :Mismo ejemplo que el anterior:
fuente
Brachylog , 14 bytes
Pruébalo en línea!
Toma la entrada como una lista que contiene una lista que contiene el rectángulo principal y la lista de otros rectángulos (así es el caso de prueba 1
[[[1,2]],[[1,2],[2,4]]]
), y genera una lista de índices basados en 0 a través de la variable de salida.Si ese tipo de formato de entrada extraño y específico es trampa, es un poco más largo ...
Brachylog , 18 bytes
Pruébalo en línea!
Toma la entrada como una lista que contiene el rectángulo principal y la lista de otros rectángulos (por lo que el caso de prueba 1 es el más obvio
[[1,2],[[1,2],[2,4]]]
), y genera una lista de índices basados en 0 a través de la variable de salida.Para determinar si dos pares de ancho y alto representan rectángulos similares, solo toma los cuatro bytes
pᵐ/ᵛ
(que genera la relación compartida o su recíproco). Todo lo demás es manejar los múltiples rectángulos para comparar, y la salida son índices.fuente
dzaima / APL , 7 bytes
Pruébalo en línea!
8 bytes que generan una lista de índices en lugar de un vector booleano
fuente
[0,1,4]
o[1,2,5]
(no estoy seguro si su idioma es 0 o 1 indexado). Hubiera sido un desafío mejor para mi si los tres formatos de salida están permitidos: índices; filtrar para mantener los valores de verdad; lista de valores de verdad / falsey (como ahora), en lugar de solo índices permitidos.[0,1,4]
,[1,2,5]
,4\n0\n1
,5 2 1
, etc, etc, ya que todavía declaró índices . Pero le he pedido a OP que aclare (si responden, ya que es un desafío de 4 años). En mi respuesta 05AB1E significaría 14 bytes si los índices son obligatorios frente a 8 bytes si se permite alguna de las otras dos opciones. De todos modos, voté tu respuesta. :)Haskell, 75 bytes
fuente
PowerShell , 57 bytes
Pruébalo en línea!
Los índices están basados en 1.
fuente
Potencia Shell ,
5856 bytes-2 bytes gracias a mazzy x2
Pruébalo en línea!
Esto abusa ligeramente de
input may be however you desire
cláusula al hacer que los componentes de la primera forma vengan por separado para guardar 3 bytes.PowerShell ,
6159 bytesPruébalo en línea!
Utiliza la indexación condicional para intercambiar entre el índice actual basado en cero y nulo en función de si las relaciones se alinean o no. Afortunadamente en este caso,
$i
aumenta independientemente de si se imprime o no.fuente
-
en su lugar-ne
.Javascript (ES6), 75
Alternativa, también 75
La entrada se toma como un objeto JSON y una matriz de objetos JSON
fuente
05AB1E ,
1514 bytesPruébelo en línea o verifique todos los casos de prueba .
Explicación:
Los
J
oins están ahí porque 05AB1E no puede determinar los índices en listas multidimensionales afaikSi genera los pares de ancho / alto que son verdaderos, o genera una lista de valores de verdad / falsey basados en la lista de entrada, podría ser 8 bytes en su lugar:
Pruébelo en línea o verifique todos los casos de prueba .
Pruébalo en línea o verifique todos los casos de prueba .
fuente