Golftipps in Haxe

12

Welche allgemeinen Tipps haben Sie zum Golfen in Haxe ? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme anwenden lassen und die zumindest etwas spezifisch für Haxe sind (z. B. "Kommentare entfernen" ist keine Antwort).

Bitte posten Sie einen Tipp pro Antwort.

Haxe können online ausgeführt werden hier !

Yytsi
quelle
Ich habe Haxe in der Vergangenheit ziemlich oft benutzt, aber seit ich mit dem Golfen angefangen habe, habe ich es nicht viel benutzt. Ich muss versuchen, es zum Golfen zu verwenden ...
ETHproductions
@ETHproductions Gleich hier. Heute habe ich zweimal damit Golf gespielt und es hat Spaß gemacht. Es hat einige gute Golffähigkeiten mit (zum Beispiel) seinen Listenverständnissen und Iteratoren, also habe ich beschlossen, die Frage zu öffnen, um zu sehen, ob jemand Tipps zum Teilen hat.
Yytsi

Antworten:

8

String-Interpolation

Haxe unterstützt die Zeichenfolgeninterpolation für Zeichenfolgen mit einfachen Anführungszeichen. Wie bei Vorlagenzeichenfolgen in JavaScript ES6 können Sie einen Ausdruck in eine Zeichenfolge einfügen mit ${...}:

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

Im Gegensatz zu ES6 können Sie die geschweiften Klammern jedoch weglassen, wenn der Ausdruck eine einzelne Variable ist:

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

Diese beiden Beispiele werden gedruckt 2 + 2 = 4 .

ETHproductions
quelle
7

Array-Verständnis

Haxe unterstützt Array-Verständnis:

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

Im Gegensatz zu vielen anderen Sprachen können Sie auch verwenden while in Begriffen verwenden:

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

Dies kann sehr nützlich sein, wenn Sie nicht wissen, wie lange ein Array benötigt wird.

Sie können auch mit Kette for, whileund ifAussagen:

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
ETHproductions
quelle
Beeindruckend. Ich werde meine Antwort löschen. Ich habe buchstäblich die gleiche Antwort formuliert, nur eine Minute zu spät. Außerdem möchten Sie vielleicht wissen, dass die Listen tatsächlich in eckige Klammern eingeschlossen sind, damit die Leser nicht verwirrt werden, da einige Herausforderungen strenge Ausgabeformate erfordern.
Yytsi
@ TuukkaX Haha, das passiert manchmal :) Ich werde eines Ihrer Beispiele hier aufnehmen, wenn es Ihnen nichts ausmacht. Außerdem scheint try.haxe.org keine eckigen Klammern zu drucken ...
ETHproductions
Diejenige, die das kartesische Produkt berechnet, ist ordentlich. Ich denke, das wäre eine gute Ergänzung für deinen Beitrag :)
Yytsi
6

Bereichsoperator

Haxe verfügt über einen Bereichsoperator, mit ...dem ganze Zahlenbereiche erstellt werden können. Zum Beispiel stattdessen:

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

Du kannst das:

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

Besonderheiten für x...y:

  • xund ymüssen beide Ints sein.
  • xkann nicht größer sein als y.
  • Dies gibt ein IntIterator-Objekt zurück , das an den gleichen Stellen wie jedes Iterable verwendet werden kann.
ETHproductions
quelle
1

Bedingtes Ausführen einer Anweisung

Natürlich können Sie alles mit iffolgenden Bedingungen ausführen :

if(n>5)doSomething(n);

Wenn Sie jedoch wie oben nur eine Anweisung haben, können Sie den ternären bedingten Operator verwenden, um ein Byte zu speichern:

n>5?doSomething(n):0;

Sie können manchmal ein anderes Byte speichern &&, obwohl dies sehr selten ist, da es &&nur funktioniert, wenn beide Ausdrücke Boolesche Werte zurückgeben:

n>5&&doSomething(n);

Eine wichtige Ausnahme bilden Schlüsselwörter : Wenn Haxe auf einen return, breakoder continue irgendwo anders stößt , wird er sofort ausgeführt und der Ausdruck, an dem er gearbeitet hat, beendet. Dies bedeutet, dass stattdessen:

if(n>5)return n;

Sie können dies tun, um 2 Bytes zu sparen:

n>5&&return n;
ETHproductions
quelle
1

Verwenden Sie Schlüsselwörter in Ausdrücken

Ein weiteres ungewöhnliches Merkmal von Haxe ist, dass alles ein Ausdruck ist . Zum Beispiel ist dieser Code vollkommen gültig:

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

Okay, das ist ein ziemlich nutzloses Beispiel, aber hoffentlich verstehen Sie meinen Standpunkt. Dies funktioniert mit den meisten Schlüsselwörtern:

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

Dies ermöglicht es Ihnen natürlich, if/ elseinline zu verwendenp=if(n>1)7else 4;p=n>1?7:4; kürzer ist.

Schlüsselwörter, die Sie nicht inline verwenden können

ETHproductions
quelle
1

Funktionsklammern weglassen

Im Gegensatz zu den meisten Sprachen ist alles in Haxe ein Ausdruck , einschließlich {blocks}. Daher können geschweifte Klammern an einer beliebigen Stelle in einem Haxe-Programm (mit Ausnahme von switchAusdrücken) weggelassen werden, wenn sie nur eine einzige Anweisung enthalten. Also stattdessen:

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

Du kannst das:

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

Einfache zwei Bytes, die für viele Funktionen gespeichert werden.

Selbst wenn eine Funktion mehrere Anweisungen enthalten muss, können Sie oft ein Byte speichern, indem Sie den Block nach return außen verschieben:

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

Dies funktioniert, weil ein Block bis zum letzten Ausdruck innerhalb des Blocks ausgewertet wird.

ETHproductions
quelle
Bearbeiten: Wenn Sie den Würfel einer Zahl benötigen, ist es besser, ihn zu verwenden n*n*n, oder gleichwertig n*n*n*nfür den Tesseract einer Zahl, usw. ... Hier Math.powdient er jedoch als gutes Beispiel.
Yytsi
@ TuukkaX Heh, danke. Ich benutze Math.pow(3,n)stattdessen ;-)
ETHproductions