D2에서의 골프 팁


10

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

답변:


1

이봐 요.

D의 함수와 템플릿 함수는 값, 메소드 (도움이되지 않음) 및 속성으로 불릴 수 있습니다.

아직 아무도이 말을 믿지 못했습니다. 바이트를 저장하는 것들을 나열하겠습니다 :

  • fun()fun!()()로 잘라내 fun(단 변수가없는 가정 fun).
  • fun(par)로 단축됩니다 par.fun( 과 같은 표현이 아니라 par속성 / 방법이 없다고 가정 ).funpar5+2
  • fun!(T)() 단축하다 fun!T
  • fun!(T)(par)단축 par.fun!T( par재산 / 방법이 없다고 가정 fun)

그리고 객체로 :

  • new cls()로 짧아 new cls(더 많은 자바 스크립트 누구?)
  • obj.fun()그리고 obj.fun!()()단축obj.fun
  • obj.fun!(T)() 단축하다 obj.fun!T

마지막으로 이전 버전을 사용하십시오 . 더 이상 사용되지 않는 기능을 사용하여 코드를 단축 할 수 있습니다. 최고의 조언 : D는 코드 골프에 좋지 않습니다. 코드 골프가 아닌 훌륭한 언어입니다.


지금 수락 :)
고양이

그래, 여기 D 팬이 아직 있다는 것을 알게되어 기쁘다.
Zacharý

1

D는 JavaScript입니다.


당연히 아니. 그러나, 처리 할 때 float, double그리고 real, nanIEEE 754에 지정된대로 처리되어야하고, 값은 NaN의 자신과 동등 비교하지 않는 것입니다.

writeln(double.nan == double.nan); // false

의미,

writeln(value!=value); // only true for nan

보다 짧다

import std.math;
writeln(isNaN(value));

물론, 항상 사용 math.isNaN에 대한 실제 코드입니다. ;)


0

D에는 형식 유추와 auto키워드가 있습니다. 객체가 아닌 경우 int, 다음 auto아마 짧다.


구문을 auto사용하여 연관 배열을 작성할 때 작동 합니까 KeyType[ValueType]?
Alex A.

@AlexA. auto asd = ["a":1, "b": 2];이후 작품,하지만 KeyType[ValueType]의 장소에 갈 것 auto키워드가 항상 리터럴 구축 할 수있는 유형의 작동하는지, 나도 몰라
고양이

@AlexA. auto arr = ["a": true, "b": 6];작동하려면 키와 값이 호환되는 유형 이어야합니다.
cat

0

D는 메소드 체인에 능숙하지만 다음과 같습니다.

str.toLower.strip().split("").sort();

와 같다

sort(split(strip(str.toLower),""));

일반적으로 체인이없는 것은 짧아서 방금 깨달았으므로 휴지통 관리에 대한 답변을 짧게 할 수 있습니다 . : D


그것은 그 점이야
CalculatorFeline

0

C / C ++과 마찬가지로, main수 있습니다 int또는 void, 그러나 void main(){}항상보다 짧은 것입니다 int main(){return my_func_returning_int;}.


질문에 정수를 출력하도록 요청하면 int main(){return output}더 짧지 않습니까?
andlrc

질문이 stdout에 정수를 쓰는 전체 프로그램을 요구하면 @ dev-null import std.stdio;void main(){write(7);}이 필요합니다. 많은 언어가 리턴 코드를 설정할 수 없기 때문에 프로그램 이 숫자를 리턴 하도록하는 질문이 의심됩니다.
cat

@ dev에 null이하지만, 그래,이 것이 그 경우에 하지 표준 출력에 기록하지만, 반환, 그것은 짧은 것
고양이

2
보통 당신은 당신의 언어에 가장 편리한 방법으로 반환 / 출력 할 수 있습니다. 그러나 D는 0-255의 종료 코드 만 지원한다고 생각합니까?
andlrc

@ dev-null은 실제로 POSIX 는 최대 255 개의 종료 코드 만 지원합니다. Windows에 대해서는 잘 모르지만 Unix / Linux에서는 오버플로로 인해 255 개 이상의 종료 코드가 줄어 듭니다.
고양이

0

D는 다중 패러다임 (Object Functional) 시스템 프로그래밍 언어로서 TIMTOWTDI를 수용하는 것으로 보이거나 그 이상의 방법이 있습니다.

적절한 경우, 프로그램의 argv를 작성하십시오.

import std.stdio, std.array, std.algorithm;

void main(string[] args) {
    for(int i=0;i<args.length;writeln(args[i++])){};

    foreach(a;args)writeln(a);

    each!writeln(args);
}

C 스타일 for-loop {}는 빈 블록으로 필요 하며 세미콜론이나 공백 문으로 아무것도 허용하지 않습니다 ( 이 경우) . 일반적으로, 또는 ;운영 체제가 아닙니다.


바이트를 저장하는 char*대신 사용할 수 있습니까 string?
Alex A.

@AlexA. function D main parameters must be main() or main(string[] args)또한 char문자 그대로 한 문자이고 문자 그대로 한 문자에 char*대한 포인터 char[]이며 문자 리터럴의 배열입니다 (문자열이 다름). D! = C || C ++
고양이

1
OIC. 추측하지 않고 D를 사용하지 마십시오.
Alex A.

0

D에는 몇 가지 유형의 C # 스타일 람다식이 있으며이 식은 단독으로 할당 할 수 있습니다.

(int a,int b)=>a*b;

auto a=(int a,int b)=>a*b;

그러나 C #과 달리 D에는 Haskell 수준 형식 유추가 없으므로 서명 형식이 여전히 필요합니다.

https://dlang.org/spec/expression.html#Lambda


골프를 치는 기능 템플릿? T f(T)(T a,T b){return a + b}f(5);
fede

@ 페더스. 안녕 친구! 그렇습니다. 정확합니다 (그러나 "유형화되지 않은"람다는 유형화 된 함수 표현식보다 짧을 것이라고 생각합니다.)
고양이

아, ofc! D를 다시 한번 살펴보기로했을 때 누구를 찾습니까? : DI는 객관적으로 당신이 언어로 좋은 맛이 선언
fede들.

@ 페더스. 왜 고마워! : P도 당신을 의미합니다 (그러나 스몰 토크 앞에서 충분한 시간을 보내지 않았지만 어쨌든 :))
cat

0

다른 인수없이 객체에서 함수 호출

reverse(x);

거의 항상 단축 될 수 있습니다

x.reverse;

바이트 이상 면도

이는 .LHS를 암시적인 첫 번째 인수로 만들고 템플릿을 사용하면 인수에 적합한 기능을 선택할 수 있기 때문 입니다.


점이 좋다? 이것은 혼란 스럽습니다 ...
CalculatorFeline

인수가없는 경우 @CatsAreFluffy 또 다른 논쟁이있을 때 x.reverse(y, z), 점 때문에 더 길다
cat

1
x.reverse(y,z)reverse(x,y,z)동일한 바이트 수있다.
Zacharý

@ZacharyT 어, 그래 ...
고양이

당신과 비교 x.reverse(y, z)하고 있었습니까 x.reverse?
Zacharý

0

질문에 전체 프로그램이 필요한 경우, module선언은 놀랍게도 불필요합니다.

* 기침 * 자바, 누구? * 목구멍을 깨끗이한다 * 사실 , D의 module시스템은 Java보다 오래되었다.

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