Советы по игре в гольф в 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.
Захари

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ключевого слова было бы место , я не знаю, будет ли это всегда работать с типами, для которых не могут быть построены литералы
cat

@AlexA. auto arr = ["a": true, "b": 6];работает, ключи и значения должны быть совместимых типов
cat

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, если вопрос требует полной программы, записывающей целое число в стандартный вывод, тогда import std.stdio;void main(){write(7);}это то, что нужно. Я сомневаюсь, что вопрос заставит программу вернуть число, потому что многие языки не могут установить коды возврата
cat

@ dev-null, однако, да, в этом случае его не следует записывать на стандартный вывод, а возвращать, он будет короче
кошка

2
Обычно вам разрешено возвращать / выводить наиболее удобный для вас язык. Но я думаю, что D поддерживает только коды выхода от 0 до 255?
andlrc

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

0

D, как многопарадигмальный (объектно-функциональный) системный язык программирования, по-видимому, охватывает TIMTOWTDI, или существует более одного способа сделать это.

Например, написание программы argv:

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
ОИС. Никогда не использовал D, просто гадал.
Алекс А.

0

D имеет несколько типов лямбда-выражений в стиле C #, которые могут быть назначены и автономны:

(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 вf(5);
fede s.

@fedes. Привет! Да, вы абсолютно правы (но я думаю / надеюсь, что «нетипизированные» лямбды будут короче, чем выражения типизированных функций).
кот

Ах, конечно! Когда я решу еще раз взглянуть на D, кого я найду? : D Я объективно заявляю, что у вас хороший вкус к языкам
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)имеют одинаковое количество байтов.
Захари

@ZacharyT Э, да ...
кот

Вы сравнивали x.reverse(y, z)с x.reverse?
Захари

0

Если вопрос требует полной программы, moduleобъявление на удивление ненужно.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.