Jakie masz ogólne wskazówki na temat gry w golfa w Octave? Szukam pomysłów, które można by zastosować do problemów z golfem w kodzie, które są przynajmniej nieco specyficzne dla Octave (np. „Usuń komentarze” nie jest odpowiedzią). Proszę zamieścić jedną wskazówkę na odpowiedź.
18
Odpowiedzi:
a
jest on wolny od zerowych wartości, użyciennz(a)
oszczędza ci 2 znaki w porównaniu donumel(a)
.a(a==0)
sięa(find(a==0))
.~t
jest krótszy niżt==0
, a nawet~~t
krótszy niżt!=0
.0*(1:n)
jest krótszy niżzeros(1,n)
||
i&&
, w przeciwieństwie do wielu innych operatorów, skalaryzuje wynik, gdy pierwszym argumentem jest skalar. W przypadku macierzy tylko niepuste macierze bez elementów równych zeru mają logiczną wartość true .Dlatego możemy zrobić
0||m
zamiastall(all(m))
dowolnej matrycy.Spróbuj
0||[1 1;1 0]
i0||[1 1;1 1]
przekonaj się.Jeśli używasz wbudowanego interfejsu wiele razy, wykonaj uchwyt funkcji, aby zaoszczędzić znaki, np.
f=@find
. W przypadku krótkich nazw funkcji uzasadniają to co najmniej 3 wystąpienia, w przypadku długich - nawet w przypadku dwóch wystąpień.Gdy funkcja jest pojedynczą instrukcją, preferuj
f=@(n)dosomething(n)
notację niżfunction r=f(n)r=dosomething(n);end
jedną.Niestety zmienne globalne muszą być deklarowane zarówno w zakresie globalnym, jak i w każdej funkcji, która ich używa. Ale jest wyjątek:
@(n)...
funkcje anonimowe „widzą” wszystkie zmienne z zakresu, z którego są wywoływane.Można to zrobić
f(a=0,b=0)
zamiasta=0;b=0;f(a,b)
.Wydaje się to nieudokumentowaną cechą, ale kolejność oceny jest od lewej do prawej (sprawdzone w wersji 3.8.1), możesz zrobić,
zeros(a=n,b=a*a)
aby zarówno utworzyć macierz anxn ^ 2 i zapisać jej numer wiersza i kolumnya
orazb
zmienne.Tabela priorytetów operatora jest Twoim przyjacielem. Nie rób,
b=(a==0)
bob=a==0
to samo.źródło
Nie pamiętam, w jakim wyzwaniu widziałem, że ktoś go używa (powiedz nam =), ale uznałem, że to fajna sztuczka:
Zwykle jeśli dodajesz macierze, musisz mieć taki sam rozmiar, ale dla macierzy jednowymiarowych (1xn i nx1) istnieje skrót (który nie działa w Matlabie):
daje taki sam efekt jak
Potem coś, o czym już wspominał pawel.boczarski: W Octave możesz (choć nie możesz w Matlabie) zdefiniować zmienne pomocnicze w uchwytach funkcji, A samo przypisanie zmiennej ma wartość przypisania, więc możesz naprawdę skrócić kod (cóż, to jest bezużyteczne przykład, ale dostaniesz lewę):
Następnie kolejną sztuczką (stosowaną również w Matlabie) jest nadużywanie ciągów do przechowywania (zakodowanych na stałe) liczb (ta zgrabna sztuczka została skradziona z feersum) , potrzebujesz tylko czegoś, co interpretuje ciąg jako liczbę, co jest tak proste, jak np. Dodanie zera:
Lub
źródło
a+0
, niea+'0'
. Poza tym wskazówki są fajne =)+= -= /=
operatorów etc na liście poniżej?+a
jest krótszy niża+0
Za pomocą listy argumentów:
Oktawa jest w stanie uzyskać domyślne argumenty, dzięki czemu wyrażenia można oceniać na liście argumentów.
Ta funkcja jest przydatna, gdy chcemy obliczyć wyrażenie i użyć go wiele razy:
Jednym z przypadków użycia jest użycie indeksowanego przypisania do modyfikacji części tablicy i chcemy użyć tablicy:
Ale wyrażenie
(a(2)=5)
zwracaa(2)
lub wyrażenie(a([1 3])=4)
zwraca tablicę dwóch elementów. Żaden z nich nie zwraca całej tablicy. Możemy użyć listy argumentów:W tym przypadku wynik przypisania indeksowanego jest przechowywany w zmiennej zastępczej,
b
a funkcja zwraca tablicę.źródło
-W Octave można zastosować indeksowanie do wyrażenia tymczasowego, co jest zabronione w MATLAB i ta funkcja jest bardzo przydatna podczas gry w golfa. przykład:
Oktawa:
[1 23 4 5 7](3:4)
i jej odpowiednik MATLAB:a=[1 23 4 5 7];a(3:4)
Oktawa:
hilb(4)(4:5,4:5)
i jej odpowiednik MATLAB:h=hilb(4);h(4:5,4:5)
Oktawa:
{1,4,{4 5 6},[7 ;3]}{3}
i jej odpowiednik MATLAB:a={1,4,{4 5 6},[7 ;3]};a{3}
Oktawa:
num2cell([1 2 3 4]){:}
do utworzenia listy oddzielonej przecinkamiOktawa:
a'(:)'
-Czasami w funkcji anonimowej jako funkcji normalnej wymagamy oceny wielu wyrażeń, które obejmują przypisanie. Jedno podejście polega na tym, że możemy umieścić każde wyrażenie w komórce (ponieważ komórka może zawierać obiekt wielu typów) i kiedy potrzebujemy wartości każdego wyrażenia możemy użyć indeksowania do wyodrębnienia tego elementu.
{1,4,{4 5 6},[7 ;3]}{3}
lub
{a=1,b=4,c={4 5 6},[b ;3]}{4}
źródło
Pomiń średniki!
Użyję tej odpowiedzi, aby zilustrować tę kwestię.
Oryginalny kod to:
Po usunięciu średników można go zmniejszyć do następujących, oszczędzając trzy bajty:
Można tego użyć w kilku miejscach i rzeczy, których nawet nie próbujesz, ponieważ często wygląda to na błąd składniowy.
źródło
To jest proste, ale przydatne.
W Octave, ale nie MATLAB, możesz zrobić tak jak w C ++:
źródło
Kolejny prosty, ale użyteczny (niemożliwy w MATLAB):
Przypisz tę samą wartość do kilku zmiennych:
źródło
Użyj
eval
!Zainspirowany odpowiedzią Luisa Mendo tutaj .
Funkcje anonimowe są w większości przypadków krótsze niż tworzenie skryptu, który wymaga jednego lub więcej wywołań
input('')
. Minusem jest to, że pętle i modyfikacje zmiennych (takie jak zamiana dwóch elementów w macierzy) sąniemożliwe.Za pomocą
eval
można pobrać dane wejściowe, tak jak w przypadku zwykłej anonimowej funkcji, i uruchomić skrypt, tak jak w przypadku zwykłego skryptu:Rozważ to :
W porównaniu z tym:
Kod jest identyczny, ale sekcja wejściowa jest znacznie krótsza.
Można to również wykorzystać do modyfikacji zmiennych wejściowych, takich jak to (za to dziękuję Luisowi Mendo !):
źródło
Użyj
rows(a)
zamiastsize(a,1)
źródło
Powiązane, ale nie identyczne wskazówki dla MATLAB .
Mało znaną i rzadko używaną funkcją Octave jest to, że większość wbudowanych funkcji można wywoływać bez nawiasów, w którym to przypadku będą traktować wszystko, co następuje po niej, jako ciąg znaków (o ile nie zawiera spacji). Jeśli zawiera spacje, potrzebujesz cudzysłowu. Można to często wykorzystać do zapisania jednego lub dwóch bajtów podczas używania
disp
. Wszystkie następujące prace i daje ten sam rezultat:Jeśli masz spacje, musisz mieć znaki cudzysłowu:
Inne, mniej przydatne przykłady to:
źródło