Dicas para jogar golfe no D2


10

Que dicas gerais você tem para jogar golfe em D ? Estou procurando idéias que possam ser aplicadas para codificar problemas de golfe em geral que sejam pelo menos um pouco específicos para D (por exemplo, "remover comentários" não é uma resposta). Poste uma dica por resposta.

Respostas:


1

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!T
  • fun!(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.fun
  • obj.fun!(T)() encurta para obj.fun!T

Uma 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.


Aceitando por enquanto :)
cat

Sim, é bom saber que ainda existem fãs de D aqui.
Zacharý

1

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


0

D tem inferência de tipo e uma autopalavra - chave. Se o objeto não estiver int, autoprovavelmente é mais curto.


Funciona autoao criar uma matriz associativa com a KeyType[ValueType]sintaxe?
Alex A.

@AlexA. 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
cat

@AlexA. auto arr = ["a": true, "b": 6];funciona, as chaves e os valores devem ser de tipos compatíveis #
cat

0

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


É esses pontos
CalculatorFeline

0

Como C / C ++, mainpode ser intou void, mas void main(){}sempre será menor que int main(){return my_func_returning_int;}.


Se a pergunta pedir para produzir um número inteiro não int main(){return output}seria menor?
28716 Andlrc

@ dev-null se a pergunta pede um programa completo escrevendo um número inteiro para o stdout, então 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
gato

@ dev nulo no entanto, sim, nesse caso, que deveria não ser escritas para stdout, mas voltou, seria mais curto
gato

2
Geralmente você tem permissão para retornar / produzir a maneira mais conveniente para o seu idioma. Mas acho que D suporta apenas códigos de saída de 0 a 255?
28716 Andlrc

@ dev-null, na verdade, o POSIX suporta apenas códigos de saída até 255. Eu não sei sobre o Windows, mas no Unix / Linux, um código de saída com mais de 255 quebra, por causa do estouro.
gato

0

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.


Você pode usar char*no lugar de stringpara salvar um byte?
Alex A.

@AlexA. 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 ++
cat

11
OIC. Nunca usei D, apenas adivinhando.
Alex A.

0

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.

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


Modelos de funções para jogar golfe nos tipos? T f(T)(T a,T b){return a + b}deve inferir T como int emf(5);
s fede.

@fedes. Olá amiga! Sim, você está exatamente correto (mas acho / espero que lambdas "não digitadas" sejam menores que as expressões de função digitadas).
cat

Ah, claro! Quando decido dar mais uma olhada em D, quem encontro? : DI declarar objetivamente que você tem bom gosto em idiomas
fede s.

@fedes. Ah, porque obrigado! : P que implica que você também (mas não passei tempo suficiente na frente do Smalltalk, de qualquer maneira :)) #
cat

0

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.


Pontos são bons? Isso é confuso ...
CalculatorFeline #

@CatsAreFluffy quando não há argumentos. Quando há um outro argumento, o x.reverse(y, z)é mais por causa do dot
cat

11
x.reverse(y,z)e reverse(x,y,z)tem a mesma contagem de bytes.
Zacharý 8/11

@ZacharyT Uh, yeah ...
cat

Você estava comparando x.reverse(y, z)com x.reverse?
Zacharý 8/11

0

Se a pergunta exigir um programa completo, a moduledeclaração é surpreendentemente desnecessária.

* tosse * Java, alguém? * limpa a garganta * Na verdade , o modulesistema de D é mais antigo que o de Java.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.