Поради щодо гольфу в D2


10

Які загальні поради щодо гольфу в D ? Я шукаю ідеї, які можна застосувати до коду проблем із гольфом взагалі, які принаймні дещо характерні для D (наприклад, "видалити коментарі" - це не відповідь). Будь ласка, опублікуйте одну пораду на відповідь.

Відповіді:


1

Дивись, жодних паронів!

Функції і функції шаблону D можна назвати як значення, методи (не допоможуть) та властивості.

Я не можу повірити, що ніхто ще цього не сказав. Я перерахую ті, що зберігають байти:

  • fun()і fun!()()скоротити до fun(якщо немає змінної fun).
  • fun(par)скорочується до par.fun(якщо припускати, що parне має властивості / методу fun, а також parне є виразом, як 5+2).
  • fun!(T)() скорочується до fun!T
  • fun!(T)(par)скорочується до par.fun!T(якщо parне має властивості / методу fun)

І з об’єктами:

  • new cls()скорочується до new cls(Ще комусь JavaScript?)
  • obj.fun()і obj.fun!()()скоротити доobj.fun
  • obj.fun!(T)() скорочується до obj.fun!T

Останнє, використовувати старі версії . Це дозволяє використовувати застарілі функції, які скорочують ваш код. Щоправда, найкраща порада: D не підходить для коду-гольфу. Це чудова мова, тільки не для коду-гольфу.


Приймаю зараз :)
кіт

Так, добре знати, що тут ще є шанувальники D.
Zacharý

1

D - JavaScript.


Очевидно, що ні. Але, коли мова йде float, doubleі real, nanце значення , яке повинно бути оброблено, і, як зазначено в стандарті IEEE 754, NaN не порівняти з рівним собі.

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

Значення,

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

шлях коротший, ніж

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

Очевидно, завжди використовуйте math.isNaNдля реального коду. ;)


0

D має тип висновку та autoключове слово. Якщо об’єкта немає int, то auto, ймовірно, коротше.


Чи autoпрацює при побудові асоціативного масиву з KeyType[ValueType]синтаксисом?
Алекс А.

@AlexA. auto asd = ["a":1, "b": 2];працює, але оскільки KeyType[ValueType]буде замість цього autoключового слова, я не знаю, чи завжди це буде працювати з типами, для яких не може бути побудовано літералів
кіт

@AlexA. auto arr = ["a": true, "b": 6];працює, ключі та значення повинні бути сумісних типів
кіт

0

D чудово підходить для ланцюжка методів, але:

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

те саме, що

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

і зазвичай це не ланцюжок коротший, що я щойно зрозумів, що дозволяє мені скоротити свою відповідь на " Керування сміттям" : D


Це ті крапки
CalculatorFeline

0

Як і C / C ++, вона mainможе бути intабо void, але void main(){}завжди буде коротшою int main(){return my_func_returning_int;}.


Якщо питання попросити вивести ціле число не int main(){return output}буде коротшим?
andlrc

@ dev-null, якщо питання запитує повну програму, яка пише ціле число для stdout, тоді import std.stdio;void main(){write(7);}це те, що потрібно. Я сумніваюся, що питання вимагатиме, щоб програма повертала номер, оскільки багато мов не можуть встановити коди повернення
кіт

@ dev-null, однак, так, у тому випадку, якщо його не слід писати в stdout, а повернути, це буде коротше
кіт

2
Зазвичай вам дозволяється повернути / вивести найзручніший спосіб для вашої мови. Але я думаю, D підтримує лише вихідні коди від 0-255?
andlrc

@ dev-null насправді POSIX підтримує лише коди виходу до 255. Я не знаю про Windows, але в Unix / Linux код виходу понад 255 обгортань через переповнення.
кіт

0

D, як мова програмування багатопарадигми (Object Functional) систем, схоже, охоплює TIMTOWTDI, або існує більше, ніж один спосіб зробити це.

Справа в суті, написання аргументу програми:

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

Зверніть увагу, що для-циклу {}в стилі C потрібен порожній блок і не прийматиме крапку з комою або нічого, як порожнє твердження, в цьому випадку . Зазвичай, або ;не є.


Чи можете ви використовувати char*замість, stringщоб зберегти байт?
Алекс А.

@AlexA. function D main parameters must be main() or main(string[] args)більше того, charце буквально один символ, char*є вказівником на буквально один символ і char[]є масивом символьних літералів (рядки різні). D! = C || C ++
кіт

1
OIC. Ніколи не використовував D, просто здогадувався.
Алекс А.

0

D має кілька типів лямбда-виразів C # -style, які можна призначати та самостійно:

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

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

Однак, на відміну від C #, типи підписів все ще потрібні, оскільки D не має рівня поширення типу Haskell.

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


Шаблони функцій для гольфу типів? T f(T)(T a,T b){return a + b}слід зробити висновок про T як int inf(5);
fede s.

@fedes. Привіт друже! Так, ви абсолютно правильні (але я думаю, що сподіваюсь, що "нетипізовані" лямбдати будуть коротшими, ніж введені вирази функцій).
кіт

Ах, оф! Коли я вирішую ще раз поглянути на D, кого я знайду? : DI об'єктивно заявляють, що ви маєте гарний смак щодо мов
fede s.

@fedes. О, чому тобі дякую! : P, що означає, що ти теж робиш (але я все ще не витратив достатньо часу перед Smalltalk, але все одно :))
кіт

0

Виклик функції на об'єкт без інших аргументів

reverse(x);

майже завжди можна скоротити до

x.reverse;

голити байт або більше.

Це тому, що .робить LHS неявний перший аргумент, і шаблонування дозволяє нам вибрати правильну функцію для аргументів.


Крапки гарні? Це заплутано ...
CalculatorFeline

@CatsAreFluffy, коли немає аргументів. Якщо є ще один аргумент, то x.reverse(y, z)довше через крапки
кішка

1
x.reverse(y,z)і reverse(x,y,z)мають однаковий підрахунок байт
Zacharý

@ZacharyT Так, так ...
кіт

Були чи ви по порівнянні x.reverse(y, z)з x.reverse?
Zacharý

0

Якщо питання вимагає повної програми, moduleдекларація напрочуд непотрібна.

* кашель * Java, хтось? * очищає горло * Насправдіmodule система D старша, ніж у Java.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.