¿Qué consejos generales tienes para jugar al golf en Octave? Estoy buscando ideas que se puedan aplicar a los problemas de golf de código en general que sean al menos algo específicos de Octave (por ejemplo, "eliminar comentarios" no es una respuesta). Por favor, publique un consejo por respuesta.
18
Respuestas:
a
está libre de valores cero, el uso lennz(a)
ahorra 2 caracteres en comparaciónnumel(a)
.a(a==0)
aa(find(a==0))
.~t
es más corto quet==0
, e incluso~~t
es más corto quet!=0
.0*(1:n)
es más corto quezeros(1,n)
||
y&&
, a diferencia de muchos otros operadores, escalar el resultado cuando el primer argumento es escalar. Para las matrices, solo las matrices no vacías sin elementos iguales a cero tienen el valor lógico de verdadero .Por lo tanto, podemos hacer en
0||m
lugar deall(all(m))
cualquier matriz.Prueba con
0||[1 1;1 0]
y0||[1 1;1 1]
para convencerte a ti mismo.Cuando esté utilizando un generador incorporado varias veces, realice un control de función para ahorrar caracteres, por ejemplo.
f=@find
. Para nombres cortos de funciones, al menos 3 ocurrencias justifican esto, para nombres largos, incluso con dos ocurrencias.Cuando una función es una sola declaración, prefiera la
f=@(n)dosomething(n)
notación afunction r=f(n)r=dosomething(n);end
una.Desafortunadamente, las variables globales deben declararse tanto en el ámbito global como en cada función que las use. Pero hay una excepción: las
@(n)...
funciones anónimas "ven" todas las variables del ámbito desde donde se llaman.Es posible hacer en
f(a=0,b=0)
lugar dea=0;b=0;f(a,b)
.Esto parece una característica no documentada, pero el orden de evaluación es de izquierda a derecha (marcado en v. 3.8.1), puede hacer
zeros(a=n,b=a*a)
tanto para crear una matriz ansn ^ 2 como para almacenar su número de fila y columnaa
yb
variables.La tabla de precedencia de operadores es tu amigo. No lo hagas
b=(a==0)
ya queb=a==0
es lo mismo.fuente
No recuerdo en qué desafío lo vi usar a alguien (por favor díganos =), pero me pareció un buen truco:
Por lo general, si agrega matrices, debe tener el mismo tamaño, pero para las matrices unidimensionales (1xn y nx1) hay un acceso directo (que no funciona en Matlab):
produce el mismo efecto que
Entonces, algo que pawel.boczarski ya mencionó: en Octave puede (mientras no puede en Matlab) definir variables auxiliares dentro de los identificadores de función, Y una asignación de variable en sí misma tiene el valor de la asignación, por lo que realmente puede acortar el código (bueno, esto es inútil ejemplo, pero obtendrás el truco):
Luego, otro truco (también aplicable en Matlab) es abusar de las cadenas para almacenar números (codificados) (este truco ordenado es robado del feersum) , solo necesita algo que interprete la cadena como número, que es tan fácil como, por ejemplo, agregar cero:
O
fuente
a+0
, noa+'0'
. Aparte de eso, los consejos son buenos =)+= -= /=
operadores etc. en su lista a continuación?+a
es más corto quea+0
Usando la lista de argumentos:
Octave es capaz de obtener argumentos predeterminados para que las expresiones se puedan evaluar en la lista de argumentos.
Esta característica es útil cuando queremos calcular una expresión y usarla varias veces:
Un caso de uso es cuando usamos una asignación indexada para modificar parte de una matriz y queremos usar la matriz:
Pero la expresión
(a(2)=5)
regresaa(2)
, o la expresión(a([1 3])=4)
devuelve una matriz de dos elementos. Ninguno de los dos devuelve la matriz completa. Podemos usar la lista de argumentos:Aquí el resultado de la asignación indexada se almacena en una variable ficticia
b
y la función devuelve la matriz.fuente
-En Octave es posible aplicar la indexación en una expresión temporal, una característica que está prohibida en MATLAB y esta característica es muy útil para el golf. ejemplo:
Octava:
[1 23 4 5 7](3:4)
y su equivalente MATLAB:a=[1 23 4 5 7];a(3:4)
Octava:
hilb(4)(4:5,4:5)
y su equivalente MATLAB:h=hilb(4);h(4:5,4:5)
Octava:
{1,4,{4 5 6},[7 ;3]}{3}
y su equivalente MATLAB:a={1,4,{4 5 6},[7 ;3]};a{3}
Octava:
num2cell([1 2 3 4]){:}
para la creación de una lista separada por comasOctava:
a'(:)'
-A veces, en una función anónima a partir de una función normal, necesitamos evaluar varias expresiones, que incluyen la asignación, un enfoque es que podemos colocar cada expresión en una celda (ya que la celda puede contener objetos de múltiples tipos) y cuando necesitamos el valor de cada expresión podemos usar indexación para extraer ese elemento.
{1,4,{4 5 6},[7 ;3]}{3}
o
{a=1,b=4,c={4 5 6},[b ;3]}{4}
fuente
Omitir punto y coma!
Usaré esta respuesta para ilustrar el punto.
El código original fue:
Después de eliminar los puntos y comas, podría reducirse a lo siguiente, ahorrando tres bytes:
Esto se puede usar en muchos lugares, y cosas que ni siquiera intentas porque parece que un error de sintaxis a menudo funciona.
fuente
Este es simple, pero útil.
En Octave, pero no en MATLAB, puede hacer lo mismo que en C ++:
fuente
Otro simple, pero útil (no es posible en MATLAB):
Asigne el mismo valor a varias variables:
fuente
Uso
eval
!Inspirado por la respuesta de Luis Mendo aquí .
En la mayoría de los casos, las funciones anónimas son más cortas que crear un script que necesite una o más llamadas
input('')
. La desventaja es que los bucles y las modificaciones variables (como el intercambio de dos elementos en una matriz) sonimposibles yengorrosos.Con
eval
, puede obtener la entrada como lo hace con una función anónima normal, y ejecutar el script como lo hace con un script normal:Considera esto :
En comparación con esto:
El código es idéntico, pero la sección de entrada es mucho más corta.
Esto también se puede usar para modificar variables de entrada, como esta (¡crédito a Luis Mendo por esto!):
fuente
Usar en
rows(a)
lugar desize(a,1)
fuente
Consejos relacionados, pero no idénticos para MATLAB .
Una característica poco conocida y poco utilizada de Octave es que la mayoría de las funciones incorporadas se pueden llamar sin paréntesis, en cuyo caso tratarán lo que sigue como una cadena (siempre que no contenga espacios). Si contiene espacios, necesita comillas. Esto se puede usar con frecuencia para guardar un byte o dos cuando se usa
disp
. Todo el siguiente trabajo, y da el mismo resultado:Si tiene espacios, entonces debe tener las comillas:
Otros ejemplos menos útiles incluyen:
fuente