¡Bienvenido a mi primer desafío de código de golf! :) Vamos directo a ello.
Desafío:
Dados dos vectores de coma flotante, O (origen) y T (objetivo), debe crear un programa para imprimir los valores L y R en STDOUT.
- O es una esquina de la plaza
- T es una esquina del cuadrado que se encuentra enfrente de O
- L es el punto 2D (esquina) que marca el otro punto del cuadrado incompleto
- R es el punto 2D (esquina) opuesto a L
Reglas
- Los valores para O y T deben leerse desde STDIN (ver entradas de ejemplo).
- Nuevamente, los valores de L y R deben imprimirse en STDOUT.
Puntuación y bonificaciones
- Cuenta los bytes de tu programa.
- Si su programa dibuja líneas que se conectan entre O a L y T a R , reste 15 bytes del recuento de bytes.
Ejemplos
La primera línea cubre entradas (primeros corchetes para O y siguientes corchetes para T ) y otra línea representa la salida esperada.
- [0, 0] [3, 3] Esperado: [0, 3] [3, 0]
- [0, 0] [-2, -2] Esperado: [-2, 0] [0, -2]
- [1, -1] [4, 2] Esperado: [1, 2] [4, -1]
- [0, -1] [0, 1] Esperado: [-1, 0] [1, 0]
AVISO : ¡las entradas y salidas pueden ser puntos flotantes!
¡Información importante!
- Los valores O y T pueden tomarse en cualquier formato, siempre que provengan de STDIN (ej. Dentro [] o () ...), use el formato que desee.
- L y R se pueden imprimir en cualquier orden.
- Recuerde: cuando (O-> L-> T-> R-> O) están conectados, ¡cada lado debe tener la misma longitud!
Victorioso
- ¡Este es el código de golf, por lo que gana la menor cantidad de bytes!
- La respuesta del ganador se aceptará el domingo 15.11.2015 20: 00-22: 00 (hora de Finlandia) (si no me equivoco, esa fecha está escrita como 11.15.2015 en los Estados Unidos, no se confunda).
¡Feliz golf!
Respuestas:
En serio , 11 bytes
Un puerto de mi respuesta TI-BASIC. Calcula
mean(X)+i*(X-mean(X))
.Explicación:
Entrada como una lista de dos números complejos:
[1-1j,4+2j]
y salida en el mismo formato:[(4-1j), (1+2j)]
.fuente
æ
media de la lista y causó queî
(multiplicar por i) se vectorizara, lo que permitió una solución de 9 bytes no competitiva. En serio está empezando a convertirse en un lenguaje realmente bueno.Σ
2 bytes?Σ
tiene el punto de código 0xF4.En serio , 25 bytes
,i││-++½)+-+½)++-½)±+++½)
Toma la entrada como una lista:
[x1,y1,x2,y2]
La misma estrategia que mi respuesta de Python, ¡pero en serio!
Explicación:
Pruébalo en línea
fuente
TI-BASIC, 16 bytes
Para una calculadora de la serie TI-83 + u 84+.
A menos que haya entendido mal, OP dijo que estaban bien con tomar entradas y salidas como números complejos. los
i
aquí es la unidad imaginaria, no la variable estadística.TI-BASIC tiene una
mean(
función, pero molestamente no funciona con listas complejas, arrojando unERR:DATA TYPE
.Ingrese el formulario
{1-i,4+2i}
para[[1,-1],[4,2]]
. La salida está en la forma{4-i 1+2i}
para[[1,2][4,-1]]
.fuente
Matlab,
5145464542 bytesAhora se espera la entrada en un vector de columna:
[x0;y0;x1;y1]
(salida en el mismo formato) Acabo de modificarlo para que sea un programa completo.O alternativamente
Vieja solución:
La entrada espera vectores de columna, p. Ej.
f([0;0],[3;3])
También devuelve dos vectores de columna (como una matriz de 2x2).
fuente
Japt,
2928 bytesJapt es una versión abreviada de Ja vaScri pt . Interprete
Tenga en cuenta que las funciones de flecha requieren un navegador compatible con ES6, como las versiones más recientes de Firefox. La entrada entra como una matriz de 4 elementos, por ejemplo
[1,-1,4,2]
.Cómo funciona
Cómo fue golfizado
Primero intenté simplemente copiar el enfoque Python de @ Mego. Esto me dejó con este monstruo de 48 bytes:
(Nota: la entrada no debe estar envuelta actualmente en una matriz).
Dado que cada uno de estos elementos debe dividirse entre 2, es más corto asignar toda la matriz con
mY=>Y/2
:¿Ahora que? Bueno, la matriz ahora simplemente agrega tres de las entradas y resta la cuarta, siguiendo el patrón
1,2,3,0
. Entonces, podríamos empacar las entradas en una matriz, luego sumarlas, dividirlas por 2 y restar el elemento necesario:¡Bien guardado un byte! Pero, ¿es posible reducir la matriz al principio? Intentemos empaquetarlo en una cadena, luego dividirlo en una matriz con
a
:Mira eso, otro byte guardado. ¿Pero hay una manera aún mejor? Bueno, podemos usar el hecho de que
[1,2,3,0] ≡ [1,2,3,4] mod 4
:¡Otros dos bytes! Ahora vamos a alguna parte. Pero eso
Ug0 +Ug1 +Ug2 +Ug3
está acaparando mucho espacio. ¿Qué pasa si reducimos la matriz con la suma?Wow, eso realmente ayudó! Ahora tenemos 29 bytes. Y gracias a @ ן nɟuɐɯɹɐ ן oɯ, incluso pude jugar golf a otro byte de la reducción. Pero si pudiéramos usar un incorporado para sumar la matriz, sería mucho más corto:
19 bytes! ¡Increíble! Desafortunadamente, Japt aún no tiene tales incorporaciones. Agregaré esto cuando tenga la oportunidad. ¡Las sugerencias son bienvenidas, ya sea para el programa o el idioma!
Bueno, a partir de la v1.4.4, he implementado muchas más funciones en Japt de lo que había planeado originalmente. Comenzando con el plan original para la versión más corta:
Primero necesitamos cambiar algunas cosas: las funciones se definen con
{
, y la función de suma esx
. Esta versión funciona como está:Ahora,
@
es una forma abreviada deXYZ{
, que nos permite guardar un byte cambiando deZ
aX
. Además,£
es un atajo param@
guardar otro byte:Recientemente implementé una función
U
en la que al principio del programa generalmente se puede omitir. Sin embargo, debido a un error de implementación, esto también funciona con funciones:Finalmente, la
g
función ahora se ajusta si el índice ha pasado el final de la cadena, lo que nos permite eliminar el%4
total de 13 bytes :Y pensé que 19 era increíble ;-) ¡ Pruébelo en línea!
fuente
eval(U.join`+`)
.eval
equivalente, ¡eso realmente ahorra un byte!Javascript (Node.js / ES6), 154 bytes
Obtener stdin es la parte más larga del código. La entrada debe ser los puntos separados por comas:
fuente
ngn APL, 21 bytes
Esto toma la entrada como un par de números complejos (por ejemplo,
1J¯1 4J2
) e imprime la salida de la misma manera (por ejemplo,4J¯1 1J2
). Pruébelo en línea en la demostración ngn / apl .fuente
1 ¯1
para entrada0J¯1 0J1
, que es la respuesta correcta. ¿Que estas obteniendo?Pyth, 12 bytes
Esto toma la entrada como un par de números complejos (por ejemplo,
1-1j, 4+2j
) e imprime la salida como una matriz (por ejemplo,[(4-1j), (1+2j)]
). Pruébalo en línea.fuente
𝔼𝕊𝕄𝕚𝕟, 29 caracteres / 43 bytes
Try it here (Firefox only).
fuente
CJam, 30 bytes
Pruébalo en línea
Esto toma la entrada como una lista de listas, por ejemplo, para el último ejemplo:
Explicación:
fuente
Prólogo, 118 bytes
Ligeramente más legible:
Para iniciar el programa:
Ejemplo de entrada cuando las esquinas conocidas son [1, -1] [4, 2]:
[1, -1,4,2]
Ejemplo de salida, donde X e Y contendrán las esquinas desconocidas:
X = [1.0, 2.0],
Y = [4.0, -1.0]
Pruébelo en línea aquí
Editar: modificado para leer la entrada de STDIN
fuente
Python 3, 102 bytes
La entrada se toma en forma
x1 y1 x2 y2
, en una sola línea.Pruébalo en línea
fuente
Python 2, 56 bytes
La entrada puede ser
x1,y1,x2,y2
o(x1,y1,x2,y2)
fuente