Wskazówki do gry w golfa w D2


10

Jakie masz ogólne wskazówki na temat gry w golfa w D ? Szukam pomysłów, które można by zastosować do problemów z golfem w kodzie, które są przynajmniej nieco specyficzne dla D (np. „Usuń komentarze” nie jest odpowiedzią). Proszę zamieścić jedną wskazówkę na odpowiedź.

Odpowiedzi:


1

Spójrz, żadnych parens!

Funkcje D i funkcje szablonów można wywoływać jako wartości, metody (nie pomogą) i właściwości.

Nie mogę uwierzyć, że nikt jeszcze tego nie powiedział. Wymienię te, które oszczędzają bajty:

  • fun()i fun!()()skróć do fun(zakładając, że nie ma zmiennej fun).
  • fun(par)skraca się do par.fun(zakładając, że parnie ma właściwości / metody fun, a także parnie jest wyrażeniem podobnym do 5+2).
  • fun!(T)() skraca się do fun!T
  • fun!(T)(par)skraca się do par.fun!T(zakładając, że parnie ma właściwości / metody fun)

I z przedmiotami:

  • new cls()skraca się do new cls(Więcej osób w JavaScript?)
  • obj.fun()i obj.fun!()()skrócić doobj.fun
  • obj.fun!(T)() skraca się do obj.fun!T

I ostatnia rzecz, użyj starych wersji . Pozwala korzystać z przestarzałych funkcji, które skracają kod. To powiedziawszy, najlepsza rada: D nie nadaje się do golfa kodowego. To świetny język, nie tylko do gry w golfa.


Akceptacja na razie :)
kot

Tak, dobrze wiedzieć, że wciąż są tu fani D.
Zacharý

1

D to JavaScript.


Oczywiście, że nie. Ale kiedy masz do czynieniafloat , doublei real, nanjest wartością, z którą trzeba sobie i, jak określono w IEEE 754, NaN nie porównuje się z samym sobą.

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

Znaczenie,

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

jest o wiele krótszy niż

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

Oczywiście, zawsze używać math.isNaNdla prawdziwego kodu. ;)


0

D ma wnioskowanie typu i autosłowo kluczowe. Jeśli obiekt nie jest int, autoto prawdopodobnie jest krótszy.


Czy autodziała podczas budowania tablicy asocjacyjnej ze KeyType[ValueType]składnią?
Alex A.

@AlexA. auto asd = ["a":1, "b": 2];działa, ale ponieważ KeyType[ValueType]miałby miejsce zamiast autosłowa kluczowego, nie wiem, czy to zawsze będzie działać z typami, dla których literałów nie można zbudować
cat

@AlexA. auto arr = ["a": true, "b": 6];działa, klucze i wartości muszą być kompatybilnych typów
cat

0

D doskonale nadaje się do łączenia metod, ale:

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

jest taki sam jak

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

i zwykle ten niepowiązany z łańcuchem jest krótszy, co właśnie zdałem sobie sprawę, co pozwala mi skrócić moją odpowiedź na Manage Trash So : D


To te kropki
CalculatorFeline

0

Podobnie jak C / C ++, mainmoże być intlub void, ale void main(){}zawsze będzie krótszy niż int main(){return my_func_returning_int;}.


Czy pytanie, które należy int main(){return output}podać jako liczbę całkowitą, nie byłoby krótsze?
andlrc

@ dev-null, jeśli pytanie dotyczy pełnego programu zapisującego liczbę całkowitą na standardowe wyjście, to import std.stdio;void main(){write(7);}jest to, czego potrzeba. Wątpię, czy pytanie wymagałoby od programu zwrotu numeru, ponieważ wiele języków nie może ustawić kodów powrotu
kot

@ dev null jednak tak, że w tym przypadku powinna ona nie być napisany na standardowe wyjście, ale wrócił, to byłby krótszy
kot

2
Zwykle możesz zwrócić / wydrukować najwygodniejszy dla swojego języka sposób. Ale myślę, że D obsługuje tylko kody wyjścia z 0-255?
andlrc

@ dev-null faktycznie, POSIX obsługuje tylko kody wyjścia do 255. Nie wiem o Windowsie, ale w Unix / Linux kod wyjścia zawija ponad 255, z powodu przepełnienia.
kot

0

D, jako język programowania systemów wieloparadigmowych (Object Functional), wydaje się obejmować TIMTOWTDI, czyli istnieje więcej niż jeden sposób, aby to zrobić.

Przykładem jest napisanie argv programu:

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);
}

Zwróć uwagę, że pętla for-style w stylu C wymaga {}pustego bloku i w tym przypadku nie zaakceptuje średnika ani niczego jako pustej instrukcji . Zwykle lub ;nie ma operacji.


Czy możesz użyć char*zamiast stringzapisać bajt?
Alex A.

@AlexA. function D main parameters must be main() or main(string[] args)ponadto charjest dosłownie jednym znakiem, char*jest wskaźnikiem dosłownie jednego znaku i char[]jest tablicą literałów znakowych (łańcuchy są różne). D! = C || C ++
kot

1
OIC. Nigdy nie użyłem D, tylko zgaduję.
Alex A.

0

D ma kilka typów wyrażeń lambda w stylu C #, które można przypisać i autonomicznie:

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

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

Jednak w przeciwieństwie do C #, typy podpisu są nadal potrzebne, ponieważ D nie ma wnioskowania na poziomie Haskell.

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


Szablony funkcyjne do gry w golfa typów? T f(T)(T a,T b){return a + b}Należy wnioskować T jako int wf(5);
Fede s.

@fedes. Witaj przyjacielu! Tak, masz dokładnie rację (ale myślę / mam nadzieję, że "nietypowane" lambdy będą krótsze niż wyrażenia funkcyjne).
kot

Ach, ofc! Kiedy zdecyduję się rzucić jeszcze okiem na D, kogo znajdę? : DI obiektywnie deklaruje dobry gust językowy
fede s.

@fedes. Aw, dlaczego dziękuję! : P, co oznacza, że ​​ty też (ale i tak nie spędziłem wystarczająco dużo czasu przed Smalltalk, a mimo to :))
kot

0

Wywołanie funkcji na obiekcie bez innych argumentów

reverse(x);

prawie zawsze można je skrócić

x.reverse;

ogolić bajt lub więcej.

Wynika to z faktu, .że LHS jest domyślnym pierwszym argumentem, a szablony pozwalają nam wybrać odpowiednią funkcję dla argumentów.


Kropki są dobre? To jest mylące ...
CalculatorFeline

@CatsAreFluffy, gdy nie ma argumentów. Kiedy pojawia się kolejny argument, x.reverse(y, z)jest on dłuższy z powodu kropki
kot

1
x.reverse(y,z)i reverse(x,y,z)mają tę samą liczbę bajtów.
Zacharý

@ZacharyT Uh, yeah ...
cat

Porównywałeś x.reverse(y, z)się x.reverse?
Zacharý

0

Jeśli pytanie wymaga pełnego programu, moduledeklaracja jest zaskakująco niepotrzebna.

* kaszel * Java, ktoś? * odchrząkuje * W rzeczywistościmodule system D jest starszy niż Java.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.