Tipps zum Golfen in D2


10

Welche allgemeinen Tipps haben Sie zum Golfen in D ? Ich suche nach Ideen, die auf Code-Golf-Probleme im Allgemeinen angewendet werden können, die zumindest etwas spezifisch für D sind (z. B. "Kommentare entfernen" ist keine Antwort). Bitte posten Sie einen Tipp pro Antwort.

Antworten:


1

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 parhat keine Eigenschaft / Methode funund ist kein parAusdruck wie 5+2).
  • fun!(T)() verkürzt sich zu fun!T
  • fun!(T)(par)verkürzt sich auf par.fun!T(vorausgesetzt, es pargibt 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.


Akzeptieren für jetzt :)
Katze

Ja, gut zu wissen, dass es hier immer noch Fans von D gibt.
Zacharý

1

D ist JavaScript.


Offensichtlich nicht. Aber im Umgang mit float, doubleund real, nanist 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.isNaNfür echten Code verwenden. ;)


0

D hat Typinferenz und ein autoSchlüsselwort. Wenn das Objekt nicht ist int, autoist es wahrscheinlich kürzer.


Funktioniert es autobeim Erstellen eines assoziativen Arrays mit der KeyType[ValueType]Syntax?
Alex A.

@AlexA. auto asd = ["a":1, "b": 2];funktioniert, aber da KeyType[ValueType]anstelle des autoSchlüsselworts verwendet werden würde, weiß ich nicht, ob dies immer mit Typen funktioniert, für die Literale nicht erstellt werden können
Katze

@AlexA. auto arr = ["a": true, "b": 6];funktioniert, müssen die Schlüssel und Werte von kompatiblen Typen sein
Katze

0

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


Es sind diese Punkte
CalculatorFeline

0

Wie C / C ++ mainkann intoder sein void, wird aber void main(){}immer kürzer sein als int main(){return my_func_returning_int;}.


Wenn die Frage nach der Ausgabe einer Ganzzahl nicht int main(){return output}kürzer wäre?
andlrc

@ dev-null Wenn die Frage nach einem vollständigen Programm fragt, das eine Ganzzahl in stdout schreibt, 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
Katze

@ dev-null jedoch, ja, in diesem Fall, dass es nicht in stdout geschrieben, sondern zurückgegeben werden sollte, wäre es kürzer
Katze

2
Normalerweise dürfen Sie den für Ihre Sprache bequemsten Weg zurückgeben / ausgeben. Aber ich denke, D unterstützt nur Exit-Codes von 0-255?
andlrc

@ dev-null unterstützt POSIX eigentlich nur Exit-Codes bis zu 255. Ich weiß nichts über Windows, aber unter Unix / Linux wird ein Exit-Code über 255 wegen Überlaufs umbrochen.
Katze

0

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.


Können Sie char*anstelle von stringein Byte speichern?
Alex A.

@AlexA. function D main parameters must be main() or main(string[] args)Darüber hinaus charist 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 ++
Katze

1
OIC. Nie D benutzt, nur raten.
Alex A.

0

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.

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


Funktionsvorlagen zum Golfen der Typen? T f(T)(T a,T b){return a + b}sollte T als int inf(5);
fede s schließen.

@ Federn. Hallo Freund! Ja, Sie sind genau richtig (aber ich denke / hoffe, dass "untypisierte" Lambdas kürzer sind als typisierte Funktionsausdrücke).
Katze

Ah, ofc! Wen finde ich, wenn ich mich entscheide, noch einen Blick auf D zu werfen? : DI erklärt objektiv, dass Sie einen guten Sprachgeschmack haben
fede s.

@ Federn. Aw, warum danke! : P das bedeutet, dass Sie es auch tun (aber ich habe noch nicht genug Zeit vor Smalltalk verbracht :))
Katze

0

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.


Punkte sind gut? Das ist verwirrend ...
CalculatorFeline

@CatsAreFluffy, wenn es keine Argumente gibt. Wenn es ein weiteres Argument ist, das x.reverse(y, z)ist länger , weil die Punkt
Katze

1
x.reverse(y,z)und reverse(x,y,z)haben die gleiche Byteanzahl.
Zacharý

@ ZacharyT Äh, ja ...
Katze

Wurden zu vergleichen Sie x.reverse(y, z)zu x.reverse?
Zacharý

0

Wenn die Frage ein vollständiges Programm erfordert, ist die moduleErklärung überraschend unnötig.

* hust * Java, jemand? * räuspert sich * Eigentlich ist Ds moduleSystem älter als das von Java.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.