Consejos para jugar al golf en Haxe

12

¿Qué consejos generales tienes para jugar al golf en Haxe ? Estoy buscando ideas que se puedan aplicar a problemas de código de golf y que también sean al menos algo específicas para Haxe (por ejemplo, "eliminar comentarios" no es una respuesta).

Por favor, publique un consejo por respuesta.

¡Haxe se puede ejecutar en línea aquí !

Yytsi
fuente
He usado bastante Haxe en el pasado, pero desde que empecé a jugar al golf no lo he usado mucho. Tendré que intentar usarlo para jugar al golf ...
ETHproductions
@ETHproductions Lo mismo aquí. Hoy jugué al golf dos veces y fue divertido. Tiene algunas buenas capacidades de golf con (por ejemplo) sus listas de comprensión e iteradores, así que decidí abrir la pregunta para ver si alguien tiene consejos para compartir.
Yytsi

Respuestas:

8

Interpolación de cuerdas

Haxe admite la interpolación de cadenas en cadenas de comillas simples. Al igual que las cadenas de plantilla en JavaScript ES6, puede incluir una expresión en una cadena con ${...}:

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

Sin embargo, a diferencia de ES6, puede omitir las llaves cuando la expresión es una sola variable:

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

Ambos ejemplos se imprimen 2 + 2 = 4.

ETHproductions
fuente
7

Matriz de comprensiones

Haxe admite comprensiones de matriz:

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

A diferencia de muchos otros idiomas, también puede usar whileen comprensiones:

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

Esto puede ser muy útil cuando no sabe cuánto tiempo necesita una matriz.

También puede hacer la cadena for, whiley ifdeclaraciones:

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
fuente
Guau. Eliminaré mi respuesta. Literalmente construí la misma respuesta, solo un minuto tarde. Además, es posible que desee tener en cuenta que en realidad imprime corchetes alrededor de las listas, para que los lectores no se confundan, ya que algunos desafíos requieren formatos de salida estrictos.
Yytsi
@ TuukkaX Jaja, eso sucede a veces :) Incluiré uno de tus ejemplos aquí, si no te importa. Además, try.haxe.org no parece imprimir corchetes ...
ETHproductions
El que calcula el producto cartesiano es ordenado. Creo que sería una buena adición a tu publicación :)
Yytsi
6

Operador de rango

Haxe tiene un operador de rango ...que puede usarse para crear rangos de enteros. Por ejemplo, en lugar de esto:

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

Puedes hacerlo:

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

Detalles para x...y:

  • xy yambos deben ser Ints.
  • xno puede ser mayor que y.
  • Esto devuelve un objeto IntIterator , que puede usarse en los mismos lugares que cualquier Iterable.
ETHproductions
fuente
1

Ejecutar una declaración condicionalmente

Obviamente puedes ejecutar cualquier cosa condicionalmente con if:

if(n>5)doSomething(n);

Sin embargo, si solo tiene una instrucción como la anterior, puede usar el operador condicional ternario para guardar un byte:

n>5?doSomething(n):0;

A veces puede guardar otro byte utilizando &&, aunque esto es muy raro porque &&solo funciona si ambas expresiones devuelven booleanos:

n>5&&doSomething(n);

Una excepción importante a esto son las palabras clave : si Haxe se encuentra con un return, breako en continue cualquier lugar , lo ejecutará inmediatamente y cerrará cualquier expresión en la que estuviera trabajando. Esto significa que en lugar de esto:

if(n>5)return n;

Puede hacer esto para guardar 2 bytes:

n>5&&return n;
ETHproductions
fuente
1

Use palabras clave en expresiones

Otra característica inusual de Haxe es que todo es una expresión . Por ejemplo, este código es perfectamente válido:

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

Bien, ese es un ejemplo bastante inútil, pero espero que entiendas mi punto. Esto funciona con la mayoría de las palabras clave:

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

Esto le permite usar if/ en elselínea, como p=if(n>1)7else 4;, aunque por supuesto p=n>1?7:4;es más corto.

Palabras clave que no puede usar en línea

  • var - El compilador se quejará de intentar usar Void como valor.
  • for/ while- Igual que el anterior, aunque puede usarlos en comprensiones de matriz .
ETHproductions
fuente
1

Omitir soportes de función

A diferencia de la mayoría de los idiomas, todo en Haxe es una expresión , incluido {blocks}. Por lo tanto, los corchetes en cualquier parte de un programa Haxe (con la excepción de las switchexpresiones) se pueden omitir si contienen una sola declaración. Entonces, en lugar de esto:

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

Puedes hacerlo:

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

Dos bytes fáciles guardados en muchas funciones.

Incluso si una función debe contener varias declaraciones, a menudo puede guardar un byte moviendo el return exterior del bloque:

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

Esto funciona porque un bloque se evalúa como la última expresión dentro del bloque.

ETHproductions
fuente
Editar: si necesita el cubo de un número, es mejor usarlo n*n*n, o de manera equivalente n*n*n*npara el testeo de un número, etc. Sin embargo, aquí Math.powsirve como un buen ejemplo.
Yytsi
@ TuukkaX Je, gracias. Lo Math.pow(3,n)
usaré