Suggerimenti per giocare a golf in D2


10

Quali consigli generali hai per giocare a golf in D ? Sto cercando idee che possano essere applicate ai problemi del codice golf in generale che siano almeno in qualche modo specifiche per D (es. "Rimuovere i commenti" non è una risposta). Si prega di inviare un suggerimento per risposta.

Risposte:


1

Guarda, niente genitori!

Le funzioni di D e le funzioni del modello possono essere chiamate come valori, metodi (non aiuta) e proprietà.

Non posso credere che nessuno l'abbia ancora detto. Elencherò quelli che salvano i byte:

  • fun()e fun!()()accorciare fun(supponendo che non vi siano variabili fun).
  • fun(par)abbreviato in par.fun(supponendo parnon abbia proprietà / metodo fun, oltre a parnon essere un'espressione simile 5+2).
  • fun!(T)() accorcia a fun!T
  • fun!(T)(par)abbreviato in par.fun!T(supponendo che parnon abbia proprietà / metodo fun)

E con oggetti:

  • new cls()abbreviato in new cls(Più JavaScript qualcuno?)
  • obj.fun()e obj.fun!()()accorciare aobj.fun
  • obj.fun!(T)() accorcia a obj.fun!T

Un'ultima cosa, usa le vecchie versioni . Ti consente di utilizzare funzionalità obsolete che riducono il codice. Detto questo, miglior consiglio: D non è buono per il code-golf. È un linguaggio eccezionale, non solo per il code-golf.


Accettando per ora :)
cat

Sì, bello sapere che ci sono ancora fan di D qui.
Zacharý,

1

D è JavaScript.


Ovviamente no. Ma, quando si ha a che fare con float, doublee real, nanè un valore che deve essere gestito e, come specificato da IEEE 754, NaN non è paragonabile a se stesso.

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

Senso,

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

è molto più breve di

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

Ovviamente, usa sempre math.isNaNper codice reale . ;)


0

D ha l'inferenza del tipo e una autoparola chiave. Se l'oggetto non lo è int, autoè probabilmente più breve.


Funziona autoquando si costruisce un array associativo con la KeyType[ValueType]sintassi?
Alex A.

@AlexA. auto asd = ["a":1, "b": 2];funziona, ma dato KeyType[ValueType]che andrebbe al posto della autoparola chiave, non so se funzionerà sempre con tipi per i quali non è possibile costruire valori letterali
cat

@AlexA. auto arr = ["a": true, "b": 6];funziona, le chiavi e i valori devono essere di tipo compatibile
cat,

0

D è eccezionale nel concatenare il metodo, ma:

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

equivale a

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

e di solito quello non incatenato è più corto, che ho appena realizzato, il che mi consente di abbreviare la mia risposta a Manage Trash So : D


Sono quei punti
CalculatorFeline,

0

Come C / C ++, mainpuò essere into void, ma void main(){}sarà sempre più breve di int main(){return my_func_returning_int;}.


Se la domanda chieda di produrre un numero intero non int main(){return output}sarebbe più breve?
Andlrc,

@ dev-null se la domanda richiede un programma completo che scrive un numero intero su stdout, allora import std.stdio;void main(){write(7);}è necessario. Dubito che una domanda imponga al programma di restituire un numero perché molte lingue non possono impostare i codici di ritorno
cat

@ dev-null però, sì, in quel caso che dovrebbe non essere scritto su stdout, ma è tornato, sarebbe stato più breve
cat

2
Di solito ti è permesso di restituire / produrre il modo più conveniente per la tua lingua. Ma suppongo che D supporti solo i codici di uscita da 0 a 255?
Andlrc,

@ dev-null in realtà, POSIX supporta solo i codici di uscita fino a 255. Non conosco Windows, ma su Unix / Linux un codice di uscita superiore a 255 si avvolge, a causa dell'overflow.
gatto,

0

D, come linguaggio di programmazione di sistemi multiparadigm (Object Functional), sembra abbracciare TIMTOWTDI, oppure esiste più di un modo per farlo.

Caso in questione, scrivendo l'argv del programma:

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

Nota il ciclo for-style in stile C richiede {}come blocco vuoto e non accetterà un punto e virgola o nulla come un'istruzione vuota, in questo caso . Di solito, o ;sono vietati.


Puoi usare char*al posto di stringper salvare un byte?
Alex A.

@AlexA. function D main parameters must be main() or main(string[] args)inoltre, charè letteralmente un carattere, char*è un puntatore a letteralmente un carattere ed char[]è un array di caratteri letterali (le stringhe sono diverse). D! = C || C ++
gatto,

1
OIC. Non ho mai usato D, solo supponendo.
Alex A.

0

D ha alcuni tipi di espressioni lambda in stile C #, che possono essere assegnate e stand-alone:

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

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

Tuttavia, a differenza di C #, i tipi di firma sono ancora necessari perché D non ha inferenze di tipo a livello di Haskell.

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


Modelli di funzioni per giocare a golf con i tipi? T f(T)(T a,T b){return a + b}dovrebbe dedurre T come int inf(5);
fede s.

@fedes. Ciao amico! Sì, hai esattamente ragione (ma penso / spero che lambda "non tipizzati" saranno più brevi delle espressioni di funzione digitate).
cat

Ah, spesso! Quando decido di dare un'altra occhiata a D, chi trovo? : DI dichiari obiettivamente di avere un buon gusto per le lingue
fede s.

@fedes. Aw, perché grazie! : P questo implica che lo fai anche tu (ma non ho trascorso abbastanza tempo davanti a Smalltalk, eppure comunque :))
cat

0

Chiamare una funzione su un oggetto senza altri argomenti

reverse(x);

può quasi sempre essere accorciato

x.reverse;

per radere un byte o più.

Questo perché .rende l'LHS un primo argomento implicito e il modello ci consente di scegliere la funzione giusta per gli arg.


I punti sono buoni? Questo è confuso ...
CalculatorFeline

@CatsAreFluffy quando non ci sono argomenti. Quando c'è un altro argomento, x.reverse(y, z)è più lungo a causa del punto
cat

1
x.reverse(y,z)e reverse(x,y,z)hanno lo stesso numero di byte.
Zacharý,

@ZacharyT Uh, yeah ...
cat

Stavi confrontando x.reverse(y, z)con x.reverse?
Zacharý,

0

Se la domanda richiede un programma completo, la moduledichiarazione è sorprendentemente superflua.

* tosse * Java, chiunque? * si schiarisce la gola * In realtà , il modulesistema di D è più vecchio di quello di Java.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.