Antworten:
Schau, keine Eltern!
Die Funktionen und Vorlagenfunktionen von D können als Werte, Methoden (hilft nicht) und Eigenschaften aufgerufen werden.
Ich kann nicht glauben, dass dies noch niemand gesagt hat. Ich werde diejenigen auflisten, die Bytes speichern:
fun()
und fun!()()
verkürzen auf fun
(vorausgesetzt, es gibt keine Variable fun
).fun(par)
verkürzt sich auf par.fun
(vorausgesetzt, es par
hat keine Eigenschaft / Methode fun
und ist kein par
Ausdruck wie 5+2
).fun!(T)()
verkürzt sich zu fun!T
fun!(T)(par)
verkürzt sich auf par.fun!T
(vorausgesetzt, es par
gibt keine Eigenschaft / Methode fun
)Und mit Gegenständen:
new cls()
verkürzt sich auf new cls
(Mehr JavaScript jemand?)obj.fun()
und obj.fun!()()
verkürzen aufobj.fun
obj.fun!(T)()
verkürzt sich zu obj.fun!T
Eine letzte Sache, verwenden Sie alte Versionen . Sie können veraltete Funktionen verwenden, die Ihren Code verkürzen. Der beste Rat: D ist nicht gut für Code-Golf. Es ist eine großartige Sprache, nur nicht für Code-Golf.
D ist JavaScript.
Offensichtlich nicht. Aber im Umgang mit float
, double
und real
, nan
ist ein Wert, der behandelt werden muss und wie angegeben von IEEE 754, NaN nicht mit sich selbst gleich vergleichen.
writeln(double.nan == double.nan); // false
Bedeutung,
writeln(value!=value); // only true for nan
ist viel kürzer als
import std.math;
writeln(isNaN(value));
Natürlich immer math.isNaN
für echten Code verwenden. ;)
D hat Typinferenz und ein auto
Schlüsselwort. Wenn das Objekt nicht ist int
, auto
ist es wahrscheinlich kürzer.
auto
beim Erstellen eines assoziativen Arrays mit der KeyType[ValueType]
Syntax?
auto asd = ["a":1, "b": 2];
funktioniert, aber da KeyType[ValueType]
anstelle des auto
Schlüsselworts verwendet werden würde, weiß ich nicht, ob dies immer mit Typen funktioniert, für die Literale nicht erstellt werden können
auto arr = ["a": true, "b": 6];
funktioniert, müssen die Schlüssel und Werte von kompatiblen Typen sein
D eignet sich hervorragend zum Verketten von Methoden, aber:
str.toLower.strip().split("").sort();
ist das gleiche wie
sort(split(strip(str.toLower),""));
und normalerweise ist die nicht verkettete kürzer, was ich gerade festgestellt habe, wodurch ich meine Antwort auf Manage Trash So : D verkürzen kann
Wie C / C ++ main
kann int
oder sein void
, wird aber void main(){}
immer kürzer sein als int main(){return my_func_returning_int;}
.
int main(){return output}
kürzer wäre?
import std.stdio;void main(){write(7);}
ist dies erforderlich. Ich bezweifle, dass eine Frage das Programm dazu zwingen würde, eine Nummer zurückzugeben, da viele Sprachen keine Rückkehrcodes festlegen können
D scheint als Programmiersprache für Multiparadigmensysteme (Object Functional) TIMTOWTDI zu umfassen, oder es gibt mehr als einen Weg, dies zu tun.
Beispiel: Schreiben Sie das Argument des Programms:
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);
}
Beachten Sie, dass die for-Schleife im C-Stil {}
als leerer Block erforderlich ist und in diesem Fall kein Semikolon oder nichts als leere Anweisung akzeptiert . Normalerweise oder
;
sind No-Ops.
char*
anstelle von string
ein Byte speichern?
function D main parameters must be main() or main(string[] args)
Darüber hinaus char
ist es buchstäblich ein Zeichen, char*
ist ein Zeiger auf buchstäblich ein Zeichen und char[]
ist ein Array von Zeichenliteralen (Zeichenfolgen sind unterschiedlich). D! = C || C ++
D hat einige Arten von Lambda-Ausdrücken im C # -Stil, die zugewiesen werden können und eigenständig sind:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
Im Gegensatz zu C # werden die Signaturtypen jedoch weiterhin benötigt, da D keine Typinferenz auf Haskell-Ebene hat.
T f(T)(T a,T b){return a + b}
sollte T als int inf(5);
Aufruf einer Funktion für ein Objekt ohne andere Argumente
reverse(x);
kann fast immer auf verkürzt werden
x.reverse;
ein Byte oder mehr rasieren.
Dies liegt daran, .
dass das LHS ein implizites erstes Argument ist und wir durch Vorlagen die richtige Funktion für die Argumente auswählen können.
x.reverse(y, z)
ist länger , weil die Punkt
x.reverse(y,z)
und reverse(x,y,z)
haben die gleiche Byteanzahl.
x.reverse(y, z)
zu x.reverse
?