D2'de golf için ipuçları


10

D' de golf oynamak için hangi genel ipuçlarınız var ? Ben genel olarak en azından biraz D (örneğin "yorumları kaldırmak" bir cevap değildir) özel olan golf sorunları kod uygulanabilir uygulanabilir fikirler arıyorum. Lütfen cevap başına bir ipucu gönderin.

Yanıtlar:


1

Bak, ebeveyn yok!

D işlevleri ve şablon işlevleri değerler, yöntemler (yardımcı olmaz) ve özellikler olarak adlandırılabilir.

Henüz kimsenin bunu söylemediğine inanamıyorum. Bayt kaydedenleri listeleyeceğim:

  • fun()ve fun!()()kısaltın fun(değişken olmadığı varsayılarak fun).
  • fun(par)için kısaltır par.fun(varsayarak parbir özellik / yöntemi vardır funsıra sıra, pargibi bir ekspresyon olmayan 5+2).
  • fun!(T)() kısaltmak fun!T
  • fun!(T)(par)kısaltır par.fun!T( parözelliği / yöntemi olmadığı varsayılarak fun)

Ve nesnelerle:

  • new cls()için kısaltır new cls(Daha JavaScript herkes?)
  • obj.fun()ve obj.fun!()()kısaltobj.fun
  • obj.fun!(T)() kısaltmak obj.fun!T

Son bir şey, eski sürümleri kullanın . Kodunuzu kısaltan kullanımdan kaldırılmış özellikleri kullanmanızı sağlar. Bununla birlikte, en iyi tavsiye: D kod golfü için iyi değildir. Harika bir dil, sadece kod golf için değil.


Şimdilik kabul
kedi

Evet, burada hala D hayranları olduğunu bilmek güzel.
Zacharý

1

D JavaScript'dir.


Belli ki değil. Ama uğraşırken float, doubleve real, nanIEEE 754 tarafından belirtildiği gibi, ele ve gereken bir değer, NaN kendisiyle eşit karşılaştırmak değildir olduğunu.

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

anlam,

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

çok daha kısa

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

Açıkçası, her zaman gerçek kod math.isNaNiçin kullanın . ;)


0

D, tür çıkarımına ve bir autoanahtar kelimeye sahiptir. Nesne değilse int, automuhtemelen daha kısadır.


Sözdizimi autoile ilişkilendirilebilir bir dizi oluştururken çalışır mı KeyType[ValueType]?
Alex A.

@AlexA. auto asd = ["a":1, "b": 2];çalışır, ancak anahtar kelimenin KeyType[ValueType]yerine gideceğinden, autobunun her zaman hazır bilgi yapıları oluşturulamayan türlerle çalışıp çalışmayacağını bilmiyorum
cat

@AlexA. auto arr = ["a": true, "b": 6];çalışır, anahtarlar ve değerler uyumlu türlerde olmalıdır
cat

0

D yöntem zincirleme konusunda harikadır, fakat:

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

aynıdır

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

ve genellikle sigara zincirleme bir ben sadece bana cevabım kısaltmak sağlayan, fark, hangi kısadır Yani çöp yönetme : D


Bu noktalar
CalculatorFeline

0

C / C ++ gibi, mainolabilir intya da void, ancak void main(){}her zaman daha kısa olacaktır int main(){return my_func_returning_int;}.


Soru bir tamsayı çıktısını sormak int main(){return output}daha kısa olmaz mı?
andlrc

@ dev-null Eğer soru stdout'a bir tamsayı yazmak için tam bir program isterse, o zaman import std.stdio;void main(){write(7);}gerekli olan şey budur. Pek çok dil dönüş kodları ayarlayamadığından , bir sorunun programın bir sayı döndürmesini zorunlu kılacağından şüpheliyim
cat

@ dev boş Ancak evet, gerektiği bu durumda değil Stdout'a yazılır ama iade edilmesi, bu kısa olacağını
Kedi

2
Genellikle dilinize en uygun şekilde geri dönmenize / çıkmanıza izin verilir. Ama sanırım D sadece 0-255 çıkış kodlarını destekliyor mu?
andlrc

@ dev-null aslında, POSIX yalnızca 255'e kadar çıkış kodlarını destekler. Windows hakkında bilmiyorum, ancak Unix / Linux'ta taşma nedeniyle 255'ten fazla bir çıkış kodu etrafına sarar.
kedi

0

D, bir çokaradigm (Nesne Fonksiyonel) sistem programlama dili olarak, TIMTOWTDI'yi kucaklıyor gibi görünüyor veya Bunu Yapmanın Birden Fazla Yolu Var.

Durumda, programın argv yazarak:

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 stili for-loop'un {}boş blok olarak gerekli olduğunu ve bu durumda noktalı virgül veya boş bir ifade olarak hiçbir şey kabul etmeyeceğini unutmayın . Genellikle veya ;hiç ops.


Kullanmak Can char*yerine stringbir byte kaydetmek için?
Alex A.

@AlexA. function D main parameters must be main() or main(string[] args)dahası, charkelimenin tam anlamıyla bir karakter, kelimenin tam anlamıyla bir karakterin char*işaretçisi ve char[]karakter değişmezleri dizisidir (dizeler farklıdır). D! = C || C ++
kedi

1
İKÖ. Asla D kullanmadım, sadece tahmin.
Alex A.

0

D, atanabilen ve tek başına kullanılabilen birkaç tür C # tarzı lambda ifadesine sahiptir:

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

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

Bununla birlikte, C # 'dan farklı olarak, D'nin Haskell düzeyinde tip çıkarımları olmadığı için imzanın türleri hala gereklidir.

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


Golf türleri için fonksiyon şablonları? T f(T)(T a,T b){return a + b}anlaması gerekir T olarak int olarakf(5);
fede s.

@fedes. Merhaba arkadaş! Evet, haklısın (ama sanırım / umarım "tipsiz" lambdalar, yazılan fonksiyon ifadelerinden daha kısa olacaktır).
kedi

Ofc! D'ye bir kez daha bakmaya karar verdiğimde, kimi bulabilirim? : DI objektif olarak diller üzerinde iyi bir tada sahip olduğunuzu beyan eder
fede s.

@fedes. Ah, neden teşekkür ederim! : Sizin de yaptığınız anlamına gelen P (ama yine de Smalltalk'ın önünde yeterince zaman geçmedim, yine de :))
kedi

0

Başka bir bağımsız değişkeni olmayan bir nesnenin işlevini çağırma

reverse(x);

neredeyse her zaman kısaltılabilir

x.reverse;

bir bayt veya daha fazlasını tıraş etmek için.

Çünkü .LHS örtük bir ilk argüman yapar ve şablonlama argümanlar için doğru işlevi seçmemize izin verir.


Noktalar iyi mi? Bu kafa karıştırıcı ...
CalculatorFeline

@CatsAreFluffy hiçbir argüman olmadığında. Başka bir argüman x.reverse(y, z)olduğunda, nokta nedeniyle daha uzun
kedi

1
x.reverse(y,z)ve reverse(x,y,z)aynı bayt sayısına sahip.
Zacharý

@ZacharyT Uh, evet ...
kedi

İle kıyaslandın x.reverse(y, z)x.reverse?
Zacharý

0

Soru tam bir program gerektiriyorsa, modulebeyan şaşırtıcı derecede gereksizdir.

* öksürük * Java, kimse? * boğazı temizler * Aslında , D'nin modulesistemi Java'nınkinden daha eskidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.