Dicas para jogar golfe em Haxe

12

Que dicas gerais você tem para jogar golfe em Haxe ? Estou procurando idéias que possam ser aplicadas a problemas de código-golfe e que também sejam pelo menos um pouco específicas para Haxe (por exemplo, "remover comentários" não é uma resposta).

Poste uma dica por resposta.

O Haxe pode ser executado online aqui !

Yytsi
fonte
Eu usei Haxe bastante no passado, mas desde que comecei a jogar golfe não o utilizei muito. Vou ter que tentar usá-lo para jogar golfe ...
ETHproductions
@ETHproductions O mesmo aqui. Hoje, joguei duas vezes com ele, e foi divertido. Ele tem alguns bons recursos de golfe com (por exemplo) suas compreensões de lista e iteradores, então decidi abrir a questão para ver se alguém tem dicas para compartilhar.
Yytsi 18/09/16

Respostas:

8

Interpolação de string

O Haxe suporta a interpolação de strings em strings de aspas simples. Como cadeias de modelo no JavaScript ES6, você pode incluir uma expressão em uma cadeia com ${...}:

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

Ao contrário do ES6, no entanto, você pode omitir os colchetes quando a expressão for uma única variável:

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

Ambos os exemplos são impressos 2 + 2 = 4.

ETHproductions
fonte
7

Compreensões de matriz

O Haxe suporta compreensões de matriz:

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

Ao contrário de muitos outros idiomas, você também pode usar whileem compreensões:

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

Isso pode ser muito útil quando você não sabe quanto tempo precisa de uma matriz.

Você também pode cadeia for, while, e ifdeclarações:

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
fonte
Uau. Eu vou apagar minha resposta. Eu literalmente construí a mesma resposta, apenas um minuto atrasado. Além disso, você pode notar que, na verdade, imprime colchetes nas listas, para que os leitores não fiquem confusos, pois alguns desafios exigem formatos estritos de saída.
Yytsi 18/09/16
@TuukkaX Haha, isso acontece às vezes :) Vou incluir um de seus exemplos aqui, se você não se importa. Além disso, try.haxe.org não parece imprimir colchetes ...
ETHproductions
O que calcula o produto cartesiano é arrumado. Eu acho que seria um bom complemento para o seu post :)
Yytsi
6

Operador de alcance

O Haxe possui um operador de intervalo ...que pode ser usado para criar intervalos de números inteiros. Por exemplo, em vez disso:

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

Você consegue fazer isso:

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

Específicos para x...y:

  • xe ydevem ser ambos Ints.
  • xnão pode ser maior que y.
  • Isso retorna um objeto IntIterator , que pode ser usado nos mesmos locais que qualquer Iterable.
ETHproductions
fonte
1

Executando uma Instrução Condicionalmente

Obviamente, você pode executar qualquer coisa condicionalmente com if:

if(n>5)doSomething(n);

Se, no entanto, você tiver apenas uma instrução como acima, poderá usar o operador condicional ternário para salvar um byte:

n>5?doSomething(n):0;

Às vezes, você pode salvar outro byte usando &&, embora isso seja muito raro, porque &&só funciona se ambas as expressões retornarem booleanos:

n>5&&doSomething(n);

Uma grande exceção a isso são as palavras - chave : se o Haxe encontrar um return, breakou continue qualquer outro local , ele será executado imediatamente e sairá da expressão em que estava trabalhando. Isso significa que, em vez disso:

if(n>5)return n;

Você pode fazer isso para salvar 2 bytes:

n>5&&return n;
ETHproductions
fonte
1

Use palavras-chave em expressões

Outra característica incomum de Haxe é que tudo é uma expressão . Por exemplo, este código é perfeitamente válido:

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

Ok, esse é um exemplo bastante inútil, mas espero que você entenda meu ponto de vista. Isso funciona com a maioria das palavras-chave:

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

Isso permite que você use if/ elseinline, como p=if(n>1)7else 4;, p=n>1?7:4;é claro, é mais curto.

Palavras-chave que você não pode usar em linha

  • var - O compilador reclamará sobre a tentativa de usar o Void como um valor.
  • for/ while- O mesmo que acima, embora você possa usá-los em compreensões de matriz .
ETHproductions
fonte
1

Omitir suportes de função

Diferentemente da maioria dos idiomas, tudo no Haxe é uma expressão , inclusive {blocks}. Portanto, colchetes em qualquer lugar do programa Haxe (com exceção das switchexpressões) podem ser deixados de fora se contiverem apenas uma única instrução. Então, em vez disso:

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

Você consegue fazer isso:

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

Um fácil dois bytes salvos em muitas funções.

Mesmo se uma função precisar conter várias instruções, você poderá salvar um byte movendo-o para return fora do bloco:

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

Isso funciona porque um bloco é avaliado até a última expressão dentro do bloco.

ETHproductions
fonte
Edit: se você precisar do cubo de um número, é melhor usá-lo n*n*n, ou equivalente, n*n*n*npara o efeito tesseract de um número, etc ... No entanto, Math.powserve como um bom exemplo aqui.
Yytsi
@TuukkaX Heh, obrigado. Em Math.pow(3,n)vez disso, vou usar ;-)
ETHproductions