Respostas:
Olha, sem parênteses!
As funções e funções de modelo de D podem ser chamadas como valores, métodos (não ajudarão) e propriedades.
Não acredito que ninguém tenha dito isso ainda. Vou listar os que salvam bytes:
fun()e fun!()()encurte para fun(supondo que não haja variável fun).fun(par)encurta para par.fun(assumindo parque não tem propriedade / método fun, além de parnão ser uma expressão como 5+2).fun!(T)() encurta para fun!Tfun!(T)(par)reduz para par.fun!T(supondo parque não tenha propriedade / método fun)E com objetos:
new cls()reduz para new cls(Mais JavaScript alguém?)obj.fun()e obj.fun!()()encurtar paraobj.funobj.fun!(T)() encurta para obj.fun!TUma coisa final, use versões antigas . Ele permite que você use recursos obsoletos que diminuem o seu código. Dito isto, o melhor conselho: D não é bom para golfe de código. É uma ótima linguagem, apenas não para o código-golfe.
D é JavaScript.
Obviamente não. Mas, ao lidar com float, doublee real, nané um valor que deve ser tratado e, conforme especificado pela IEEE 754, o NaN não se compara igual a si mesmo.
writeln(double.nan == double.nan); // false
Significado,
writeln(value!=value); // only true for nan
é muito menor que
import std.math;
writeln(isNaN(value));
Obviamente, sempre use math.isNaNpara código real . ;)
D tem inferência de tipo e uma autopalavra - chave. Se o objeto não estiver int, autoprovavelmente é mais curto.
autoao criar uma matriz associativa com a KeyType[ValueType]sintaxe?
auto asd = ["a":1, "b": 2];obras, mas desde que KeyType[ValueType]iria no lugar da autopalavra-chave, eu não sei se isso vai sempre trabalhar com tipos para o qual literais não podem ser construídas
auto arr = ["a": true, "b": 6];funciona, as chaves e os valores devem ser de tipos compatíveis #
D é ótimo no encadeamento de métodos, mas:
str.toLower.strip().split("").sort();
é o mesmo que
sort(split(strip(str.toLower),""));
e geralmente o não-encadeado é mais curto, o que acabei de perceber, o que me permite encurtar minha resposta para Gerenciar lixo Então : D
Como C / C ++, mainpode ser intou void, mas void main(){}sempre será menor que int main(){return my_func_returning_int;}.
int main(){return output}seria menor?
import std.stdio;void main(){write(7);}é necessário. Duvido uma pergunta seria mandatar o programa retornar um número, porque muitas línguas não é possível definir códigos de retorno
D, como uma linguagem de programação de sistemas multiparadigmático (Object Functional), parece adotar o TIMTOWTDI ou existe mais de uma maneira de fazê-lo.
Caso em questão, escrevendo o argumento do programa:
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);
}
Observe que o loop for do estilo C requer {}como bloco vazio e não aceitará ponto-e-vírgula ou nada como uma declaração em branco, neste caso . Geralmente, ou ;não são ops.
char*no lugar de stringpara salvar um byte?
function D main parameters must be main() or main(string[] args)além disso, charé literalmente um caractere, char*é um ponteiro para literalmente um caractere e char[]é uma matriz de literais de caracteres (as strings são diferentes). D! = C || C ++
D tem alguns tipos de expressões lambda no estilo C #, que podem ser atribuídas e independentes:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
No entanto, diferentemente do C #, os tipos de assinatura ainda são necessários porque D não possui inferências de tipo no nível Haskell.
T f(T)(T a,T b){return a + b}deve inferir T como int emf(5);
Chamando uma função em um objeto sem outros argumentos
reverse(x);
quase sempre pode ser reduzido para
x.reverse;
raspar um byte ou mais.
Isso ocorre porque .torna o LHS um primeiro argumento implícito e a modelagem permite escolher a função correta para os argumentos.
x.reverse(y, z)é mais por causa do dot
x.reverse(y,z)e reverse(x,y,z)tem a mesma contagem de bytes.
x.reverse(y, z)com x.reverse?