Haxe'de golf için ipuçları


12

Haxe'de golf yapmak için hangi genel ipuçlarınız var ? Ben kod-golf sorunları uygulanabilir ve aynı zamanda en azından biraz Haxe (örneğin "yorumları kaldırmak" bir cevap değildir) belirli fikirler arıyorum.

Lütfen cevap başına bir ipucu gönderin.

Haxe burada çevrimiçi olarak çalıştırılabilir !


Haxe'yi geçmişte biraz kullandım, ama golf oynamaya başladığımdan beri çok fazla kullanmadım. Golf için kullanmayı denemeliyim ...
ETHproductions

@ETHproductions Burada aynı. Bugün, iki kez golf oynadım ve eğlenceliydi. (Örneğin) liste anlayışları ve yineleyiciler ile bazı iyi golf yetenekleri vardır, bu yüzden kimse paylaşmak için ipuçları olup olmadığını görmek için soruyu açmaya karar verdi.
Yytsi

Yanıtlar:


8

Dize enterpolasyonu

Haxe , tek tırnaklı dizelerde dize enterpolasyonunu destekler . JavaScript ES6'daki şablon dizeleri gibi, bir dizeye aşağıdakileri içeren bir ifade ekleyebilirsiniz ${...}:

trace('2 + 2 = ${2 + 2}');

Ancak ES6'dan farklı olarak, ifade tek bir değişken olduğunda süslü parantezleri atlayabilirsiniz:

var x = 2 + 2;
trace('2 + 2 = $x');

Bu örneklerin her ikisi de yazdırılır 2 + 2 = 4.


7

Dizi anlama

Haxe dizi anlayışlarını destekler:

trace([for (i in 0...5) i]); // Prints 0,1,2,3,4

Diğer birçok dilden farklı olarak while, anlamada da kullanabilirsiniz :

var i = 5;
trace([while (i > 0) i--]); // Prints 5,4,3,2,1

Bu, bir dizinin ne kadar süreye ihtiyacınız olduğunu bilmediğinizde çok yararlı olabilir.

Sen Ayrıca zincir for, whileve ififadeleri:

trace([for (x in ['A','B','C','D'])
       for (y in ['x','y'])
       if (x + y != "Cx")
       x + y
]); // Prints Ax,Ay,Bx,By,Cy,Dx,Dy

Vay. Cevabımı sileceğim. Aynı cevabı kelimenin tam anlamıyla bir dakika geç yaptım. Ayrıca, listelerin etrafına gerçekten köşeli parantez bastığını da not etmek isteyebilirsiniz, bu nedenle bazı zorluklar katı çıktı formatları gerektirdiğinden okuyucular karıştırılmayacaktır.
Yytsi

@TuukkaX Haha, bu bazen olur :) Sakıncası yoksa, senin örneklerinden birini buraya ekleyeceğim. Ayrıca, try.haxe.org köşeli parantez basmıyor gibi görünüyor ...
ETHproductions

Kartezyen ürünü hesaplayan düzgün. Ben bu yazı için iyi bir katkı olacağını düşünüyorum :)
Yytsi 18:16

6

Aralık operatörü

Haxe, ...tamsayı aralıkları oluşturmak için kullanılabilen bir aralık operatörüne sahiptir. Örneğin, bunun yerine:

var i = 0;
while (i < 10) trace(i++);

Bunu yapabilirsiniz:

for (i in 0...10) trace(i++);

Özellikler x...y:

  • xve yikisi de Ints olmalıdır.
  • xdaha büyük olamaz y.
  • Bu, herhangi bir Yinelenebilir ile aynı yerlerde kullanılabilen bir IntIterator nesnesi döndürür .

1

Bir ifadeyi koşullu olarak çalıştırma

Açıkçası şununla şartlı olarak çalışabilirsiniz if:

if(n>5)doSomething(n);

Bununla birlikte, yukarıdaki gibi yalnızca bir ifadeniz varsa, bir bayt kaydetmek için üçlü koşullu işleci kullanabilirsiniz:

n>5?doSomething(n):0;

Bazen kullanarak başka bir bayt kaydedebilirsiniz &&, ancak bu çok nadirdir, çünkü &&yalnızca her iki ifade de booleans döndürürse çalışır:

n>5&&doSomething(n);

Bunun bir önemli istisna anahtar kelimeler : Haxe bir içine çalışıyorsa return, breakya continue yerde , hemen çalıştırmak ve üzerinde çalışıyordu ne olursa olsun ifadesi çıkılacak. Bu, bunun yerine:

if(n>5)return n;

Bunu 2 bayt kaydetmek için yapabilirsiniz:

n>5&&return n;

1

İfadelerde anahtar kelimeler kullanma

Haxe'nin sıra dışı bir özelliği de her şeyin bir ifade olmasıdır . Örneğin, bu kod tamamen geçerlidir:

function(n){while(n>0)n%4==1?return 6:n--;return 3;}

Tamam, bu oldukça işe yaramaz bir örnek, ama umarım benim fikrimi anlarsın. Bu, çoğu anahtar kelimeyle çalışır:

function(n){while(n>0)n%4==1?break:n--;return n;}

Bu , tabii ki daha kısa olsa da , if/ elsesatır içi kullanmanızı sağlar .p=if(n>1)7else 4;p=n>1?7:4;

Satır içi kullanamayacağınız anahtar kelimeler


1

İşlev parantezlerini atla

Çoğu dilde farklı olarak, Haxe her şey bir ifadesidir dahil {blocks}. Bu nedenle, bir Haxe programındaki herhangi bir yerde ( switchifadeler hariç ) kıvırcık parantezler , yalnızca tek bir ifade içeriyorsa bırakılabilir. Bunun yerine:

function f(n){return Math.pow(3,n);}

Bunu yapabilirsiniz:

function f(n)return Math.pow(3,n);

Birçok fonksiyona kaydedilmiş kolay iki bayt.

Bir fonksiyonun birden fazla ifade içermesi gerekse bile, genellikle bloğun dışını hareket ettirerek bir bayt kaydedebilirsiniz return :

function f(a){var b=a*a;return a<0?-b:b;}
function f(a)return{var b=a*a;a<0?-b:b;}

Bu, bir blok, blok içindeki son ifadeyi değerlendirdiği için çalışır.


Düzenleme: bir sayının küpüne ihtiyacınız varsa, kullanmak daha iyidir n*n*n, ya da eşdeğer n*n*n*nbir sayının tesseract için, vb ... Ancak, Math.powburada iyi bir örnek olarak hizmet vermektedir.
Yytsi

@TuukkaX Heh, teşekkürler. Bunun Math.pow(3,n)yerine kullanacağım ;-)
ETHproductions
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.