Existe-t-il des raccourcis utiles utilisables en Java?
Comme indiqué ci-dessous, import
ajoute déjà au moins 17 caractères à un programme.
import java.io.*;
Je comprends que la solution simple consisterait à utiliser un autre langage, mais raccourcir les programmes Java semble être un réel défi.
Les astuces doivent être spécifiques à Java: s’ils s’appliquent à la plupart des langages de type C, ils appartiennent à la liste plus générale d’astuces .
package
peut être sauté.Réponses:
Utilisez le java le plus récent possible. Java 8 vous permet d' utiliser des expressions lambda, donc l' utiliser si vous avez besoin , même comme des objets fonctionnels.
Définissez des fonctions abrégées pour les choses que vous utilisez beaucoup. Par exemple, vous avez cent appels à
exampleClassInstance.doSomething(someParameter)
, définir une nouvelle fonctionvoid d(ParameterType p){exampleClassInstance.doSomething(p)}
et l'utiliser pour vous épargner des caractères.Si vous utilisez plusieurs fois un nom de classe long particulier, comme
à la place, définissez une nouvelle classe:
Si vous utilisez uniquement une méthode particulière de cette classe (mais que vous avez toujours besoin de l'instancier), vous pouvez définir une version abrégée à l'intérieur de la nouvelle classe en même temps.
Utilisez les paramètres de type de fonction pour raccourcir les choses, si possible, comme ceci:
Utilisez
for(;;)
au lieu dewhile(true)
.N'utilisez pas de modificateurs d'accès, sauf en cas d'absolue nécessité.
Ne pas utiliser
final
pour rien.Ne mettez jamais un bloc après une
for
boucle (mais une boucle foreachfor(x:y)
est différente). Des déclarations supplémentaires doivent être placées dans lafor
déclaration elle-même, commefor(int i=0;i<m;a(i),b(++i))c(i);
.Utilisez l'affectation en ligne, l'incrémentation, l'instanciation. Utilisez des classes en ligne anonymes, le cas échéant. Utilisez lambdas à la place si possible. Appels de fonction de nid. Certaines fonctions ont la garantie de retourner leur objet parent, celles-ci sont même censées être chaînées.
Votre
main
méthodethrows Exception
ne les attrape pas.Error
est plus court queException
. Si pour une raison quelconque vous avez vraiment besoin dethrow
messages en haut de la pile, utilisez unError
, même s’il s’agit d’une situation parfaitement normale.Si une condition nécessite une résiliation immédiate, utilisez
int a=1/0;
plutôt quethrow null;
ouSystem.exit(0);
. Au moment de l'exécution, cela jette un fichierArithmeticException
. Si vous avez déjà une variable numérique dans votre code, utilisez-la à la place. (Si vous avez déjàimport static java.lang.System.*;
, aller avecexit(0);
.)Au lieu d'implémenter des interfaces, par exemple
List<E>
, étendez une classe enfant immédiate (ou pas si immédiate, le cas échéant), commeAbstractList<E>
, qui fournit des implémentations par défaut de la plupart des méthodes et ne requiert que l'implémentation quelques pièces clés.Écrivez d'abord votre code dans le code de la main, avec les nouvelles lignes, l'indentation et les noms de variables complets. Une fois que vous avez le code de travail, vous pouvez alors raccourcir les noms, déplacer les déclarations et ajouter des méthodes de raccourci. En écrivant longtemps pour commencer, vous vous donnez plus de possibilités de simplifier le programme dans son ensemble.
Comparez les optimisations alternatives à un élément de code, car la stratégie la plus optimale peut changer de façon spectaculaire en modifiant très peu le code. Par exemple:
Arrays.sort(a)
, la façon la plus efficace est de l' appeler avec son nom complet,java.util.Arrays.sort(a)
.void s(int[]a){java.util.Arrays.sort(a);}
. Cela devrait toujours utiliser le nom qualifié complet dans ce cas. (Si vous avez besoin de plus d'une surcharge, vous le faites probablement mal.)for
boucle de golf, en l'absence d'une méthode de bibliothèque facilement accessible), vous pouvez en profiterArrays.copyOf
pour effectuer la tâche. Lorsque plusieurs méthodes sont utilisées et qu'il y a 3 appels ou plus,import static java.util.Arrays.*;
la méthode la plus efficace consiste à faire référence à ces méthodes. Par la suite, si voussort
utilisez plus de 8 appels distincts, utilisez une méthode de raccourci, et seulement à 5 appels ou plus, un raccourci est garanticopyOf
.Le seul moyen réel d'effectuer une telle analyse sur le code consiste à effectuer des modifications éventuelles sur des copies du code, puis à comparer les résultats.
Évitez d'utiliser la
someTypeValue.toString();
méthode, ajoutez simplementsomeTypeValue+""
.Si vous avez besoin de Windows, n'utilisez pas Swing, utilisez AWT (sauf si vous avez vraiment besoin de quelque chose de Swing). Comparez
import javax.swing.*;
etimport java.awt.*;
. De plus, les composants Swing ont unJ
préfixé à leur nom (JFrame
,JLabel
, etc.), mais les composants dans AWT ne le font pas (Frame
,Label
, etc.)la source
Utilisez
interface
au lieu declass
.En Java 8, des méthodes statiques ont été ajoutées aux interfaces. Dans les interfaces, toutes les méthodes sont publiques par défaut. par conséquent
peut maintenant être raccourci à
ce qui est évidemment plus court.
Par exemple, j'ai utilisé cette fonctionnalité dans Hello, World! défi.
la source
Avec varargs, vous pouvez " convertir " un paramètre en un tableau du même type:
au lieu de
la source
Avec une importation statique :
vous pouvez économiser un peu plus tard, mais vous avez besoin de plusieurs invocations pour obtenir un gain:
la source
Java
!import static java.lang.System.*
.var o=System.out;
et ne l'utilisez que deux fois avant que cela porte ses fruitsvar o=System.out.println
fonctionnerait?L'argument à
main
ne doit pas nécessairement être appeléargs
, et vous pouvez couper certains espaces:fera très bien.
la source
Si vous devez utiliser les expressions booléennes
true
oufalse
, remplacez-les par1>0
et1<0
respectivement.Par exemple:
Cet exemple de recherche linéaire peut être réduit à
la source
true/false
, ajoutez simplementboolean t=1>0,f=1<0;
. Puis, au lieu de1>0
, utilisezt
et enregistrez deux caractères par utilisation. Le gain sur la1>0
méthode vient à 10 utilisations.boolean t=1>0,f=!t;
- un caractère plus court!true
/false
directement: celaf|=a[i++]==42;
économise beaucoup.boolean
j'utilise, mais comme je ne pouvais pas donner d'exemples au moment de l'écriture (je ne code généralement pas en Java), je viens d'écrire un exemple simple.Si vous utilisez beaucoup une méthode, affectez sa classe résidente à une variable. Par exemple, assignez
System.out
à une variable:Aussi pour
Integer.parseInt()
:Cela déclenchera presque sûrement un avertissement concernant "l'accès à la méthode statique à partir d'une variable"
la source
((Integer)1).parseInt("1")
fonctionne aussi.new Integer("1")
est encore plus court. Mais ce que Justin voulait dire par sa réponse, c'est que vous pouvez réutiliser les variables que vous avez déjà pour les appels statiques. Comme je l'explique au bas de cette réponse.Plutôt que d’utiliser la
import static java.lang.System.*
technique pour économiser surprintln()
instructions, j'ai constaté que la définition de la méthode suivante est beaucoup plus efficace pour enregistrer des caractères:En effet, il peut être invoqué
p(myString)
plutôt que deout.println(myString)
bénéficier d’un gain de caractère beaucoup plus rapide et spectaculaire.la source
Cela peut sembler évident, mais il existe des options plus courtes pour certaines
Math
fonctions:la source
Si vous avez besoin de
Integer.MAX_VALUE
(2147483647), utilisez-1>>>1
.Integer.MIN_VALUE
(-2147483648) est mieux écrit1<<31
.la source
Si vous devez extraire un nombre d'un argument (ou de toute autre chaîne), vous verrez normalement quelque chose comme:
Plusieurs fois, vous n’avez pas besoin d’ un
Integer
. Beaucoup de défis n'utilisent pas de grands nombres. Étant donnéShort
queByte
les deux seront décompressés en unint
, utilisez le plus appropriévalueOf()
et enregistrez quelques octets.Gardez votre variable réelle comme un
int
, cependant, car elle est plus courte que les deuxbyte
etshort
:Si vous devez le faire pour plusieurs numéros, vous pouvez combiner cette méthode :
la source
int n=new Byte(a[0]);
est trois plus court. Si le nombre est peut-être supérieur, utilisez-lelong n=new Long(a[0])
, il sera toujours meilleur queint
s dans la plupart des cas.Ne pas utiliser
public class
. La méthode principale doit être publique, mais pas sa classe. Ce code fonctionne:Vous pouvez courir
java S
même si ceclass S
n'est pas une classe publique. ( Mise à jour: j'utilisais Java 7 lorsque j'ai écrit cette astuce. En Java 8, votre méthode principale doit être dans une interface . En Java 5 ou 6, votre méthode principale doit être en enum .)Beaucoup de programmeurs Java ne le savent pas! Environ la moitié des réponses à une question sur le dépassement de pile concernant une classe principale dans une classe non publique prétendent à tort que la méthode principale doit être une classe publique. Maintenant tu sais mieux. Supprimez le
public
danspublic class
et enregistrez 7 caractères.la source
interface s{static void main(String[]...
est plus courte. Si vous devez avoir un fichier source compilable et une méthode principale. Comme dans une interface Java 1.8, toutes les méthodes sont publiques, vous pouvez donc ignorer le modificateur de la ou des méthodes.Quelques petits conseils de code-golf
Ces astuces étaient un peu trop petites pour une réponse séparée, je vais donc utiliser cette réponse pour de très petites astuces de golf-code que j'ai trouvées ou proposées, et qui ne sont pas encore mentionnées dans les autres astuces:
Supprimer le dernier caractère d'une chaîne:
Dans certains cas, vous savez à l’avance le dernier caractère et vous savez également que ce caractère n’apparaît qu’une fois dans la chaîne. Dans ce cas, vous pouvez utiliser à la
.split
place:Raccourcis d'encodage:
Tous les encodages ont un nom canonique utilisé dans l'
java.nio
API, ainsi qu'un nom canonique utilisé dans les APIjava.io
etjava.lang
. Voici une liste complète de tous les encodages pris en charge en Java. Donc, utilisez toujours le plus court des deux; la seconde est généralement plus courte (commeUTF-8
vsutf8
,Windows-1252
vsCp1252
, etc.), mais pas toujours (UTF-16BE
vsUnicodeBigUnmarked
).Booléen aléatoire:
Primes:
Il existe différentes façons de rechercher des nombres premiers ou d'obtenir tous les nombres premiers, mais la réponse de @ SaraJ est la plus courte. Voici un copier-coller comme référence:
REMARQUE: En règle générale, vous pouvez le fusionner avec d'autres boucles existantes en fonction de la manière dont vous souhaitez l'utiliser. Vous n'avez donc pas besoin d'une méthode distincte. Cela a permis d'économiser beaucoup d'octets dans cette réponse, par exemple.
Troncature d'entier au lieu de Math.floor / Math.ceil:
Si vous utilisez des doubles / floats positifs et que vous souhaitez
floor
les utiliser, n'utilisez pas,Math.floor
mais utilisez(int)
plutôt -cast (car Java tronque les entiers):La même astuce peut être appliquée aux doublons / flotteurs négatifs que vous souhaitez utiliser à la
ceil
place:Utilisez
&1
au lieu de%2
pour vous débarrasser des parenthèses:Étant donné que la priorité de l' opérateur
&
est inférieure à celle des opérateurs arithmétiques par défaut tels que*/+-
et%
, vous pouvez supprimer les parenthèses dans certains cas.Notez que cela n'aide pas vraiment dans les contrôles booléens, car alors vous auriez toujours besoin de parenthèses, elles sont juste déplacées un peu:
BigIntegers et la création de variables pour les appels de méthodes statiques:
Lorsque vous utilisez BigIntegers, créez-le une seule fois, que vous pourrez ensuite réutiliser. Comme vous le savez peut-être, BigInteger contient des champs statiques pour
ZERO
,ONE
etTEN
. Ainsi, lorsque vous utilisez uniquement ces trois éléments, vous n’avez pas besoin d’un,import
mais vous pouvez les utiliserjava.Math.BigInteger
directement.NOTE: Vous devez utiliser
=null
ainsit
est initialisé pour pouvoir utilisert.
.Parfois, vous pouvez ajouter plusieurs BigIntegers pour en créer un autre afin de sauvegarder des octets. Alors disons que vous voulez avoir les BigIntegers
1,10,12
pour une raison quelconque:Comme correctement souligné dans les commentaires, l'astuce avec
BigInteger t=null;
ses appels de méthode statique peut également être utilisée avec d'autres classes.Par exemple, cette réponse de 2011 peut être lue:
getBytes()
au lieu detoCharArray()
Lorsque vous souhaitez effectuer une boucle sur les caractères d'une chaîne, procédez comme suit:
Faire une boucle sur les caractères peut être utile pour les imprimer, les ajouter à une chaîne ou quelque chose de similaire.
Toutefois, si vous utilisez uniquement les caractères pour certains calculs de nombre unicode, vous pouvez remplacer le
char
avecint
, ET vous pouvez le remplacertoCharArray()
pargetBytes()
:Ou même plus court en Java 8+:
En Java 10+, le bouclage sur le caractère à imprimer peut maintenant aussi être effectué sur 22 octets:
Article aléatoire de a
List
:Vérifier si une chaîne contient des espaces de début / fin
Pourquoi cela fonctionne-t-il, alors que
!=
sur Strings, il faut vérifier la référence au lieu de la valeur en Java? CarString#trim
retournera " Une copie de cette chaîne avec les espaces blancs de début et de fin supprimés, ou cette chaîne si elle n'a pas d'espace blanc de début ou de fin . " Je l'ai utilisé, après que quelqu'un me l'ait suggéré, dans ma réponse .Palindrome:
Pour vérifier si une chaîne est un palindrome (en gardant à l'esprit les longueurs paires et impaires des chaînes), il s'agit de la plus courte (
.contains
fonctionne ici car nous savons que la chaîne elle-même et sa forme inversée sont de même longueur):.contains(...)
au lieu de.equals(...+"")
grâce au commentaire de @assylias ici .Soit 0, ou les deux sont 0?
Je pense que la plupart connaissent déjà celui-ci: si vous voulez vérifier si l'un
a
ou l' autreb
est égal à zéro, multipliez-le pour sauvegarder les octets:Et si vous voulez vérifier si les deux
a
etb
sont égaux à zéro, vous pouvez utiliser un opérateur OR, ou les ajouter ensemble si elles sont toujours positives:Pair = 1, impair = -1; ou vice versa
La raison pour laquelle j'ai ajouté ceci était après avoir vu
k+(k%2<1?1:-1)
dans cette réponse :n
Temps de boucle dans le programme completSi nous avons un défi pour lequel un programme complet est obligatoire et que nous devons boucler un nombre de fois spécifique, nous pouvons procéder comme suit:
Il en va de même lorsque nous devons prendre cette plage en entrée:
Merci à @JackAmmo pour ce commentaire .
try-finally au lieu de try-catch (Exception e) lors du retour et quand l'utiliser
Si vous ne pouvez pas utiliser un
throws Exception
mais devez le fairecatch
et y faire quelque chose avant de revenir, vous pouvez utiliser à lafinally
place:En ce qui concerne un exemple d'utilisation d'un
try-catch
, je peux me référer à cette réponse (le crédit pour le golf indirect va à @KamilDrakari ). Dans ce défi, nous devons boucler en diagonale sur une matrice NxM, nous devons donc déterminer si le nombre de colonnes ou le nombre de lignes est le plus bas que notre maximum dans la boucle for (ce qui est assez coûteux en termes d'octets:)i<Math.min(a.length,a[0].length)
. Donc, attraper simplement l'ArrayIndexOutOfBoundsException
utilisationcatch-finally
est plus court que cette vérification, et sauve ainsi des octets:NOTE: Cela a seulement fonctionné à cause de
return r;
l'enfin. On m'a suggéré de modifier la première cellule, comme l'a fait @KamilDrakari dans sa réponse en C # pour économiser des octets. Cependant, en Java, cela signifie que je devrai le modifier enm->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 octets), ce qui augmenterait le nombre d'octets au lieu de diminuer si j'avais pu l'utiliserfinally
.Math.pow (2, n)
Lorsque vous voulez une puissance de 2, une approche un peu sage est beaucoup plus courte:
Combinaison de contrôles binaires et logiques au lieu d'utiliser des parenthèses
Je pense qu'il est bien connu maintenant que
&
et|
peut être utilisé à la place&&
et||
en Java (Boolean) Les contrôles logiques. Dans certains cas, vous souhaiterez quand même utiliser&&
au lieu de&
pour éviter les erreurs, commeindex >= 0 && array[index].doSomething
. Si le&&
serait changé à&
ici, il évaluera toujours la partie où il utilise l'index dans le tableau, provoquant uneArrayIndexOutOfBoundsException
, d'où l'utilisation de&&
dans ce cas à la place de&
.Jusqu'ici, les bases de
&&
/||
vs&
/|
en Java.Lorsque vous voulez vérifier
(A or B) and C
, le plus court peut sembler utiliser les opérateurs binaires comme celui-ci:Toutefois, comme les opérateurs au niveau des bits ont priorité sur les contrôles logiques, vous pouvez combiner les deux pour enregistrer un octet ici:
Utiliser
n+=...-n
au lieu de(long)...
Lorsque vous avez un long comme dans et sortie dans un lambda, par exemple lors de l'utilisation
Math.pow
, vous pouvez enregistrer un octet en utilisant à lan+=...-n
place de(long)...
.Par exemple:
Cela a sauvé un octet dans cette réponse à moi , et même deux octets en combinant
-n-1
à+~n
dans cette réponse à moi .la source
positive integers
? De plus, je ne suis pas sûr que la mise en œuvre de ceil fonctionne .since Java automatically floors on integers
; Je pense que le terme approprié est troncature , pas revêtement de sol .String t="";for(int i=s.length();--i>=0;t+=s.charAt(i));return s.equals(t);
s.equals(new StringBuffer(s).reverse()+"")
c'est assez.Pour jouer au golf qui ne nécessite pas d’entrée, vous pouvez utiliser des blocs statiques et le lancer sans aucune méthode principale, il suffit de le compiler avec Java 6.
la source
java
sur la ligne de commande / dans un fichier manifeste la classe à charger.Nous connaissons tous le bitwise xor (
^
), mais c'est aussi un xor logique.Alors
(a||b)&&!(a&&b)
devient tout simplementa^b
.Nous pouvons maintenant utiliser xor.
En outre , les opérateurs
|
et&
travaillent également , rappelez-vous simplement que la priorité des opérateurs change.la source
&
et|
aussi. Cela peut être utile si vos conditions sont déjà entre parenthèses ou si vous travaillez déjà avec des booléens.!=
place de^
pour xor, et==
pour xnorVous n'êtes pas obligé d'utiliser
Character.toLowerCase(char c)
. Utilisez plutôt(c|32)
. Au lieu d'Character.toUpperCase(char c)
utiliser(c&~32)
. Cela ne fonctionne qu'avec les lettres ASCII.la source
c|~32
aurait tendance à se traduire par -1 ... mieux à utiliserc-32
.Convertir une chaîne en nombre
Il existe plusieurs façons de convertir une chaîne en valeur numérique:
ABC.parseABC :
ABC.valueOf :
ABC.decode :
nouvel ABC :
Ainsi, pour le code-golf, il est préférable d'utiliser le constructeur lors de la conversion d'une chaîne en valeur numérique.
La même chose s'applique à
Double
;Float
; etByte
.Cela ne s'applique pas toujours lorsque vous pouvez réutiliser une primitive déjà présente en tant qu'objet.
Par exemple, supposons que nous avons le code suivant:
Vous pouvez utiliser
.decode
le constructeur plus court en réutilisant le paramètre en tant qu'objet:la source
Ne pas utiliser
Random
!En général, si vous avez besoin de nombres aléatoires,
Random
c'est une façon horrible de s'y prendre *. Mieux vaut utiliser à laMath.random()
place. Pour l'utiliserRandom
, vous devez faire ceci (disons qu'il nous faut unint
):Comparez cela à:
et:
La première méthode prend des
41+15n
caractères (n
c'est le nombre d'appels). La seconde est des25n
personnages, et la troisième est43+7n
.Donc, si vous n'en avez besoin qu'une ou deux fois, utilisez la
Math.random()
méthode inline . Pour trois appels ou plus, vous enregistrez en utilisant une fonction. Soit on enregistre des caractères sur la première utilisation plusRandom
.Si vous utilisez déjà
Math.random()
pourdouble
, rappelez-vous qu’au bout de quatre utilisations, il reste des économies à réaliser:Pour 33 caractères, vous en économiserez 10 à chaque appel de
r()
Mise à jour
Si vous avez besoin d'un entier et que vous souhaitez économiser sur le casting, ne le lancez pas! Java se lance automatiquement si vous effectuez une opération au lieu d'une affectation. Comparer:
* Sauf si vous devez semer le PRNG pour obtenir des résultats prévisibles. Ensuite, je ne vois pas beaucoup de chemin autour de ça.
la source
Random#nextGaussian
cependant.(int)(Math.random()*9)
biais modulo est très faible, carMath.random()
renvoie 2 53 valeurs possibles et 2 53 n'est pas un multiple de 9. La probabilité de chaque nombre est inférieure à 1/9 plus ou moins 5 / (9 * 2 ** 53), une erreur si petite, c'est presque exactement 1/9.9
juste à titre d'exemple, cela pouvait être n'importe quoi. Je suis relativement sûr quenextInt()
(ou toute autreRandom
méthode) présente également un léger biais, juste en raison du fonctionnement du PRNG de Java.new java.util.Random().nextBoolean()
vous pouvez utiliserMath.random()<.5
.Je ne sais pas si vous considéreriez ce Java «pur», mais Processing vous permet de créer des programmes avec une configuration initiale réduite (terminée automatiquement).
Pour la sortie de la console, vous pouvez avoir quelque chose d'aussi simple que:
pour la sortie graphique, un peu plus:
la source
size
du tout; il utilisera par défaut un carré de 100 x 100 pixels. Dans la plupart des systèmes d’exploitation, le cadre qui l’entoure sera environ deux fois plus grand, avec le carré centré et le reste de la zone rempli de contenu pris sur le bureau.setup()
etdraw()
utiliser le "mode statique". Vous pouvez également utiliser des couleurs hexadécimales à 6 chiffres et l'interprète les modifiera, ce qui est parfois payant (#FF8000
<255,128,0
), et si vous utilisez l'échelle de gris, vous ne devez spécifier qu'un seul nombre (255
<255,255,255
)Raccourcissement de retour
Vous pouvez raccourcir les instructions de retour de chaînes par un octet avec:
à
Et, si vous commencez votre déclaration de retour par une parenthèse, vous pouvez faire la même chose avec elles:
à
Je suppose que les citations sont considérées comme des parenthèses? En fait, j’ai pris cela au sérieux grâce à AppleScript et j’ai pensé que cela valait la peine d’être mentionné.
la source
return-n;
au lieu dereturn -n;
ou à lareturn~n;
place dereturn ~n;
. Outre les guillemets simples au lieu des guillemets doubles:return'A';
N'ayez pas peur d'utiliser la notation scientifique
Si vous avez affaire à des doubles ou à des flottants, vous pouvez utiliser la notation scientifique pour les nombres. Donc, au lieu d'écrire,
double a=1000
vous pouvez le changerdouble a=1e3
pour sauvegarder 1 octet.la source
Essayez d'utiliser
int
au lieu deboolean
Dans certains cas, j'ai constaté qu'il est plus court de renvoyer une valeur entière à partir d'une méthode qui normalement renverrait un booléen, de la même manière que ce qui pourrait être fait dans les programmes C.
Dès le départ, la taille
int
est 4 octets plus courte queboolean
. Chaque fois que vous écrivez à lareturn 0
place dereturn 1<0
, vous enregistrez 2 octets supplémentaires et la même chose pourreturn 1
overreturn 1>0
.Le piège est que chaque fois que vous voulez utiliser la valeur de retour directement comme un booléen, cela coûte 2 octets (
if(p(n))
v.if(p(n)>0)
). Ceci peut être compensé par l'utilisation de l'arithmétique booléenne. Étant donné un scénario artificiel où vous voulez écrirevous pouvez plutôt écrire
afin d'économiser 2 octets.
la source
0
et1
ne constituent pas faux / vrai en Java (et JLS ne les considère pas comme ça non plus ). Donc, si le golf demande spécifiquement la vérité / la fausseté, vous devez le booleaniser (et, malheureusement, en faire uneboolean
fonction, en jetant encore plus d'octets).t[0]+=p(n):10?0;
Est-ce même valable?t[0]+=p(n)?10:0;
. (Je l'ai édité.)Si vous utilisez enum au lieu de classe , vous enregistrez un caractère.
Mais vous devez introduire au moins une instance enum (F, G, H dans cet exemple) qui doivent être rentables.
la source
enum M{;public static void main(String[]a){...}
sans problèmes.class M{
est exactement la même longueur queenum M{;
. Dans ce cas, j'irais avecclass
parce que c'est plus joli (IMO)enum{
travaillé sans un;
après; c'est le seul IDE gémissant qu'il y ait une erreur mais le compilateur l'accepteQuand vous avez une méthode qui devrait retourner un
boolean
ouBoolean
, c'est-à-dire:Vous pouvez changer le type
boolean
/Boolean
returnObject
pour enregistrer 1 octet:De plus, comme vous l'avez peut-être remarqué, vous pouvez utiliser une
<1
vérification au lieu de==0
sauvegarder un octet. Bien que ce soit plus un conseil de code-golf général au lieu de spécifique à Java.Ceci est principalement utilisé lorsque le nombre entier ne peut pas être négatif, comme pour vérifier la longueur:
au lieu de
la source
c(-21)
retournetrue
avec le fichier actuel.c(-20)
au lieu de-21
?-21 % 5 = 4
et-20 % 5 = 0
.-21
.-21 % 5 != 4
en Java, ce qui est mon point. Le divisible par cinq fonction serait fonctionner correctement si le module toujours retourné non-négatif, mais il ne fonctionne pas. Voir cet exemple d'extrait .%
, j'ai donc oublié que Java renvoie le reste au lieu du module, d'où la différence ..Comment dessiner en Java ...
Voici la plaque de chaudière de peinture GUI la plus courte possible:
Golfé pour 111 octets:
la source
Éviter
StringBuilder
sAjouter des éléments à a
String
prend beaucoup moins d'octets.Si vous devez inverser une chaîne et l’imprimer immédiatement, utilisez a
StringBuffer
.Si vous devez inverser une chaîne et faire autre chose que de l’imprimer, utilisez une
for
boucle chaque.la source
StringBuffer
pour l’inversion de chaînes.String b="";for(char c:"Hello, World!".toCharArray()){b=c+b;}
{}
de cette boucle foreach si vous utilisez cette méthode.String s:"".split("")
au lieu dechar c:"".toCharArray()
.java.util.stream.Stream
déjà importé et si vous devez chaîner un autre appel vers le résultat (du typeB.chartAt(42)
) ou si vous devez simplement transmettre le résultat à une fonction (du typef(B)
), utilisezfor(:)
est égal àStream.of("Hello, World!".split("")).reduce("",(a,b)->b+a)
.String b=new StringBuffer("Hello, World!").reverse()+"";
(.toString
remplacé par+""
), et votre deuxième ligne peut devenir:String B="";for(String c:"Hello, World!".split(""))B=c+B;
(char
toString
et.toCharArray()
to.split("")
).Utiliser Java 10
var
Si vous définissez une seule variable d'un type spécifique, utilisez
var
.Exemples
Non utilisable dans les exemples suivants
var
ne peut pas être utilisé dans de nombreux exemplesla source
Dans la plupart des cas, votre programme sera mono-thread, c'est-à-dire qu'un seul thread sera en cours d'exécution. Vous pouvez exploiter ce fait en
return
utilisant la méthode principale lorsque vous devez quitter instantanément.Comparez-le à "correctement" terminer le programme:
Ou pointant vers
null
:Ou en divisant par 0:
la source
Parfois, une seule instruction for-loop peut être remplacée. Considérons le code suivant:
Ceci est une simple boucle for qui est une solution à cette question .
Puisque nous savons que
i
cela ne sera pas assez important pour causer des erreurs StackOverflow, nous pouvons remplacer la boucle for par une récursivité:Nous pouvons simuler une boucle en utilisant un opérateur ternaire dans l'instruction return pour provoquer la récursivité.
Cette réduction est assez spécifique, mais je peux imaginer plus de situations où cela serait utile.
la source
En utilisant
...
(varags) comme paramètreDans certains cas, il est plus court d’utiliser un varargs Java en tant que paramètre plutôt que des paramètres non structurés.
Par exemple:
Serait le plus joué au golf à ceci:
Mais peut être joué un octet supplémentaire à ceci:
Notez que les trois entiers ne sont accessibles qu'une seule fois dans la méthode elle-même. Comme il
int
est assez court, il n’est utile que de les utiliser une seule fois dans la méthode et d’en avoir trois ou plus comme paramètre.Avec des paramètres plus longs, cela est généralement plus utile. Par exemple, c’était ma réponse initiale à ce défi (calculer les occurrences du caractère saisi dans la chaîne de saisie):
Et on m'a recommandé de jouer au golf à ceci:
Mais j'ai fini par y mettre le golf en utilisant
...
:NOTE: Si la question / défi demande une entrée flexible,
...
on peut[]
bien sûr le raccourcir . Si la question / défi demande spécifiquement, disons, troisString
entrées et interdit unString
tableau contenant trois valeurs, vous pouvez utiliser à laString...
place deString a,String b,String c
.la source
String[]
au lieu d'utiliser varargs? (sauvegarde 1 octet de plus)