Conseils pour jouer au golf en D2


10

Quels conseils généraux avez-vous pour jouer au golf en D ? Je recherche des idées qui peuvent être appliquées aux problèmes de golf de code en général qui sont au moins quelque peu spécifiques à D (par exemple, "supprimer les commentaires" n'est pas une réponse). Veuillez poster un pourboire par réponse.

Réponses:


1

Regardez, pas de parens!

Les fonctions et les fonctions de modèle de D peuvent être appelées comme valeurs, méthodes (n'aidera pas) et propriétés.

Je ne peux pas croire que personne n'ait encore dit cela. Je vais lister ceux qui économisent des octets:

  • fun()et fun!()()raccourcir à fun(en supposant qu'il n'y a pas de variable fun).
  • fun(par)se raccourcit en par.fun(en supposant qu'il parn'a pas de propriété / méthode fun, ainsi que de parne pas être une expression comme 5+2).
  • fun!(T)() raccourcit à fun!T
  • fun!(T)(par)raccourci à par.fun!T(en supposant qu'il parn'y a pas de propriété / méthode fun)

Et avec des objets:

  • new cls()raccourcit à new cls(Plus de JavaScript pour tout le monde?)
  • obj.fun()et obj.fun!()()raccourcir àobj.fun
  • obj.fun!(T)() raccourcit à obj.fun!T

Une dernière chose, utilisez les anciennes versions . Il vous permet d'utiliser des fonctionnalités obsolètes qui raccourcissent votre code. Cela dit, le meilleur conseil: D n'est pas bon pour le golf de code. C'est un super langage, mais pas pour le golf de code.


J'accepte pour l'instant :)
cat

Ouais, bon de savoir qu'il y a encore des fans de D ici.
Zacharý

1

D est JavaScript.


Évidemment pas. Mais, lorsqu'il s'agit de float, doubleet real, nanest une valeur qui doit être gérée, et, comme spécifié par IEEE 754, NaN ne se compare pas à lui-même.

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

Sens,

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

est bien plus court que

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

De toute évidence, toujours utiliser math.isNaNpour vrai code. ;)


0

D a une inférence de type et un automot clé. Si l'objet ne l'est pas int, alors il autoest probablement plus court.


Fonctionne-t-il autolors de la création d'un tableau associatif avec la KeyType[ValueType]syntaxe?
Alex A.

@AlexA. auto asd = ["a":1, "b": 2];fonctionne, mais puisque KeyType[ValueType]cela remplacerait le automot - clé, je ne sais pas si cela fonctionnera toujours avec des types pour lesquels des littéraux ne peuvent pas être construits
cat

@AlexA. auto arr = ["a": true, "b": 6];fonctionne, les clés et les valeurs doivent être de types compatibles
cat

0

D est excellent pour le chaînage de méthodes, mais:

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

est le même que

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

et généralement celle non enchaînée est plus courte, ce que je viens de réaliser, ce qui me permet de raccourcir ma réponse à Manage Trash So : D


Ce sont ces points
CalculatorFeline

0

Comme C / C ++, mainpeut être intou void, mais void main(){}sera toujours plus court que int main(){return my_func_returning_int;}.


Si la question demandait de sortir un entier ne serait pas int main(){return output}plus court?
andlrc

@ dev-null si la question demande un programme complet écrivant un entier dans stdout, alors import std.stdio;void main(){write(7);}ce qui est nécessaire. Je doute qu'une question obligerait le programme à renvoyer un numéro car de nombreuses langues ne peuvent pas définir de codes de retour
cat

@ dev-null cependant, oui, dans ce cas, il ne devrait pas être écrit sur stdout mais retourné, il serait plus court
cat

2
Habituellement, vous êtes autorisé à renvoyer / imprimer le moyen le plus pratique pour votre langue. Mais je suppose que D ne prend en charge que les codes de sortie de 0 à 255?
andlrc

@ dev-null en fait, POSIX ne prend en charge que les codes de sortie jusqu'à 255. Je ne connais pas Windows, mais sur Unix / Linux un code de sortie sur 255 s'enroule, à cause du débordement.
chat

0

D, en tant que langage de programmation de systèmes multiparadigm (Object Functional), semble embrasser TIMTOWTDI, ou il y a plus d'une façon de le faire.

Exemple concret, écrivant l'argv du programme:

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

Notez que la boucle for de style C nécessite {}comme bloc vide et n'acceptera pas de point-virgule ou rien comme instruction vide, dans ce cas . Habituellement, ou ;non.


Pouvez-vous utiliser char*à la place de stringpour enregistrer un octet?
Alex A.

@AlexA. function D main parameters must be main() or main(string[] args)de plus, charest littéralement un caractère, char*est un pointeur vers littéralement un caractère et char[]est un tableau de littéraux de caractères (les chaînes sont différentes). D! = C || C ++
chat

1
OCI. Jamais utilisé D, juste deviner.
Alex A.

0

D a quelques types d'expressions lambda de style C #, qui peuvent être attribuées et autonomes:

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

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

Cependant, contrairement à C #, les types de signature sont toujours nécessaires car D n'a pas d'inférence de type au niveau Haskell.

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


Modèles de fonction pour jouer aux types? T f(T)(T a,T b){return a + b}devrait conclure T comme int dansf(5);
s fede.

@fedes. Salut l'ami! Oui, vous avez exactement raison (mais je pense / j'espère que les lambdas "non typés" seront plus courts que les expressions de fonction typées).
chat

Ah, bien sûr! Quand je décide de jeter un nouveau regard sur D, qui trouve-je? : DI déclare objectivement que vous avez bon goût sur les langues
fede s.

@fedes. Oh, pourquoi merci! : P cela implique que vous le fassiez aussi (mais je n'ai pas passé assez de temps devant Smalltalk, pourtant quand même :))
chat

0

Appel d'une fonction sur un objet sans autre argument

reverse(x);

peut presque toujours être raccourci

x.reverse;

pour raser un octet ou plus.

En effet, le .fait du LHS un premier argument implicite, et le modèle nous permet de choisir la bonne fonction pour les arguments.


Les points sont bons? C'est déroutant ...
CalculatorFeline

@CatsAreFluffy lorsqu'il n'y a pas d'arguments. Quand il y a un autre argument, le x.reverse(y, z)est plus long à cause du point
cat

1
x.reverse(y,z)et reverse(x,y,z)ont le même nombre d'octets.
Zacharý

@ZacharyT Euh, ouais ...
chat

Étiez-vous en train x.reverse(y, z)de comparer x.reverse?
Zacharý

0

Si la question nécessite un programme complet, la moduledéclaration est étonnamment inutile.

* toux * Java, n'importe qui? * se racle la gorge * En fait , le modulesystème de D est plus ancien que celui de Java.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.