¿Hay atajos útiles que se puedan usar en Java?
Como se muestra a continuación, import
ya agrega al menos 17 caracteres a un programa.
import java.io.*;
Entiendo que la solución simple sería usar otro lenguaje, pero parece ser un verdadero desafío acortar los programas Java.
Las sugerencias deben ser específicas para Java: si son aplicables a la mayoría de los lenguajes tipo C, pertenecen a la lista más general de sugerencias .
package
Se puede omitir.Respuestas:
Usa el Java más reciente posible. Java 8 le permite utilizar las expresiones lambda, así que úsalo si necesitas cualquier cosa, incluso como objetos funcionales.
Defina funciones abreviadas para las cosas que usa mucho. Por ejemplo, tiene cientos de llamadas
exampleClassInstance.doSomething(someParameter)
, defina una nueva funciónvoid d(ParameterType p){exampleClassInstance.doSomething(p)}
y úsela para ahorrarse algunos caracteres.Si está usando un nombre de clase larga particular más de una vez, como
en su lugar, defina una nueva clase:
Si solo está utilizando un método particular de esa clase (pero aún necesita crear una instancia), puede definir una versión abreviada dentro de la nueva clase al mismo tiempo.
Use parámetros de tipo de función para acortar cosas, donde sea posible, de esta manera:
Usar en
for(;;)
lugar dewhile(true)
.No use modificadores de acceso a menos que sea absolutamente necesario.
No utilizar
final
para nada.Nunca ponga un bloque después de un
for
bucle (pero un bucle foreachfor(x:y)
es diferente). Las declaraciones adicionales deben colocarse dentro de lafor
declaración misma, comofor(int i=0;i<m;a(i),b(++i))c(i);
.Use asignación en línea, incremento, instanciación. Utilice clases en línea anónimas cuando corresponda. Use lambdas en su lugar si es posible. La función de nido llama. Algunas funciones están garantizados para volver a su objeto principal, estos son en realidad incluso significaba que estar encadenado juntos.
Su
main
métodothrows Exception
s, no los atrapa.Error
es más corto queException
. Si por alguna razón realmente necesitathrow
enviar mensajes a la pila, use unaError
, incluso si es una situación perfectamente normal.Si alguna condición requiere la terminación inmediata, use en
int a=1/0;
lugar dethrow null;
oSystem.exit(0);
. En tiempo de ejecución, esto arroja unArithmeticException
. Si ya tiene una variable numérica en su código, úsela en su lugar. (Si ya lo has hechoimport static java.lang.System.*;
, ve conexit(0);
).En lugar de implementar interfaces, como
List<E>
, extienda una clase secundaria inmediata (o no tan inmediata, si es que tiene alguna ventaja hacerlo)AbstractList<E>
, que proporciona implementaciones predeterminadas de la mayoría de los métodos y requiere solo la implementación de Algunas piezas clave.Escriba su código en letra larga primero, con líneas nuevas, sangría y nombres completos de variables. Una vez que tenga el código de trabajo, puede acortar los nombres, mover las declaraciones y agregar métodos de acceso directo. Al escribirlo mucho para comenzar, tiene más oportunidades de simplificar el programa en su conjunto.
Compare optimizaciones alternativas con un fragmento de código, porque la estrategia más óptima puede cambiar drásticamente con cambios muy pequeños en el código. Por ejemplo:
Arrays.sort(a)
, la forma más eficiente para es llamarlo con su nombre completo,java.util.Arrays.sort(a)
.void s(int[]a){java.util.Arrays.sort(a);}
. Esto aún debería usar el nombre completo en este caso. (Si necesita más de una sobrecarga, probablemente lo esté haciendo mal).for
ciclo corto en el golf, en ausencia de un método de biblioteca de fácil acceso), puede aprovecharArrays.copyOf
para hacer la tarea. Cuando se usa más de un método, y hay 3 o más llamadas, hacerimport static java.util.Arrays.*;
es la forma más eficiente de referirse a esos métodos. Después de eso, solo si tiene más de 8 llamadas separadas,sort
debería estar utilizando un método de acceso directo, y solo en 5 o más llamadas está garantizado un acceso directocopyOf
.La única forma real de realizar dicho análisis en el código es realizar modificaciones potenciales en las copias del código y luego comparar los resultados.
Evite usar el
someTypeValue.toString();
método, solo agreguesomeTypeValue+""
.Si necesita ventanas, no use Swing, use AWT (a menos que realmente necesite algo de Swing). Compara
import javax.swing.*;
yimport java.awt.*;
. Además, los componentes de oscilación tienen unJ
antepone a su nombre (JFrame
,JLabel
, etc.), pero los componentes de AWT no (Frame
,Label
, etc.)fuente
Usar en
interface
lugar declass
.En java 8, se agregaron métodos estáticos a las interfaces. En las interfaces, todos los métodos son públicos por defecto. Por consiguiente
ahora se puede acortar a
que obviamente es más corto.
Por ejemplo, usé esta función en Hello, World! desafío.
fuente
Con varargs puedes "lanzar" un parámetro a una matriz del mismo tipo:
en lugar de
fuente
Con una importación estática :
puede guardar algo más tarde, pero necesita múltiples invocaciones para obtener un resultado:
fuente
Java
!import static java.lang.System.*
.var o=System.out;
que solo debe usarse dos veces antes de que valga la penavar o=System.out.println
?main
No es necesario llamar al argumento toargs
, y puede cortar algunos espacios en blanco:hará bien.
fuente
Si alguna vez tiene que usar las expresiones booleanas
true
ofalse
, reemplácelas con1>0
y1<0
respectivamente.Por ejemplo:
Este ejemplo de búsqueda lineal se puede reducir a
fuente
true/false
, solo agregueboolean t=1>0,f=1<0;
. Luego, en lugar de1>0
usart
y guardar dos caracteres por uso. El pago sobre el1>0
método tiene 10 usos.boolean t=1>0,f=!t;
- ¡un personaje más corto!true
/false
directamente de todos modos:f|=a[i++]==42;
ahorra bastante.boolean
, pero como no pude encontrar ningún ejemplo al momento de escribir (generalmente no codifico en Java), simplemente escribí un ejemplo simple.Si va a utilizar mucho algún método, asigne su clase residente a una variable. Por ejemplo, asignar
System.out
a una variable:También para
Integer.parseInt()
:Esto seguramente desencadenará una advertencia ide sobre "acceder al método estático desde la variable"
fuente
((Integer)1).parseInt("1")
también funcionanew Integer("1")
es aún más corto. Pero lo que Justin quiso decir con su respuesta es que puede reutilizar variables que ya tiene para llamadas estáticas. Como explico al final de esta respuesta.En lugar de usar la
import static java.lang.System.*
técnica para ahorrar en lasprintln()
declaraciones, descubrí que definir el siguiente método es mucho más efectivo para guardar caracteres:Esto se debe a que se puede invocar en
p(myString)
lugar deout.println(myString)
tener una recompensa de personaje mucho más rápida y dramática.fuente
Esto puede parecer obvio, pero hay opciones más cortas para algunas
Math
funciones:fuente
Si lo necesita
Integer.MAX_VALUE
(2147483647), use-1>>>1
.Integer.MIN_VALUE
(-2147483648) está mejor escrito1<<31
.fuente
Si necesita obtener un número de un argumento (o cualquier otra cadena), normalmente verá algo como:
Muchas veces, no necesitas un
Integer
. Muchos desafíos no usan grandes cantidades. DadoShort
yByte
será tanto unbox a unaint
, utilizar el más adecuadovalueOf()
en su lugar y guardar un par de bytes.Sin embargo, mantenga su variable real como una
int
, ya que es más corta que ambasbyte
yshort
:Si necesita hacer esto para varios números, puede combinarlo con este método :
fuente
int n=new Byte(a[0]);
Es tres más corto. Si el número puede ser mayor, uselong n=new Long(a[0])
, aún es mejor queint
s en la mayoría de los casos.No utilice
public class
. El método principal debe ser público, pero su clase no. Este código funciona:Puedes correr
java S
aunqueclass S
no sea una clase pública. ( Actualización: estaba usando Java 7 cuando escribí este consejo. En Java 8, su método principal debería estar en una interfaz . En Java 5 o 6, su método principal debería estar en una enumeración ).¡Muchos programadores de Java no lo saben! Aproximadamente la mitad de las respuestas a una pregunta de Stack Overflow sobre main en una clase no pública afirman erróneamente que el método main debe estar en una clase pública. Ahora lo sabes mejor. Eliminar el
public
enpublic class
y guardar 7 caracteres.fuente
interface s{static void main(String[]...
es más corta. Si debe tener un archivo fuente compilable y un método principal. Porque en una interfaz Java 1.8, todos los métodos son públicos, por lo que puede omitir el modificador en los métodos.Algunos pequeños consejos de golf de código
Estos consejos eran demasiado pequeños para respuestas separadas, por lo que utilizaré esta respuesta para consejos muy pequeños de codegolf que encontré o se me ocurrieron, y que aún no se mencionan en los otros consejos:
Eliminar el último carácter de una cadena:
En algunos casos, usted sabe de antemano cuál es el último carácter, y también sabe que este carácter solo aparece una vez en la Cadena. En ese caso, puede usar
.split
en su lugar:Atajos de codificación:
Todas las codificaciones tienen un nombre canónico utilizado en la
java.nio
API, así como un nombre canónico utilizado en losjava.io
yjava.lang
las API. Aquí hay una lista completa de todas las codificaciones compatibles en Java. Así que siempre usa el más corto de los dos; el segundo suele ser más corto (comoUTF-8
vsutf8
,Windows-1252
vsCp1252
, etc.), pero no siempre (UTF-16BE
vsUnicodeBigUnmarked
).Booleano aleatorio:
Primes:
Hay muchas formas diferentes de verificar los números primos u obtener todos los números primos, pero la respuesta de @ SaraJ aquí es la más corta. Aquí hay una copia-pegar como referencia:
NOTA: Por lo general, puede fusionarlo con otros bucles existentes dependiendo de cómo desee usarlo, por lo que no necesitará un método separado. Esto ahorró muchos bytes en esta respuesta, por ejemplo.
Truncamiento de enteros en lugar de Math.floor / Math.ceil:
Si está utilizando dobles / flotantes positivos y desea
floor
utilizarlos, no los utilice,Math.floor
sino que use un(int)
-cast en su lugar (ya que Java se trunca en los enteros):El mismo truco se puede aplicar a dobles / flotantes negativos que desee
ceil
:Use en
&1
lugar de%2
deshacerse del paréntesis:Debido a que la precedencia de operadores de
&
es menor que los operadores aritméticos predeterminados como*/+-
y%
, en algunos casos puede deshacerse del paréntesis.Tenga en cuenta que esto realmente no ayuda en las comprobaciones booleanas, porque aún necesitaría paréntesis, solo se movieron un poco:
BigIntegers y creando variables para llamadas a métodos estáticos:
Cuando use BigIntegers, créelo solo una vez y luego podrá reutilizarlo. Como ya sabrán, BigInteger contiene campos estáticos para
ZERO
,ONE
yTEN
. Entonces, cuando solo usa esos tres, no necesita unimport
pero puede usarlojava.Math.BigInteger
directamente.NOTA: Usted tiene que usar
=null
por lo quet
se inicializa con el fin de utilizart.
.A veces puede agregar múltiples BigIntegers para crear otro para guardar bytes. Entonces, digamos que quieres tener BigIntegers
1,10,12
por alguna razón:Como se señaló correctamente en los comentarios, el truco con
BigInteger t=null;
sus llamadas a métodos estáticos también se puede usar con otras clases.Por ejemplo, esta respuesta de 2011 se puede jugar:
getBytes()
en lugar detoCharArray()
Cuando desee recorrer los caracteres de una Cadena, generalmente hará esto:
Recorrer los caracteres puede ser útil al imprimirlos, agregarlos a una cadena o algo similar.
Sin embargo, si solo usa los caracteres para algunos cálculos de números Unicode, puede reemplazarlos
char
conint
Y, y puede reemplazartoCharArray()
congetBytes()
:O incluso más corto en Java 8+:
En Java 10+, el bucle sobre el carácter a imprimir ahora también se puede hacer en 22 bytes:
Artículo aleatorio de a
List
:Compruebe si una cadena contiene espacios iniciales / finales
¿Por qué funciona esto, cuando
!=
en Strings se busca una referencia en lugar de un valor en Java? PorqueString#trim
devolverá " Una copia de esta cadena con espacios en blanco iniciales y finales eliminados, o esta cadena si no tiene espacios en blanco iniciales o finales " . Utilicé esto, después de que alguien me sugirió esto, en esta respuesta mía .Palíndromo:
Para verificar si una Cadena es un palíndromo (teniendo en cuenta las longitudes pares e impares de las Cadenas), esta es la más corta (
.contains
funciona aquí porque sabemos que tanto la Cadena en sí como su forma invertida tienen la misma longitud):.contains(...)
en lugar de.equals(...+"")
gracias al comentario de @assylias aquí .¿O es 0 o ambos son 0?
Creo que la mayoría ya conoce esta: si desea comprobar si
a
ob
es cero, multiplique en su lugar para guardar bytes:Y si desea verificar si ambos
a
yb
son cero, puede usar un OR bit a bit o agregarlos juntos si siempre son positivos:Par = 1, impar = -1; o viceversa
La razón por la que agrego esto fue después de ver
k+(k%2<1?1:-1)
en esta respuesta :n
Tiempos de bucle en el programa completoSi tenemos un desafío en el que un programa completo es obligatorio, y necesitamos realizar un ciclo específico de veces, podemos hacer lo siguiente:
Lo mismo se aplica cuando tenemos que tomar este rango como entrada:
Gracias a @JackAmmo en este comentario .
try-finally en lugar de try-catch (Excepción e) al regresar y cuándo usarlo
Si no puede usar un
throws Exception
pero tiene quecatch
hacerlo y hacer algo con él antes de regresar, puede usarfinally
en su lugar:En cuanto a un ejemplo de cuándo usar un
try-catch
, puedo referirme a esta respuesta mía (el crédito por el golf indirecto va a @KamilDrakari ). En este desafío, debemos realizar un bucle en diagonal sobre una matriz NxM, por lo que debemos determinar si la cantidad de columnas o la cantidad de filas es la más baja como nuestro máximo en el bucle for (que es bastante costoso en términos de bytesi<Math.min(a.length,a[0].length)
). Por lo tanto, simplemente capturar elArrayIndexOutOfBoundsException
usocatch-finally
es más corto que esta verificación y, por lo tanto, ahorra bytes:NOTA: Esto solo funcionó debido
return r;
al final. Me han sugerido que modifique la primera celda, como @KamilDrakari hizo en su respuesta de C # para guardar bytes. Sin embargo, en Java esto significa que tendré que cambiarlo am->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 bytes), en realidad aumentando el recuento de bytes en lugar de disminuir si pudiera haberlo usadofinally
.Math.pow (2, n)
Cuando quieres una potencia de 2, un enfoque basado en bits es mucho más corto:
Combinando controles lógicos y de bits en lugar de usar paréntesis
Creo que ahora es bien conocido eso
&
y|
puede usarse en lugar de&&
y||
en las comprobaciones lógicas Java (booleanas). Sin embargo, en algunos casos aún querrás usar en&&
lugar de&
evitar errores, comoindex >= 0 && array[index].doSomething
. Si&&
se cambiara a&
aquí, todavía evaluará la parte donde usa el índice en la matriz, causando unArrayIndexOutOfBoundsException
, de ahí el uso de&&
en este caso en lugar de&
.Hasta ahora, los conceptos básicos de
&&
/||
vs&
/|
en Java.Cuando desee verificar
(A or B) and C
, el más corto puede parecer usar los operadores de bits como este:Sin embargo, debido a que los operadores de bits tienen prioridad de operador sobre las comprobaciones lógicas, puede combinar ambos para guardar un byte aquí:
Usar en
n+=...-n
lugar de(long)...
Cuando tiene un largo como entrada y salida en un lambda, por ejemplo, cuando lo usa
Math.pow
, puede guardar un byte usando enn+=...-n
lugar de(long)...
.Por ejemplo:
Esto ahorró un byte en esta respuesta mía , e incluso dos bytes mediante la combinación de
-n-1
a+~n
en esta respuesta mía .fuente
positive integers
? Además, no estoy seguro de si la implementación del techo funciona .since Java automatically floors on integers
; Creo que el término apropiado es truncamiento , no piso .String t="";for(int i=s.length();--i>=0;t+=s.charAt(i));return s.equals(t);
s.equals(new StringBuffer(s).reverse()+"")
es suficiente.Para jugar al golf que no requiere entrada, puede usar bloques estáticos y ejecutarlo bien sin ningún método principal, solo compílelo con Java 6.
fuente
java
en la línea de comando / en un archivo de manifiesto qué clase cargar.Todos conocemos el bit xor (
^
), pero también es un xor lógico.Entonces
(a||b)&&!(a&&b)
simplemente se conviertea^b
.Ahora podemos usar xor.
Además , los operadores
|
y&
también funcionan , solo recuerde que los cambios de precedencia de operadores.fuente
&
y|
también. Puede ser útil si sus condiciones ya están entre paréntesis, o si ya está trabajando con booleanos.!=
lugar de^
para xor y==
para xnorNo tienes que usar
Character.toLowerCase(char c)
. En lugar de usar(c|32)
. En lugar deCharacter.toUpperCase(char c)
usar(c&~32)
. Esto solo funciona con letras ASCII.fuente
c|~32
tendería a resultar en -1 ... mejor para usarc-32
.Convertir cadena en número
Hay varias formas de convertir una cadena en un valor numérico:
ABC.parseABC :
ABC.valueOf :
ABC.decode :
nuevo ABC :
Por lo tanto, para golf de código, es mejor usar el constructor al convertir una cadena en un valor numérico.
Lo mismo se aplica a
Double
;Float
; yByte
.Esto no siempre se aplica cuando puede reutilizar una primitiva ya presente como objeto.
Como ejemplo, digamos que tenemos el siguiente código:
Puede usar en
.decode
lugar del constructor más corto reutilizando el parámetro como objeto:fuente
¡No lo uses
Random
!En general, si necesita números aleatorios,
Random
es una forma horrible de hacerlo *. Mucho mejor usarMath.random()
en su lugar. Para usarRandom
, debes hacer esto (digamos que necesitamos unint
):Compare eso con:
y:
El primer método toma
41+15n
caracteres (n
es el número de llamadas). El segundo son los25n
personajes, y el tercero es43+7n
.Entonces, si solo lo necesita una o dos veces, use el
Math.random()
método en línea . Para tres o más llamadas, ahorrará utilizando una función. Cualquiera de los dos personajes ahorra en el primer uso másRandom
.Si ya está usando
Math.random()
paradouble
, recuerde que con cuatro usos, todavía es un ahorro sacarlo en:Para 33 caracteres, ahorrará 10 en cada llamada a
r()
Actualizar
Si necesita un número entero y desea ahorrar en la conversión, ¡no lo eche! Java se convierte automáticamente si realiza una operación en lugar de una asignación. Comparar:
* A menos que tenga que sembrar el PRNG para obtener resultados predecibles. Entonces, no veo mucha forma de evitarlo.
fuente
Random#nextGaussian
embargo, no te olvides .(int)(Math.random()*9)
tiene un sesgo de módulo muy pequeño, porqueMath.random()
devuelve 2 53 valores posibles, y 2 53 no es un múltiplo de 9. La probabilidad de cada número está dentro de 1/9 más o menos 5 / (9 * 2 ** 53), Un error tan pequeño que es casi exactamente 1/9.9
solo como ejemplo, podría ser cualquier cosa. Estoy relativamente seguro de quenextInt()
(o cualquier otroRandom
método) también tiene un pequeño sesgo, solo debido a cómo funciona el PRNG de Java.new java.util.Random().nextBoolean()
que puedas usarMath.random()<.5
.No sé si consideraría esta Java 'pura', pero Processing le permite crear programas con poca configuración inicial (completada automáticamente).
Para la salida de la consola, puede tener algo tan simple como:
para salida gráfica, un poco más:
fuente
size
en absoluto; por defecto tendrá un cuadrado de 100 por 100 píxeles. En la mayoría de los sistemas operativos, el marco a su alrededor será aproximadamente el doble de grande, con el cuadrado centrado y el resto del área llena de contenido tomado del escritorio.setup()
ydraw()
usar el "modo estático". También puede usar colores hexadecimales de 6 dígitos y el intérprete los cambiará, lo que a veces vale la pena (#FF8000
<255,128,0
), y si está usando escala de grises solo se debe especificar un número (255
<255,255,255
)Acortamiento regresando
Puede acortar las declaraciones de retorno de cadenas por un byte con:
a
Y, si comienza su declaración de retorno con un paréntesis, puede hacer lo mismo con ellos:
a
¿Supongo que las citas se consideran paréntesis? De hecho, recogí esto a través de AppleScript, curiosamente, y pensé que valdría la pena mencionarlo.
fuente
return-n;
lugar dereturn -n;
o enreturn~n;
lugar dereturn ~n;
. Además de comillas simples en lugar de dobles:return'A';
No tengas miedo de usar notación científica
Si se trata de dobles o flotadores, puede usar la notación científica para los números. Entonces, en lugar de escribir
double a=1000
, puede cambiarlodouble a=1e3
para guardar 1 byte.fuente
Intenta usar en
int
lugar deboolean
En algunos casos, descubrí que es más corto devolver un valor entero de un método que normalmente devolvería un valor booleano, de manera similar a lo que se podría hacer en los programas en C.
De buenas a primeras
int
es 4 bytes más corto queboolean
. Cada vez que escribe enreturn 0
lugar dereturn 1<0
, guarda 2 bytes adicionales y lo mismo parareturn 1
másreturn 1>0
.El problema aquí es que cada vez que desee utilizar el valor de retorno directamente como un valor booleano, cuesta 2 bytes (
if(p(n))
v.if(p(n)>0)
). Esto puede compensarse mediante el uso de la aritmética booleana. Dado un escenario artificial donde quieres escribiren su lugar puedes escribir
para ahorrar 2 bytes.
fuente
0
y1
no constituye falso / verdadero en Java (y el JLS tampoco los considera de esa manera). Entonces, si el golf está pidiendo específicamente veracidad / falsedad, debe booleanizarlo (y, desafortunadamente, convertirlo en unaboolean
función, arrojándole aún más bytes).t[0]+=p(n):10?0;
¿Es esto incluso válido?t[0]+=p(n)?10:0;
. (Lo edité.)Si usa enum en lugar de clase , guarda un personaje.
Pero debe introducir al menos una instancia de enumeración (F, G, H en este ejemplo) que tienen que compensarse.
fuente
enum M{;public static void main(String[]a){...}
sin problemas.class M{
tiene exactamente la misma longitud queenum M{;
. En ese caso, iría con elclass
porque es más bonito (IMO)enum{
trabajaba sin un;
después; es solo el IDE quejándose de que hay un error pero el compilador lo aceptaCuando tiene un método que debería devolver un
boolean
oBoolean
, es decir:Puede cambiar el
boolean
/Boolean
return-typeObject
para guardar 1 byte:Además, como habrá notado, puede usar un
<1
cheque en lugar de==0
guardar un byte. Aunque eso es más un consejo general de código de golf en lugar de específico de Java.Esto se usa principalmente cuando el entero no puede ser negativo, como verificar la longitud:
en lugar de
fuente
c(-21)
regresatrue
con el actual.c(-20)
lugar de-21
?-21 % 5 = 4
y-20 % 5 = 0
.-21
.-21 % 5 != 4
en Java, que es mi punto. El divisible por cinco función sería trabajar correctamente si el módulo siempre devueltos no negativo, pero no es así. Ver este fragmento de ejemplo .%
, así que olvidé que Java devuelve el resto en lugar del módulo, de ahí la diferencia ..Cómo dibujar en Java ...
Aquí está la placa de caldera de pintura GUI más corta posible:
Golfizado por 111 Bytes:
fuente
Evitar
StringBuilder
sAgregar cosas a un
String
ocupa muchos menos bytes.Si tiene que invertir una cadena e imprimirla de inmediato, use a
StringBuffer
.Si tiene que invertir una cadena y luego hacer algo más que imprimirla, use un
for
bucle.fuente
StringBuffer
para invertir las cuerdas.String b="";for(char c:"Hello, World!".toCharArray()){b=c+b;}
{}
bucle foreach si va a utilizar ese método.String s:"".split("")
lugar dechar c:"".toCharArray()
.java.util.stream.Stream
importado y necesita encadenar otra llamada al resultado (comoB.chartAt(42)
) o si solo necesita pasar el resultado a una función (comof(B)
), entonces usarfor(:)
es igual aStream.of("Hello, World!".split("")).reduce("",(a,b)->b+a)
.String b=new StringBuffer("Hello, World!").reverse()+"";
(.toString
reemplazado por+""
), y su segunda línea puede convertirse en:String B="";for(String c:"Hello, World!".split(""))B=c+B;
(char
haciaString
y.toCharArray()
hacia.split("")
).Use Java 10's
var
Si define una sola variable de un tipo específico, use
var
.Ejemplos
No se puede usar en ninguno de los siguientes ejemplos
var
no se puede usar en muchos ejemplosfuente
En la mayoría de los casos, su programa tendrá un solo subproceso, es decir, solo tendrá un subproceso en ejecución. Puede explotar este hecho
return
desde el método principal cuando tiene que salir instantáneamente.Compárelo con "correctamente" terminando el programa:
O apuntando a
null
:O dividiendo por 0:
fuente
A veces, una sola instrucción for-loop puede ser reemplazable. Considere el siguiente código:
Este es un bucle for simple que es una solución a esta pregunta .
Como sabemos que
i
no será lo suficientemente grande como para causar errores de StackOverflow, podemos reemplazar el ciclo for con recursividad:Podemos simular un bucle mediante el uso de un operador ternario en la declaración de retorno para causar recursividad.
Esta reducción es bastante específica, pero puedo imaginar más situaciones en las que esto sería útil.
fuente
Usando
...
(varags) como parámetroEn algunos casos es más corto usar un varargs de Java como parámetro en lugar de los sueltos.
Por ejemplo:
Sería golfed por la mayoría de esto:
Pero se puede jugar un byte adicional a esto:
Tenga en cuenta que solo se accede a los tres enteros una vez en el método mismo. Como
int
es bastante corto, solo es beneficioso si los usa cada uno una vez dentro del método y tiene tres o más de ellos como parámetro.Sin embargo, con parámetros más largos esto suele ser más útil. Por ejemplo, esta fue mi respuesta original para este desafío (calcular las ocurrencias del carácter de entrada en la cadena de entrada):
Y me recomendaron jugar golf para esto:
Pero terminé jugando golf a esto usando
...
:NOTA: Si la pregunta / desafío solicita una entrada flexible,
...
se puede acortar a,[]
por supuesto. Si la pregunta / desafío específicamente pide, digamos, tresString
entradas y no permite unaString
matriz que contenga tres valores, puede usar enString...
lugar deString a,String b,String c
.fuente
String[]
lugar de usar varargs? (ahorra 1 byte más)