Si aún no lo sabe, un cuaternión es básicamente un número de 4 partes. Para los propósitos de este desafío, tiene un componente real y tres componentes imaginarios . Los componentes imaginarios son representados por el sufijo i
, j
, k
. Por ejemplo, 1-2i+3j-4k
es un cuaternión con 1
ser el componente real y -2
, 3
y -4
siendo los componentes imaginarios.
En este desafío, debe analizar la forma de cadena de un cuaternión (ej. "1+2i-3j-4k"
) En una lista / matriz de coeficientes (ej. [1 2 -3 -4]
). Sin embargo, la cadena de cuaternión se puede formatear de muchas maneras diferentes ...
- Puede ser normal:
1+2i-3j-4k
- Puede tener términos que faltan:
1-3k
,2i-4k
(Si usted tiene términos que faltan, la producción0
de tales condiciones) - Puede haber coeficientes falta:
i+j-k
(En este caso, esto es equivalente a1i+1j-1k
En otras palabras, a.i
,j
Ok
sin un número delante se asume que tiene un1
frente de forma predeterminada) - Puede no estar en el orden correcto:
2i-1+3k-4j
- Los coeficientes pueden ser simplemente enteros o decimales:
7-2.4i+3.75j-4.0k
Hay algunas cosas a tener en cuenta al analizar:
- Siempre habrá un
+
o-
entre términos - Siempre se le pasará una entrada válida con al menos 1 término y sin letras repetidas (sin
j-j
s) - Se puede suponer que todos los números son válidos
- Puede cambiar los números en otra forma después de analizar si lo desea (por ej.
3.0 => 3
,0.4 => .4
,7 => 7.0
)
Se prohíben las funciones integradas de análisis / cuaternión y las lagunas estándar. Esto incluye eval
palabras clave y funciones. La entrada será una sola cadena y la salida será una lista, una matriz, valores separados por espacios en blanco, etc.
Como se trata de código de golf , gana el código más corto en bytes.
Toneladas de casos de prueba
1+2i+3j+4k => [1 2 3 4]
-1+3i-3j+7k => [-1 3 -3 7]
-1-4i-9j-2k => [-1 -4 -9 -2]
17-16i-15j-14k => [17 -16 -15 -14]
7+2i => [7 2 0 0]
2i-6k => [0 2 0 -6]
1-5j+2k => [1 0 -5 2]
3+4i-9k => [3 4 0 -9]
42i+j-k => [0 42 1 -1]
6-2i+j-3k => [6 -2 1 -3]
1+i+j+k => [1 1 1 1]
-1-i-j-k => [-1 -1 -1 -1]
16k-20j+2i-7 => [-7 2 -20 16]
i+4k-3j+2 => [2 1 -3 4]
5k-2i+9+3j => [9 -2 3 5]
5k-2j+3 => [3 0 -2 5]
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13 => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i => [5.6 -3 0 0]
k-7.6i => [0 -7.6 0 1]
0 => [0 0 0 0]
0j+0k => [0 0 0 0]
-0j => [0 0 0 0] or [0 0 -0 0]
1-0k => [1 0 0 0] or [1 0 0 -0]
fuente
+
signos innecesarios en la entrada? Así como:+1k
?+
.-0
Forma parte del resultado legal de los dos últimos ejemplos?eval
restricción que se toma en una cadena, se interpreta como código y / o entrada. Cualquier conversión no cuenta bajo esto porque no puede pasar, por ejemplo, la cadena"test"
a una función de conversión de enteros para recibir un entero, perotest
se interpretaría como código en unaeval
función normal . TLDR: eval: no, conversiones de tipo: sí.Respuestas:
Pyth, 48 bytes
Conjunto de pruebas de demostración
El formato de salida está separado por una nueva línea. El código del conjunto de pruebas utiliza la separación de espacios, para facilitar la lectura, pero por lo demás es el mismo.
Salidas a
-0
en los últimos 2 casos, lo que espero que esté bien.Explicación a seguir.
fuente
Retina, 115
Pruébalo en línea!
1 byte guardado gracias a @Chris Jester-Young .
Un error corregido y 6 bytes guardados gracias a @Martin Büttner
Encontramos un par de errores que involucran algunos casos extremos, aumentaron bastante el recuento de bytes.
Devuelve los números de nueva línea separados. De todos modos, esta tiene una solución principalmente elegante que se ve arruinada por los casos extremos, pero bueno, tuve que usar el modo de clasificación, eso significa que usé la herramienta adecuada para el trabajo, ¿verdad?
Explicación:
Etapa por etapa, como siempre.
Los únicos caracteres en la entrada que pueden crear límites de palabras son
-+.
. Esto significa que si encontramos un límite seguido de una letra, tenemos un implícito1
que agregamos con el reemplazo.$&
es sinónimo de$0
.Muchas gracias a Martin por este, este agrega lo implícito
0
para la parte real si faltaba en la entrada. Nos aseguramos de que no podamos encontrar un número seguido de un signo más o menos, o el final de la cadena. Todos los números complejos tendrán una letra después de ellos.Las siguientes 3 etapas son más o menos lo mismo, salvo en qué letra impactan. Todos miran para ver si no podemos coincidir con la letra, y si no podemos agregarle un
0
término. La única razóni
tiene un extra+
antes de evitar que el valor real sea ilegible con eli
coeficiente s, los otros números están separados por su variable compleja.Ah, la parte divertida. Esto utiliza la etapa de ordenación más nueva, indicada por
O
la opción anterior al separador de opciones. El truco aquí es tomar el número entero seguido opcionalmente por un carácter de palabra, que en este caso solo coincidirá con uno deijk
. La otra opción utilizada es la$
que hace que el valor utilizado para ordenar estas coincidencias sea el reemplazo. Aquí solo usamos la letra opcional que queda como nuestro valor de clasificación. Dado que Retina ordena lexicográficamente por defecto, los valores se ordenan como si estuvieran en un diccionario, lo que significa que ordenamos las coincidencias"", "i", "j", "k"
.Esta etapa pone un
+
signo delante de todos los signos menos, esto es necesario si tenemos un valor negativo parai
en la etapa dividida, más adelante.Eliminamos el inicio
+
para asegurarnos de que no tenemos una nueva línea adicional.Divida las líneas restantes en ejecuciones de las variables complejas o el signo más. Esto nos da un valor por línea.
fuente
Perl 5, 125 bytes
fuente
\a
coincidencias de Perl en "alarma", no alfabética. Hay\w
para palabra-carácter (alfanumérico y subrayado), pero eso no funcionará aquí; Necesitamos que no coincida con un número.Lua ,
185187195183166 bytes ( pruébelo en línea ) [regex usado]Gracias a @Chris Jester-Young por la expresión regular mejorada.
Gracias a @Katenkyo por reducirlo a 166 bytes.
Golfizado:
Sin golf:
fuente
n
en este caso), por lo que debe agregar el código para leer la entrada.io.read()
usar(...)
.r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
C, 236 bytes
(Para valores como -0 o -0.0, el signo menos también se imprime en la salida,
pero dado que el desafío establece que "puede cambiar los números a otra forma después de analizar si lo desea", y si aparece -0 en la entrada, se deduce que también es aceptable en la salida.@GamrCorps ahora ha aclarado que esto está bien).fuente
JavaScript (ES6),
103100bytesEditar: guardé 3 bytes al cambiar de
parseInt
acharCodeAt
, que convenientemente solo necesita&3
obtener el índice de matriz correcto.fuente
JavaScript (ES6) 106
Prueba
fuente
PowerShell, 178 bytes
Ungolfed con explicación
No super impresionado pero es un resultado no obstante.
fuente
PHP, 179 bytes
Prueba el conjunto de pruebas .
fuente
Python 3.5 - 496 bytes [usando expresiones regulares]:
Puede ser largo, pero en mi defensa, funciona perfectamente para hacer lo que el OP quiere, ya que todos los casos de prueba fueron exitosos usando mi código.
Versión sin golf con explicación incluida:
Si lo anterior es un poco difícil de leer, básicamente lo que está sucediendo es que:
Si hay alguno, todos los signos + o - NO seguidos de un número se reemplazan con un "+1" / "- 1", respectivamente.
Se
lambda
define una función que, cuando se usa en unasorted
función como una tecla, clasifica la lista de acuerdo con poner primero el número entero y luego ordenar el resto en letras cada vez mayores ("i", luego "j", luego "k" en este caso).El Quaternion, que ahora tiene todos los signos +/- reemplazados por un 1 si es necesario, se busca, usando Expresiones regulares, para TODAS las letras NO precedidas por al menos un número, y aquellas letras que coinciden se reemplazan con un "+1" seguido de esa carta.
La instrucción "if" luego reemplaza TODOS los signos +/- con un espacio, y luego el Quaternion modificado ahora se "divide" en esos espacios y se devuelve en una lista. Luego, la lista se ordena de acuerdo con la función lambda explicada anteriormente. Finalmente, el primer elemento de esa lista se verifica para asegurarse de que sea un número, ya que se supone que es, y si no lo es, se agrega un "+0" al Quaternion.
El segundo ciclo "for" encuentra TODAS las letras que NO están en el Quaternion al encontrar una diferencia simétrica entre un conjunto de esas letras encontradas en la expresión, y luego un conjunto que incluye todas las letras requeridas. Si se encuentra alguno, se agrega un "+0" seguido de la letra que falta y se agrega un espacio al Quaternion.
Finalmente, en este último paso, se agrega un "," entre cada carácter seguido de un símbolo +/-, y luego el Quaternion se divide en esos espacios, luego la lista devuelta se ordena, por última vez, de acuerdo con el función lambda definida como "q" anteriormente. Las comas en la expresión separan cada parte del cuaternión (de lo contrario, obtendría algo como
14i+5j+6k
de4i+5j+6k+1
). Por último, esa lista ahora ordenada se une en una cadena, y solo se extraen los números de cualquier tipo (cortesía de Expresiones regulares), y finalmente se devuelven en una lista, en el orden correcto, cada vez.fuente