Japt에서의 골프 팁


18

코드 골프에 완전히 중독되었으므로 몇 가지 골프 언어를 선택하려고 할 때가되었을 것입니다.

내가 거의 독점적으로 JavaScript를 사용한다는 점을 감안할 때 Japt 는 논리 언어로 시작하는 것처럼 보입니다. 다음 번에 기회에 따라 문서를 살펴볼 예정이지만 그 동안 아래 답변에 Japt에 대한 팁을 게시하십시오.

나는 일반적으로 Japt 및 골프 언어의 초보자이므로 가능한 경우 팁을 JavaScript로 "번역"할 수 있다면 사물을 파악하는 데 큰 도움이 될 것입니다.


Heh, 이것을 게시 해 주셔서 감사합니다. 나는 언젠가 Japt를 다시 디자인하고 싶기 때문에 이것을하고 있었지만, 그것은 곧 일어나지 않을 것이며, 어쨌든 많은 팁을 엉망으로 만들지 않을 것입니다. 나 자신을위한 팁 : 튜토리얼 작성 : P
ETHproductions

Japt chatroom 을 방문하는 것을 잊지 마십시오 :)
Oliver

답변:


11

JavaScript에서 Japt로 이동

아시다시피, Japt는 짧고 확장 된 JavaScript 버전입니다. 나는와 같은 긴 속성 이름 String.fromCharCode(x)Math.floor(x)범위 만들기와 같은 일을하는 지루함 으로 피곤했기 때문에 Japt를 만들었습니다 . JavaScript에서 Japt로 갈 때 알아야 할 최소한의 내용은 다음과 같습니다.

  • Japt는 번역 된 언어입니다. JAPT 코드입니다 transpiled 자바 스크립트에 다음 JS로 실행합니다. (나는 당신이 컴파일 된 것으로 말할 수 있다고 생각 하지만, 번역 것은 더 많은 소식을 듣게됩니다. 면책 조항 : 나는 힙 스터가되는 것에 대해 전혀 아무것도 모릅니다)
  • 모든 항목은 기본적으로 전체 프로그램입니다. 입력이 내재적으로 파싱하고, 제 1 입력은 여섯 변수에 넣고 U, V, W, X, Y, 및 Z; 전체 배열은에 저장됩니다 N. 마지막 표현식의 결과가 자동으로 인쇄됩니다.
  • 모든 대문자는 변수이며 변환 될 때 동일하게 유지됩니다. 대부분의 사전 설정 값은 Japt 문서의 "변수"섹션 ( 인터프리터 ) 에서 찾을 수 있습니다 .
  • 모든 소문자는 프로토 타입 함수 또는 메소드 입니다. JAPT는 방법을 추가 a- z(와 à- ÿ숫자, 문자열 및 배열에). 당신이이 편지 중 하나를 사용하는 경우, JAPT는 채워 .(; UcJapt U.c(에서는 JavaScript에서 와 동일하며 , 이는의 유형에 따라 ceil, charCodeAt 또는 concat을 의미 할 수 U있습니다. 이곳은 대부분의 Japt의 힘이 나오는 곳입니다. Japt 문서의 "_____ 함수"섹션 ( 통역사 ) 에서 이러한 메소드의 전체 목록을 찾을 수 있습니다 .
  • 공간이 나타냅니다 ))냅니다 )). Japt를 처음 디자인 할 때 가능한 한 많은 바이트를 절약하고 싶었 기 때문에 처음이 작업을 생각했습니다. ( IMHO Us w n보다보기에는 좋지 않습니다 Us)w)n).)
  • 함수는로 표시되며 ABC{...}여기서 ABC변수는 문자열 일 수 있습니다. 함수는 JS에서와 마찬가지로 대부분 작동합니다. 마지막 차이점은 returnES6 괄호 를 사용하지 않고 마지막식이 자동으로 반환된다는 것 입니다.
  • '는 단일 문자 문자열을 나타내며 (즉 ,와 'a동일 "a") #다음 문자 코드를 가져와 해당 숫자가됩니다 ( #e와 동일 101).
  • 달러 기호 사이의 모든 $것은 변환 과정에서 동일하게 유지됩니다. for예를 들어, Japt에는 루프가 없기 때문에 이것을 사용하여 루프 를 구현할 수 있지만 다른 방법 (예 : m문자열 및 배열 또는 o숫자)을 사용하는 것이 좋습니다 .
  • 대부분의 다른 문자는 일반적으로 JS에서 사용 - "", 0-9, (, +, =, 등 - 같은 (어쨌든, 대부분의 경우) transpiled 때를 유지.

그리고 기본적인 Japt 코드를 작성하기 위해 알아야 할 모든 것입니다. Japt에서 최대 골프 파워를 달성하려면 더 많은 지식이 필요하지만 다른 답변에서 찾을 수 있습니다.


기본 예는 다음과 같습니다. ASCII 문자 문자열을 가져 와서 16 진수 문자 코드로 바꾸고 싶다고 가정하십시오. 다음은 JavaScript에서 수행하는 방법입니다.

U.split("").map(x=>x.charCodeAt(0).toString(16)).join("")

이제 Japt로 변환합니다. .split("")JS q""에서 Japt 와 동일 하거나 더 짧습니다 q. .join("")또한 q객체가 문자열 대신 배열이라는 차이점이 있습니다. .map(is m, .charCodeAt(is c.toString(is s입니다. 따라서 Japt 코드는 다음과 같습니다.

Uq mX{Xc0 s16} q 

그러나 Japt에서는 m배열에서와 마찬가지로 문자열에서도 잘 작동하므로 두 가지를 모두 제거 할 수 있습니다 q.

UmX{Xc0 s16}

온라인으로 테스트하십시오! "JS 코드"상자에서 볼 수 있듯이 이것은 다음으로 직접 변환됩니다.

U.m(function(X){return X.c(0).s(16)})

Japt로 작업하는 법을 배우면 JavaScript에서 앞뒤로 변환하는 데 점점 더 집중하지 않고 Japt에서 자체 언어로 코딩 할 수 있습니다. 다음은 JavaScript 부분을 완전히 생략 한 설명입니다.

UmX{Xc0 s16}
               // Implicit: U = input string
UmX{       }   // Take U, and replace each character X with the result of this function:
    Xc0        //   Take the char-code at index 0 in X (the first and only one).
        s16    //   Convert this to a hexadecimal string.
               // Implicit: output result of last expression

유니 코드 바로 가기라는 다른 단계를 표시하는 것이 좋습니다. 이 경우 2B를 절약 할 수 있습니다. 또한 마지막에 특정 항목을 생략 할 수 있다고 덧붙일 수도 있습니다. 다른 바이트를 절약 할 수 있습니다.
Luke

감사합니다, ETH. 몇 가지 간단한 과제를 시작하기에 충분하다고 생각합니다.
Shaggy

이것을 지금까지 README에서 얻은 것과 결합하면 위의 예가 더 짧아 질 수 있다는 것이 맞 Um_c s16습니까?
Shaggy

또는 짧게 : ¡Xc s16?
Shaggy

1
@Shaggy 당신은 맞습니다! 사람, 당신은 이것을 빨리 알아 냈습니다 ;-) 다른 Jap 골프 팁 (예 : 유니 코드 바로 가기 등)을 다른 답변으로 추가 할 것입니다.
ETHproductions

8

문자열 배열 압축

업데이트 : 이 팁에 소개 된 도구는 재 작성되고 개선되었으며 Japt 인터프리터에 통합되었습니다 . 최상의 결과를 얻으려면 아래 링크 된 압축기보다 압축기를 사용하는 것이 좋습니다. 시간이 더 있으면이 팁을 다시 방문하여 새 압축기를 염두에두고 다시 작성하겠습니다.

소개

코드에 문자열 배열이있는 경우 압축하는 가장 확실한 방법은 각 문자열실행 하는 것입니다.Oc 개별적 입니다. 이 팁의 목적을 위해 ["lollipop","marshmallow","nougat","oreo"], 처음에는 42 바이트의 무게 를 갖는 array 작업을 수행 할 것 입니다. 각 문자열을 통해 실행 Oc하면 다음 을 얻을 수 있습니다.

[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]

이제 33 바이트가 절약되었습니다.


1 단계

그러나 우리는 더 잘할 수 있습니다. 배열을 개행으로 구분 된 문자열에 결합하면 대괄호, 쉼표 및 불필요한 백틱을 제거하고 개행으로 분할하여 배열을 얻을 수 있습니다. 이를 예제 배열에 적용하면 다음과 같은 결과를 얻을 수 있습니다.

`lo¥ipop
Ú\hÚaow
Í
eo`·

지금은 26 바이트로 줄었습니다.


2 단계

그러나 여전히 더 잘할 수 있습니다! 압축에 포함될 수있는 줄 바꿈 대신 소문자를 사용하여 문자열을 구분할 수 있습니다. z우리의 어떤 문자열에도 사용되지 않습니다.

`lo¥ipopzÚ\hÚaowzÍzeo`qz

아, 견과류-거기에 개선이 없습니다. 우리의 바이트 수는 1 씩 증가했습니다! 사용할 수있는 다른 문자가있을 수 있지만 문자열에 따라 시도해야 할 것이 몇 가지 있습니다 b,c,d,f,j,k,q,v,x,y,z. 각각을 시도하는 것은 꽤 지루할 것입니다. 도구를 사용 이 편리한 도구 가 제공됩니다. 줄 바꿈으로 구분 된 문자열을 공급하면 문자열에 포함되지 않은 각 문자로 문자열을 구분하여 출력하려고합니다.

  • 가장 짧은 압축 문자열
  • 사용하는 구분자
  • 길이.

샘플 문자열을 통해 실행 b하면 최상의 결과를 얻을 수 있습니다.

`lo¥ipáæqrÚaowbÍÞo`qb

그리고 당신은 그것을 가지고 있습니다. 우리는 24 바이트로 줄었습니다.


3 단계

그러나 , 우리는 할 수 있습니다 , 심지어 더 나은! 배열의 문자열 순서가 중요하지 않은 경우 다른 구분 기호와 결합 된 다른 순열이 더 짧아 질 수 있습니다. 하지만 각각의 가능성을 시도하는 것은 훨씬 더 지루할 것입니다. 4 개의 문자열을 사용하면 24 가지 순열을 시도 할 수 있습니다. 264 개가 될 수있는 11 개의 가능한 글자들과 함께! 바로이 도구 가 사용됩니다. 다시 줄 바꿈으로 구분 된 문자열을 입력하면 모든 순열과 모든 구분 문자의 모든 조합을 시도하여 다음을 출력합니다.

  • 가장 짧은 압축 문자열의 문자열 순서
  • 압축 된 문자열
  • 사용하는 구분 기호
  • 길이.

그것을 통해 우리의 샘플 문자열을 실행하면 보여줍니다 "nougat","oreo","lollipop","marshmallow"으로 b구분 단지 (23)의 최종 바이트 수로, 최상의 결과를 제공으로 :

`ÍÞo½o¥ipáæqrÚaow`qb


보너스 팁 : 정수 배열 압축

각각을 더 높은 염기로 변환하여 정수 배열에 동일한 원리를 적용 할 수 있습니다. 이 샘플을 사용하여 36 바이트 배열 :

[588181,156859,595676,475330,680474]

먼저 기본 32 문자열의 배열로 변환 한 다음 첫 번째 압축 프로그램을 통해 실행하여 29 바이트로 줄일 수 있습니다.

`huclt4p5r5ÛÊg62tkogq`qt mnH

또는 두 번째 프로그램을 사용하여 27 바이트만큼 낮습니다.

`4p5Ïcl5ÛÊg62tkogq`qt mnH

정수 변환을 이미 배열에서 실행중인 메소드로 이동하여 다른 바이트 또는 2를 저장할 수 있습니다.


노트

  1. 1 바이트 또는 2 바이트의 추가 q<letter>(<space>)비용 을 고려하는 것을 잊지 마십시오 ·. 구분 기호에 따라 유니 코드 바로 가기 중 하나를 사용 하여 바이트를 다시 가져올 수 있지만ql<space> 예 : ).
  2. 마지막 도구를 사용할 때주의해야 할 말 : 문자열이 많을수록 더 많은 순열이 발생하고 프로그램이 느리게 실행될 때까지 프로그램이 느리게 실행됩니다. 위에서 설명한 바와 같이, 4 개의 샘플 문자열과 11 개의 가능한 문자를 사용하면 264 개의 가능한 조합이 가능하고 동일한 11 개의 문자로 문자열 수를 1 씩 늘릴 수 있으며 이미 시도 할 1320 개의 조합이 있습니다. 원하는 경우이 도구 를 사용 하여 조합 수를 계산할 수 있습니다 .

크레딧

  • 이 팁에서 찾은 도구를 만드는 데 영감을 준 Oliver.
  • 교정을위한 ETH 프로덕션.

6

문자열 압축

Japt (현재)는 문자열 압축에 shoco 라이브러리를 사용합니다 . Oc소문자가 포함되어있는 한을 사용하여 임의의 문자열을 압축 할 수 있습니다 .

Oc"Hello, World!"

이것은 출력입니다 HÁM, WŽld! ( Ž기술적으로는 인쇄 할 수없는 문자입니다). 이것을 백틱으로 감싸서 압축을 풀 수 있습니다 :

`HÁM, WŽld!`

온라인으로 테스트하십시오!

또는 Od함수를 사용하여 임의의 문자열을 압축 해제 할 수 있습니다 . 이것은 일반적으로 유용하지 않지만 목적이 있습니다 ...


그래서 "Hello, World!"라고 대답하면 도전, 내가 그냥 사용 HÁM, WŽld!하거나 백틱으로 묶어야합니까? 후자를 추측하고 있습니다.
Shaggy

2
@Shaggy 질문에 대답 할 때는 모든 코드를 포함시켜야합니다. 그래서`HÁM, WŽld! 이 경우
Martijn Vissers 7

6

문자 코드로 단축 번호

Japt에서는 # 문자를 사용하여 문자 코드를 만들 수 있습니다. 더 긴 숫자를 단축 할 때 유용합니다.

@ETHproductions에서 언급했듯이 UTF-8로 기꺼이 전환하지 않는 한 100-255 범위의 세 자리 숫자로만 작동합니다.

예 :

123 단축 될 수있다 #{

101 단축 될 수있다 #e

이것들을 함께 연결할 수도 있습니다.

123101 단축 될 수있다 #{#e

당신이 사용할 수있는 String.fromCharCode(123)자바 스크립트, 또는 123dJAPT에서 해당 문자를 찾을 수 있습니다.

String.fromCharCode(123) 보고 {


감사합니다, @obarakon, 공을 구르는 좋은 팁; String.fromCharCode()바이트 수를 늘릴 수있는 엄청나게 긴 JS 메소드 중 하나입니다. 아마도 이것들은 정수로 간주됩니까? 즉, 123솔루션에 정수가 필요한 경우 #{바이트를 저장하는 데 사용할 수 있습니다 .
Shaggy

1
예, 정수입니다. -Q입력 창에 플래그를 추가하면 출력 유형을 더 잘 볼 수 있습니다 : strings , arrays 등의 인용 부호
Oliver

1
당신은 그 언급해야합니다 String.fromCharCode(123)자바 스크립트의 작품을,하지만 당신은 할 수 123d같은 결과를 얻을 수 JAPT에 ;-) 또한,이 단지의 범위에 세 자리의 실행에서 작동 100- 255(하지 않는 한있는 거 UTF-8로 전환 할 용)
ETHproductions

@ETHproductions 좋은 전화, 업데이트!
올리버

5

빠른 팁 : 빈 배열 []

Japt에는 빈 배열에 대한 상수가 A있습니다. 그러나 액세스 ;하려면 Japt의 대체 상수를 사용하도록 프로그램에 세미콜론 을 추가해야합니다 . 그렇지 않으면 A입니다 10. 따라서를 사용하면 ;A실제로 0 바이트를 절약 []있지만 배열에 변수 (예 :)를 할당 해야하는 경우 바이트 절약합니다 A=[].

그러나 프로그램이 입력을받지 않는 경우 입력 배열 인 N변수 를 사용하여 1 바이트만으로 빈 배열에 액세스 할 수 있습니다. 입력이 없으면 비어 있습니다. 여기서 사용해보십시오 .

이것은 또한 어떤 경우에는 프로그램의 기본 상수 값을 사용 할 수있게의 추가 혜택을 가지고있다, 할 수있다 여전히 사용을 통해 바이트를 저장 ;A하여 프로그램에 대한 바로 가기를 입력 감사를 복용하는 경우도 s1하고s2 .


2
와우, 나는 N좋은 아이디어를 사용하는 것에 대해 생각하지 못했습니다 .
ETHproductions

2
좋은, @Shaggy!
Oliver

4

자바 스크립트 평가

Japt를 사용하면 원시 JavaScript를 감싸서 실행할 수 있습니다 $...$.

예를 들어 $alert("hello world")$

이것은 JAPT의 자동 폐쇄을 이용하여 단축 할 수 $) .

$alert("hello world")$ 단축 될 수있다 $alert("hello world"

자바 스크립트 압축

다음을 사용하여 JavaScript를 압축 할 수도 있습니다 Ox .

사용하려는 JavaScript 함수가있는 경우 예 를 들어을 사용screen.width 하여 문자열 "screen.width"Oc 압축 한 다음 Ox` ...`사이에 결과삽입 할 수 있습니다

Japt 뒤에 다른 것이 없으면 따옴표로 닫을 필요가 없습니다.


@Shaggy Ox문자열을 평가 하려면가 필요 합니다. 그렇지 않으면 텍스트를 출력합니다 "screen.width".
Oliver

4

깃발을 알고

당으로 최신 메타 컨센서스 (2,017 진수) , 명령 줄 플래그는 더 이상 바이트으로 계산되지 않습니다. 입 / 출력에 대한 추가 처리를위한 많은 플래그가 있기 때문에 Japt에게는 정말 좋은 소식입니다.

Japt에서 사용 가능한 모든 플래그 는 평가 순서 대로 아래에 설명되어 있습니다 . 같은 그룹의 플래그는 서로 배타적입니다. 다른 그룹의 플래그가 같은 결과 조합하여 사용할 수 있습니다 :)

mdefæ

전체 프로그램은 첫 번째 인수 ( U) 위에 매핑 됩니다.

더 많은 인수가 있으면 그대로 전달됩니다 (즉, 쌍으로 매핑 되지 않음 ). 그렇지 않으면 두 번째 인수는 인덱스이고 세 번째 인수는처럼 전체 배열 U.m입니다. 경우 U숫자, 그것은 범위로 변환된다; 문자열 인 경우 문자 배열로 변환되고 결과가 함께 결합됩니다.

  • -m: 위의 사항을 적용합니다.
  • -d: true일부 결과가 사실이면 false반환합니다.
  • -e: true모든 결과가 사실이면 false반환합니다.
  • -f: U결과가 진실 인 요소의 배열을 반환합니다 .
  • : -f첫 번째 요소를 적용 하고 반환합니다.

gh

지정된 인덱스에서 요소를 가져옵니다.

  • -g: 첫 번째 요소 (인덱스 0)를 사용합니다.
  • -gX: 인덱스에서 요소를 취합니다 X(양의 정수일 수 있음).
  • -h: 마지막 요소를 취합니다.

결과를 부울로 변환하십시오.

  • -!: 부울을 적용하지 않습니다.
  • : 부울을 두 번 적용하지 않습니다 (진실도를 반환 함).

N

결과를 숫자로 변환하십시오. 단항 더하기가 사용됩니다.

PRSQ

일종의 문자열로 변환하십시오.

  • -P:로 배열을 조인합니다 "".
  • -R:로 배열을 조인합니다 "\n".
  • -S:로 배열을 조인합니다 " ".
  • -Q: 적용 JSON.stringify(배열뿐만 아니라 모든 개체가 될 수 있음). .

x

기능 x을 출력에 적용합니다 . 문자 그대로 x"단일 소문자 알파벳 함수"가 아닙니다.

  • 배열 : 합계
  • 문자열 : 양쪽 끝에서 다듬기.
  • 숫자 : 정수로 반올림합니다.

2
플래그를 사용하는 것은 Japt 제출으로 계산되지 않으며 Japt-with-those-specific-flags-language 제출로 계산됩니다.
Nit

3

유니 코드 단축키

같은 단지 하나의 아스키 문자에 저장할 수 없습니다 JAPT에서 많은 일반적인 구조가있다 qS , p2 , mX{, , 등 그래서이를 해결하기 위해이 JAPT이 범위의 문자입니다 "유니 코드 바로 가기"를,이 \xA1- \xDE( ¡- Þ이러한 공통 구조로 확장됩니다. 인터프리터 docs 에서 이들의 전체 목록을 찾을 수 있습니다 .

또한, @의미 XYZ{, 그리고 _의미 Z{Z도움이 빌드 함수. 예제 프로그램을 다른 답변으로 골라 봅시다 :

UmX{Xc0 s16}

첫째, 우리는 대체 할 수 X{X와 함께 _우리를 준다 :

Um_c0 s16}

그런 다음 다른 바이트 m_®저장하는 것으로 바꿀 수 있습니다 .

U®c0 s16}

또는로 대체 X{하여 다음 @을 제공 할 수 있습니다.

Um@Xc0 s16}

그러면 ¡바로 가기를 사용하여 2 바이트를 저장할 수 있습니다.

¡Xc0 s16}

이 두 경로 중 하나는 다른 것보다 1 바이트 더 짧아 질 수 있습니다. 어느 것을 알아낼 수 있습니까?


1
®c s166 바이트-쿠키를 얻나요?!
얽히고 설킨

@Shaggy 충분히 열심히 보면 1 바이트를 더 절약 할 수 있습니다 ...;)
ETHproductions

그럴까요 ®c sG?
Shaggy

1
네! 나는 당신이 갈 수있는만큼 낮다고 생각합니다. 잘 했어! :-)
ETHproductions

2
몇 개월 만에 Japt의 진행 상황을 보면서 놀라운 것을 되돌아 보았습니다. 이것은 이제로 달성 할 수 있습니다 csG.
얽히고 설킨

3

사전 설정 변수 활용

변수는 A- SJAPT에 표현하는 하나 이상의 바이트를 가지고 일반적인 값으로 미리 설정되어 있습니다 :

  • A- G입니다 10- 16.
  • His 32, Iis 64, Jis -1, Lis 100입니다.
  • K는로 정의되며 new Date()다양한 방식으로 조작 할 수 있습니다.
  • MO여러 유용한 기능을 가진 객체입니다. 문서에서 자세히 배울 수 있습니다.
  • P빈 문자열, Q따옴표, R줄 바꿈 및 S공백입니다.
  • T로 설정되어 0있으므로 필요한 경우 누산기로 사용할 수 있습니다.

프로그램의 첫 문자가 세미콜론 ;A-L경우 다음과 같이 재설정 하십시오 .

  • A빈 배열 []입니다.
  • B입니다 "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
  • C입니다 "abcdefghijklmnopqrstuvwxyz".
  • D입니다 "QWERTYUIOP\nASDFGHJKL\nZXCVBNM".
  • Eis "[a-z]"이고 Fis "[A-Za-z]"(정규 기능으로 추가하기 전에 유용합니다)
  • Gis 36, His 65Iis입니다 91(알파벳 범위에 유용).
  • J단일 쉼표입니다. L, 단일 기간입니다.

현재 단지 A, B, C, 그리고 D이 목록에서 정말 유용합니다. 최대 256 개의 2 바이트 변수를 허용하는 더 나은 시스템을 추가 할 계획이며,이 값은 이러한 값으로 사전 설정되어 훨씬 더 많이 설정됩니다.


3

자동 기능 사용

당신은 대부분 이미 알고 @_대한 바로 가기입니다 XYZ{Z{Z덮여 (각각 유니 코드 바로 가기 답). 그러나 때로는 기능을 더 짧게 만들 수도 있습니다.

문자 배열이 있고 각 문자를 해당 문자 코드에 맵핑하려고한다고 가정하십시오. 다음 중 하나를 사용하여이 작업을 수행 할 수 있습니다.

mX{Xc} 
m_c} 

그러나 더 좋은 방법이 있습니다. 메소드 또는 연산자가 다른 메소드 또는 a 다음의 첫 번째 항목 인 (경우 문자열로 바뀝니다. 따라서이 두 줄은 동일합니다.

r'a'b  // Replace all "a"s with "b"s; transpiles to .r("a","b")
ra'b   // Does the same thing, 1 byte less; transpiles to the same thing

그러나 그것은 우리의 기능에 어떻게 도움이됩니까? 함수 나 함수를 나타내는 문자열이 주어진다면 함수를 받아들이는 대부분의 메서드는 함수로 해석합니다. 이것은 또한 당신이 이것을 할 수 있음을 의미합니다 :

m_c}  // Map each item to its char code
m'c   // Does the same thing, 1 byte less
mc    // Also does the same thing, 2 bytes less

이것을 "자동 기능"이라고합니다. 여러 종류가 있습니다 :

  • m@Xc}mc
  • m@Xc1}mc1
  • m@X+1}m+1
  • m@1+X}m!+1
  • m@2pX}m!p2

잘만되면 당신은 아이디어를 얻는다. 인수를 바꾸려면 메서드 나 연산자 앞에 접두사를 붙이십시오 !.


자동 기능을 사용하면 단축키를 사용하여 추가 비용을 절약 할 수 있다는 점에 주목할 가치가 있습니까? 예를 들어 m@2pXÃm!p2<space>m!².
얽히고 설킨

우와! 나는지도에서 문자열을 사용하는 것에 대해 생각하지 않았고 가능하다는 것을 몰랐습니다. 아마도 나는 이것 덕분에 몇 바이트를 절약 할 것입니다.
RedClover

안녕하세요 @Soaku, 당신이 Japt로 대답하고 있다는 것을 놓친 적이 있기 때문에 늦게 오신 것을 환영합니다! 지금까지 사용 하셨기를 바랍니다. 궁금한 점이나 제안이 있거나 이야기하고 싶은 경우 Japt 대화방 에서 자유롭게 참여하십시오 (Github은 일반적으로 처음 두 개에서도 잘 작동합니다.))
ETHproductions

3

암시 적 변수 할당

Japt에서 새 줄을 시작할 때마다 이전 줄의 결과는 입력 변수 ( U- Z) 중 하나에 자동으로 할당되며 첫 번째 줄 U은 두 번째 줄입니다.V 등이됩니다.

예를 들어 보겠습니다. 하나는 숫자 1-10을 포함하고 다른 하나는 제곱을 포함하는 2 개의 배열을 만들고 싶었다고 가정 해 봅시다. 이 작업을 수행하는 먼 길은 다음과 같습니다.

U=Aõ V=Um² [do something with the arrays]

그러나 자동 변수 할당을 사용하면 다음과 같이 단축 할 수 있습니다.

Aõ
Um²
[do something with the arrays]

거기에 4 바이트를 저장했습니다. 1-10의 배열이 할당되기 때문에 그러나,이 경우에, 우리는 또 하나의 바이트를 저장할 수 UU특정 시나리오에서 생략 할 수 있습니다 :

Aõ
m²
[do something with the arrays]

주의

이 팁에서주의해야 할 사항은 나중에 프로그램에서 필요할 수있는 입력 변수를 덮어 쓰지 않는다는 것입니다. 시작시 하나 이상의 빈 줄을 남겨두면 피할 수 있습니다. 다음 예에서, 어레이 (2)은 변수에 할당 될 V& W대신, UV:


Aõ
Vm²
[do something with the arrays]

3

자바 스크립트 알기

모든 Japt 코드는 변환 된 JS로 실행되므로 JS 연산자 및 내장 메소드를 잘 이해하면 Japt 코드를 골프화하는 데 많은 도움이됩니다.

관련 JS 팁

[]Vm@...
...
  • 단락
  • 숫자로 나누기
    • 문자열은 받아들이지 만 숫자는받지 않는 모든 방법으로 일반화 할 수 있습니다. 전달 된 숫자는 암시 적으로 문자열로 전송되어 종종 바이트를 저장합니다 (예 : 0over '0).

관련 JS 내장 기능

함수 인수에 전달되는 매개 변수를 자세히 살펴보십시오.

문자열 메서드의 경우 g플래그를 사용하거나 사용하지 않고 문자열 또는 정규식을 전달하는 경우 동작이 어떻게 다른지 아는 것이 좋습니다 .


3

필요할 때 여러 줄을 사용하십시오

그리 어렵지 않은 대부분의 문제에 대해서는 내장 함수를 적용하는 순서로 한 줄의 Japt로 솔루션을 표현할 수 있습니다. 그러나 더 복잡한 것은 반복 구조, 재귀 또는 큰 코드 덩어리를 재사용해야합니다. 멀티 라인 프로그래밍이 시작됩니다.

닫는 괄호 제거

작업 : 숫자 배열이 주어지면 각 요소를 인덱스 제곱과 쌍을 이루고 합계로 정렬하십시오.

[5,1,17,9,3] => [[5,0],[1,1],[17,4],[9,9],[3,16]] => [[1,1],[5,0],[9,9],[3,16],[17,4]]

한 줄 솔루션은입니다 íUm@Yp2})ñx})비용은 2 바이트입니다 (1 바이트 단축키는 없음). })후행 ñx을 다음 줄로 이동 하면 코드를 다음과 같이 제거 할 수 있습니다 .

íUm@Yp2
ñx

번역 된 JS는 다음과 같습니다.

U = U.í(U.m(function(X, Y, Z) { return Y.p(2) })); U.ñ("x")

중간 결과를 다시 할당하여 단선 솔루션과 동일한 작업을 수행함을 분명히 알 수 있습니다 U.

암시 적 인수로 되풀이

재귀 함수 ßUVWXYZ지정되지 않은 경우 모두 암시 적 매개 변수로 사용합니다. U분명히 주요 입력이지만, VWXYZ다른 값을 사용하여 필요한 다른 값을 추적 할 수 있습니다 . 예를 들어 다음과 같은 작업을 수행 할 수 있습니다.

(modify input and implicit assign to U)
(modify V and implicit assign to V)
(test something and call ß without arguments; U and V are passed automatically)

또는 원하는 모든 변수가 임시 변수 인 (T=...)경우 변수 T(0)을 그대로 사용하지 않기 때문에 인라인 할당을 사용할 수 있습니다 .

긴 기능 재사용

이를 위해 좋은 예제 작업을 할 수 있다고 생각하지 않으므로이 팁이 사용 된 유일한 솔루션을 참조 하고 일반적인 아이디어를 간략하게 설명합니다.

  • 함수를 재사용하려면 변수에 저장해야합니다. 기능을 뜨게와 선을 시작 {, @또는하여 _작업을 수행합니다. 또는 (T=@...})함수 할당을보다 복잡한 행에 포함시키는 것과 같은 작업을 수행 할 수도 있습니다 .
  • 실제로 저장된 함수를 호출하는 것은 쉽지 않습니다. V함수 라고 가정 V(U)하고 JS 에서 호출하려고합니다 . VU단순히 의미하기 때문에 작동하지 않습니다 V,U. V(U하지도 않습니다. 그것은이다 V,(U). 함수 메소드조차도별로 도움이되지 않습니다. 우리가 찾은 가장 좋은 방법은 다음과 같습니다.
    • [U]xV 결과가 숫자 인 경우 (맵 및 합계)
    • UmVU단일 문자 인 경우 V문자열을 반환하거나
    • $V($U또는 [U]mV g일반적으로.
  • 그러나 매핑 또는 루핑은 다소 쉽습니다. 배열을 매핑하려면을 사용하십시오 UmV. 만족하는 첫 번째 정수를 찾으려면을 V사용하십시오 Va.

2

자동 기능으로 즐기는 재미

ETH의 자동 기능에 대한 일반적인 팁에 대한 후속 조치로 ,이 팁에서는 달성 할 수있는 바이트 절약 트릭에 대한 몇 가지 특정 예를 제공 할 것입니다.


배열에서 가장 큰 정수를 가져옵니다.

배열 [3,1,4,2]에 변수가 할당되어 U있고 가장 큰 숫자를 검색 한다고 가정 합니다. 우리는 할 수 배열을 정렬 한 후 마지막 요소를 진열하여 4 바이트에서 할 :

Un o

단점은 원래 배열을 수정했다는 것입니다. U지금은 [1,2,3]항상 바람직하지 않을 수있다. 운 좋게도 1 바이트 더 짧은 배열을 수정하지 않고 수행 할 수있는 방법이 있습니다.

Urw

우리가 한 일은 w정수를 사용할 때 정수와 메서드의 인수 (예 :)를 2w5반환 하는 메소드를 사용하여 배열을 줄 5입니다. 위 그래서의 동등 UrÈwY또는 UrXY{XwY}. 그러나이 팁은 배열 의 모든 정수가 음수 인 경우 작동하지 않습니다 .


1
참고 사항 : 아마도 v2에서만 배열의 최소 및 최대를 얻는 함수를 추가 할 계획입니다.
ETHproductions

2

사용 하지 않을í

ízip두 배열 또는 문자열 을 쌍으로 묶거나 함수를 통해 선택적으로 각 쌍을 매핑 하는 유용한 기본 제공 기능입니다. 그러나 배열이나 문자열이 고르지 않을 때 현재 몇 가지 사소한 문제가 있습니다.

  • 첫 번째 배열에 두 번째 배열보다 많은 항목이 있으면 두 번째 배열에 존재하지 않는 항목이로 표시됩니다 undefined.
  • 두 번째 배열에 첫 번째 배열보다 많은 항목이 있으면 첫 번째 배열의 끝에서 처리가 중지됩니다.

따라서 두 개의 고르지 않은 문자열을 비교하고 각 쌍에서 더 높은 코드 포인트를 가진 문자를 가져 오기가 어려울 수 있습니다. U그것이 더 길다는 것을 알고 있더라도이 간단한 작업을 해결하려면 여전히 많은 바이트가 필요합니다.

UíUç hV @[XY]n o

당신이 대신 할 수있는 것은, 두 문자열의 배열로 입력을하는 것입니다 트랜스 로 배열을 y하고 올바른 결과로 각 행을지도 :

Uy m_q n o

이것은 항상 짧은 줄을 공백으로 채우는 장점이 있으며, 두 줄 모두를 통과하는 케이크 조각이됩니다.

실제 사례 : 1 , 2


2

ASCII 범위 생성

업데이트 : Japt는 이제 ASCII 범위에 대한 상수를 갖습니다. 에 대한 대체 값으로 E로 액세스 할 수 있습니다 ;. 이 팁을 참조하십시오Japt 상수에 대한 자세한 을 .

Japt에는 ASCII 범위에 대한 기본 제공 기능이 없지만 5 바이트만으로 문자 배열을 생성 할 수 있습니다.

95odH

시도 해봐


작동 원리

95o숫자에 사용될 때 해당 코드 포인트의 문자를 반환하는 자동 기능[0,95)통해 각 요소가 전달되는 범위 를 만듭니다 . 이 경우 메소드에 인수로 숫자를 전달하십시오. ddH 32의 Japt 상수). 변환하기 전에 원래 숫자에 추가됩니다.

JavaScript에서 동등한 솔루션은 다음과 같습니다.

[...Array(95)].map((_,x)=>String.fromCharCode(x+32))

임의의 문자

아스키 범위에서 임의의 문자를 얻으려면, 사용 ö범위에서 임의의 숫자를 반환하는 대신 [0,X), X그것을 실행되는 수이다.

95ö dH

또는 여러 개의 임의 문자 배열을 얻으려면 인수로 필요한 문자 수를 전달하십시오 ö. 다음은 10자를 반환합니다.

95öA mdH

1

불필요한 구조 문자 제거

구조 문자에 의해, 내 말은 {}, (), $,도 "`. 일반적으로 이러한 문자는 프로그램이 끝날 때마다 발생할 수 있습니다 (예 :) UmX{Xc +"; "} -> UmX{Xc +"; .

또한 다음과 같은 장소에 나타날 때마다 괄호 나 공백을 제거 할 수 있습니다.

  • 세미콜론에 대하여 ; (또는 프로그램의 끝)에 대하여;
  • 의 오른쪽 {(그리고 확장에 의해 @) 또는 [, 또는 왼쪽 ]이나 }.

또한 쉼표는 인수를 구분하는 데 거의 필요하지 않습니다. 당신이 작성하는 경우 AB, 예를 들어, JAPT는 의미 알고 AB별도. 두 개의 숫자 리터럴을 구분하려면 실제로 쉼표 만 있으면됩니다.Us2,5 .

마지막으로, 만약 거기에 U프로그램의 시작시 또는 이후 {;, 메소드 호출 (소문자 또는 관련 유니 코드 바로 가기) 또는 이항 연산자를 제외한 다음 +-( *, &,== , 등), 당신은 제거 할 수 U을 저장 바이트와 ​​Japt가 당신을 위해 그것을 삽입 할 것입니다.


U프로그램 시작이 아닌 경우에도 생략 할 수 있는 몇 가지 다른 인스턴스를 발견했습니다 .
Shaggy

@Shaggy 아, {또는 a 후에도 작동합니다 ;. 알고있는 다른 사람이 있습니까? (이 기능을 코딩 한 지
오래되었습니다

내 머리 꼭대기에서 그것들을 생각할 수 없다. 내일 컴퓨터로 돌아 오면 다시 확인해 보겠습니다.
Shaggy

1

배열의 마지막 요소 수정

때로는 배열의 마지막 요소를 수정해야 할 수도 있으므로 여기에 간단한 방법에 대한 설명이 있습니다. [2,4,8,32]입력 변수에 할당 된 배열로 작업 할 것입니다.U 하고 마지막 정수를 나눕니다 (32 )를 2로 .

이를 달성하는 확실한 방법은 다음 9 바이트 솔루션 ( Demo )을 사용하는 것입니다.

UhJUgJ /2
  • hnx인덱스에있는 요소를 설정 n하는 x.
  • gn 인덱스의 요소를 돌려줍니다 n .
  • J Japt 상수입니다 -1음의 인덱스에 대한 Japt의 지원 덕분에 배열의 마지막 요소에 대해 작업 할 수 . 배열의 크기를 모를 때 편리합니다.
  • 그리고 /2단순히 2로 나눕니다.

위의 내용 -1은 배열의 인덱스 에 있는 요소를 인덱스 에 있는 요소로 설정합니다.-1 배열의 에있는 2로 나눈 값으로 설정합니다. 또는 JavaScript : U[3]=U[3]/2. 그렇게 쓰면 너무 오래 걸리는 것처럼 보입니다. 다행히이 있다 짧은 방법은; 배열에서 마지막 요소를 팝하고 수정 한 다음 배열로 다시 밀어 넣을 수 있습니다. 이러한 각 작업을 개별적으로 수행하는 데 9 바이트 이상이 걸리지 만 7 바이트만으로 한 번에 모두 수행 할 수있어 2 바이트 절약 ( Demo )

UpUo /2

JS로 번역하면 다음과 같습니다.

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