MATL에서의 골프 팁


20

MATLLuis Mendo가 만든 골프 언어입니다 . MATL은 종종 높은 경쟁력을 입증했다 구타 등 Pyth, CJam 및 젤리와 같은 다른 골프의 언어로 제출.

MATL에서 골프를 치는 데 유용한 팁은 무엇입니까? (항상 그렇듯이, 답변 당 팁 하나만주세요!)


5
Matlab / Octave를 알고 있다면 확실히 큰 이점입니다. MATL에서 사용되는 Matlab 에서 골프 팁Octave에서 골프 팁의 일부 트릭 도 사용됩니다.
flawr

제안 : accumarray( XQ)은 매우 강력 할 수있는 것처럼 보입니다 ( 길이 함수 핸들은 편리한 숫자 코드를 가지고 있기 때문에 MATLAB / Octave보다 훨씬 더 좋습니다).하지만 좋은 예제로 설명하기에는 충분하지 않습니다. 실제로 유용하다면 누군가가 그것을 사용하는 방법에 대한 아이디어로 답변을 만들 수 있습니까?
sundar-복원 자 Monica Monica

답변:


7

미리 정의 된 리터럴을 알고

일부는 클립 보드에 복사 할 때 정보를 유지하지만 모두 미리 정의 된 값을 갖습니다.

  • F, 0을 푸시합니다 (실제로 False )
  • T, 1을 푸시합니다 (실제로 True )
  • H, 2를 누름 (사전 정의 된 클립 보드 값)
  • I, 3을 누름 (사전 정의 된 클립 보드 값)
  • K, 4 (미리 정의 된 클립 보드 값)를 누릅니다.
  • J, 0 + 1j (미리 정의 된 클립 보드 값)를 누릅니다.

그래도 미리 정의 된 모든 값을 다뤘는지 확실하지 않습니다.


완성도를 높이기 위해 (그리고 답에 추가하려는 경우) 각 클립 보드 수준 L에는 미리 정의 된 값이 있지만 일반적인 일반 값 대신 일반적인 용도로 사용됩니다. 예를 들어, 1Lgives [1 0](index로 사용 1:end), 2Lgives [0 -1 1](for 1:-1:end)를 제공합니다 . 또한 기능 lO기본적으로 0 개의 입력을 취하고 각각을 생산 0하고 1각각
Luis Mendo

이것이 어떻게 유용한 지 모르겠습니다 ... 그냥 쓸 수는 4없습니까?
Cyoce

@Cyoce 유용성은 구분 기호로 공백을 피하는 것입니다. 당신이 밀어하려면 1, 다음 4, 14하지 않습니다. 당신이 필요합니다 1 4. 또는 1K1 바이트를 절약하기 위해
Luis Mendo

@LuisMendo 아, 알겠습니다. 나는 그것이 1 자리 숫자 만의 방법을 사용한다고 가정 한 것 같습니다 (왜 그런지 모르겠습니다)
Cyoce

1
K대신 4편리한 또 다른 경우 는 다음과 같습니다. 1-4means : push 1, push -4; 반면에 1-K의미는 : push 1, 스택의 아래에있는 것을 빼고4
Luis Mendo

5

&메타 기능 (대체 입력 / 출력 사양)

함수에 전달할 입력 인수 수를 지정하는 일반적인 방법은 $메타 함수 를 사용하는 것입니다.

2$:     % Two-input version of :

마찬가지로 출력 인수 수를 지정하기 위해 출력 인수 수를 지정하는 #메타 함수를 사용할 수 있습니다.

2#S     % Two-output version of sort

또는 함수에 대해 정의 된 출력 인수 수 보다 큰 수를 전달 하면 출력 mod(N, numberOfOutputs) + 1 제공됩니다.

4#S     % Get only the second output of sort

#특정 출력 인수 만 검색 하기 위해 논리 배열을 입력으로 지정할 수 있습니다 .

TFT#u   % Three output version of unique and discard the second output

이러한 모든 입 / 출력 사양은 편리 하지만 바이트 수를 매우 빠르게 증가시킵니다. 이를 처리하기 위해 MATL &17.0.0 릴리스 에서 메타 함수를 도입했습니다 . 이 &메타 함수는 함수의 특정 입력 또는 출력 사양에 대한 바로 가기 역할을합니다. 그게 무슨 뜻인지 봅시다.

위의 예에서, 우리는 두 개의 입력 버전을 사용하고 싶었습니다 :(같은 간격의 값으로 구성된 벡터를 만듭니다). 입력 인자의 기본 수 있지만 :IS는 1(상기 배열을 생성 [1...N]), 그는 매우 사용자가 제 2 입력을 필요로하는 범위의 시작 값을 지정하려는 것이 일반적인. 에 대한 바로 가기로 :정의 &했습니다 2$.

10      % Push 10 to the stack
12      % Push 12 to the stack
2$:     % Create an array: [10, 11, 12] 

이제 바이트를 저장 하여 다음과 같이됩니다 !

10 12 &:

대체 인수 수가 무엇인지 어떻게 알 수 있습니까?

입력 / 출력 사양 &으로 변환는 기능 특정 우리 바이트 절약을 최적화하도록.

각 기능에 대한 도움말 설명의 입력 / 출력 인수 섹션이이 대체 입력 / 출력 수 (있는 경우)를 표시하도록 업데이트되었습니다. 입력 또는 출력 인수의 가능한 수는 범위로 표시되며 각각의 기본값은 괄호 안에 표시됩니다. 치환 될 수있는 입력 / 출력 사양 &애프터 도시 /괄호 안의 문자.

다음은 도움말 설명의 입력 / 출력 인수 섹션입니다. :

 +- Min-Max range of # of inputs
 |        +----- Alt. Default # of inputs
 |        |
 V        V
1--3 (1 / 2); 1 <--- Possible / Default # of outputs
      ^       
      |       
  Default # of inputs

&각 기능의 의미를 어떻게 결정 했 습니까?

매우 신중하게. 은 Using StackExchange API를 , 우리는 이제까지 PPCG 도전에 사용 된 모든 MATL 답변을 다운로드 할 수 있었다. 각 답변을 파싱하여 각 입력 / 출력 사양이 각 기능에 사용 된 빈도를 확인할 수있었습니다. 이 정보를 사용하여 &메타 함수가 각 함수에 대해 나타내야 하는 입력 / 출력 사양을 객관적으로 식별 할 수있었습니다 . 때로는 명확한 승자가 없었으므로 현재 많은 기능이 &정의 되지 않았습니다 .

다음은 우리가 사용한 스크립트입니다 (불행히도 MATLAB이 아니라 MATLAB으로 작성 됨 ).

그리고 여기 에 / 사용법 의 히스토그램예가 있습니다$#


1
이 기능은 @Suever 에서 제안 했습니다. 원래 &는 "기본값에 따라 입력 수가 1 씩 증가 함"을 의미했습니다. 그의 제안은 훨씬 더 유용한 것으로 판명되었습니다
Luis Mendo

5

MATL의 진실 / 거짓 정의에 익숙해 지십시오

동안 true( T)와 false( F) 분명히 truthy 및 falsy 출력을 나타내고, 각각이 널리 truthy의 정의에 합의 / falsy 조금 MATL에 더 많은 유연성을 비트 우리를 제공합니다.

정의 상태는 다음과 같습니다.

if (x)
    disp("x is truthy");
else
    disp("x is falsy");
end

따라서 모든 입력을 반복하고 입력이 진실인지 허위인지 여부를 표시하는 빠른 MATL 진실 / 거짓 테스트를 작성할 수 있습니다.

` ? 'truthy' } 'falsey' ]DT

온라인 버전입니다.

이것이 MATL에서 의미하는 것

이것이 실제로 MATL (및 MATLAB 및 Octave)에서 해석하는 것은 조건이 비어 있지 않고 모든 값의 실제 성분이 0이 아닌 경우 조건이 참으로 간주된다는 것입니다 . 여기에는 두 가지 부분이 강조되어야합니다.

  1. 0아님 : 정확히 0 이 아님을 의미합니다 ==. 여기에는 양수, 음수, 널이 아닌 문자 등이 포함됩니다. 주어진 값을 logical값 ( g) 으로 변환하여 쉽게 확인할 수 있습니다.~~

    F           % Falsy
    T           % Truthy
    0           % Falsy
    1           % Truthy
    2           % Truthy
    -1          % Truthy
    'a'         % Truthy
    ' '         % Truthy (ASCII 32)
    char(0)     % Falsy  (ASCII 0)  
    
  2. 모든 값 : 일반적으로 우리는 스칼라를 참 또는 거짓으로 생각하지만 MATL에서는 스칼라, 행 벡터, 열 벡터 또는 다차원 행렬을 평가할 수 있으며 모든 단일 값이 다음과 같은 경우에만 진실로 간주됩니다 0이 아닌 값 (위에 정의 된대로), 그렇지 않으면 거짓입니다. 다음은 몇 가지 예입니다.

    [1, 1, 1]           % Truthy
    [1, 0, 0]           % Falsey
    [1, 1, 1; 1, 1, 1]  % Truthy
    [1, 0, 1; 1, 1, 1]  % Falsey
    'Hello World'       % Truthy
    

한 에지 경우, 전술 한 바와 같이, 빈 배열 []항상 falsy 것으로 간주된다 ( )

골프를 더 잘하기 위해 이것을 어떻게 사용할 수 있습니까?

도전 과제가 단순히 출력이 진실이거나 허위이어야한다고 언급하는 경우 위의 정의를 활용하여 답변에서 몇 바이트를 줄일 수 있습니다. 혼동을 피하기 위해 위의 온라인 진실 / 거짓 테스트 링크를 MATL 진실 / 거짓 값의 작동 방식을 설명하는 답변에 포함시키는 것이 좋습니다.

몇 가지 구체적인 예 :

  • 로 끝나는 답변입니다 A. 도전은 truthy 또는 falsy 출력을 필요로하고 당신이 당신의 대답을 종료하는 경우 all( A스칼라을 만들 수),이 마지막 바이트를 제거 할 수 있으며 (출력하지 않는 한 당신의 대답은 올바른 남아 []있기 때문에 []입니다 false[]A입니다 true).

  • 배열에 하나의 고유 한 값만 포함되어 있는지 확인 : &=대신에 사용합니다 un1=. 배열의 모든 값이 같으면 브로드 캐스트 된 요소 별 같음 비교는 모든 값의 N x N행렬을 생성 합니다. 모든 값이 같지 않으면이 행렬에 일부 0값 이 포함되어 거짓으로 간주됩니다.


4

암시 적 입력

대부분의 함수는 몇 가지 입력을받습니다. 이 입력은 스택 상단에서 가져옵니다. 스택의 상단에 충분한 인수가 없으면 입력에서 나머지 인수를 가져옵니다. (문서의 섹션 7.3 참조) 원래 설명을 인용하고 싶습니다.

암시 적 입력은 다음과 같이 볼 수 있습니다. 스택은 맨 아래 아래, 즉 0, -1, -2, ...에서 처음으로 정의되지 않았지만 암시 적 입력을 통해 즉시 해결되는 위치에서 무한히 확장됩니다. . 이러한 입력은 필요할 때만 필요한 순서대로 사용자에게 묻습니다. 여러 입력이 동시에 필요한 경우, 일반 스택 순서를 따릅니다. 즉, (확장 된) 스택에서 가장 깊은 입력이 먼저 입력됩니다.


2
암시 적 입력은 @flawr에 의해 제안 된 기능입니다.
Luis Mendo

6
@flawr은 정말 영리한 사람이어야합니다. : D
flawr

3

논리 배열은 종종 숫자 배열로 사용될 수 있습니다

TF0과 1의 배열 리터럴 대신 " "표기법을 사용할 수 있습니다 . 예를 들어, FTF동일하다 [0,1,0]것만, FTF생성 logical된 값이 아닌 double값. 산술 연산은 논리 값을 숫자로 취급하므로 일반적으로 문제가되지 않습니다. 예를 들어, FTFQgives [1,2,1]( Q는 "1 씩 증가")입니다.

경우에 따라 숫자를 이진수로 변환하는 것이 더 짧을 수 있습니다. 예를 들어 [1,0,1], TFT5B동일하다; 후자의 두 logical값 은 값 이라는 점에주의하십시오 .


TF(논리적) [1 0]수치 와 (숫자) 의 차이가 지수로 사용될 때입니다. logical인덱스로 사용되는 유형의 배열은에 해당하는 요소를 선택하고에 해당하는 요소를 T삭제합니다 F. 이렇게 [10 20]TF)생성 10(첫 번째 요소를 선택)하는 반면 [10 20][1 0])생산 [10 20](인덱스 [1 0]의 해석을 가지고 1:end, 상기 어레이의 모든 요소가 선택된다).


3

크기 n-1의 루프

교체를 고려해보다

tnq:"...

td"...

전체 바이트 이상 을 저장합니다 .


@ 루이스 사실! 루프되는 원래 벡터가 필요할 수도 있지만 첫 번째 방법으로는 불가능합니다. 그 말을 제거합니다.
Sanchises

그러나 반드시 1 바이트를 절약 할 필요는 없습니다. 당신은 당신이 필요로하는 여부에 따라 1 또는 2를 저장 @/ X@루프 여부를 내. 아마 당신은 "바이트를 절약하기 위해"라고 말할 수 있습니다
Luis Mendo

3

암시 적 끝을 이용하기 위해 루프 뒤에서 루프 내로 물건을 이동

그 뒤에 코드가 없으면 루프 end문을 생략] 할 수 있습니다 . MATL 파서에 의해 암시 적으로 채워집니다.

따라서 루프 뒤에서 루프 내로 물건을 옮길 수 있다면 최종을 저장할 수 있습니다 ].

구체적인 예로, 다음 코드는 숫자 계승에 몇 개의 후행 0이 N있는지 확인합니다 ( 여기 참조 ).

  • 코드는에서 1로 반복 됩니다 N.
  • 각 숫자에 대해 주요 요소를 계산하고 몇 번 5존재 하는지 결정합니다 .
  • 답은 누적 횟수 5가 나타나는 것입니다 (각각에 대해 5적어도 하나가 있기 때문에 작동합니다 2).

첫 번째 아이디어는 :"@Yf5=]vs다음과 같습니다 (루프 뒤에 명령문이 있음에 유의하십시오).

:      % Range from 1 to implicit input
"      % For each number in that vector
  @    %   Push that number
  Yf   %   Vector of prime factors (with repetitions)
  5=   %   True for entries that equal `5`, and `false` for the rest
]      % End for
v      % Concatenate all vectors as a column vector
s      % Sum. Implicitly display

v기본적으로 모든 스택 내용을 연결 하므로 루프로 이동할 수 있습니다. 또한 덧셈은 연관성 s이 있으므로 이동할 수도 있습니다. 그 잎 ]코드의 끝에, 그리고 따라서는 생략 할 수 있습니다 :"@Yf5=vs:

:      % Range from 1 to implicit input
"      % For each number in that vector
  @    %   Push that number
  Yf   %   Vector of prime factors (with repetitions)
  5=   %   True for entries that equal `5`, and `false` for the rest
  v    % Concatenate all vectors so far as a column vector
  s    % Sum. Inplicitly end loop and display

나는이 상형 문자와 비슷한 글의 언어를 알지 못하지만 다음 3 개월 동안 공부할 시간을 많이 가질 것입니다.
Abr001am

@ Agawa001 :-) Matlab과 매우 유사합니다. 여기에서
보내실 수

3

스택이 비어있는 경우 빈 숫자 배열을 정의하는 더 짧은 방법

빈 숫자 배열을 푸시하려면 일반적으로 사용 []합니다. 그러나 스택이 비어 있으면을 사용하여 바이트를 저장할 수 있습니다 v. 이 함수는 기본적으로 모든 스택 내용을 세로로 연결하므로 스택이 비어 있으면 빈 배열이 생성됩니다.

예를 들어 여기 에서 실제로 볼 수 있습니다 .


2

일부 기능은 MATLAB 또는 Octave와 비교하여 확장되었습니다.

MATLAB 또는 Octave에서 온 경우 많은 MATL 함수가 해당 언어의 함수와 유사하다는 것을 알 수 있습니다. 그러나 그 중 몇 가지 기능이 확장되었습니다.

예를 들어, MATLAB의 reshape기능을 고려하십시오 e. MATL 의 기능은 입니다. 코드 스 니펫 reshape([10 20 30 40 50 60], 2, 3)reshape([10 20 30 40 50 60], 2, [])각각은 "행 벡터 [10 20 30 40 50 60를 2x3 행렬로 재구성 "또는 "필요한만큼의 열을 가진 2 행 행렬로"를 의미합니다. 두 경우 모두 결과는 2D 배열입니다

10    30    50
20    40    60

같은 뭔가 reshape([10 20 30 40 50 60], 2, 2)또는 reshape([10 20 30 40 50 60], 5, [])호환되지 않는 크기의 오류를 줄 것이다. 그러나 MATL은 첫 번째 경우 요소를 제거 하거나 ( 온라인 시도! ) 두 번째 요소는 0으로 채우고 ( 온라인 시도! )

10 30
20 40 

10 60
20  0
30  0
40  0
50  0

MATLAB 대응 기능과 비교하여 확장 된 기능을 가진 다른 기능으로는 (완전하지 않은 목록) S( sort), Yb( strsplit), m( ismember), h( horzcat), v( vertcat), Zd( gcd), Zm( lcm), YS( circshift), YA( dec2base), ZA( base2dec), Z"( blanks).


1

0이 아닌 첫 번째 요소의 색인을 가져옵니다 (있는 경우).

f함수는 배열의 0이 아닌 모든 요소의 인덱스를 제공합니다. 종종 0이 아닌 첫 번째 요소 의 색인을 원합니다 . 즉 것 f1): 적용 f과 그 첫 번째 요소를 선택하십시오. 그러나 원래 배열에 0이 아닌 값 f이 없으면 빈 배열 ( []) 이 출력되고 첫 번째 요소를 선택하려고하면 오류가 발생합니다.

일반적인는보다 강력한 요구의 첫 번째 요소의 인덱스를 획득하는 적어도 하나 존재하는 경우[]그렇지. 이 if후 분기 로 수행 할 수 f있지만 바이트 비싸지 않습니다. 더 좋은 방법은 fX<즉, 최소 기능 X<을의 출력에 적용하는 것 입니다 f. X<입력이 빈 배열 인 경우 빈 배열을 반환합니다.

온라인으로 사용해보십시오! 빈 배열은 전혀 표시되지 않습니다. 또는 여기 직장에서 이에 대한 예를 보십시오 .


1

주어진 배열만큼 범위를 생성하십시오

TL; WR : 배열에 0이 아닌 요소 만 f있는 n:경우 대신 사용 하십시오.


종종 요구 배열 생성하는 경우가 해당 배열의 요소의 수이다. 그렇게하는 표준 방법은 입니다. 예를 들어, 코드 는 숫자 형 벡터를 입력으로 사용하고 각 항목에 색인을 곱한 값을 계산합니다.[1 2 ... L]Ln:tn:*

주어진 배열에 0이 아닌 항목 만 포함되도록 보장 된 경우 (예를 들어, 양의 정수로 구성되거나 인쇄 가능한 문자가 포함 된 문자열 인 경우) n:를 0으로 대체하여 f0이 아닌 항목의 색인이있는 배열을 생성 할 수 있습니다 . 따라서 위의 코드 tf*는 1 바이트를 절약하는입니다.

좀 더 정교한 예 : 1 , 2 , 3 .


1

숫자 형 배열 리터럴을 효율적으로 정의

다음은 숫자 형 배열 리터럴을 정의 할 때 바이트를 절약하는 데 사용할 수있는 몇 가지 방법입니다. 이를 사용하는 예제 답변에 대한 링크가 제공됩니다. 이것들은 @Suever가 만든 분석 스크립트 를 사용하여 얻었습니다 .

연결 및 미리 정의 된 리터럴

작은 숫자 배열의 경우 가끔 연결 (기능을 사용할 수 있습니다 hv비교 : 구분 기호로 공간을 사용하지 않는)뿐만 아니라, 미리 정의 된 리터럴을 [2 4], 2 4h그리고 2Kh배열을 정의, 모두 [2 4]. 마찬가지로 2K1v빈 스택을 사용하여을 정의합니다 [2; 4; 1]. .

숫자 형 배열 리터럴 내의 문자

약간 큰 숫자의 경우 일부 문자가 배열 리터럴 내에 숫자 의미가 있다는 사실을 이용하여 공백을 절약 할 수 있습니다. 따라서 대신에을 [3 5 2 7;-4 10 12 5]사용할 수 있습니다 [IAHC;dX12A]. .

특히 배열 리터럴 내에서

  • O, l, H I K평소의 의미를 가지고 0, ...,4
  • A, ..., Emean 5, ...,9
  • X 방법 10
  • a, ... d-1, ...,-4
  • JG평균 1j-1j
  • P 방법 pi
  • Y 방법 inf
  • N의미 NaN합니다.

문자열과 연속적인 차이점

숫자가 클수록 문자열을 정의하고 연속적인 차이를 계산하는 d데 도움 [20 10 35 -6]이 될 수 있습니다 '!5?b\'d. 대신을 사용할 수 있습니다 . d차이점을 계산하기 위해 문자의 코드 포인트를 사용 하기 때문에 작동합니다 . .

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