Gibt es nützliche Verknüpfungen, die in Java verwendet werden können?
Wie unten gezeigt, werden import
einem Programm bereits mindestens 17 Zeichen hinzugefügt.
import java.io.*;
Ich verstehe, dass die einfache Lösung darin besteht, eine andere Sprache zu verwenden, aber es scheint eine echte Herausforderung zu sein, Java-Programme zu verkürzen.
Tipps sollten spezifisch für Java sein: Wenn sie auf die meisten C-ähnlichen Sprachen anwendbar sind, gehören sie in die allgemeinere Liste der Tipps .
package
kann übersprungen werden.Antworten:
Verwenden Sie das neueste Java. Java 8 können Sie Lambda - Ausdrücke verwenden, so ist es , wenn Sie alles selbst brauchen wie funktionale Objekte.
Definieren Sie verkürzte Funktionen für Dinge, die Sie häufig verwenden. Beispielsweise müssen Sie hundert Anrufe tätigen
exampleClassInstance.doSomething(someParameter)
, eine neue Funktion definierenvoid d(ParameterType p){exampleClassInstance.doSomething(p)}
und sich damit einige Zeichen sparen.Wenn Sie einen bestimmten langen Klassennamen mehrmals verwenden, z
definieren Sie stattdessen eine neue Klasse:
Wenn Sie nur eine bestimmte Methode dieser Klasse verwenden (diese aber immer noch instanziieren müssen), können Sie gleichzeitig eine verkürzte Version in der neuen Klasse definieren.
Verwenden Sie Funktionstyp-Parameter, um Dinge zu verkürzen, wo dies möglich ist:
Verwenden Sie
for(;;)
anstelle vonwhile(true)
.Verwenden Sie keine Zugriffsmodifikatoren, es sei denn, dies ist unbedingt erforderlich.
Verwenden Sie
final
für nichts.Setzen Sie niemals einen Block hinter eine
for
Schleife (aber eine foreach-Schleifefor(x:y)
ist anders). Zusätzliche Anweisungen sollten wie folgt in diefor
Anweisung selbst eingefügt werdenfor(int i=0;i<m;a(i),b(++i))c(i);
.Verwenden Sie Inline-Zuweisung, Inkrementierung und Instantiierung. Verwenden Sie gegebenenfalls anonyme Inline-Klassen. Verwenden Sie nach Möglichkeit stattdessen Lambdas. Funktionsaufrufe verschachteln. Es ist garantiert, dass einige Funktionen ihr übergeordnetes Objekt zurückgeben. Diese Funktionen sind sogar dazu gedacht , miteinander verkettet zu werden.
Ihre
main
Methodethrows Exception
fängt sie nicht.Error
ist kürzer alsException
. Wenn Sie aus irgendeinem Grund wirklichthrow
Nachrichten auf dem Stack benötigen , verwenden Sie eineError
, auch wenn dies eine ganz normale Situation ist.Wenn eine Bedingung eine sofortige Kündigung erfordert, verwenden Sie
int a=1/0;
stattthrow null;
oderSystem.exit(0);
. Zur Laufzeit wirft dies eineArithmeticException
. Wenn Sie bereits eine numerische Variable in Ihrem Code haben, verwenden Sie sie stattdessen. (Wenn Sie bereits habenimport static java.lang.System.*;
, gehen Sie mitexit(0);
.)Anstatt Schnittstellen wie zu implementieren
List<E>
, erweitern Sie eine untergeordnete Klasse wieAbstractList<E>
, die Standardimplementierungen der meisten Methoden bereitstellt und nur die Implementierung von erfordert ein paar Schlüsselstücke.Schreiben Sie Ihren Code zuerst in Langschrift mit Zeilenumbrüchen, Einrückungen und vollständigen Variablennamen. Sobald Sie über Arbeitscode verfügen, können Sie Namen kürzen, Deklarationen verschieben und Verknüpfungsmethoden hinzufügen. Wenn Sie es von Anfang an aufschreiben, erhalten Sie mehr Gelegenheit, das Programm insgesamt zu vereinfachen.
Vergleichen Sie alternative Optimierungen mit einem Codeteil, da sich die optimalste Strategie mit sehr kleinen Änderungen am Code dramatisch ändern kann. Zum Beispiel:
Arrays.sort(a)
ist es am effizientesten, ihn mit seinem vollqualifizierten Namen anzurufenjava.util.Arrays.sort(a)
.void s(int[]a){java.util.Arrays.sort(a);}
. Dies sollte in diesem Fall immer noch den vollqualifizierten Namen verwenden. (Wenn Sie mehr als eine Überlastung benötigen, machen Sie es wahrscheinlich falsch.)for
Schleife beim Golfen, da keine leicht zugängliche Bibliotheksmethode vorhanden ist), könnenArrays.copyOf
Sie die Aufgabe ausführen. Wenn mehr als eine Methode verwendet wird und 3 oder mehr Aufrufe vorhanden sind,import static java.util.Arrays.*;
ist dies die effizienteste Methode, um auf diese Methoden zu verweisen. Danachsort
sollten Sie nur dann eine Abkürzungsmethode verwenden , wenn Sie mehr als 8 separate Anrufe haben, und nur bei 5 oder mehr Anrufen ist eine Abkürzung gerechtfertigtcopyOf
.Die einzige Möglichkeit, eine solche Analyse für Code durchzuführen, besteht darin, potenzielle Änderungen an Kopien des Codes vorzunehmen und die Ergebnisse dann zu vergleichen.
Vermeiden Sie die Verwendung der
someTypeValue.toString();
Methode, sondern hängen Sie sie einfach ansomeTypeValue+""
.Wenn Sie Windows benötigen, verwenden Sie nicht Swing, sondern AWT (es sei denn, Sie benötigen wirklich etwas von Swing). Vergleichen
import javax.swing.*;
undimport java.awt.*;
. Zusätzlich Komponenten in Swing haben eineJ
voran ihren Namen (JFrame
,JLabel
usw.), aber Komponenten in AWT nicht (Frame
,Label
usw.)quelle
Verwenden Sie
interface
anstelle vonclass
.In Java 8 wurden statische Methoden zu Interfaces hinzugefügt. In Interfaces sind standardmäßig alle Methoden öffentlich. Folglich
kann jetzt auf gekürzt werden
das ist offensichtlich kürzer.
Zum Beispiel habe ich diese Funktion in der Hello, World! Herausforderung.
quelle
Mit varargs können Sie einen Parameter in ein Array desselben Typs " umwandeln ":
Anstatt von
quelle
Bei einem statischen Import :
Sie können später einige Boilerplate speichern, aber Sie benötigen mehrere Aufrufe, um eine Auszahlung zu erreichen:
quelle
Java
!import static java.lang.System.*
.var o=System.out;
das nur zweimal verwendet werden muss, bevor es sich auszahltvar o=System.out.println
funktionieren?Das Argument to
main
muss nicht aufgerufen werdenargs
, und Sie können Leerzeichen entfernen:wird gut tun.
quelle
Wenn Sie jemals die booleschen Ausdrücke
true
oder verwenden müssenfalse
, ersetzen Sie sie durch1>0
und1<0
.Zum Beispiel:
Dieses lineare Suchbeispiel kann auf reduziert werden
quelle
true/false
, fügen Sie einfach hinzuboolean t=1>0,f=1<0;
.1>0
Verwendent
und speichern Sie dann stattdessen zwei Zeichen pro Verwendung. Die Auszahlungsmethode1>0
kommt bei 10 Einsätzen.boolean t=1>0,f=!t;
- Ein Zeichen kürzer!true
/false
direct sowieso vermeiden :f|=a[i++]==42;
Spart ziemlich viel.boolean
wurden. Da ich zum Zeitpunkt des Schreibens jedoch keine Beispiele finden konnte (ich programmiere normalerweise nicht in Java), habe ich nur ein einfaches Beispiel geschrieben.Wenn Sie eine Methode häufig verwenden, weisen Sie deren residente Klasse einer Variablen zu. Weisen Sie beispielsweise
System.out
einer Variablen zu:Auch für
Integer.parseInt()
:Dies wird mit ziemlicher Sicherheit eine ide-Warnung über den Zugriff auf statische Methoden von Variablen auslösen.
quelle
((Integer)1).parseInt("1")
funktioniert auch.new Integer("1")
ist noch kürzer. Mit seiner Antwort meinte Justin jedoch, dass Sie bereits vorhandene Variablen für statische Aufrufe wiederverwenden können. Wie ich am Ende dieser Antwort erkläre.Anstatt die
import static java.lang.System.*
Technik zum Speichern vonprintln()
Anweisungen zu verwenden, habe ich festgestellt, dass das Definieren der folgenden Methode beim Speichern von Zeichen viel effektiver ist:Dies liegt daran, dass es aufgerufen werden kann,
p(myString)
anstattout.println(myString)
dass es eine viel schnellere und dramatischere Charakterauszahlung hat.quelle
Dies mag offensichtlich erscheinen, für einige
Math
Funktionen gibt es jedoch kürzere Optionen :quelle
Wenn Sie
Integer.MAX_VALUE
(2147483647) benötigen , verwenden Sie-1>>>1
.Integer.MIN_VALUE
(-2147483648) ist besser geschrieben1<<31
.quelle
Wenn Sie eine Zahl aus einem Argument (oder einer anderen Zeichenfolge) abrufen müssen, sehen Sie normalerweise Folgendes:
Viele Male, dass Sie nicht brauchen ein
Integer
. Viele Herausforderungen verbrauchen keine großen Zahlen. DaShort
undByte
werden beide zu einem Unboxint
, verwenden Sie die besser geeignetevalueOf()
statt und sparen Sie ein paar Bytes.Behalten Sie jedoch Ihre tatsächliche Variable als bei
int
, da sie kürzer als beide istbyte
undshort
:Wenn Sie dies für mehrere Zahlen tun müssen, können Sie mit dieser Methode kombinieren :
quelle
int n=new Byte(a[0]);
ist drei kürzer. Wenn die Zahl größer sein könnte, verwenden Sielong n=new Long(a[0])
, es istint
in den meisten Fällen immer noch besser als s.Nicht verwenden
public class
. Die Hauptmethode muss öffentlich sein, die Klasse jedoch nicht. Dieser Code funktioniert:Sie können laufen
java S
, obwohlclass S
es keine öffentliche Klasse ist. ( Update: Ich habe Java 7 verwendet, als ich diesen Tipp geschrieben habe. In Java 8 sollte sich Ihre Hauptmethode in einer Schnittstelle befinden . In Java 5 oder 6 sollte sich Ihre Hauptmethode in einer Aufzählung befinden .)Viele Java-Programmierer wissen das nicht! Ungefähr die Hälfte der Antworten auf eine Stapelüberlauf-Frage zu main in einer nicht öffentlichen Klasse besagen fälschlicherweise, dass die main-Methode in einer öffentlichen Klasse sein muss. Jetzt weißt du es besser. Löschen Sie die
public
inpublic class
und 7 Zeichen speichern.quelle
interface s{static void main(String[]...
ist kürzer, es sei denn, Sie haben Java vor 1.8 als Ziel angegeben. Wenn Sie eine kompilierbare Quelldatei und Hauptmethode haben müssen. Da in einer Java 1.8-Schnittstelle alle Methoden öffentlich sind, können Sie den Modifikator für die Methode (n) überspringen.Einige kleine Code-Golftipps
Diese Tipps waren etwas zu klein für eine separate Antwort. Daher verwende ich diese Antwort für sehr kleine Codegolf-Tipps, die ich gefunden oder mir ausgedacht habe und die in den anderen Tipps noch nicht erwähnt sind:
Entfernen des letzten Zeichens eines Strings:
In einigen Fällen wissen Sie vorher, was das letzte Zeichen ist, und Sie wissen auch, dass dieses Zeichen nur einmal in der Zeichenfolge vorkommt. In diesem Fall können Sie
.split
stattdessen Folgendes verwenden:Codierungsverknüpfungen:
Alle Kodierungen haben einen kanonischen Namen, der in der
java.nio
API verwendet wird, sowie einen kanonischen Namen, der in den APIsjava.io
und verwendet wirdjava.lang
. Hier ist eine vollständige Liste aller unterstützten Codierungen in Java. Verwenden Sie also immer die kürzeste von beiden. Die Sekunde ist normalerweise kürzer (wieUTF-8
vsutf8
,Windows-1252
vsCp1252
usw.), aber nicht immer (UTF-16BE
vsUnicodeBigUnmarked
).Zufälliger Boolescher Wert:
Primes:
Es gibt viele verschiedene Möglichkeiten, nach Primzahlen zu suchen oder alle Primzahlen abzurufen , aber die Antwort von @ SaraJ ist hier die kürzeste. Hier ist ein Copy-Paste als Referenz:
HINWEIS: Normalerweise können Sie es mit anderen vorhandenen Loops zusammenführen, je nachdem, wie Sie es verwenden möchten, sodass Sie keine separate Methode benötigen. Dies hat zum Beispiel eine Menge Bytes in dieser Antwort gespart .
Integer-Kürzung anstelle von Math.floor / Math.ceil:
Wenn Sie mit positiven Doppel / Schwimmer und Sie wollen
floor
sie nicht verwenden ,Math.floor
sondern eine Verwendung(int)
-Cast statt (da Java auf ganze Zahlen kürzt):Der gleiche Trick kann stattdessen auf negative Doubles / Floats angewendet
ceil
werden:Verwenden
&1
anstelle von%2
, um Klammern zu entfernen:Da die Operatorpräzision von
&
niedriger ist als die standardmäßigen arithmetischen Operatoren wie*/+-
und%
, können Sie in einigen Fällen Klammern entfernen.Beachten Sie, dass dies bei Booleschen Prüfungen nicht wirklich hilfreich ist, da Sie dann immer noch Klammern benötigen. Sie sind nur ein wenig verschoben:
BigInteger und Erstellen von Variablen für statische Methodenaufrufe:
Wenn Sie BigIntegers verwenden, erstellen Sie es nur einmal und können es dann wiederverwenden. Wie Sie vielleicht wissen, enthält BigInteger statische Felder für
ZERO
,ONE
undTEN
. Wenn Sie also nur diese drei verwenden, benötigen Sie keinimport
, können es aberjava.Math.BigInteger
direkt verwenden.HINWEIS: Sie müssen verwenden,
=null
damitt
initialisiert wird, um zu verwendent.
.Manchmal können Sie mehrere BigInteger hinzufügen, um weitere zu erstellen und Bytes zu sparen. Nehmen wir also an, Sie möchten
1,10,12
aus irgendeinem Grund die BigIntegers haben :Wie in den Kommentaren richtig ausgeführt, kann der Trick mit
BigInteger t=null;
seinen statischen Methodenaufrufen auch für andere Klassen verwendet werden.Zum Beispiel kann diese Antwort von 2011 gespielt werden:
getBytes()
Anstatt vontoCharArray()
Wenn Sie die Zeichen eines Strings durchlaufen möchten, gehen Sie normalerweise folgendermaßen vor:
Das Durchlaufen der Zeichen kann nützlich sein, wenn Sie sie drucken oder an eine Zeichenfolge oder ähnliches anhängen.
Wenn Sie jedoch nur die Zeichen für einige Unicode-Nummer Berechnungen verwenden, können Sie die ersetzen
char
mitint
und kann Sie ersetzentoCharArray()
mitgetBytes()
:Oder noch kürzer in Java 8+:
In Java 10+ kann das zu druckende Zeichen jetzt auch in 22 Bytes durchlaufen werden:
Zufälliger Artikel von einem
List
:Überprüfen Sie, ob ein String führende / nachfolgende Leerzeichen enthält
Warum funktioniert das, wenn
!=
bei Strings auf Referenz anstatt auf Wert in Java geprüft werden soll? Denn esString#trim
wird zurückgegeben: " Eine Kopie dieser Zeichenfolge mit entferntem führenden und nachfolgenden Leerzeichen oder diese Zeichenfolge, wenn sie kein führendes oder nachfolgendes Leerzeichen enthält . " Ich habe dies in meiner Antwort verwendet, nachdem mir jemand dies vorgeschlagen hat .Palindrom:
Um zu überprüfen, ob es sich bei einer Zeichenfolge um ein Palindrom handelt (wobei sowohl gerade als auch ungerade Längen von Zeichenfolgen berücksichtigt werden), ist dies die kürzeste (
.contains
funktioniert hier, weil wir wissen, dass sowohl die Zeichenfolge selbst als auch ihre umgekehrte Form gleich lang sind):.contains(...)
statt.equals(...+"")
danke an @assylias 'Kommentar hier .Entweder ist 0 oder beide sind 0?
Ich denke, die meisten kennen dieses bereits: Wenn Sie überprüfen möchten, ob entweder
a
oderb
Null ist, multiplizieren Sie stattdessen, um Bytes zu sparen:Und wenn Sie überprüfen möchten, ob beide
a
undb
Null sind, können Sie ein bitweises ODER verwenden oder sie addieren, wenn sie immer positiv sind:Gerade = 1, ungerade = -1; oder umgekehrt
Der Grund, warum ich dies hinzufüge, war, nachdem ich
k+(k%2<1?1:-1)
in dieser Antwort gesehen habe :Wiederholungszeiten
n
im vollen ProgrammWenn wir eine Herausforderung haben, bei der ein vollständiges Programm obligatorisch ist und wir eine bestimmte Anzahl von Wiederholungen durchführen müssen, können wir Folgendes tun:
Gleiches gilt, wenn wir diesen Bereich als Eingabe verwenden müssen:
Dank an @JackAmmo in diesem Kommentar .
try-finally anstelle von try-catch (Ausnahme e) bei der Rückgabe und wann es verwendet werden soll
Wenn Sie a nicht verwenden können,
throws Exception
abercatch
etwas damit tun müssen, bevor Sie zurückkehren, können Siefinally
stattdessen Folgendes verwenden:Als Beispiel für die Verwendung von a
try-catch
kann ich auf meine Antwort verweisen (Gutschrift für das indirekte Golf geht an @KamilDrakari ). In dieser Herausforderung müssen wir eine NxM-Matrix diagonal durchlaufen, um zu bestimmen, ob die Anzahl der Spalten oder der Zeilen als unser Maximum in der for-Schleife am niedrigsten ist (was in Bezug auf Bytes recht teuer ist:)i<Math.min(a.length,a[0].length)
. Das einfache Abfangen derArrayIndexOutOfBoundsException
Verwendungcatch-finally
ist also kürzer als diese Prüfung und spart somit Bytes:ANMERKUNG: Dies funktionierte nur wegen der
return r;
im Endeffekt. Es wurde mir vorgeschlagen, die erste Zelle zu ändern, wie es @KamilDrakari in seiner C # -Antwort getan hat , um Bytes zu sparen. In Java bedeutet dies jedoch, dass ich es inm->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 Bytes) ändern muss , um die Anzahl der Bytes zu erhöhen, anstatt sie zu verringern, wenn ich sie hätte verwenden könnenfinally
.Math.pow (2, n)
Wenn Sie eine Potenz von 2 wollen, ist ein bitweiser Ansatz viel kürzer:
Kombinieren Sie bitweise und logische Prüfungen, anstatt Klammern zu verwenden
Ich denke , es ist bekannt durch die jetzt
&
und|
kann anstelle verwendet werden&&
und||
in Java (boolean) logischen Kontrollen. In einigen Fällen möchten Sie jedoch trotzdem Fehler vermeiden,&&
anstatt diese zu verwenden . Wenn das würde geändert werden hier, wird es noch die Rolle zu bewerten , wo es um den Index in dem Array verwendet, wodurch eine , daher die Verwendung von in diesem Fall statt .&
index >= 0 && array[index].doSomething
&&
&
ArrayIndexOutOfBoundsException
&&
&
Bisher die Grundlagen von
&&
/||
vs&
/|
in Java.Wenn Sie prüfen möchten,
(A or B) and C
scheint der kürzeste die folgenden bitweisen Operatoren zu verwenden:Da jedoch die bitweisen Operatoren Vorrang vor den logischen Prüfungen haben, können Sie beide kombinieren, um hier ein Byte zu speichern:
Verwenden Sie
n+=...-n
anstelle von(long)...
Wenn Sie zum Beispiel bei der Verwendung eine lange Ein- und Ausgabe in einem Lambda haben,
Math.pow
können Sie ein Byte speichern, indem Sien+=...-n
anstelle von verwenden(long)...
.Zum Beispiel:
Das sparte ein Byte in dieser Antwort von mir , und sogar zwei Bytes , die durch die Kombination von
-n-1
zu+~n
in von mir diese Antwort .quelle
positive integers
? Ich bin mir auch nicht sicher, ob die Ceil-Implementierung funktioniert .since Java automatically floors on integers
; Ich denke, der richtige Begriff ist Verkürzung , nicht Bodenbelag .String t="";for(int i=s.length();--i>=0;t+=s.charAt(i));return s.equals(t);
s.equals(new StringBuffer(s).reverse()+"")
ist genug.Für das Golfen, für das keine Eingabe erforderlich ist, können Sie statische Blöcke verwenden und es ohne Hauptmethode problemlos ausführen. Kompilieren Sie es einfach mit Java 6.
quelle
java
in der Befehlszeile / in einer Manifestdatei angeben, welche Klasse geladen werden soll.Wir alle kennen das bitweise xor (
^
), aber es ist auch ein logisches xor.So wird
(a||b)&&!(a&&b)
einfacha^b
.Jetzt können wir xor verwenden.
zusätzlich müssen die Operatoren
|
und&
auch die Arbeit daran denken, dass sich die Rangfolge der Operatoren ändert.quelle
&
und|
auch verwenden. Dies kann hilfreich sein, wenn Ihre Bedingungen bereits in Klammern angegeben sind oder wenn Sie bereits mit Booleschen Werten arbeiten.!=
anstelle von^
für xor und==
für xnorSie müssen nicht verwenden
Character.toLowerCase(char c)
. Verwenden Sie stattdessen(c|32)
. Anstatt zuCharacter.toUpperCase(char c)
benutzen(c&~32)
. Dies funktioniert nur mit ASCII-Buchstaben.quelle
c|~32
würde tendenziell zu -1 führen ... besser zu verwendenc-32
.Konvertiere String in Zahl
Es gibt mehrere Möglichkeiten, einen String in einen numerischen Wert zu konvertieren:
ABC.parseABC :
ABC.valueOf :
ABC.decode :
neues ABC :
Für Code-Golf ist es daher am besten, den Konstruktor zu verwenden, wenn Sie einen String in einen numerischen Wert konvertieren.
Gleiches gilt für
Double
;Float
; undByte
.Dies gilt nicht immer, wenn Sie ein bereits vorhandenes Grundelement als Objekt wiederverwenden können.
Nehmen wir als Beispiel an, wir haben den folgenden Code:
Sie können
.decode
anstelle des kürzeren Konstruktors auch den Parameter als Objekt verwenden:quelle
Nicht verwenden
Random
!Wenn Sie Zufallszahlen benötigen,
Random
ist dies im Allgemeinen ein schrecklicher Weg *. Viel besser zu benutzenMath.random()
. Um zu verwendenRandom
, müssen Sie dies tun (sagen wir, wir brauchen eineint
):Vergleichen Sie das mit:
und:
Die erste Methode akzeptiert
41+15n
Zeichen (n
Anzahl der Anrufe). Der zweite ist25n
Zeichen, und der dritte ist43+7n
.Wenn Sie es also nur ein- oder zweimal benötigen, verwenden Sie die Inline-
Math.random()
Methode. Bei drei oder mehr Anrufen speichern Sie mithilfe einer Funktion. Entweder speichert man Zeichen bei der ersten Verwendung überRandom
.Wenn Sie bereits
Math.random()
für verwendendouble
, denken Sie daran, dass es bei vier Verwendungszwecken immer noch eine Ersparnis ist, dies herauszuholen:Bei 33 Zeichen sparen Sie 10 bei jedem Anruf an
r()
Aktualisieren
Wenn Sie eine Ganzzahl benötigen und beim Casting sparen möchten, casten Sie sie nicht! Java-Auto-Casts, wenn Sie eine Operation anstelle einer Zuweisung ausführen. Vergleichen Sie:
* Es sei denn, Sie müssen den PRNG-Wert festlegen, um vorhersehbare Ergebnisse zu erzielen. Dann sehe ich kaum einen Ausweg.
quelle
Random#nextGaussian
.(int)(Math.random()*9)
die Modulo-Verzerrung sehr klein ist, da sieMath.random()
2 53 mögliche Werte zurückgibt und 2 53 kein Vielfaches von 9 ist. Die Wahrscheinlichkeit für jede Zahl liegt bei 1/9 plus oder minus 5 / (9 * 2 ** 53). Ein Fehler, der so klein ist, dass er fast genau 1/9 beträgt.9
nur als Beispiel verwendet, es könnte alles sein. Ich bin mir relativ sicher, dassnextInt()
(oder eine andereRandom
Methode) auch eine geringe Tendenz aufweist, nur weil Java PRNG funktioniert.new java.util.Random().nextBoolean()
können Sie verwendenMath.random()<.5
.Ich weiß nicht, ob Sie dieses "reine" Java in Betracht ziehen würden, sondern die Verarbeitung ermöglicht es Ihnen, Programme mit wenig anfänglicher Einrichtung (automatisch abgeschlossen) zu erstellen.
Für die Konsolenausgabe können Sie Folgendes verwenden:
für die grafische Ausgabe etwas mehr:
quelle
size
; Standardmäßig wird ein Quadrat von 100 x 100 Pixel verwendet. In den meisten Betriebssystemen ist der Rahmen ungefähr doppelt so groß, wobei das Quadrat zentriert ist und der Rest des Bereichs mit Inhalten gefüllt ist, die vom Desktop stammen.setup()
unddraw()
den "statischen Modus" verwenden. Sie können auch 6-stellige Hex-Farben verwenden. Der Interpreter ändert diese, was sich manchmal auszahlt (#FF8000
<255,128,0
). Wenn Sie Graustufen verwenden, muss nur eine Zahl angegeben werden (255
<255,255,255
)Verkürzung der Rückkehr
Sie können return-Anweisungen von Strings durch ein Byte verkürzen mit:
zu
Und wenn Sie Ihre return-Anweisung zufällig mit einer Klammer beginnen, können Sie dasselbe mit ihnen tun:
zu
Ich denke, Zitate gelten als Klammer? Ich habe das tatsächlich über AppleScript aufgegriffen und dachte, es wäre erwähnenswert.
quelle
return-n;
stattreturn -n;
oderreturn~n;
stattreturn ~n;
. Sowie einfache statt doppelte Anführungszeichen:return'A';
Haben Sie keine Angst, wissenschaftliche Notation zu verwenden
Wenn Sie es mit Doubles oder Floats zu tun haben, können Sie die wissenschaftliche Notation für Zahlen verwenden. Anstatt also zu schreiben
double a=1000
, können Sie es in änderndouble a=1e3
, um 1 Byte zu sparen.quelle
Versuchen Sie es mit
int
anstelle vonboolean
In einigen Fällen habe ich festgestellt, dass es kürzer ist, einen Ganzzahlwert von einer Methode zurückzugeben, die normalerweise einen Booleschen Wert zurückgibt, ähnlich wie dies in C-Programmen möglich ist.
Auf Anhieb
int
sind 4 Bytes kürzer alsboolean
. Jedes Mal , wenn Sie schreibenreturn 0
stattreturn 1<0
, sparen Sie zusätzlich 2 Bytes und das gleiche gilt fürreturn 1
überreturn 1>0
.Der Nachteil hierbei ist, dass jedes Mal, wenn Sie den Rückgabewert direkt als Booleschen Wert verwenden möchten, 2 Byte (
if(p(n))
v.if(p(n)>0)
) Anfallen . Dies kann durch Verwendung von Boolescher Arithmetik ausgeglichen werden. In einem erfundenen Szenario, in dem Sie schreiben möchtendu kannst stattdessen schreiben
um 2 Bytes zu sparen.
quelle
0
und1
in Java nicht falsch / wahr ist (und das JLS betrachtet sie auch nicht so). Wenn der Golf also speziell nach Wahrhaftigkeit / Falschheit fragt, müssen Sie ihn booleanisieren (und ihn leider zu einerboolean
Funktion machen, indem Sie noch mehr Bytes darauf werfen).t[0]+=p(n):10?0;
Ist das überhaupt gültig?t[0]+=p(n)?10:0;
. (Ich habe es bearbeitet.)Wenn Sie enum anstelle von class verwenden , speichern Sie ein Zeichen.
Sie müssen jedoch mindestens eine Enum-Instanz (in diesem Beispiel F, G, H) einführen, die sich selbst auszahlen muss.
quelle
enum M{;public static void main(String[]a){...}
ohne Probleme gemacht.class M{
ist genau so lang wieenum M{;
. In diesem Fall würde ich mit dem gehen,class
weil es schöner ist (IMO)enum{
hat es ohne;
nachher geklappt; Es ist nur die IDE stöhnt, dass es einen Fehler gibt, aber der Compiler akzeptiert esWenn Sie eine Methode haben, die ein
boolean
oder zurückgeben sollBoolean
, dh:Sie können den
boolean
/Boolean
return-Typ ändernObject
, um 1 Byte zu sparen:Darüber hinaus können Sie, wie Sie vielleicht bemerkt haben, ein
<1
Häkchen verwenden, anstatt==0
ein Byte zu speichern. Das ist zwar eher ein allgemeiner Code-Golftipp als ein Java-spezifischer.Dies wird meistens verwendet, wenn die Ganzzahl nicht negativ sein kann, z. B. beim Überprüfen der Länge:
Anstatt von
quelle
c(-21)
kehrttrue
mit der aktuellen.c(-20)
statt-21
?-21 % 5 = 4
und-20 % 5 = 0
.-21
.-21 % 5 != 4
in Java, das ist mein Punkt. Die durch fünf teilbare Funktion würde korrekt funktionieren , wenn der Modul immer nicht negativ zurückgegeben würde, dies ist jedoch nicht der Fall. Siehe dieses Beispiel-Snippet .%
, also habe ich vergessen, dass Java den Rest anstelle des Moduls zurückgibt, daher der Unterschied.Wie zeichnet man in Java ...
Hier ist die kürzestmögliche GUI-Farbkesselplatte:
Golf für 111 Bytes:
quelle
Vermeiden Sie
StringBuilder
sDas Anhängen von Daten an a
String
nimmt viel weniger Bytes in Anspruch.Wenn Sie eine Zeichenfolge umkehren und sofort ausdrucken müssen, verwenden Sie a
StringBuffer
.Wenn Sie eine Zeichenfolge umkehren und dann etwas anderes tun müssen als sie zu drucken, verwenden Sie eine
for
Schleife für jede Zeichenfolge .quelle
StringBuffer
beim Umkehren von Strings.String b="";for(char c:"Hello, World!".toCharArray()){b=c+b;}
{}
foreach-Schleife entfernen , wenn Sie diese Methode verwenden möchten.String s:"".split("")
anstelle vonchar c:"".toCharArray()
.java.util.stream.Stream
bereits importiert haben und einen weiteren Aufruf an das Ergebnis (wieB.chartAt(42)
) ketten müssen oder wenn Sie das Ergebnis nur an eine Funktion (wief(B)
) übergeben müssen, ist usingfor(:)
gleichStream.of("Hello, World!".split("")).reduce("",(a,b)->b+a)
.String b=new StringBuffer("Hello, World!").reverse()+"";
(.toString
ersetzt durch+""
), und Ihre zweite Zeile kann werden:String B="";for(String c:"Hello, World!".split(""))B=c+B;
(char
nachString
und.toCharArray()
nach.split("")
).Verwenden Sie Java 10
var
Wenn Sie eine einzelne Variable eines bestimmten Typs definieren, verwenden Sie
var
.Beispiele
In keinem der folgenden Beispiele verwendbar
var
kann nicht in vielen Beispielen verwendet werdenquelle
In den meisten Fällen handelt es sich bei Ihrem Programm um ein Single-Thread-Programm, dh es wird nur ein Thread ausgeführt. Sie können diese Tatsache ausnutzen, indem
return
Sie die Hauptmethode verlassen, wenn Sie sofort beenden müssen.Vergleichen Sie es mit dem "richtigen" Beenden des Programms:
Oder zeigen auf
null
:Oder durch 0 teilen:
quelle
Manchmal kann eine einzelne for-loop-Anweisung ersetzt werden. Betrachten Sie den folgenden Code:
Dies ist eine einfache for-Schleife, die eine Lösung für diese Frage darstellt .
Da wir wissen, dass dies
i
nicht groß genug ist, um StackOverflow-Fehler zu verursachen, können wir stattdessen die for-Schleife durch eine Rekursion ersetzen:Wir können eine Schleife simulieren, indem wir einen ternären Operator in der return-Anweisung verwenden, um eine Rekursion zu verursachen.
Diese Reduzierung ist ziemlich spezifisch, aber ich kann mir mehr Situationen vorstellen, in denen dies nützlich wäre.
quelle
Verwenden
...
(varags) als ParameterIn einigen Fällen ist es kürzer, Java-Variablen als Parameter anstelle von losen zu verwenden.
Zum Beispiel:
Würde von den meisten dazu golfen werden:
Aber kann ein zusätzliches Byte dazu gespielt werden:
Beachten Sie, dass auf alle drei Ganzzahlen in der Methode selbst nur einmal zugegriffen wird. Schon seit
int
es ziemlich kurz ist, ist es nur von Vorteil, wenn Sie sie jeweils nur einmal in der Methode verwenden und drei oder mehr von ihnen als Parameter haben.Bei längeren Parametern ist dies jedoch in der Regel sinnvoller. Dies war zum Beispiel meine ursprüngliche Antwort auf diese Herausforderung (Berechnen Sie das Vorkommen von Eingabezeichen in der Eingabezeichenfolge):
Und mir wurde empfohlen, es zu diesem Golf zu spielen:
Am Ende habe ich es aber so gemacht
...
:HINWEIS: Wenn die Frage / Herausforderung eine flexible Eingabe erfordert,
...
kann diese[]
natürlich auf gekürzt werden . Wenn die Frage / Herausforderung speziell nach dreiString
Eingaben fragt und einString
-array mit drei Werten nicht zulässt, können SieString...
statt verwendenString a,String b,String c
.quelle
String[]
anstelle von varargs verwenden? (speichert 1 weiteres Byte)