Windows Batch (CMD) mungkin merupakan bahasa yang paling tidak cocok untuk kode golf.
Hindari karakter baris baru . Jika Anda mencari kode terpendek dalam byte, dan bukan karakter, Anda ingin menyingkirkan semua pengembalian carriage yang tidak perlu (karakter baris baru = 2 byte). Anda dapat menggunakan &
operasi untuk melakukan ini, memangkas satu byte untuk setiap perintah.
echo Hello&echo World.
Pengaturan variabel . Saat mengatur variabel menggunakan sakelar, set
parser akan mengabaikan spasi.
set /a a+=1
set /p b="User Input: "
:: Will be handled the same as..
set/aa+=1
set/pb="User Input: "
Perhatikan bahwa aturan parser yang sama tidak berlaku untuk semua perintah - sebagai contoh, untuk loop membutuhkan spasi. Kecuali antara set, string, or command
(yaitu apa yang ada di dalam kurung) dan kata do
.
for /f %%a in (file.txt)do ...
Ekspresi matematika sederhana . Juga, perhatikan ekspresi yang saya gunakan untuk penambahan dalam set /a
perintah. Untuk ekspresi matematika yang sederhana, gunakan += -= *= /=
alih-alih (misalnya) set /a a=%a%+1
.
Mengumpulkan output perintah . Untuk mendapatkan output dari suatu perintah, kadang-kadang berguna untuk menampilkan dan membaca dari sebuah file, di mana Anda mungkin menggunakan loop for untuk mengumpulkan output:
for /f %%a in ('echo test') do set a=%%a
:: Can be shortened to
echo test>f&set/pa=<f
echo test
kirim stdout ke file bernama f,, >f
mulai perintah baru &
dan dapatkan isi file dalam variabel set/pa=<f
. Jelas ini tidak selalu berguna. Tetapi bisa jadi ketika yang Anda butuhkan adalah satu baris output.
Output perintah . Saat menekan output perintah, gunakan @
sebelum perintah, kecuali jika Anda perlu menekan lebih dari 9 perintah, dalam hal ini, gunakan @echo off
di awal skrip Anda. @echo off
panjangnya 9 byte, dan karena itu umumnya akan menghemat lebih banyak byte dengan skrip yang lebih panjang.
Perintah sering melakukan lebih dari sekadar apa yang sudah jelas - pikirkan tentang apa yang dilakukan perintah Anda. Sebagai contoh; jika Anda perlu mengatur variabel dan menggemakan variabel lain, alih-alih:
set a=OUTPUT
echo %a%
echo test>f
set /p b=<f
Anda dapat menggunakan perintah set dengan /p
beralih ke output %a%
untuk Anda.
set a=OUTPUT
echo test>f
set /p b=%a%<f
Benar-benar bermain golf ...
set a=OUTPUT&echo test>f&set/pb=%a%<f
Beberapa contoh - Hitung jumlah semua digit - dugaan Goldbach .
Kiat lain lebih dihargai - saya akan terus memperbarui ini jika saya memikirkan hal lain.
Jawaban:
Penghitung
Setiap kali Anda memiliki variabel yang akan bertindak sebagai penghitung mulai dari
0
Anda mungkin ingin menulis; Namun, Anda dapat menghilangkan baris pertama karena setiap kali
set/a
digunakan dengan variabel yang tidak diset, nilainya diasumsikan0
Blok Kode
Ada beberapa cara Anda dapat mencukur beberapa byte saat Anda harus menggunakan blok kode.
Setiap kali Anda membuka blok kode, Anda tidak perlu memasukkan jeda baris sebelum baris pertama kode di blok itu. Tanda kurung tutup tidak harus pada barisnya sendiri.
bisa bermain golf
Mencetak Tanpa Mengikuti Garis Baru
Pola umum untuk ini adalah
tetapi, Anda dapat menyimpan 2 byte yang diubah
echo
menjadicd
sumber
if
pernyataan itu dapat di-golf lebih lanjut. Yang terbaik adalah:if %a%==%b% (echo true)else echo false
Ampersands
Meskipun & membuat kode tampak lebih pendek, karena menggunakan lebih sedikit garis, namun menggunakan karakter sebanyak baris baru. Ini artinya
selama
sehingga kode Anda dapat tetap dibaca tanpa membuang-buang karakter.
Mungkin ada pengecualian karena beberapa editor teks menggabungkan umpan baris dan pengembalian karbohidrat untuk setiap baris baru.
sumber
Langsung mencetak hasil perhitungan numerik
Jika tantangan mengharuskan Anda untuk mengeluarkan angka yang perlu dihitung, Anda dapat menggunakan
cmd/c set/a
untuk menampilkan hasil perhitungan secara langsung alih-alih menyimpan perhitungan dan kemudian menggemakannya. Contoh:menjadi
Sunting: Rupanya tidak ada spasi sama sekali, menghemat 2 byte lebih banyak.
sumber
Ekspansi Tertunda
Alih-alih menggunakan panjang
setLocal enableDelayedExpansion
Anda dapat menggunakancmd /v on
(ataucmd/von
) yang akan memulai juru bahasa baru dengan ekspansi variabel tertunda diaktifkan.Saya belum menerapkan ini jadi saya tidak punya contoh, tetapi Anda bisa menggunakan ini bersama dengan
/c
saklar. Contoh:Perhatikan penggunaan karat sebelum ampersand. jika Anda perlu menggunakan beberapa ampersand atau karakter khusus lainnya, Anda mungkin lebih baik melampirkan semuanya setelah
/c
sakelar dalam tanda kutip:Metode ini juga memiliki keuntungan hanya dengan menggunakan satu
@
karakter untuk menutupi semua input, dan karenanya dapat digunakan, tanpa/von
, sebagai alternatif yang lebih pendek dari@echo off
(atau beberapa@
simbol).9 karakter:
@echo off
6 karakter:
@cmd/c
Untuk skrip yang lebih panjang, yang tidak dapat Anda lakukan dalam satu baris, Anda dapat melakukan hal berikut untuk menyimpan beberapa byte:
Atau, ungolfed:
Ganti
@echo off&setLocal enableDelayedExpansion
dengan yang di atas.Ketika Anda pertama kali menjalankan skrip Anda
!!
tidak akan berkembang sama sekali, jadi Anda menerima kesalahan karena"!!"
bukan perintah. Output kesalahan kemudian disalurkan ke nul (2>nul
). Ketika 'perintah' pertama ini gagal (||
), ia memanggil instance baru cmd, yang memanggil file batch itu sendiri (digunakan/v (on)
untuk mengaktifkan ekspansi yang tertunda, dan/q
untuk mematikan gema). Kemudian!!
akan berkembang menjadi nol, karena tidak ada variabel yang dipanggil<NULL>
. Sisa skrip Anda kemudian dijalankan. Setelah itu ia akan kembali ke instance asli dari cmd, dan (&&
) keluar dengan/b
syarat untuk menjaga jendela tetap terbuka (keluar adalah agar ia tidak terus berjalan melalui skrip Anda dalam konteks contoh cmd pertama, dengan gema aktif dan menunda ekspansi).sumber
cmd /q /v on /c <filename>
seharusnya hanya dihitung sebagai 2 byte karena mereka adalah dua "flag" yang mirip dengan flag Perl seperti-pI
yang hanya akan dihitung sebagai 2 byte tambahan.String berulang
Atur blok kode berulang dalam variabel, di mana jumlah byte yang digunakan untuk mengatur variabel + jumlah byte untuk menghasilkan variabel kurang dari jumlah byte untuk hanya memanggil kode secara langsung.
Sebagai contoh, lihat: Gambar kombinasi yang menambahkan hingga 100
Anda menyimpan 1 byte per penggunaan perintah set, jika Anda membuat variabel (dinamai dengan satu karakter, seperti "s") yang berisi
set<space>
. Ini hanya menghasilkan nilai jika Anda menggunakan perintah set lebih dari 12 kali. (Perhatikan ada karakter di akhir stringset s=set
).Di atas adalah 1 byte lebih pendek dari ..
Ini mungkin contoh yang sangat buruk - tetapi ini benar.
sumber
Mulai dari sebuah string
Notasi
%var:~start,end%
mengekstraksi substring dari variabelvar
. Namun jikastart
ini0
maka Anda dapat menghilangkan itu sepenuhnya. Kami sudah tahu bahwa Anda dapat menghilangkan,end
jika Anda ingin sisa string, yang membuat%var:~%
sinonim yang hampir tidak berguna untuk%var%
, kecuali bahwa ia mengembalikan~
ketika%var%
kosong. (Mungkin Anda bisa menggunakannya dalam ujianif %var:~%==~
:?)sumber
IF EQU
Pernyataan pemendekanMenggunakan
==
bukannyaequ
menghemat 3 byte.Memperpendek kutipan dalam
IF
pernyataanIni adalah perbandingan tradisional yang disebut "lebih aman"
if
.Untuk mempersingkat pernyataan ini, lakukan hal berikut saat input hanya bisa alfanumerik / kosong :
Menyimpan total 2 byte.
Tantangan yang membutuhkan keluaran
Jika pertanyaan mengatakan sesuatu seperti:
maka Anda bisa melakukan ini:
The
cd
menunjukkan direktori keSTDOUT
.GOTO
sebuah labelBerikut adalah beberapa metode
goto
untuk membuat label, dipesan dalam urutan byte.Metode di atas menghemat 1 byte.
sumber
goto:l
yang menghemat 1 byte yang sama dan memiliki bonus tambahan untuk menjaga usus Anda tetap utuhMenghilangkan ruang antara perintah dan parameter dengan garis miring
Maaf tentang judul yang tidak informatif. Apa yang saya coba maksudkan adalah bahwa untuk beberapa (tidak semua) perintah Windows, Anda dapat menghilangkan spasi di antara perintah / nama program dan parameter, selama parameter itu dimulai dengan garis miring. Sebagai contoh:
menjadi
-1 Byte!
Output perpipaan alih-alih menggunakan ERRORLEVEL
Menggunakan ERRORLEVEL untuk menentukan apakah perintah berjalan dengan benar bukan metode terpendek atau paling elegan. Sebagai gantinya, Anda dapat mem-pipe output. Ini berfungsi sebagai berikut (ingat bahwa perintah apa pun setelah
&&
operator hanya dijalankan jika perintah sebelum&&
dijalankan tanpa kesalahan. Perintah apa pun setelah||
operator, di sisi lain, akan berjalan hanya jika perintah sebelum TIDAK dijalankan dengan benar. Contoh saya adalah :Ini bisa diganti dengan:
-26 Bytes, wow! Perhatikan bahwa ini tidak bekerja dengan perintah seperti
choice
, di mana ERRORLEVEL memiliki nilai khusus sesuai dengan beberapa input.Salam,
Gabe
sumber
Menggunakan tanda kurung secara efektif
Halo lagi,
Maaf untuk mengirim jawaban kedua tetapi saya merasa ini pantas untuk itu. Saya perhatikan bahwa orang sering menggunakan salah satu metode berikut untuk menampilkan output perintah tanpa menampilkan
C:\Windows\System32>echo foo
baris sial sebelum setiap perintah.Metode pertama (menggunakan
echo off
):Metode kedua:
Namun, tak satu pun dari metode ini sesingkat berikut:
Cukup praktis, bukan? Pada catatan lain, ini dapat digunakan untuk menyalurkan banyak jalur output ke file atau perangkat dengan mudah. Misalnya, kode yang panjang ini:
menjadi jauh lebih singkat:
Terima kasih telah membaca jawaban yang agak panjang ini, dan saya harap ini membantu Anda. Salam,
Gabe
sumber