Penjepit tangan kanan adalah gaya bracketing kode di mana kurung kurawal dan titik koma semuanya disejajarkan dengan satu titik di sisi kanan file.
Secara umum, ini dianggap praktik buruk, karena beberapa alasan.
Tantangan
Ambil string multiline melalui metode apa pun, dan ubah gaya brace-nya menjadi Right Hand Brace.
Untuk tantangan ini, Anda hanya perlu bekerja pada kode Java, namun, secara teoritis harus bekerja pada kode apa pun yang menggunakan Kawat Gigi dan Titik Koma.
Anda harus mengambil semua {};
karakter dalam satu baris, dengan jumlah spasi putih di antara mereka. MISALNYA. }}
,, ; }
}\n\t\t}
dan sejajarkan mereka di sisi kanan file melalui penggunaan spasi putih.
sebagai contoh:
a {
b;
{c
harus menjadi
a {
b ;{
c
Atau, secara lebih abstrak, dorong setiap dan semua spasi putih dari kiri semua {};
karakter, ke kanan.
Lekukan garis harus tetap dipertahankan. Baris hanya berisi spasi putih setelah perpindahan {};
karakter dapat secara opsional dihapus.
Sebagai contoh:
a{
b{
c;
}
}
d;
Mungkin menjadi salah satu
a {
b {
c;}}
d ;
atau
a {
b {
c;}}
d ;
Didorong ke kanan mengacu pada semua {};
karakter yang disejajarkan ke titik yang tidak lebih pendek dari garis terpanjang. Jumlah ruang setelah itu dapat diterima.
Jadi semua di bawah ini dapat diterima:
a {
bc;
a {
bc ;
a {
bc ;
dll ...
Baris dalam kode apa pun dapat berisi {};
karakter di antara karakter non-spasi lain, penanganan kasus ini tidak diperlukan, meskipun jika Anda cenderung, Anda harus membiarkannya di tempat. Garis juga mungkin tidak mengandung {};
karakter sama sekali, dan ini harus ditangani dengan benar. Seperti yang ditunjukkan di bawah ini.
a {
b ;
c
d }
Karena kami tidak ingin Peninjauan Kode melihat hal-hal mengerikan yang kami lakukan, Anda harus membuat kode Anda sekecil mungkin.
Contoh / Testcases
Java Generik
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
menjadi...
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") ;}}
Gambar itu sendiri
public class Permuter{
private static void permute(int n, char[] a){
if (n == 0){
System.out.println(String.valueOf(a));
}else{
for (int i=0; i<= n; i++){
permute(n-1, a);
swap(a, n % 2 == 0 ? i : 0, n);
}
}
}
private static void swap(char[] a, int i, int j){
char saved = a[i];
a[i] = a[j];
a[j] = saved;
}
}
menjadi...
public class Permuter {
private static void permute(int n, char[] a) {
if (n == 0) {
System.out.println(String.valueOf(a)) ;}
else {
for (int i=0; i<= n; i++) {
permute(n-1, a) ;
swap(a, n % 2 == 0 ? i : 0, n) ;}}}
private static void swap(char[] a, int i, int j) {
char saved = a[i] ;
a[i] = a[j] ;
a[j] = saved ;}}
Python Generik Tidak Sempurna
Untuk kontras
def Main():
print("Hello, World!");
Main();
menjadi...
def Main():
print("Hello, World!") ;
Main() ;
Catatan
- Berlaku celah standar
- IO standar berlaku
- Ini adalah kode-golf , sehingga program terpendek dalam byte menang!
- Saya tidak bertanggung jawab atas kerusakan yang berkaitan dengan pemrograman dengan gaya Right Hand Brace
- Selamat bersenang-senang!
Edit Catatan
Saya menulis ulang rincian tantangan, Semoga saya tidak melanggar pandangan siapa pun tentang aturan, saya yakinkan Anda itu tidak disengaja. Ini harus menjadi spesifikasi yang jauh lebih jelas dan tidak saling bertentangan.
sumber
int a=0;System.out.println(a);
;{}
karakter dikumpulkan jika mereka berada di baris yang berbeda (itu hanya jelas dari contoh, bukan aturan, dan pada kenyataannya jika garis terdiri dari\t}
menjaga lekukan akan berarti tidak bergerak}
hingga akhir dari baris sebelumnya)Jawaban:
V + Bash Utilities,
6462616062 byte1 byte disimpan berkat @DJMcMayhem karena menggabungkan perintah ex
^R
adalah karakter literal untuk<C-r>
(0x12
) dan<84>
is0x84
dan<94>
is0x94
.wc -L
bekerja pada kebanyakan sistem berbasis * nix, tetapi tidak macOS. Untuk macOS, yang harus Anda lakukangwc -L
setelah mendapatkan coreutils menggunakan brew, jika Anda belum melakukannya.Cobalah online! (Jawa)
Cobalah online! (Python)
Cobalah online! (Java lagi)
Ini mempertahankan semua garis kosong dan tidak menangani tab, hanya spasi.
Hexdump:
Penjelasan
Pertama-tama kita harus bisa memindahkan kursor ke mana saja di buffer, jadi kita gunakan
dan kami rantai ini dengan menggunakan perintah ex lain
|
Kita perlu mendapatkan panjang dari garis terpanjang di input. Ini bisa dilakukan dengan perintah shell
wc -L
.Ini menimpa buffer saat ini (berisi input) dengan hasil
wc -L
. Ini memberikan output dari sesuatu seperti:dan kursor mendarat di
4
dalam42
. Kemudian kami menyalin nomor ini dengan menggunakany$
: yank teks dari posisi kursor ke akhir baris. Ini dengan mudah menyimpan nomor ini dalam daftar0
. Tetapi lebih lanjut tentang itu nanti. Input diganti dengan nomor ini, jadi untuk kembali, kami tidak melakukannyau
.Sekarang katakan inputnya terlihat seperti ini:
kita perlu memindahkan kawat gigi
}
dari ujung buffer ke tepat setelahprintln
pernyataan.Jika regex tidak dapat ditemukan, kesalahan pemecahan terjadi dan keluar dari rekursi yang disebabkan oleh
ò
.Sekarang sampai pada bagian utama dari program ini, pindahkan semua kawat gigi dan semi-titik dua dan sejajarkan seperti yang dinyatakan dalam pertanyaan.
Sekali lagi, rekursi ini akan dihentikan oleh kesalahan yang disebabkan ketika regex tidak ditemukan di buffer.
Suntingan
D
sebagai gantid$
(Saya bahkan tidak tahu mengapa saya melewatkan itu di tempat pertama)[^
(dalam regex) ke<84>
\zs
(mengompresi ke dalam<93>
) dan dengan menghapus$
in$xk$pò
sumber
:se ve=all|%!wc -L
Ruby,
100114108 byteMembaca nama file sebagai argumen baris perintah. Jika tidak ada nama file yang diberikan, itu akan dibaca dari STDIN. Tidak menangani tab.
Cobalah online!
sumber
catch
pernyataan lekukan , dan B. tanda koma yang terlalu banyak indentasi, pada baris terpanjang dalam kode. Saya rasa saya tahu hal yang saya butuhkan untuk memperbaikinya, beri saya waktu sebentar. (Juga, saya memperbarui spesifikasi untuk menyebutkan itu tidak dapat menangani tab, dan file Anda memiliki tab.)Perl , 90 byte
88 byte kode +
-p0
bendera.Cobalah online!
Penjelasan singkat:
\@a[y///c]for/.*/g;
menghitung panjang garis terpanjang: untuk setiap baris, ia mendefinisikan elemen pada indeksy///c
(yaitu ukuran garis) dari array@a
. Pada akhirnya, indeks maksimum@a
(yaitu ukuran@a
) adalah ukuran garis terpanjang.s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme
menempatkan{};
karakter di akhir baris.1while s/ *\n *([{};]+)$/$1/m
make membuat kawat gigi pada baris kosong pergi pada baris di atas.Terima kasih kepada @primo dari siapa saya "mencuri" sebagian kode saya dari sini untuk menghitung panjang garis terpanjang.
sumber
Python 2: 228 Bytes
sumber
;{}
yang diperlukan pada akhir baris sebelumnya.ditumpuk , 133 byte
Cobalah online! Saya bisa terlalu memikirkan ini ... tapi siapa pun. Saya akan melihatnya lagi besok. Beberapa tips yang bagus:
"!
sering dapat digunakan sebagai penggantimap
, menyimpan satu atau dua byte, tergantung pada apakah token berikutnya dimulai dengan sebuah kata. Namun, itu hanya dapat digunakan ketika setiap atom dari array ingin dipetakan. Ini mirip dengan peta yang dalam.$MAXmap
sama dengan$MAX map
, yang pada gilirannya setara dengan[MAX] map
. (Memetakan setiap larik ke elemen maksimalnya.)sumber
JavaScript (Proposal ES),
139121 byteMembutuhkan Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15 untuk
padEnd
. Sunting: Disimpan 18 byte berkat @ValueInk.sumber
s.replace(r,`$1`)
ketika menghitung panjang garis? Jumlah bantalan-kanan yang masuk akal harus cukup, jadi menghitung panjang garis dengan titik koma dan tanda kurung harus baik-baik saja.PHP,
201194185172167 bytemengambil input dari file f; mengasumsikan satu baris byte byte dan tidak ada tab; mempertahankan garis kosong.
+1
ke yang keduastr_pad
parameter .0
:Hapus
""<
dan ganti""==
dengan!
.kerusakan
sumber
{}
kawat gigi di regex?Java 8,
312305 bytePenjelasan:
Coba di sini.
sumber