<모든 언어>에서의 골프 팁


81

이 게시물의 목표 <all languages>는 특정 팁이 아닌 쉽게 적용 할 수있는 모든 골프 팁을 수집 하는 것입니다.

논리가 대부분 의 언어에 적용될 수 있다는 답변 만 게시

답변 당 하나의 팁


5
"주요"란 무엇입니까?
반 시계 회전을 중지

2
@leftaroundabout 같은 단어의 메트릭으로
ajax333221

8
문제는 많은 언어들이 (일반적으로 단기적인) 실험적인 언어이며, 전형적인 프로그래밍 표현이 전혀 이해되지 않는 매우 전형적인 패러다임을 가지고 있습니다. 따라서 " 모든 언어의 대다수 "를 수행하는 것은 사실상 불가능합니다. "codegolf.SE에서 정기적으로 사용되는 언어의 대다수"와 같은 방식으로 제한해야합니다. 현재 답변은 "원격 C 파생 언어의 대다수"와 매우 비슷해 보이지만, 모든 작성된 코드 의 대다수가 해당 언어로 작성되었지만 대부분의 언어 는 아닙니다 .
반 시계 회전을 중지

3
좌회전에 대해, 우리는 그들이 대략 무엇을 의미하는지 알고 있습니다. 이것은 대부분 언어 독립적 인 최적화에 관한 것입니다. 즉 Brainfuck뿐만 아니라 Python, C, Java 및 Fortran에 유용 할 수도 있습니다. 유사하게 작동하는 여러 언어로 적용 할 수있는 일반적인 아이디어. 과 CW 질문 에 정확하고 구체적이어야 할 필요는 없다고 생각 합니다. 이것은 다른 사람들을 화나게하지 말고 골프를하도록 돕는 것입니다.
Joey

14
바라건대 아무도 언어라는 언어를 <all languages>
만들지 않기를 바랍니다

답변:


72

루프 병합

일반적으로 두 개의 후속 루프 또는 두 개의 중첩 루프를 하나로 병합 할 수 있습니다.

전에:

for (i=0; i<a; i++) foo();
for (i=0; i<b; i++) bar();

후:

for (i=0; i<a+b; i++) i<a?foo():bar();

루프는 여전히 동일하지 않습니다. @Gaffi가 맞습니다.
kaoD

5
@kaoD가, 두 경우 모두 foo호출 a시간, bar호출 b시간을. "after"에서 루프가 a+b시간, 첫 번째 a호출 foo, 다음 호출을 실행하기 때문입니다 bar.
ugoren

나는 이것을 다시보고 (많은, 훨씬 나중에), 나는 내 자신의 질문을 이해하지 못한다. 나는 전에 삼항 연산을 이해하지 못했습니까? 내가 지금 보는 방식은 말이됩니다.
Gaffi

1
웁스, 밤 늦게 읽었 어 네가 옳아!
kaoD

3
매우 유사한 for(y=0;y<Y;++y)for(x=0;x<X;++x)종종이 될 수 for(i=0;i<X*Y;++i)x대체 i%X하고 y대체 i/X.
Lynn

62

명백한 것을 언급하기 위해 :

알고리즘 선택에 의문을 제기하고 완전히 새로운 것을 시도하십시오.

골프를 타는 경우 (특히 더 긴 프로그램으로 이어지는 어려운 문제) 너무 자주 다른 기본 옵션 을 시도하지 않고 선택한 경로를 고수 할 수 있습니다. 물론 전체 아이디어의 한 번에 또는 한 줄에 한두 줄씩 마이크로 골프를 할 수도 있지만 완전히 다른 해결책을 시도하지 않는 경우가 있습니다.

이것은 실제 알고리즘에서 벗어나 동일한 결과를 얻기 위해 적용 할 수있는 패턴을 찾는 많은 언어에서 J가 아닌 Hitting 495 (Kaprekar) 에서 특히 두드러졌습니다 .

단점은 아마도 같은 일을 십여 번 해결할 수 있다는 것입니다. 그러나 HQ9 +를 제외한 모든 언어에서 작동합니다 ( Hello World 를 출력하는 다른 방법을 찾는 것이 약간 쓸데없는 일임).


12
+1 골프에 좋은 것 외에도 많은 실제 상황에서 모든 프로그래머에게 좋은 운동입니다!
Gaffi

52

테스트 주도 개발 사용

코드가 다양한 입력을 처리해야하는 경우 포괄적 인 테스트를 작성하여 매우 빠르게 실행할 수 있습니다. 이를 통해 한 번에 한 단계 씩 위험한 변형을 시도 할 수 있습니다. 그러면 골프는 악의적 인 의도로 리팩토링하는 것처럼됩니다.


4
이 방법의 스핀 오프를 사용합니다. 문제 자체는 일반적으로 다소 단순하기 때문에 작업을 수행하는 프로그램을 작성합니다. 일반적으로 이것은 "읽을 수있는 골프"이므로 간결하지만 개행 등이 있습니다. 이 파일을 새 위치에 복사하고 골프를 치고 지금 확인하고 프로그램이 선택한 입력에 대해 동일한 값을 반환하는지 확인합니다. 내가 깨진 프로그램으로 인해 실수를했을 때, 내가 바꾼 것에 대한 기억이없고 내 골프 조각에 대한 이해가 없다면, "사양"이 참조 소스로 저장되어있다.
shiona

2
필자는이 방법이 마음에 듭니다. 이것이 제가 작성하는 모든 문제에 대해 종합적인 테스트 스위트를 포함시키는 이유 중 하나입니다.
Joey

@RubberDuck 스스로 반복하지 마십시오 원칙은 종종 엄격하게 준수됩니다.
Jonathan Frech

48

논리 문을 줄이십시오.

예를 들어, 경우 A와 것은 B논리 값과 어느 정도 번호와 같은 언어를 취급 부울이다, A and (not B)A>B동일합니다. 예를 들어 파이썬에서

if A and not B:
    foo()

와 같다:

if A>B:
    foo()

3
나는 그런 생각을 한 적이 없습니다.
cjfaure

27
B>A or foo()이것을 표현하는 더 짧은 방법 일 것입니다. 부울 식의 게으른 평가를 활용하여 필요할 때만 계산하도록하십시오.
scragar

5
@ scragar : 맞습니다. 그러나 이것은이 팁의 요점이 아닙니다. (그러나 그것은 귀중한 독립 팁입니다.)
Wrzlprmft

3
@ scragar 는 우리가 원하는 것이 아닌지 B>A or foo평가 foo합니다 B==A. (오른쪽?)
msh210

2
또한 긴 함대 상태 (5/6 매개 변수)가있는 경우 Truth 테이블과 Karnaugh 맵 을 사용하여 가장 짧은 부울 표현식을 찾을 수 있습니다.
Katenkyo

33

이미 가지고있는 값을 사용하여 변수를 초기화하십시오.

대신에 x=1이미 1과 같은 것을 찾으십시오.
예를 들어 함수의 반환 값 : printf("..");x=0;-> x=!printf("..");. 항상 부정 할 수 있거나 필요한 모든 것이 올바른 진실 가치 일 때 (그리고 1 또는 19인지 상관하지 않기 때문에) 0을 사용하는 것이 가장 쉽습니다.


4
C에서 당신은 1시피 주에서는 argc를 사용할 수 있습니다 codegolf.stackexchange.com/questions/1034/reinvent-the-for-loop/...
std''OrgnlDave

1
@ std''OrgnlDave, True, 그러나이 질문은 모든 언어에 공통적 인 것들에 관한 것입니다.
ugoren

33

단항 사용 ~에 대한 x+1x-1

이 트릭은 단항 비트 부정 연산자 ~와 단항 정규 부정 연산자 가있는 언어에 적용됩니다 -.

프로그램에 우연히 expression 표현식이 포함 된 경우 바이트를 저장하기 위해로 -x-1대체 할 수 있습니다 ~x. 이것은 너무 자주 발생하지는 않지만 -두 표현식을 모두 부정 ( ) 하면 어떻게되는지 살펴보십시오 : x+1equals -~x! 마찬가지로, x-1같습니다 ~-x. (틸드 포인트가 어떤 방식인지 생각하십시오 : right is +, left is -.)

모든 언어에서 이러한 연산자가 있다고 생각할 수 있기 때문에 대부분의 연산자보다 우선 순위가 높습니다. 이를 통해 괄호를 절약 할 수 있습니다. 여기서 4 바이트를 절약하는 방법을 살펴보십시오.

(x+1)*(y-1)     ==>    -~x*~-y

30

공백을 쥐어 짜다

해당 언어의 공백 규칙을 알고 있어야합니다. 일부 문장 부호 또는 다른 문자는 공백을 필요로하지 않을 수 있습니다. 이 Bourne 쉘 기능을 고려하십시오 .

f () { echo a; echo b; }

Bourne 쉘에서 ();메타 문자이며 주변 공백이 필요하지 않습니다. 그러나 {}단어이며 메타 문자 옆에 있지 않으면 공백이 필요합니다. 우리는 멀리 4 개 공간 옆에 골프 할 수 ();있지만, 사이의 공간을 유지해야 {하고 echo.

f(){ echo a;echo b;}

커먼 리스프PicoLisp , ()메타 문자입니다. 이 코드를 고려하여 두 숫자의 평균을 찾으십시오.

(/ (+ a b) 2)

우리는 2 칸 떨어져 골프를 치를 수 있습니다.

(/(+ a b)2)

일부 언어에는 공백에 대해 이상하고 미묘한 규칙이 있습니다. 이 Ruby 프로그램은 정수 행의 합계와 곱을 인쇄합니다.

#!ruby -an
i=$F.map &:to_i
puts"#{i.reduce &:+} #{i.reduce &:*}"

각각 &앞에 공간이 필요합니다. 루비에서 블록 매개 변수를 전달하는 위치 를 i=$F.map &:to_i의미 합니다. 그러나 이항 연산자가있는 곳을 의미 합니다.i=$F.map(&:to_i)&i=$F.map&:to_ii=$F.map.&(:to_i)&

이 기묘함은 Perl 또는 Ruby와 같이 모호한 문장 부호를 사용하는 언어에서 발생합니다. 의심스러운 경우 REPL을 사용하거나 짧은 프로그램을 작성하여 공백 규칙을 테스트하십시오.


1
"{"와 "echo"사이에 공백이 필요하지만 ";"사이에 공백이없는 이유는 무엇입니까? "에코"?
Ryan

3
OpenBSD sh (1)에 대한 매뉴얼의 용어를 사용했습니다. "{"는 예약어이고 ";" 메타 문자입니다. 이 때문에 "{echo"는 한 단어이지만 "; echo"는 두 단어입니다. 다른 매뉴얼은 이것을 다르게 설명 할 수 있습니다. 또한 Z 셸 zsh에는 다른 규칙이 있습니다.
kernigh

28

여러 번 사용될 경우 함수에 새로운 이름을 할당

x = SomeLongFunctionName
x(somedata)
x(somemoredata)
etc

에 대한 충분한 호출을 사용하는 경우에만 x.
elipszilon

28

단일 문자 변수 이름

그 중 52 개가 있습니다. 그들 모두를 사용하십시오! 다른 접근법을 시도하고 길이를 비교하는 것을 두려워하지 마십시오. 사용 가능한 언어와 특정 단축키 / 라이브러리 기능을 알고 있어야합니다.


8
대소 문자를 구분하지 않는 언어의 경우 26입니다. :-)
Gaffi

12
종종 $_식별자로 사용할 수 있습니다.
Griffin

4
@Gaffi : 작업이 사용자를 ASCII로 제한하거나 문자가 아닌 바이트를 계산하지 않는 한 유니 코드 식별자를 허용하는 언어에는 충분합니다.
hammar

유니 코드 대신 바이트 수를 계산하는 경우 확장 ASCII를 사용하면 필요한 경우 ~ 120 개의 식별자를 짜는 방법 일 수 있습니다 (골프 스크립트의 경우 26 개 이상이 필요하지 않음)
scragar

2
@T-SQL에서 유효한 변수 이름이므로 대신 사용하십시오 @a.
BradC

25

조건부 연산자를 사용하십시오.

조건부 연산자

bool ? condition_true : condition_false

IF 보다 문자 적으로 현명 합니다 .

if(a>b){r=a;}else{r=b;}

로 쓸 수 있습니다

r=a>b?a:b;

25
삼항이없는 언어는 a&&b||c대신 사용할 수 있습니다 . 약간 길지만 여전히보다 짧습니다 if.
Michael Kohl

다시 말하지만, 일부는 두 옵션 중 하나를 사용할 수 없지만 (VBA가 떠오름) 여전히 좋은 제안입니다. :-)
Gaffi

1
Gaffi : VBA는 Iff함수이지만 모든 인수를 평가해야합니다.
Joey

if 문 에서 삼항 사용하면 매우 유용 할 수 있습니다.if(a ? b : c)
Jojodmo

4
@MichaelKohl 참고 true 일 때 a&&b||c반환 c할 수 있음 참고 aiff b는 약간의 경우에 해당하지만 ^^
Katenkyo

24

코드 설명을 작성하십시오

설명을 작성하면 코드의 각 부분을 다시 철저히 검토하고 특정 구절을 명시 적으로 작성할 때 생각과 선택을해야합니다. 그렇게함으로써 일부 바이트를 절약 할 수있는 다른 접근 방식이 가능하거나 잠재 의식적으로 가정 할 필요는없는 가정을했을 수 있습니다.

이 팁은 알고리즘 선택 질문 과 유사하며 완전히 새로운 것을 시도해보십시오 . 그러나 각 부분의 작동 방식을 실제로 적어 두는 단계가 대안을 인식하는 데 때로는 중요하다는 것을 알았습니다.

보너스로 설명을 포함한 답변이 다른 사용자에게는 더 흥미 롭기 때문에 공언 될 가능성이 높습니다.


23

당신의 문자 수를 다시 확인

당연히 들리는 것처럼 들리지만주의를 기울이면 실제로 아무 것도하지 않으면 서 몇 개의 문자를 "저장"할 수 있습니다!

Windows를 사용하는 경우, \r\n그냥 \r또는 대신 \nReturn 키를 눌렀을 때 입력 할 수 있습니다 . 줄당 바이트를 추가하십시오! 제어 문자를 돌려서 수행하지 않는 것을 다시 확인하십시오.

메모장 ++에서는 로 이동하여 모든 \r\n줄 끝을 로 변환 할 수 있습니다 .\rEdit > EOL Conversion > UNIX/OSX Format

또한 문자 수에 후행 공백을 포함시키지 마십시오! 코드의 맨 아래 줄에있는 줄 바꿈도 중요하지 않으므로 계산할 필요도 없습니다.


나는 이것이 실제로 계산 된 사례를 본 적이 있다고 생각하지 않습니다 ...
Jacob

4
방금이 문제가 발생했습니다 (따라서 추가하는 이유).
Sean Latham

21

질문을주의 깊게 읽으십시오

코드 골프는 질문을 이해하는 것만으로도 질문을 이해하는 것에 관한 것입니다 ( 다른 설정에서 암시하더라도 질문과 요청 되지 않은 내용).

명시 적으로 요청 된 것 이외의 입력은 처리 할 필요가 없습니다. 테스트 사례가 있고 일반적인 요구 사항이 없으면 코드는 해당 사례에서만 작동 할 수 있습니다. 기타.


15
여기서 더 나은 헤드 라인은 "필요하지 않은 엣지 케이스를 처리하지 마십시오"라고 생각합니다. "허점을 찾으려고 시도하십시오"라는 문구는 규칙을 교묘하게 재 해석하여 지정된 작업을 수행하지 않는 방법을 염두에두고 제공하는 것은 솔루션을 과도하게 구현하지 않는 좋은 조언 일뿐입니다.
Jonathan Van Matre

1
예, 그러나 규칙을 교묘하게 재 해석하는 것도 코드 골프의 일부입니다! (0 숯 솔루션 등)
Tobia

8
그러나 다른 대답이 될 것입니다. 예를 들어, OP에는 플로트 지원이 필요하지 않기 때문에 int에서만 작동하는 솔루션을 구현하는 것과 "100보다 큰 소수"라는 텍스트를 인쇄하는 대답 사이에는 근본적인 차이가 있습니다. 실제 소수 여야합니다. "
Jonathan Van Matre

일부 OP에는 "변경 될 수있는 테스트 사례가 있습니다. 코드는 변경 후에도 계속 작동해야합니다"라는 알림이 포함되어 있으며 테스트 사례를 하드 코딩 한 답변이 하나만 표시되는 경우 실제로 변경됩니다.
Outgolfer Erik

20

0에서 2 n -1 사이의 숫자를 확인하려면 비트 단위 연산을 사용하십시오.

약간의 경우가 될 수 있지만 때로는 유용 할 수 있습니다. m = 2 n -1이 적용되는 모든 숫자 는 가장 오른쪽에있는 n 비트가 1로 설정되어 있다는 사실에 의존합니다 .

따라서 7 10 == 00000111 2 , 15 10 == 00001111 2 , 31 10 == 00011111 2 등입니다.

트릭은 x&~m입니다. 0과 (포함) 사이 x아닐 때마다 true를 반환 m하고 그렇지 않으면 false를 반환합니다. 다음으로 가장 짧은 등식 인 6 바이트를 절약 x>=0&&x<=m하지만 m2 n -1을 만족할 때만 작동합니다 .


18

새 변수 대신 함수 매개 변수 재사용


1
예를 들어, C에서 주 함수는 항상 프로그램에 제공된 인수 수 (1-프로그램 이름- '기본')를 전달하므로 main(i){...이제 값을 1 로 지정할 수 있습니다. 과제를 수행하십시오. 2 개의 문자가 저장되었습니다 ..
Griffin

6
스크립트 언어는 선언이 필요하지 않으며 대부분의 컴파일 언어에서 변수를 정의하는 것이 매개 변수를 정의하는 것보다 길지 않습니다.
ugoren

Java에서 하나의 매개 변수와 동일한 유형의 함수 안에 배열이 필요할 때 해당 매개 변수를 마지막으로 두어 vararg 매개 변수로 만들어 몇 바이트를 절약 할 수 있습니다. (문장에서 가장 긴 단어를 찾기 위해 함수에서 일부 바이트를 면도하는 데 사용됨)
masterX244

18

숫자를 저장하는 것보다 큼 / 낮음 :

//use:
if(n>9){A}else{B}
//instead of:
if(n<10){B}else{A}

단지에서 코드를 교환하는 것을 기억 if받는 else그들이 똑같은 일을 (또는 불평등의 측면을 전환) 할 것이다!

참고 : 이것은 10의 거듭 제곱과 그 부정에 적용 할 수 있습니다....-100, -10, 10, 100...

(소스 링크)


나는 이것의 요점을 이해하지 못한다. 이것이 무엇을 줄입니까?
Gaffi

@Gaffi 당신은 하나의 문자를 저장하고 그들은 정확히 동일
ajax333221

어떤 대안 대? 미안하지만 고집을 피우려고 노력하지는 않습니다. (최신, 여기, 분명히 ...)
Gaffi

1
아, 알겠습니다 9에서 10, 99에서 100 등의 정수 전이에서 작동합니다. 죄송합니다. 너무 오래 걸렸습니다! (n = 9.5의 문제를 볼 수 있기 때문에 정수만 말합니다.)
Gaffi

8
또한 일부 언어 (지원되는 경우)에서 숫자가 충분히 크거나 작 으면 과학적 표기법이 실제로 문자를 대신 저장할 수 있습니다. if(n>99999)vsif(n<1e5)
scragar

16

> = 및 <= 대신> 및 <을 사용하십시오.

하드 코딩 된 정수 값에 대해 검토 한 결과, 사용 >하고 <대신 >=하고 <=가능한있다. 예를 들어

if(x>24&&x<51)

사용하는 것보다 2 바이트 더 짧습니다

if(x>=25&&x<=50)

3
관련 : 당신이 확신하는 경우 결과는 당신이 사용할 수, 음수가 될 수 없습니다 <1대신 ==0제로 체크 등 (또는 >0대신 !=0미러 확인 용).
Kevin Cruijssen 2016 년

1
x정수라 는 것에 대한 메모를 추가해서는 안 됩니까?
Zacharý

15

조기 루프 중단 방지

부울 검사의 하나 이상의 인스턴스를 검사하기 위해 루프를 통해 실행하는 경우보다 효율적인 프로그램이 첫 번째 실제 값에서 루프를 종료하도록 만들 수 있습니다. 그러나 중단을 제거하고 모든 반복을 반복하면 코드가 더 짧아집니다.

int main() {
bool m = false;
int n = 1000;
for (int i = 0; i < n; i++) {
if (i >= 100) {
m = true;
break; // remove this line
}
} 
return 0;
}

5
if다음과 같은 경우에는 설명을 단순화 할 수도 있습니다 m|=i>=100. ( 이 경우 에는 i>=100to i>99를 단순화 할 수도 있지만 여기서는 그다지 관련이 없습니다)
marinus

15

-대신에 사용!=

숫자 비교의 경우 :

a가 b와 같으면 a-b결과가 0되며 이는 거짓입니다. 0진실 이 아닌 다른 것 ; 그래서
부울 문맥에서 사용하는 경우, a-b<=>a!=b

if/else삼항 연산자와 함께 또는 삼항 연산자와 함께 사용하면 동등성을 위해 1 바이트를 절약 할 수도 있습니다.
a==b?c:d<=>a-b?d:c


12

긴 배열을위한 분할 문자열

대부분의 언어에는 문자열을 일종의 토큰 주변의 문자열 배열로 나누는 방법이 있습니다. 문자열 당 추가 오버 헤드는 (적어도) 두 개의 문자열 구분 기호가 아닌 하나의 문자 토큰 사본이므로 길이가 언어 종속 임계 값에 도달하면 배열 리터럴보다 짧을 수밖에 없습니다.

예를 들어 GolfScript

["Foo""Bar""Baz""Quux"]  # 23 chars

된다

"Foo
Bar
Baz
Quux"n/  # 20 chars

일부 언어의 경우 임계 값이 하나의 문자열만큼 낮습니다. 예를 들어 Java에서는

new String[]{"Foo"}  // 19 chars

된다

"Foo".split("~")  // 16 chars

6
주목할만한 예외는 Ruby이며, 문자열의 배열 리터럴을 제공하여 2 바이트의 비용으로 공백을 자동으로 분할합니다 %w{Foo Bar Baz Quux}.
Martin Ender

1
펄은 비슷한 것을 제공한다 : qw(Foo Bar Baz Quux)문자열리스트가된다.
BenGoldberg

12

다른 사람들이 한 일을 이해

재미 있고, 다른 사람들의 코드를 살펴보면 생각하지 못한 좋은 알고리즘이나 간과하기 어려운 트릭 (때로는 명백한 알고리즘)을 발견 할 수 있습니다.

때로는 다른 언어로 번역하고 다른 언어의 장점을 활용할 수있는 기존의 대답이 있습니다.


10

운영자 우선 순위를 알고

여러 표현식을 결합 할 때마다 언어에 대한 연산자 우선 순위 테이블을 확인하여 괄호를 저장하기 위해 항목을 재정렬 할 수 있는지 확인하십시오.

예 :

  • 내가 알고있는 모든 언어에서 비트 연산자는 부울 연산자보다 더 높은 우선 순위를 가지고는 : (a&b)&&c더 괄호를 필요로하지 않는다 : a&b&&c단지로 (a*b)+c하지 않습니다.
  • a+(b<<c)로 다시 쓸 수 있습니다 a+b*2**c.
    이 예제에서는 아무 것도 저장하지 않지만 c작은 정수 리터럴 인 경우 (<14)
  • 비트 연산은 대부분의 산술 연산보다 낮은 우선 순위를 가지고, 그래서 당신의 언어를 암시 적으로 int로 부울을 캐스팅하는 경우, 당신은에 바이트를 저장할 수 있습니다 a<b&&c<da<b&c<d(당신은 단락 회로 평가를 필요로하지 않는 한)

7

더 짧은 for- 루프

당신이 경우 X{안쪽에 }당신을위한 루프를, 당신은 이동할 수 있습니다 X-1(안쪽에 )두 번째 세미콜론 이후에 대한 루프를 for(blah;blah;HERE)3 바이트를 저장합니다. (쉼표를 사용하여 문장을 분리하십시오 ,)

대신에

for(int i=0;i<9;){s+=s.length();println(i++);}

명령문 중 하나를 for 루프의 (괄호 로 옮길 수 있고 다른 하나는 )생략 할 수 있습니다

for(int i=0;i<9;println(i++))s+=s.length();

3 바이트를 절약하십시오 (@ETHProductions 덕분에 1 바이트 더 절약되었습니다)


간단히 말해서

대신에

for(blah;blah;){blah 1;blah 2;...;blah X}

당신이 이것으로 끝나도록 문장을 움직입니다.

for(blah;blah;blah 2,...,blah X)blah 1;

3 바이트를 저장


@ETHproductions 팁 골프를 주셔서 감사합니다 :)
Kritixi Lithos

그리고 이것이 for마지막 ;
진술인

7

단항 사용 ~에 대한 a-b-1a+b+1

뿐만 아니라 @Lynn 에 관한의 제안 x+1-~x; 그리고 x-1→가~-x , 당신은 또한 골프를 할 수 a-b-1a+b+1.

a-b-1    // 5 bytes
a+~b     // 4 bytes

a+b+1    // 5 bytes
a-~b     // 4 bytes

자주 사용하지 않는 팁처럼 보일 수 있습니다. ~x대신 사용하는 것이 -x-1자주 발생하지는 않지만 유용한 팁으로 볼 수 있도록 충분한 시간을 사용했습니다. 특히 배열 인덱싱을 사용하면 경우에 따라 위의 항목을 사용할 수 있습니다.


6

압축 또는 줄무늬

ands (또는이 경우 ors,이 경우 'all'을 'any'로 대체하십시오)로 묶인 긴 조건을 짜려고 할 때 생각해 낸 간단한 트릭.

예 :

if a>0 and a<10 and a+b==4 and a+3<1:

된다

if all([a>0,a<10,a+b==4,a+3<1]):

그것은 멋진 것입니다, 나는 그것을 시도해야합니다!
stokastic

4
어떤 언어가 all(array-of-Booleans)내장되어 있습니까?
피터 테일러

3
루비가 가지고 있습니다. [a>0,a<10,a+b==4,a+3<1].all?
kernigh 2009 년

4
이것이 파이썬이라면 다음과 같은 것을 사용하게 될 것입니다.if 10>a>0 and a+b==4>1>a+3:
Sp3000

@PeterTaylor Haskell도
자랑스런 Haskeller

6

필요한 성능을 제공하려면 컴파일러를 사용하십시오.

컴파일러가 어떤 최적화를 보장하는지와 어떤 최적화 레벨을 사용하는지 알고 자유롭게 사용하십시오. 또한 성능이 문제 가되지 않아도 최적화를 사용하여 테스트 한 다음 컴파일러 플래그없이 기술적으로 유효한 코드이므로 한 문자 만 할인 할 수 있습니다 .

2 ^ n을 계산하려면 다음 Haskell 함수를 고려하십시오 (Haskell에 이미 내장 지수 연산자 또는 3 개가 있다는 사실을 무시 함) (23 자) :

p 0=1;p x=p(x-1)+p(x-1)

문제는-엄청나게 느리고, 기하 급수적으로 실행됩니다. 이로 인해 코드를 테스트 할 수 없거나 질문으로 인한 성능 제한이 실패 할 수 있습니다. 반복되는 함수 호출 (25 자)을 피하기 위해 임시 변수 또는 즉시 호출 된 함수 리터럴을 사용하려는 유혹이있을 수 있습니다.

p 0=1;p x=(\y->y+y)$p$x-1

그러나 컴파일러가 이미 그렇게 할 수 있으므로 -O컴파일러 플래그로 설정 하면됩니다! 공통 하위 표현식을 수동으로 제거하기 위해 사이트 당 몇 개의 추가 문자를 소비하는 대신 전체 프로그램에서 총 1 문자 또는 2 문자에 대해 기본 최적화를 수행하도록 컴파일러에 지시하십시오.


@ETHproductions 예, 죄송합니다.
John Dvorak

첫 번째 예제가 아니어야합니까 p(x-1)*2?
Cyoce

5

다소 명백하지만 ...

연산자 반환 값 사용

대입 연산자는 값을 반환합니다.

예를 들어, x에 y를 더한 다음 x가 다른 것보다 큰지 확인하려면 할 수 있습니다

if(25<x+=y)

대신에

x+=y;if(x>25)

또는 트리밍 후 문자열의 길이를 찾고 싶을 수도 있습니다.

strlen(s=trim(s))

오히려

s=trim(s);strlen(s)

통화 에서 어떤 언어로 과제를 할 수 있습니까? 아니면 키워드 arg입니까?
cat

2
할당은 적어도 C, C ++, C # 및 Java에서 표현식 (할당 된 변수의 새로운 값을 표현식 값으로 사용)이라고 생각합니다. a = (b=c)+1;설정 bc설정 한 후,과 ab+1.
Lynn

@Lynn 사용해보십시오 a=1+b=c. 그리고 목록에 PHP와 JavaScript를 추가 할 수 있습니다.
Titus

2
루비가 가장 최선을 다합니다. 그것은 =연산자가 왼쪽보다 오른쪽보다 우선 순위가 높으므로 1+x=2유효하며 다음과 같이 평가됩니다3
Cyoce

@Cyoce는 과제가 표현 인 모든 언어에서 그렇게됩니다.
Titus

5

언어 버전 / 컴파일러 / 환경 문제 / 새로운 기능 활용

이것은 특히 유용 하지만 다른 문제에도 적용될 수 있습니다. 때로는 컴파일러 버그로 인해 1 바이트가 떨어지거나 구현 버그로 인해 몇 개의 문자를 저장하거나 실제로 최첨단 기능으로 점수를 향상시킬 수 있습니다.


4

가능하면 And / Or을 사용하여 확인한 경우 다중 / 중첩을 결합하십시오.

즉 :

if (a && (b || c)) {

}

대신에:

if (a) {
    if (b) {
        //Do Stuff
    } elseif (c) {
        //Do same stuff
    }
}

5
또한 &더 많은 문자를 제거 하려면 비트 조건 ( ,`|)을 사용하십시오.
FUZxxl

2
경우에 따라 1 문자 &&&제거하는 대신 비트 단위 를 사용하더라도 연산자 우선 순위를 엉망으로 만들고 괄호를 넣어야 작동합니다.
DollarAkshay

4

변수를 초기화하는 더 좋은 방법을 찾으십시오

다른 답변은 이미 이것을 언급하는 것에 가까워졌지만 많은 (엄격한 유형의) 언어에서 x빈 문자열 로 초기화하는 것이 더 짧습니다 .

x:=""

또는 x빈 룬 (char)으로 :

x:=''

...보다

var x string

var x rune

기존 값을 사용하는 것이 분명히 바람직하지만 쉽지는 않습니다.

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