Apakah ada jalan pintas berguna yang bisa digunakan di Jawa?
Seperti yang ditunjukkan di bawah ini, import
sudah menambahkan setidaknya 17 karakter ke program.
import java.io.*;
Saya mengerti bahwa solusi sederhana adalah dengan menggunakan bahasa lain, tetapi tampaknya menjadi tantangan nyata untuk mempersingkat program Java.
Tip harus spesifik untuk Java: jika mereka berlaku untuk sebagian besar bahasa sejenis C, mereka termasuk dalam daftar tips yang lebih umum .
package
bisa dilewati.Jawaban:
Gunakan java terbaru yang mungkin. Java 8 memungkinkan Anda menggunakan ekspresi lambda, jadi gunakan itu jika Anda memerlukan sesuatu bahkan seperti objek fungsional.
Tentukan fungsi singkat untuk hal-hal yang sering Anda gunakan. Misalnya, Anda memiliki seratus panggilan untuk
exampleClassInstance.doSomething(someParameter)
, menetapkan fungsi baruvoid d(ParameterType p){exampleClassInstance.doSomething(p)}
dan menggunakannya untuk menghemat beberapa karakter.Jika Anda menggunakan nama kelas panjang tertentu lebih dari sekali, seperti
sebagai gantinya tentukan kelas baru:
Jika Anda hanya menggunakan satu metode tertentu dari kelas itu (tetapi masih perlu membuat instance), Anda dapat menentukan versi singkat di dalam kelas baru pada saat yang sama.
Gunakan parameter tipe fungsi untuk mempersingkat hal-hal, jika memungkinkan, seperti ini:
Gunakan
for(;;)
sebagai gantiwhile(true)
.Jangan gunakan pengubah akses kecuali benar-benar diperlukan.
Jangan gunakan
final
untuk apa pun.Jangan pernah meletakkan blok setelah
for
loop (tapi loop foreachfor(x:y)
berbeda). Pernyataan tambahan harus ditempatkan di dalamfor
pernyataan itu sendiri, sepertifor(int i=0;i<m;a(i),b(++i))c(i);
.Gunakan penugasan sebaris, peningkatan, instantiasi. Gunakan kelas inline anonim jika perlu. Gunakan lambdas sebagai gantinya jika memungkinkan. Panggilan fungsi sarang. Beberapa fungsi dijamin mengembalikan objek induknya, yang ini sebenarnya bahkan dimaksudkan untuk dirantai bersama.
main
Metode Andathrows Exception
, bukan menangkap mereka.Error
lebih pendek dariException
. Jika karena alasan tertentu Anda benar - benar perluthrow
mengirim pesan ke tumpukan, gunakanError
, meskipun situasinya normal.Jika suatu kondisi membutuhkan penghentian segera, gunakan
int a=1/0;
daripadathrow null;
atauSystem.exit(0);
. Pada waktu berjalan, ini melemparArithmeticException
. Jika Anda sudah memiliki variabel numerik dalam kode Anda, gunakan saja. (Jika sudahimport static java.lang.System.*;
, pergilahexit(0);
.)Alih-alih mengimplementasikan antarmuka, seperti
List<E>
, memperpanjang segera (atau tidak-begitu-langsung, jika ada keuntungan untuk melakukannya sama sekali) kelas anak, sepertiAbstractList<E>
, yang menyediakan implementasi standar dari sebagian besar metode, dan hanya membutuhkan implementasi dari beberapa potong kunci.Tuliskan kode Anda terlebih dahulu, dengan baris baru, lekukan, dan nama variabel lengkap. Setelah Anda memiliki kode yang berfungsi, Anda dapat mempersingkat nama, memindahkan deklarasi, dan menambahkan metode pintasan. Dengan menulisnya panjang untuk memulai, Anda memberi diri Anda lebih banyak kesempatan untuk menyederhanakan program secara keseluruhan.
Bandingkan optimalisasi alternatif dengan sepotong kode, karena strategi paling optimal dapat berubah secara dramatis dengan perubahan yang sangat kecil pada kode. Misalnya:
Arrays.sort(a)
, cara paling efisien adalah dengan memanggilnya dengan nama lengkap yang memenuhi syaratjava.util.Arrays.sort(a)
,.void s(int[]a){java.util.Arrays.sort(a);}
. Ini harus tetap menggunakan nama yang sepenuhnya memenuhi syarat dalam kasus ini. (Jika Anda membutuhkan lebih dari satu kelebihan, Anda mungkin salah melakukannya.)for
loop pendek dalam bermain golf, dengan tidak adanya metode perpustakaan yang mudah diakses), Anda dapat memanfaatkanArrays.copyOf
untuk melakukan tugas tersebut. Ketika lebih dari satu metode digunakan, dan ada 3 panggilan atau lebih, melakukanimport static java.util.Arrays.*;
adalah cara paling efisien untuk merujuk pada metode-metode tersebut. Setelah itu, hanya jika Anda memiliki lebih dari 8 panggilan terpisah yangsort
harus Anda gunakan metode pintas untuk itu, dan hanya di 5 atau lebih panggilan adalah jalan pintas dijamin untukcopyOf
.Satu-satunya cara nyata untuk melakukan analisis pada kode adalah untuk benar-benar melakukan modifikasi potensial pada salinan kode, dan kemudian membandingkan hasilnya.
Hindari menggunakan
someTypeValue.toString();
metode, sebagai gantinya hanya menambahkansomeTypeValue+""
.Jika Anda memang membutuhkan windows, jangan gunakan Swing, gunakan AWT (kecuali Anda benar-benar membutuhkan sesuatu dari Swing). Bandingkan
import javax.swing.*;
danimport java.awt.*;
. Selain itu, komponen di Swing telah menjadiJ
ditambahkan ke nama mereka (JFrame
,JLabel
, dll), tetapi komponen dalam AWT tidak (Frame
,Label
, dll)sumber
Gunakan
interface
sebagai ganticlass
.Di java 8, metode statis ditambahkan ke antarmuka. Dalam antarmuka, semua metode bersifat publik secara default. Karena itu
sekarang dapat disingkat menjadi
yang jelas lebih pendek.
Misalnya, saya menggunakan fitur ini di Hello, World! tantangan.
sumber
Dengan varargs Anda dapat "melemparkan" parameter ke array dengan tipe yang sama:
dari pada
sumber
Dengan impor statis :
Anda dapat menghemat beberapa pelat boiler nanti, tetapi Anda perlu beberapa pemanggilan untuk mencapai hasil:
sumber
Java
!import static java.lang.System.*
.var o=System.out;
yang hanya perlu digunakan dua kali sebelum terbayarvar o=System.out.println
berhasil?Argumen untuk
main
tidak harus dipanggilargs
, dan Anda dapat memotong beberapa spasi putih:akan baik-baik saja.
sumber
Jika Anda harus menggunakan ekspresi boolean
true
ataufalse
, ganti dengan1>0
dan1<0
masing - masing.Sebagai contoh:
Contoh pencarian linear ini dapat dikurangi menjadi
sumber
true/false
, cukup tambahkanboolean t=1>0,f=1<0;
. Maka alih-alih1>0
, gunakant
dan simpan dua karakter per penggunaan. Payoff lebih1>0
metode datang pada 10 kegunaan.boolean t=1>0,f=!t;
- satu char lebih pendek!true
/false
secara langsung:f|=a[i++]==42;
menyimpan cukup banyak.boolean
, tetapi karena saya tidak dapat menemukan contoh apa pun pada saat penulisan ini (saya biasanya tidak kode di Jawa) saya hanya menulis contoh sederhana.Jika Anda akan sering menggunakan beberapa metode, tetapkan kelas residennya ke sebuah variabel. Misalnya, tetapkan
System.out
ke variabel:Juga untuk
Integer.parseInt()
:Ini hampir pasti akan memicu ide peringatan tentang "mengakses metode statis dari variabel"
sumber
((Integer)1).parseInt("1")
bekerja juga.new Integer("1")
bahkan lebih pendek. Tetapi yang dimaksud Justin dengan jawabannya adalah bahwa Anda dapat menggunakan kembali variabel yang sudah Anda miliki untuk panggilan statis. Seperti yang saya jelaskan di bagian bawah jawaban ini.Daripada menggunakan
import static java.lang.System.*
teknik untuk menghematprintln()
pernyataan, saya menemukan bahwa mendefinisikan metode berikut ini jauh lebih efektif untuk menyimpan karakter:Ini karena dapat dipanggil sebagai
p(myString)
daripadaout.println(myString)
yang memiliki hasil karakter yang jauh lebih cepat dan lebih dramatis.sumber
Ini mungkin tampak jelas, tetapi ada opsi yang lebih pendek untuk beberapa
Math
fungsi:sumber
Jika Anda perlu
Integer.MAX_VALUE
(2147483647), gunakan-1>>>1
.Integer.MIN_VALUE
(-2147483648) lebih baik ditulis1<<31
.sumber
Jika Anda perlu mengambil nomor dari argumen (atau string lain), biasanya Anda melihat sesuatu seperti:
Banyak kali, Anda tidak perlu sebuah
Integer
. Banyak tantangan tidak menggunakan jumlah besar. KarenaShort
danByte
akan sama-sama menghapus kotak keint
, gunakan yang lebih tepatvalueOf()
dan simpan beberapa byte.Jaga variabel aktual Anda sebagai
int
, karena lebih pendek dari keduanyabyte
danshort
:Jika Anda perlu melakukan ini untuk beberapa angka, Anda dapat menggabungkan dengan metode ini :
sumber
int n=new Byte(a[0]);
tiga lebih pendek. Jika jumlahnya mungkin lebih besar, gunakanlong n=new Long(a[0])
, itu masih lebih baik daripadaint
dalam kebanyakan kasus.Jangan gunakan
public class
. Metode utama harus publik, tetapi kelasnya tidak. Kode ini berfungsi:Anda dapat menjalankan
java S
meskipunclass S
bukan kelas publik. ( Pembaruan: Saya menggunakan Java 7 ketika saya menulis tip ini. Di Java 8, metode utama Anda harus di antarmuka . Di Java 5 atau 6, metode utama Anda harus dalam enum .)Banyak programmer Java tidak tahu ini! Sekitar setengah jawaban untuk pertanyaan Stack Overflow tentang utama di kelas non-publik dengan keliru mengklaim bahwa metode utama harus di kelas publik. Sekarang kamu tahu lebih baik. Hapus
public
inpublic class
dan simpan 7 karakter.sumber
interface s{static void main(String[]...
lebih pendek. Jika Anda harus memiliki file sumber yang dapat dikompilasi dan metode utama. Karena dalam antarmuka Java 1.8, semua metode bersifat publik sehingga Anda dapat melewati pengubah pada metode.Beberapa tips kode-golf kecil
Kiat-kiat ini agak terlalu kecil untuk jawaban yang terpisah, jadi saya akan menggunakan jawaban ini untuk kiat kodegolf yang sangat kecil yang saya temukan atau hasilkan, dan belum disebutkan dalam kiat lain:
Menghapus karakter terakhir dari String:
Dalam beberapa kasus Anda tahu apa karakter terakhir sebelumnya, dan Anda juga tahu karakter ini hanya muncul sekali di String. Dalam hal ini Anda dapat menggunakan
.split
sebagai gantinya:Pintasan penyandian:
Semua penyandian memiliki nama kanonik yang digunakan dalam
java.nio
API, serta nama kanonik yang digunakan dalam APIjava.io
danjava.lang
. Berikut adalah daftar lengkap semua penyandian yang didukung di Jawa. Jadi selalu gunakan yang terpendek dari keduanya; yang kedua biasanya lebih pendek (sepertiUTF-8
vsutf8
,Windows-1252
vsCp1252
, dll), tetapi tidak selalu (UTF-16BE
vsUnicodeBigUnmarked
).Boolean acak:
Bilangan prima:
Ada banyak cara berbeda untuk memeriksa bilangan prima atau mendapatkan semua bilangan prima, tetapi jawaban @ SaraJ di sini adalah yang terpendek. Berikut ini adalah copy-paste sebagai referensi:
CATATAN: Biasanya Anda dapat menggabungkannya dengan loop lain yang ada tergantung pada bagaimana Anda ingin menggunakannya, sehingga Anda tidak perlu metode terpisah. Ini menyimpan banyak byte dalam jawaban ini misalnya.
Pemotongan bilangan alih-alih Math.floor / Math.ceil:
Jika Anda menggunakan doubl / float positif dan Anda menginginkannya
floor
, jangan gunakanMath.floor
tetapi gunakan(int)
-cast sebagai gantinya (karena Java memotong bilangan bulat):Trik yang sama dapat diterapkan pada dobel / mengapung negatif yang Anda inginkan
ceil
:Gunakan
&1
alih-alih%2
untuk menyingkirkan tanda kurung:Karena Operator Precedence dari
&
lebih rendah dari operator aritmatika standar seperti*/+-
dan%
, Anda dapat menyingkirkan kurung dalam beberapa kasus.Perhatikan bahwa ini tidak benar-benar membantu dalam pemeriksaan boolean, karena Anda masih membutuhkan tanda kurung, mereka hanya bergerak sedikit:
BigIntegers dan membuat variabel untuk panggilan metode statis:
Saat menggunakan BigIntegers, buat hanya sekali yang kemudian dapat Anda gunakan kembali. Seperti yang Anda ketahui, BigInteger berisi bidang statis untuk
ZERO
,ONE
danTEN
. Jadi saat Anda hanya menggunakan ketiganya, Anda tidak perluimport
tetapi bisa menggunakannyajava.Math.BigInteger
secara langsung.CATATAN: Anda harus menggunakan
=null
begitut
diinisialisasi untuk menggunakant.
.Terkadang Anda dapat menambahkan beberapa BigIntegers untuk membuat yang lain untuk menyimpan byte. Jadi katakanlah Anda ingin memiliki BigIntegers
1,10,12
karena beberapa alasan:Seperti yang ditunjukkan dengan benar dalam komentar, trik dengan
BigInteger t=null;
untuk panggilan metode statis juga dapat digunakan dengan kelas lain.Misalnya, jawaban dari 2011 ini dapat di-golf:
getBytes()
dari padatoCharArray()
Saat Anda ingin mengulang karakter String, biasanya Anda akan melakukan ini:
Melonggarkan karakter dapat berguna saat mencetaknya, atau menambahkannya ke String, atau yang serupa.
Namun, jika Anda hanya menggunakan karakter untuk beberapa perhitungan angka unikode, Anda bisa mengganti
char
denganint
, DAN Anda bisa menggantitoCharArray()
dengangetBytes()
:Atau bahkan lebih pendek di Java 8+:
Di Java 10+ pengulangan karakter untuk dicetak sekarang juga dapat dilakukan dalam 22 byte:
Item acak dari
List
:Periksa apakah sebuah String berisi spasi awal / akhir
Mengapa ini bekerja, ketika
!=
di Strings adalah untuk memeriksa referensi alih-alih nilai di Jawa? KarenaString#trim
akan mengembalikan " Salinan string ini dengan spasi putih awal dan akhir dihapus, atau string ini jika tidak memiliki spasi putih awal atau akhir . " Saya telah menggunakan ini, setelah seseorang menyarankan ini kepada saya, dalam jawaban saya ini .Palindrome:
Untuk memeriksa apakah suatu String adalah palindrome (dengan mengingat panjang Strings yang genap dan ganjil), ini adalah yang terpendek (
.contains
bekerja di sini karena kita tahu baik String itu sendiri maupun bentuknya yang dibalik memiliki panjang yang sama):.contains(...)
alih-alih.equals(...+"")
terima kasih atas komentar @assylias di sini .Entah 0, atau keduanya 0?
Saya pikir sebagian besar sudah tahu yang ini: jika Anda ingin memeriksa apakah salah
a
ataub
nol, gandakan untuk menyimpan byte:Dan jika Anda ingin memeriksa apakah keduanya
a
danb
nol, Anda bisa menggunakan bitwise-OR, atau menambahkannya bersama jika keduanya selalu positif:Even = 1, odd = -1; atau sebaliknya
Alasan saya menambahkan ini setelah melihat
k+(k%2<1?1:-1)
di jawaban ini :Loop
n
kali dalam Program LengkapJika kita memiliki tantangan di mana program lengkap wajib, dan kita perlu mengulang sejumlah waktu tertentu, kita dapat melakukan hal berikut:
Hal yang sama berlaku ketika kita harus mengambil rentang ini sebagai input:
Kredit ke @JackAmmo dalam komentar ini .
try-akhirnya alih-alih try-catch (Exception e) saat kembali, dan kapan menggunakannya
Jika Anda tidak dapat menggunakan
throws Exception
tetapi haruscatch
dan melakukan sesuatu dengannya sebelum kembali, Anda dapat menggunakanfinally
:Adapun contoh kapan harus menggunakan
try-catch
, saya bisa merujuk ke jawaban saya ini (kredit untuk golf tidak langsung masuk ke @KamilDrakari ). Dalam tantangan ini kita harus mengulang secara diagonal pada matriks NxM, jadi kita harus menentukan apakah jumlah kolom atau jumlah baris adalah yang terendah sebagai maksimum kita dalam for-loop (yang cukup mahal dalam hal byte:)i<Math.min(a.length,a[0].length)
. Jadi, hanya menangkapArrayIndexOutOfBoundsException
penggunaancatch-finally
lebih pendek dari pemeriksaan ini, dan dengan demikian menghemat byte:CATATAN: Ini hanya berhasil karena
return r;
pada akhirnya. Saya disarankan untuk memodifikasi sel pertama, seperti yang dilakukan @KamilDrakari dalam jawaban C # untuk menyimpan byte. Namun, di Jawa ini berarti saya harus mengubahnya kem->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 byte), sebenarnya meningkatkan jumlah byte bukannya menurun jika saya bisa menggunakanfinally
.Math.pow (2, n)
Saat Anda menginginkan kekuatan 2, pendekatan sedikit lebih bijaksana:
Menggabungkan pemeriksaan bit-bijaksana dan logis alih-alih menggunakan tanda kurung
Saya pikir ini sudah terkenal sekarang
&
dan|
dapat digunakan sebagai pengganti&&
dan||
dalam Java (boolean) pemeriksaan logis. Dalam beberapa kasus, Anda tetap ingin menggunakan&&
alih-alih&
mencegah kesalahan, misalnyaindex >= 0 && array[index].doSomething
. Jika&&
akan diubah ke&
sini, ia masih akan mengevaluasi bagian di mana ia menggunakan indeks dalam array, menyebabkanArrayIndexOutOfBoundsException
, maka penggunaan&&
dalam kasus ini bukan&
.Sejauh ini dasar-dasar
&&
/||
vs&
/|
di Jawa.Saat Anda ingin memeriksa
(A or B) and C
, yang terpendek mungkin menggunakan operator bit-bijaksana seperti ini:Namun, karena operator bit-wise memiliki prioritas operator atas pemeriksaan logis, Anda dapat menggabungkan keduanya untuk menyimpan byte di sini:
Gunakan
n+=...-n
sebagai ganti(long)...
Ketika Anda memiliki panjang masuk dan keluaran dalam lambda, misalnya saat menggunakan
Math.pow
, Anda dapat menyimpan byte dengan menggunakann+=...-n
alih-alih(long)...
.Sebagai contoh:
Ini menyimpan satu byte dalam jawaban saya ini , dan bahkan dua byte dengan menggabungkan
-n-1
ke+~n
dalam jawaban saya ini .sumber
positive integers
? Juga, saya tidak yakin apakah implementasi ceil bekerja .since Java automatically floors on integers
; Saya pikir istilah yang tepat adalah pemotongan , bukan lantai .String t="";for(int i=s.length();--i>=0;t+=s.charAt(i));return s.equals(t);
s.equals(new StringBuffer(s).reverse()+"")
sudah.Untuk bermain golf yang tidak memerlukan input, Anda dapat menggunakan blok statis, dan menjalankannya dengan baik tanpa metode utama, cukup kompilasi dengan Java 6.
sumber
java
pada baris perintah / dalam file manifes kelas mana yang akan dimuat.Kita semua tahu tentang bitor xor (
^
), tetapi juga xor logis.Jadi
(a||b)&&!(a&&b)
sederhananyaa^b
.Sekarang kita bisa menggunakan xor.
Selain itu , operator
|
dan&
juga berfungsi , hanya ingat bahwa prioritas operator berubah.sumber
&
dan|
juga. Mungkin bermanfaat jika kondisi Anda sudah dalam tanda kurung, atau jika Anda sudah bekerja dengan boolean.!=
sebagai ganti^
untuk xor, dan==
untukAnda tidak harus menggunakan
Character.toLowerCase(char c)
. Sebaliknya gunakan(c|32)
. Alih-alihCharacter.toUpperCase(char c)
digunakan(c&~32)
. Ini hanya berfungsi dengan huruf ASCII.sumber
c|~32
akan cenderung menghasilkan -1 ... lebih baik digunakanc-32
.Konversi String ke angka
Ada beberapa cara untuk mengonversi String ke nilai numerik:
ABC.parseABC :
ABC.nilai :
ABC.decode :
ABC baru :
Jadi, untuk bermain golf, lebih baik menggunakan konstruktor saat mengonversi String ke nilai numerik.
Hal yang sama berlaku untuk
Double
;Float
; danByte
.Ini tidak selalu berlaku ketika Anda dapat menggunakan kembali primitif yang sudah ada sebagai objek.
Sebagai contoh, katakanlah kita memiliki kode berikut:
Anda dapat menggunakan
.decode
alih-alih konstruktor yang lebih pendek dengan menggunakan kembali parameter sebagai objek:sumber
Jangan gunakan
Random
!Secara umum, jika Anda memerlukan angka acak,
Random
adalah cara yang mengerikan untuk melakukannya *. Jauh lebih baik untuk digunakanMath.random()
. Untuk menggunakannyaRandom
, Anda perlu melakukan ini (misalkan kita membutuhkanint
):Bandingkan dengan:
dan:
Metode pertama mengambil
41+15n
karakter (n
jumlah panggilan). Yang kedua adalah25n
karakter, dan yang ketiga adalah43+7n
.Jadi, jika Anda hanya membutuhkannya sekali atau dua kali, gunakan
Math.random()
metode sebaris . Untuk tiga panggilan atau lebih, Anda akan menghemat dengan menggunakan suatu fungsi. Salah satu menyimpan karakter pada penggunaan pertama berakhirRandom
.Jika Anda sudah menggunakan
Math.random()
untukdouble
, ingat bahwa pada empat penggunaan, itu masih penghematan untuk menariknya ke:Untuk 33 karakter, Anda akan menghemat 10 pada setiap panggilan
r()
Memperbarui
Jika Anda membutuhkan integer dan ingin menghemat casting, jangan melemparkannya! Java auto-casts jika Anda melakukan operasi alih-alih tugas. Membandingkan:
* Kecuali Anda harus menyemai PRNG untuk hasil yang dapat diprediksi. Kemudian, saya tidak melihat banyak jalan di sekitarnya.
sumber
Random#nextGaussian
.(int)(Math.random()*9)
memiliki bias modulo sangat kecil, karenaMath.random()
mengembalikan 2 53 nilai yang mungkin, dan 2 53 bukan kelipatan 9. Probabilitas setiap angka berada di 1/9 plus atau minus 5 / (9 * 2 ** 53), kesalahan sangat kecil, hampir persis 1/9.9
hanya sebagai contoh, bisa apa saja. Saya relatif yakin bahwanextInt()
(atauRandom
metode lain ) memiliki bias kecil juga, hanya karena cara kerja PRNG Java.new java.util.Random().nextBoolean()
Anda dapat menggunakannyaMath.random()<.5
.Saya tidak tahu apakah Anda akan mempertimbangkan Java 'murni' ini, tetapi Memproses memungkinkan Anda membuat program dengan sedikit pengaturan awal (selesai secara otomatis).
Untuk output konsol, Anda dapat memiliki sesuatu yang sederhana seperti:
untuk output grafis, lebih sedikit:
sumber
size
sama sekali; standarnya adalah 100 x 100 piksel persegi. Di sebagian besar OS, bingkai di sekitarnya akan sekitar dua kali lebih besar, dengan kotak di tengah dan seluruh area diisi dengan konten yang diambil dari desktop.setup()
dandraw()
menggunakan "mode statis". Anda juga dapat menggunakan warna hex 6-digit dan penerjemah akan mengubahnya, yang kadang-kadang terbayar (#FF8000
<255,128,0
), dan jika Anda menggunakan skala abu-abu, hanya satu nomor yang perlu ditentukan (255
<255,255,255
)Memendekkan kembali
Anda dapat mempersingkat pernyataan string yang dikembalikan oleh byte dengan:
untuk
Dan, jika Anda memulai pernyataan pengembalian dengan tanda kurung, Anda dapat melakukan hal yang sama dengan mereka:
untuk
Saya kira kutipan dianggap seperti tanda kurung? Saya benar-benar mengambil ini melalui AppleScript, cukup lucu, dan berpikir mungkin layak disebutkan.
sumber
return-n;
bukanreturn -n;
ataureturn~n;
bukanreturn ~n;
. Serta tunggal bukan tanda kutip ganda:return'A';
Jangan takut menggunakan notasi ilmiah
Jika Anda berurusan dengan ganda, atau mengapung, Anda dapat menggunakan notasi ilmiah untuk angka. Jadi, alih-alih menulis,
double a=1000
Anda dapat mengubahnyadouble a=1e3
untuk menghemat 1 byte.sumber
Coba gunakan
int
sebagai gantiboolean
Dalam beberapa kasus saya telah menemukan bahwa lebih pendek untuk mengembalikan nilai integer dari metode yang biasanya mengembalikan boolean, mirip dengan apa yang mungkin dilakukan dalam program C.
Langsung dari kelelawar
int
adalah 4 byte lebih pendek dariboolean
. Setiap kali Anda menulisreturn 0
alih-alihreturn 1<0
, Anda menyimpan tambahan 2 byte dan sama untukreturn 1
overreturn 1>0
.Jebakan di sini adalah bahwa setiap kali Anda ingin menggunakan nilai kembali secara langsung sebagai boolean, harganya 2 byte (
if(p(n))
v.if(p(n)>0)
). Ini dapat dibuat dengan menggunakan aritmatika boolean. Diberi skenario yang dibuat-buat di mana Anda ingin menulisAnda malah bisa menulis
untuk menghemat 2 byte.
sumber
0
dan1
tidak merupakan salah / benar di Jawa (dan JLS tidak menganggapnya demikian). Jadi, jika golf secara khusus meminta kebenaran / kepalsuan, Anda perlu membukanya (dan, sayangnya, membuatnyaboolean
berfungsi, melemparkan lebih banyak byte padanya).t[0]+=p(n):10?0;
Apakah ini valid?t[0]+=p(n)?10:0;
. (Saya mengeditnya.)Jika Anda menggunakan enum alih-alih kelas , Anda menyimpan satu karakter.
Tetapi Anda harus memperkenalkan setidaknya satu contoh enum (F, G, H dalam contoh ini) yang harus membayar sendiri.
sumber
enum M{;public static void main(String[]a){...}
tanpa masalah.class M{
panjangnya persis sama denganenum M{;
. Dalam hal ini, saya akan memilihclass
karena lebih cantik (IMO)enum{
bekerja tanpa;
after; itu hanya IDE yang mengeluh bahwa ada kesalahan tetapi kompiler menerimanyaKetika Anda memiliki metode yang harus mengembalikan
boolean
atauBoolean
, yaitu:Anda dapat mengubah
boolean
/Boolean
kembali-jenisObject
untuk menyimpan 1 byte:Selain itu, seperti yang mungkin telah Anda perhatikan, Anda dapat menggunakan tanda
<1
centang alih-alih==0
menyimpan satu byte. Meskipun itu lebih merupakan tip kode-golf umum daripada Java-spesifik.Ini sebagian besar digunakan ketika bilangan bulat tidak boleh negatif, seperti memeriksa panjang:
dari pada
sumber
c(-21)
kembalitrue
dengan yang saat ini.c(-20)
bukan-21
?-21 % 5 = 4
dan-20 % 5 = 0
.-21
.-21 % 5 != 4
di Jawa, yang merupakan poin saya. Fungsi dibagi oleh lima akan bekerja dengan benar jika modulus selalu mengembalikan non-negatif, tetapi tidak. Lihat cuplikan contoh ini .%
, jadi saya lupa Java mengembalikan sisanya daripada modulus, maka bedanya ..Bagaimana Draw di Java ...
Ini adalah pelat GUI cat terpendek yang mungkin:
Golf untuk 111 Bytes:
sumber
Hindari
StringBuilder
sMenambah barang ke
String
byte membutuhkan jauh lebih sedikit.Jika Anda harus membalik string dan mencetaknya segera, gunakan a
StringBuffer
.Jika Anda harus membalik string dan kemudian melakukan sesuatu selain mencetaknya, gunakan
for
setiap loop.sumber
StringBuffer
untuk membalik string.String b="";for(char c:"Hello, World!".toCharArray()){b=c+b;}
{}
dari loop foreach jika Anda akan menggunakan metode itu.String s:"".split("")
bukanchar c:"".toCharArray()
.java.util.stream.Stream
sudah mengimpor, dan jika Anda perlu membuat panggilan lain ke hasil (sepertiB.chartAt(42)
) atau jika Anda hanya perlu meneruskan hasilnya ke fungsi (sepertif(B)
), maka menggunakanfor(:)
adalah sama denganStream.of("Hello, World!".split("")).reduce("",(a,b)->b+a)
.String b=new StringBuffer("Hello, World!").reverse()+"";
(.toString
diganti dengan+""
), dan baris kedua Anda bisa menjadi:String B="";for(String c:"Hello, World!".split(""))B=c+B;
(char
keString
dan.toCharArray()
ke.split("")
).Gunakan Java 10's
var
Jika Anda mendefinisikan satu variabel dari jenis tertentu, gunakan
var
.Contohnya
Tidak dapat digunakan dalam salah satu contoh berikut
var
tidak dapat digunakan dalam banyak contohsumber
Dalam kebanyakan kasus, program Anda akan single-threaded, yaitu hanya memiliki satu utas berjalan Anda dapat memanfaatkan fakta ini dengan
return
menggunakan metode utama saat Anda harus keluar secara instan.Bandingkan dengan "benar" mengakhiri program:
Atau menunjuk ke
null
:Atau membaginya dengan 0:
sumber
Terkadang, satu pernyataan for-loop mungkin bisa diganti. Pertimbangkan kode berikut:
Ini adalah for-loop sederhana yang merupakan solusi untuk pertanyaan ini .
Karena kita tahu bahwa
i
tidak akan cukup besar untuk menyebabkan kesalahan StackOverflow, sebagai gantinya kita dapat mengganti for-loop dengan rekursi:Kami dapat mensimulasikan loop dengan menggunakan operator ternary dalam pernyataan kembali untuk menyebabkan rekursi.
Pengurangan ini agak spesifik, tapi saya bisa membayangkan lebih banyak situasi di mana ini akan berguna.
sumber
Menggunakan
...
(varags) sebagai parameterDalam beberapa kasus lebih pendek untuk menggunakan Java varargs sebagai parameter daripada yang longgar.
Sebagai contoh:
Akan golf paling banyak untuk ini:
Tetapi dapat di-golf byte tambahan untuk ini:
Perhatikan bahwa ketiga bilangan bulat hanya diakses satu kali dalam metode itu sendiri. Karena
int
cukup pendek, itu hanya menguntungkan jika Anda menggunakannya masing-masing hanya sekali di dalam metode, dan memiliki tiga atau lebih dari mereka sebagai parameter.Dengan parameter yang lebih panjang ini biasanya lebih bermanfaat. Sebagai contoh, ini adalah jawaban asli saya untuk tantangan ini (menghitung kemunculan karakter input dalam string input):
Dan saya disarankan untuk golf ini:
Tapi akhirnya saya bermain golf dengan ini
...
:CATATAN: Jika pertanyaan / tantangan meminta input yang fleksibel, tentu saja
...
dapat disingkat[]
. Jika pertanyaan / tantangan secara spesifik meminta, katakanlah, tigaString
input dan tidak mengizinkanString
-array yang mengandung tiga nilai, Anda dapat menggunakanString...
sebagai gantinyaString a,String b,String c
.sumber
String[]
daripada menggunakan varargs? (menghemat 1 byte lebih banyak)