Consejos para jugar golf en D2

10

¿Qué consejos generales tienes para jugar al golf en D ? Estoy buscando ideas que se puedan aplicar a los problemas de golf de código en general que sean al menos algo específicos para D (por ejemplo, "eliminar comentarios" no es una respuesta). Por favor, publique un consejo por respuesta.

gato
fuente

Respuestas:

1

Mira, no parens!

Las funciones de D y funciones de plantilla se pueden llamar como valores, métodos (no ayudarán) y propiedades.

No puedo creer que nadie haya dicho esto todavía. Voy a enumerar los que guardan bytes:

  • fun()y fun!()()acortar a fun(suponiendo que no hay variable fun).
  • fun(par)se acorta a par.fun(suponiendo que parno tiene propiedad / método fun, además de parno ser una expresión como 5+2).
  • fun!(T)() acorta a fun!T
  • fun!(T)(par)se acorta a par.fun!T(suponiendo que parno tiene propiedad / método fun)

Y con objetos:

  • new cls()acorta a new cls(¿Más JavaScript a alguien?)
  • obj.fun()y obj.fun!()()acortar aobj.fun
  • obj.fun!(T)() acorta a obj.fun!T

Una última cosa, usa versiones antiguas . Le permite usar funciones obsoletas que acortan su código. Dicho esto, el mejor consejo: D no es bueno para el golf de código. Es un gran idioma, pero no para el golf de código.

Zacharý
fuente
Aceptando por ahora :)
gato
Sí, es bueno saber que todavía hay fanáticos de D aquí.
Zacharý
1

D es JavaScript.


Obviamente no. Pero, cuando se trata de float, doubley real, nanes un valor que debe manejarse, y, según lo especificado por IEEE 754, NaN no se compara igual a sí mismo.

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

Sentido,

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

es mucho más corto que

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

Obviamente, use siempre math.isNaNpara código real . ;)

gato
fuente
0

D tiene inferencia de tipos y una autopalabra clave. Si el objeto no es int, entonces autoprobablemente sea más corto.

gato
fuente
¿ autoFunciona al construir una matriz asociativa con la KeyType[ValueType]sintaxis?
Alex A.
@AlexA. auto asd = ["a":1, "b": 2];funciona, pero como KeyType[ValueType]iría en lugar de la autopalabra clave, no sé si eso siempre funcionará con tipos para los que no se pueden construir literales
cat
@AlexA. auto arr = ["a": true, "b": 6];funciona, las claves y los valores deben ser de tipos compatibles
cat
0

D es excelente en el método de encadenamiento, pero:

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

es lo mismo que

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

y, por lo general, el no encadenado es más corto, lo que acabo de dar cuenta, lo que me permite acortar mi respuesta a Administrar Papelera Entonces : D

gato
fuente
Son esos puntos
CalculatorFeline
0

Al igual que C / C ++, mainpuede ser into void, pero void main(){}siempre será más corto que int main(){return my_func_returning_int;}.

gato
fuente
Si la pregunta pedir que salga un número entero, ¿no int main(){return output}sería más corta?
andlrc
@ dev-null si la pregunta solicita un programa completo escribiendo un número entero para stdout, entonces import std.stdio;void main(){write(7);}es lo que se necesita. Dudo que una pregunta obligue al programa a devolver un número porque muchos idiomas no pueden establecer códigos de retorno
cat
@ dev-nula en cambio, sí, en ese caso, que debería no ser escrito en la salida estándar, pero regresó, sería más corto
gato
2
Por lo general, puede regresar / enviar la forma más conveniente para su idioma. ¿Pero supongo que D solo admite códigos de salida de 0-255?
andlrc
@ dev-null en realidad, POSIX solo admite códigos de salida de hasta 255. No sé acerca de Windows, pero en Unix / Linux un código de salida de más de 255 se envuelve, debido al desbordamiento.
gato
0

D, como lenguaje de programación de sistemas multiparadigm (Object Functional), parece adoptar TIMTOWTDI, o hay más de una forma de hacerlo.

Caso en cuestión, escribiendo el argumento del 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);
}

Tenga en cuenta que el estilo for-loop de C requiere {}como bloque vacío y no aceptará un punto y coma o nada como una declaración en blanco, en este caso . Por lo general, o ;son no-ops.

gato
fuente
¿Se puede usar char*en lugar de stringguardar un byte?
Alex A.
@AlexA. function D main parameters must be main() or main(string[] args)además, chares literalmente un carácter, char*es un puntero a literalmente un carácter y char[]es una matriz de literales de caracteres (las cadenas son diferentes). D! = C || C ++
gato
1
OIC Nunca usé D, solo adivinando.
Alex A.
0

D tiene algunos tipos de expresiones lambda de estilo C #, que pueden asignarse y ser independientes:

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

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

Sin embargo, a diferencia de C #, los tipos de firma todavía son necesarios porque D no tiene inferencia de tipo de nivel Haskell.

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

gato
fuente
Plantillas de funciones para jugar al golf los tipos? T f(T)(T a,T b){return a + b}debe inferir T como int inf(5);
fede s.
@fedes. ¡Hola amigo! Sí, tiene toda la razón (pero creo / espero que las lambdas "sin tipo" sean más cortas que las expresiones de funciones escritas).
gato
Ah, ofc! Cuando decido echarle otro vistazo a D, ¿a quién encuentro? : DI declaro objetivamente que tienes buen gusto en idiomas
fede s.
@fedes. Aw, porque gracias! : P eso implica que tú también (pero no he pasado suficiente tiempo frente a Smalltalk, de todos modos :))
gato
0

Llamar a una función en un objeto sin otros argumentos

reverse(x);

casi siempre se puede acortar a

x.reverse;

afeitarse un byte o más.

Esto se debe a que .hace que el LHS sea un primer argumento implícito, y la creación de plantillas nos permite elegir la función correcta para los argumentos.

gato
fuente
Los puntos son buenos? Esto es confuso ...
CalculatorFeline
@CatsAreFluffy cuando no hay args. Cuando hay otro argumento, el x.reverse(y, z)es más largo debido al punto
gato
1
x.reverse(y,z)y reverse(x,y,z)tienen el mismo número de bytes.
Zacharý
@ZacharyT Uh, sí ...
gato
¿Estaba comparando x.reverse(y, z)a x.reverse?
Zacharý
0

Si la pregunta requiere un programa completo, la moduledeclaración es sorprendentemente innecesaria.

* tos * Java, alguien? * se aclara la garganta * En realidad , el modulesistema de D es más antiguo que el de Java.

gato
fuente