옥타브 골프 팁


18

옥타브 골프에는 어떤 일반적인 팁이 있습니까? 나는 일반적으로 옥타브에 다소 특정한 코드 골프 문제에 적용될 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.


2
관련이 있지만 복제본이 아님 : MATLAB에서의 골프 팁
Dennis Jaheruddin

답변:


9
  1. 일단 당신이 알면, 그것은 2 문자를 비교 a하여 0 값이 없습니다 .nnz(a)numel(a)
  2. 를 선호 a(a==0)하십시오 a(find(a==0)).
  3. ~t보다 짧은 t==0, 심지어는 ~~t보다 짧은 t!=0.
  4. 0*(1:n) 보다 짧다 zeros(1,n)
  5. 일반적으로, ||그리고 &&첫 번째 인수는 스칼라 때, 많은 다른 사업자와는 달리, 그 결과를 scalarize. 행렬의 경우 요소가 0이 아닌 비어 있지 않은 행렬 만 논리 값이 true 입니다.

따라서 모든 행렬 0||m대신에 할 수 있습니다 all(all(m)).

함께 노력 0||[1 1;1 0]하고 0||[1 1;1 1]설득하십시오.

  1. 내장을 여러 번 사용하는 경우, 예를 들어 문자를 절약하기 위해 함수 핸들을 수행하십시오. f=@find. 짧은 함수 이름의 경우 적어도 3 개의 어커런스가 긴 어커런스의 경우 2 개 어커런스로도이를 정당화합니다.

  2. 함수가 단일 명령문 인 경우 하나의 f=@(n)dosomething(n)표기법을 선호하십시오 function r=f(n)r=dosomething(n);end.

  3. 불행히도 전역 변수는 전역 범위와 변수를 사용하는 각 함수 모두에서 선언해야합니다. 그러나 익명 @(n)...함수는 호출 된 범위의 모든 변수를 "참조"합니다.

  4. 그것은 할 가능성이 f(a=0,b=0)대신 a=0;b=0;f(a,b).

  5. 이것은 문서화되지 않은 기능으로 보이지만 평가 순서는 왼쪽에서 오른쪽으로 (3.8.1에서 확인 됨) zeros(a=n,b=a*a)anxn ^ 2 행렬을 만들고 행과 열 번호 ab변수 를 모두 저장할 수 있습니다.

  6. 운영자 우선 순위 테이블은 친구입니다. b=(a==0)이후 b=a==0동일 하지 않습니다 .


7

나는 누군가가 사용하는 것을 보았을 때 (우리에게 말해주십시오 =) 기억하지 않지만, 이것은 깔끔한 트릭을 발견했습니다.

일반적으로 행렬을 추가하는 경우 크기는 같아야하지만 1 차원 (1xn 및 nx1) 행렬의 경우 바로 가기가 있습니다 (Matlab에서는 작동하지 않음).

z = (1:5)+(6:10)';

같은 효과를냅니다

[x,y]=meshgrid(1:5,6:10);
z = x+y;

pawel.boczarski가 이미 언급 한 것 : Octave에서는 함수 핸들 내에서 보조 변수를 정의 할 수 있으며 Matlab에서는 보조 변수를 정의 할 수 있으며 변수 할당 자체에 할당 값이 있으므로 코드를 실제로 단축 할 수 있습니다 (이것은 쓸모가 없습니다) 예를 들어 트릭을 얻을 수 있습니다) :

f=@(n)(z=n+1)*z; %returns (n+1)^2

그런 다음 또 다른 트릭 (Matlab에도 적용 가능)은 (하드 코딩 된) 숫자를 저장하기 위해 문자열을 남용하는 것입니다 (이 깔끔한 트릭은 feersum에서 도난당했습니다) . 문자열을 숫자로 해석하는 것이 필요합니다 .0을 추가하는 것만 큼 쉽습니다.

a = 'abc';
a+0 %returns
[97 98 99]

또는

sum('abc') == 294

나는 그것이 a+0아니라고 생각합니다 a+'0'. 그 이외의 팁은 훌륭합니다 =)
Stewie Griffin

그래, 고마워! 추신 : += -= /=아래 목록에 etc 연산자 를 추가 할 수 있습니까?
flawr

1
+a보다 짧은a+0
Luis Mendo

7

인수 목록 사용 :

Octave는 기본 인수를 얻을 수 있으므로 인수 목록에서 표현식을 평가할 수 있습니다.

이 기능은 표현식을 계산하고 여러 번 사용할 때 유용합니다.

f = @(x,a=sort(x))a(a>.5);

사용 사례는 인덱스 할당을 사용하여 배열의 일부를 수정하고 배열을 사용하려는 경우입니다.

a=[1 2 3 4]
a(2)=5;

그러나 표현식 (a(2)=5)은을 반환 a(2)하거나 표현식 (a([1 3])=4)은 두 요소 배열을 반환합니다. 전체 배열을 반환하지도 않습니다. 인수 목록을 사용할 수 있습니다 :

f=@(a=[1 2 3 4],b=a(2)=5)a;

여기에서 인덱스 할당의 결과는 더미 변수에 저장되고 b함수는 배열을 반환합니다.


6

옥타브에서는 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}


@StewieGriffin 멋진 팁! 답변이 업데이트되었습니다!
rahnema1

5

세미콜론을 건너 뛰십시오!

이 답변 을 사용 하여 요점을 설명 하겠습니다 .

원래 코드는 다음과 같습니다.

function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end

세미콜론을 제거한 후 3 바이트를 절약하여 다음과 같이 줄일 수 있습니다.

function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end

이것은 꽤 많은 곳에서 사용될 수 있으며 구문 오류가 자주 작동하는 것처럼 보이기 때문에 시도조차하지 않는 것들입니다.


1
구문 오류가 자주 작동하는 것처럼 보이기 때문에 시도조차하지 않는 것들
Sanchises

2

이것은 간단하지만 유용한 것입니다.

MATLAB이 아닌 Octave에서는 C ++에서와 같이 할 수 있습니다.

x = 0  ->  x = 0
x++    ->  ans = 0
x      ->  x = 1
++x    ->  ans = 2
x      ->  x = 2

2

간단하지만 유용한 또 다른 방법 (MATLAB에서는 불가능) :

여러 변수에 동일한 값을 지정하십시오.

a=b=c=0;

2

사용 eval!

Luis Mendo의 답변 에서 영감을 얻었 습니다 .


익명 함수는 대부분의 경우 하나 이상의 호출이 필요한 스크립트를 만드는 것보다 짧습니다 input(''). 단점은 루프 (예를 들면, 매트릭스의 두 요소를 교환 등) 가변 변형 있다는 불가능 성가신.

을 사용하면 eval일반 익명 함수를 사용하여 입력을 가져오고 일반 스크립트를 사용하여 스크립트를 실행할 수 있습니다.

이것을 고려 하십시오 :

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

이것과 비교하여 :

@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')

코드는 동일하지만 입력 섹션이 훨씬 짧습니다.


이것은 또한 다음과 같이 입력 변수를 수정하는 데 사용될 수 있습니다 (이를 위해 Luis Mendo의 신용 !) :

f(x)eval('x([1,4])=x([4,1])`;

3
코드는 동일 합니다. 추악하고 느리고 읽기 어려운 코드입니다 . 무엇을 더 요청할 수 있습니까? :-D
Luis Mendo


1

MATLAB에 대한 관련 팁은 동일하지 않습니다 .

옥타브의 거의 알려지지 않은 기능은 대부분의 내장 함수를 괄호없이 호출 할 수 있다는 것입니다.이 경우 뒤에 오는 모든 것을 문자열로 처리합니다 (공백이없는 한). 공백이 있으면 따옴표가 필요합니다. 이것은 자주 사용할 때 1 ~ 2 바이트를 절약하기 위해 사용될 수 있습니다 disp. 다음 작업이 모두 동일하며 결과는 동일합니다.

disp('Hello')
disp Hello
disp"Hello"

공백이 있으면 따옴표가 있어야 합니다.

disp('Hello, World!')
disp"Hello, World!"

덜 유용한 다른 예는 다음과 같습니다.

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.