Codegolf — Советы По Игре В Гольф В Octave

  • Автор темы Екатерина Кузьмич
  • Обновлено
  • 22, Oct 2024
  • #1

Какие общие советы вы можете дать по игре в гольф в Октаве? Я ищу идеи, которые можно применить к решению задач по гольфу в целом, которые хотя бы в некоторой степени специфичны для Octave (например, «удалить комментарии» не является ответом). Пожалуйста, оставляйте по одному совету за каждый ответ.

#код-гольф #советы #октава

Екатерина Кузьмич


Рег
22 Oct, 2020

Тем
90

Постов
193

Баллов
673
  • 26, Oct 2024
  • #2
  1. Как только ты узнаешь, что
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     nnz PPCG
    ans = 4
    
    size PPCG
    ans = 1  4
    
    str2num 12
    ans = 12
     
    is free of zero values, using disp('Hello, World!') disp"Hello, World!" экономит вам 2 символа по сравнению с disp('Hello') disp Hello disp"Hello" .
  2. Предпочитать disp to size(a,1) .
  3. rows(a) is shorter than f(x)eval('x([1,4])=x([4,1])`; и даже @(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A') is shorter than c=(i=@input)('');N=i('');A=i('');for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A .
  4. eval is shorter than input('')
  5. В целом, eval и a=b=c=0; , в отличие от многих других операторов, скаляризует результат, если первый аргумент является скаляром. Для матриц только непустые матрицы без элементов, равных нулю, имеют логическое значение истинный.

    Следовательно, мы можем сделать +~e(m,n) instead of 0 для любой матрицы.

    Попробуйте с false and ~e(m,n) чтобы убедить себя.

  6. Когда вы используете встроенную функцию несколько раз, используйте дескриптор функции, чтобы сохранить символы, например. zeros(m,n) . For short function names at least 3 occurrences justify this, for long ones - even with two occurrences.

  7. Если функция представляет собой один оператор, предпочтительнее logical notation to 1 один.

  8. К сожалению, глобальные переменные приходится объявлять как в глобальной области видимости, так и в каждой использующей их функции. Но есть исключение: аноним e(m,n) functions "see" all variables from the scope where they are called from.

  9. Это возможно сделать 1 instead of true .

  10. Кажется, это недокументированная функция, но порядок оценки слева направо (проверено в версии 3.8.1), вы можете сделать ~~e(m,n) to both create a n x n^2 matrix and store it's row and column number in ones(m,n) and zeros variables.

  11. Таблица приоритета операторов — ваш друг. Не делай ones since e то же самое.

 

Dimon2008


Рег
24 Nov, 2008

Тем
56

Постов
207

Баллов
537
  • 26, Oct 2024
  • #3

Использование списка аргументов:

Octave способен получать аргументы по умолчанию, поэтому выражения можно оценивать в списке аргументов.

Эта функция полезна, когда мы хотим вычислить выражение и использовать его несколько раз:

zeros

Один из вариантов использования — когда мы используем индексированное присваивание для изменения части массива и хотим использовать сам массив:

ones

Но выражение e returns x = 0 -> x = 0 x++ -> ans = 0 x -> x = 1 ++x -> ans = 2 x -> x = 2 , или выражение {a=1,b=4,c={4 5 6},[b ;3]}{4} returns a two elements array. Neither returns the whole array. We can use the argument list:

{1,4,{4 5 6},[7 ;3]}{3}

Здесь результат индексированного присваивания сохраняется в фиктивной переменной. a'(:)' and the function returns the array.

 

Termdid


Рег
26 Nov, 2019

Тем
69

Постов
210

Баллов
555
  • 26, Oct 2024
  • #4

Я не помню, в каком задании я видел, как кто-то это использовал (пожалуйста, сообщите нам =), но я нашел это изящным трюком:

Обычно, если вы добавляете матрицы, они должны иметь одинаковый размер, но для одномерных матриц (1xn и nx1) есть ярлык (который не работает в Matlab):

num2cell([1 2 3 4]){:}

производит тот же эффект, что и

a={1,4,{4 5 6},[7 ;3]};a{3}

Затем кое-что, о чем уже упоминал pawel.boczarski: в Octave вы можете (в то время как вы не можете в Matlab) определять вспомогательные переменные внутри дескрипторов функций, И само присвоение переменной имеет значение присваивания, поэтому вы можете действительно сократить код (ну, это бесполезная процедура). пример, но вы поймете трюк):

{1,4,{4 5 6},[7 ;3]}{3}

Тогда еще один трюк (также применимый в Matlab) — злоупотребление строками для хранения (жестко запрограммированных) чисел. (этот изящный трюк украден из Feersum), вам просто нужно что-то, что интерпретирует строку как число, что так же просто, как, например, добавление нуля:

h=hilb(4);h(4:5,4:5)

Или

hilb(4)(4:5,4:5) ||answer||

Пропустите точки с запятой!

я буду использовать этот ответ чтобы проиллюстрировать суть.

Исходный код был:

a=[1 23 4 5 7];a(3:4)

После удаления точек с запятой его можно было бы сократить до следующего, сэкономив три байта:

[1 23 4 5 7](3:4)

Это можно использовать во многих местах, и вещи, которые вы даже не пробуете, потому что это выглядит как синтаксическая ошибка, часто срабатывает.

 

Arnoldwrank


Рег
04 May, 2019

Тем
64

Постов
200

Баллов
530
  • 26, Oct 2024
  • #5

- В Octave можно применять индексацию к временному выражению, функция, запрещенная в MATLAB, и эта функция очень полезна для игры в гольф.

пример: function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end and its MATLAB equivalent: function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end
Октава: sum('abc') == 294 and its MATLAB equivalent: a = 'abc'; a+0 %returns [97 98 99]
Октава: f=@(n)(z=n+1)*z; %returns (n+1)^2 and its MATLAB equivalent: [x,y]=meshgrid(1:5,6:10); z = x+y;
Октава: z = (1:5)+(6:10)'; for creation of comma separated list
Октава: b

Октава:

f=@(a=[1 2 3 4],b=a(2)=5)a;
-Иногда в анонимной функции, как и в обычной функции, нам требуется оценить несколько выражений, которые включают присваивание,

(a([1 3])=4)

Один из подходов заключается в том, что мы можем поместить каждое выражение в ячейку (поскольку ячейка может содержать объект нескольких типов), и когда нам нужно значение каждого выражения, мы можем использовать индексацию для извлечения этого элемента.

или

 

Consqassg


Рег
08 Oct, 2013

Тем
72

Постов
190

Баллов
560
  • 26, Oct 2024
  • #6

a(2) ||answer||

Это простой, но полезный способ. (a(2)=5) function instead of a=[1 2 3 4] a(2)=5; В Octave, но не в MATLAB, можно сделать как в C++: f = @(x,a=sort(x))a(a>.5);

Используйте b=a==0 function, which I don't think is very well known. It's like b=(a==0) или b , but it produces copies of the number У Октавы естьили е. И это

  • короче a you can use zeros(a=n,b=a*a) . Эта функция иногда может быть полезна: a=0;b=0;f(a,b) instead of f(a=0,b=0) Вместо @(n)... directly if all you need is a nonzero value, not specifically function r=f(n)r=dosomething(n);end если тебе удастся избежать наказания f=@(n)dosomething(n) later).
  • . Или даже использовать f=@find you can use 0||[1 1;1 1] (например, если вы собираетесь конвертировать в 0||[1 1;1 0] is acceptable instead of all(all(m)) Вместо 0||m to produce actual zeros.
если

; или

 

Hex33


Рег
16 Mar, 2009

Тем
85

Постов
206

Баллов
661
  • 26, Oct 2024
  • #7

&& ||answer||

Еще один простой, но полезный (невозможно в MATLAB): || !

Присвойте одно и то же значение нескольким переменным: Использовать.


Вдохновленный ответом Луиса Мендо zeros(1,n) . The downside is that loops and variable modifications (such as swapping two elements in a matrix) is impossible cumbersome.

здесь 0*(1:n) , you can fetch the input as you do with a normal anonymous function, and run the script as you do with a normal script:

Анонимные функции в большинстве случаев короче, чем создание сценария, для которого требуется один или несколько вызовов. С:

t!=0

Учитывать

~~t

этот


По сравнению с этим: Код идентичен, но раздел ввода намного короче. Это также можно использовать для изменения входных переменных, например:

t==0 ||answer||

Луис Мендо ~t instead of a(find(a==0))

для этого!):

Использовать

 

Wein


Рег
31 Mar, 2005

Тем
86

Постов
221

Баллов
651
  • 26, Oct 2024
  • #8
.

Родственные, но не идентичные a(a==0) . All the following work, and gives the same result:

numel(a)

советы по MATLAB Малоизвестная и малоиспользуемая особенность Octave заключается в том, что большинство встроенных функций можно вызывать без круглых скобок, и в этом случае они будут рассматривать все, что следует за ними, как строку (при условии, что она не содержит пробелов). Если он содержит пробелы, вам нужны кавычки. Это часто можно использовать для сохранения одного или двух байтов при использовании Если у вас есть места, то вы

nnz(a)

должен

a
 

AdrianKl


Рег
27 Dec, 2013

Тем
82

Постов
187

Баллов
607
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно