Какие общие советы у вас есть для игры в гольф в Октаве? Я ищу идеи, которые могут быть применены к кодовым проблемам гольфа в целом, которые хотя бы несколько специфичны для Octave (например, «удалить комментарии» - это не ответ). Пожалуйста, оставьте один совет за ответ.
18
Ответы:
a
это значение не содержит нулевых значений,nnz(a)
вы сэкономите 2 символа по сравнению сnumel(a)
.a(a==0)
вa(find(a==0))
.~t
корочеt==0
, и даже~~t
короче, чемt!=0
.0*(1:n)
короче чемzeros(1,n)
||
и&&
, в отличие от многих других операторов, скалярный результат, когда первый аргумент является скалярным. Для матриц только непустые матрицы без элементов, равных нулю, имеют логическое значение true .Следовательно, мы можем сделать
0||m
вместоall(all(m))
любой матрицы.Попробуй
0||[1 1;1 0]
и0||[1 1;1 1]
убеди себя.Когда вы несколько раз используете встроенную функцию, сделайте дескриптор функции, чтобы сэкономить символы, например.
f=@find
, Для коротких имен функций это оправдывают как минимум 3 случая, для длинных - даже с двумя случаями.Когда функция представляет собой один оператор, предпочитайте
f=@(n)dosomething(n)
нотациюfunction r=f(n)r=dosomething(n);end
одному.К сожалению, глобальные переменные должны объявляться как в глобальной области видимости, так и в каждой функции, использующей их. Но есть исключение: анонимные
@(n)...
функции «видят» все переменные из области видимости, из которой они вызываются.Это можно сделать
f(a=0,b=0)
вместоa=0;b=0;f(a,b)
.Это кажется недокументированной функцией, но порядок оценки слева направо (проверено в v. 3.8.1), вы можете сделать,
zeros(a=n,b=a*a)
чтобы создать матрицу тревог ^ 2 и сохранить ее номер строки и столбцаa
иb
переменные.Таблица приоритетов операторов - ваш друг. Не делай,
b=(a==0)
такb=a==0
как то же самое.источник
Я не помню, в каком испытании я видел, что это кто-то использует (пожалуйста, сообщите нам =), но я нашел этот хитрый трюк:
Обычно, если вы добавляете матрицы, вы должны иметь одинаковый размер, но для одномерных (1xn и nx1) матриц есть ярлык (который не работает в Matlab):
производит тот же эффект, что и
Затем то, что pawel.boczarski уже упомянул: в Octave вы можете (хотя вы не можете в Matlab) определять вспомогательные переменные в дескрипторах функций, а само присвоение переменной имеет значение присваивания, так что вы действительно можете сократить код (ну, это бесполезно) пример, но вы получите хитрость):
Затем другой трюк (также применимый в Matlab) - злоупотребление строками для хранения (жестко закодированных) чисел (этот аккуратный трюк украден из feersum) , вам просто нужно что-то, что интерпретирует строку как число, что так же просто, как, например, добавить ноль:
Или
источник
a+0
, а неa+'0'
. Кроме того, советы хороши =)+= -= /=
операторов etc в ваш список ниже?+a
корочеa+0
Используя список аргументов:
Octave способен получать аргументы по умолчанию, поэтому выражения могут оцениваться в списке аргументов.
Эта функция полезна, когда мы хотим вычислить выражение и использовать его несколько раз:
Один случай использования - когда мы используем индексированное присваивание для изменения части массива, и мы хотим использовать массив:
Но выражение
(a(2)=5)
возвращаетa(2)
или выражение(a([1 3])=4)
возвращает массив из двух элементов. Ни один из них не возвращает весь массив. Мы можем использовать список аргументов:Здесь результат индексированного присваивания сохраняется в фиктивной переменной,
b
и функция возвращает массив.источник
-В Octave можно применять индексацию для временного выражения, функция, которая запрещена в MATLAB, и эта функция очень полезна для игры в гольф. пример:
Octave:
[1 23 4 5 7](3:4)
и эквивалент MATLAB:a=[1 23 4 5 7];a(3:4)
Octave:
hilb(4)(4:5,4:5)
и эквивалент MATLAB:h=hilb(4);h(4:5,4:5)
Octave:
{1,4,{4 5 6},[7 ;3]}{3}
и эквивалент MATLAB:a={1,4,{4 5 6},[7 ;3]};a{3}
Octave:
num2cell([1 2 3 4]){:}
для создания списка, разделенного запятымиOctave:
a'(:)'
Иногда в анонимной функции, как и в обычной функции, нам требуется вычислять несколько выражений, которые включают присваивание. Один из подходов состоит в том, что мы можем поместить каждое выражение в ячейку (поскольку ячейка может содержать объект нескольких типов) и когда нам нужно значение каждого выражения мы можем использовать индексирование для извлечения этого элемента.
{1,4,{4 5 6},[7 ;3]}{3}
или
{a=1,b=4,c={4 5 6},[b ;3]}{4}
источник
Пропустить точку с запятой!
Я буду использовать этот ответ, чтобы проиллюстрировать это.
Оригинальный код был:
После удаления точек с запятой его можно уменьшить до следующих трех байтов:
Это может использоваться довольно много мест, и вещи, которые вы даже не пытаетесь, потому что похоже, что синтаксическая ошибка часто работает.
источник
Это простой, но полезный.
В Octave, но не в MATLAB, вы можете сделать как в C ++:
источник
Еще один простой, но полезный (не возможно в MATLAB):
Назначьте одно и то же значение нескольким переменным:
источник
Используйте
eval
!Вдохновленный ответом Луиса Мендо здесь .
Анонимные функции в большинстве случаев короче, чем создание сценария, для которого требуется один или несколько вызовов
input('')
. Недостатком является то, что циклы и переменные модификации (например, замена двух элементов в матрице)невозможнообременительно.С помощью
eval
вы можете получить входные данные, как вы делаете с обычной анонимной функцией, и запустить скрипт, как вы делаете с обычным скриптом:Учтите это :
По сравнению с этим:
Код идентичен, но раздел ввода намного короче.
Это также может быть использовано для изменения входных переменных, например так (спасибо Луису Мендо за это!):
источник
Используйте
rows(a)
вместоsize(a,1)
источник
Связанные, но не идентичные советы для MATLAB .
Малоизвестная и мало используемая особенность Octave заключается в том, что большинство встроенных функций можно вызывать без скобок, и в этом случае они будут обрабатывать все, что следует за ней, как строку (если только она не содержит пробелов). Если он содержит пробелы, вам нужны кавычки. Это может часто использоваться, чтобы сохранить один или два байта при использовании
disp
. Все следующие работы и дают одинаковый результат:Если у вас есть пробелы, то вы должны иметь кавычки:
Другие, менее полезные примеры включают в себя:
источник