Akhiri tab versus perang antariksa
Jadi, ada banyak perdebatan apakah akan menggunakan tab atau spasi untuk indentasi / memformat kode. Dapatkah Anda membantu universitas menyelesaikan perselisihan, dengan pergi ke metode pemformatan unik yang sangat gila .
Tugas Anda adalah menulis program atau fungsi lengkap yang memperluas semua tab menjadi empat ruang. Dan kemudian mengganti serangkaian n spasi terkemuka dengan "/ (n - dua bintang di sini) /". Anda akan menerima input lebih dari beberapa baris dalam format apa pun (array string tunggal string untuk setiap baris baru. Array kolom dll.)
Masukan sampel dicuri tanpa malu-malu . Perhatikan bahwa sejak tab diperluas secara otomatis ke empat spasi di SE, saya mewakilinya sebagai karakter "^", tetapi Anda juga harus menangani tab (codepoint 0x09). Semua karakter "^" mewakili tabulasi.
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
Not zero so multiply by 256 again to get 65536
[>++++<-]>[<++++++++>-]<[>++++++++<-]
+>[>
# Print "32"
++++++++++[>+++++<-]>+.-.[-]<
<[-]<->] <[>>
# Print "16"
+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
# Print "8"
++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera!
Output sampel
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera!
Karena universitas membutuhkan ruang untuk mengunduh Vim dan Emacs, Anda hanya memiliki sedikit penyimpanan untuk kode Anda. Karenanya ini adalah kode-golf dan kode terpendek menang. Anda dapat mengasumsikan bahwa input terbentuk dengan baik dan garis dengan kurang dari empat spasi (setelah penggantian tab) dapat mengakibatkan perilaku yang tidak terdefinisi.
Penolakan
Strategi pemformatan "luar biasa" ini berasal dari Geobits, dan direproduksi dengan izinnya. Tidak ada programmer yang terluka selama produksi tantangan ini.
sumber
/*
, atau dapatkah itu dianggap bukan "masukan yang dibentuk dengan baik"? File sumber C ++ akan menjadi tes yang lebih baik, karena komentar multiline-nya/* */
mungkin akan memecahkan beberapa jawaban yang menggantikan pertama dan terakhir dari spasi utama dengan/
, dan kemudian melanjutkan untuk mengisi spasi dengan*
./* */
kode C ++ yang sama , tetapi kali ini di awal baris. Menurut spesifikasi Anda itu harus dibiarkan apa adanya. Di sini jebakannya, dan sudah menemukan jawaban yang salah, bahwa regex seperti say/\** /
digunakan untuk mengisi ruang-ruang antara // dengan tanda bintang akan mengubah garis menjadi/***/
. Saya telah melihat konversi ini juga/*//*/
. Saya menganggap keduanya salah.Jawaban:
V ,
21, 20 byteCobalah online!
Ini benar-benar hanya port langsung dari jawaban vim saya. Perbedaan yang mencolok:
The
Í
perintah (Global pengganti) secara otomatis mengisi/g
bendera, yang menyimpan dua byteô
identik dengan\t
Î
Adalah mnemonik untuk:%norm
, dan juga mengisi ruang yang diperlukan antara:%norm
dan set penekanan tombol.Pengembalian trailing carriage di bagian akhir ditambahkan secara implisit.
sumber
Vim,
37, 34, 33,32 byteCobalah online!
Perhatikan bahwa ini membutuhkan trailing carriage return (enter) di vim, meskipun tidak dalam penerjemah online.
Ini menggunakan penerjemah V karena itu kompatibel ke belakang. Solusi yang sangat mudah.
Berikut adalah gif yang memungkinkan Anda melihat solusi terjadi secara real time. Ini menggunakan versi yang sedikit lebih lama, dan saya menambahkan beberapa penekanan tombol untuk membuatnya berjalan lebih lambat sehingga Anda dapat melihat apa yang terjadi:
Dan inilah penjelasan cara kerjanya:
sumber
g
tetapi kemudian Anda diedit untuk tidak menggunakan g: / +1 tetap: D:g
karena menyalahgunakan fitur yang kurang dikenal:norm
perintah dibatalkan jika^F<space>
gagal. Jadi:%norm ^F<space>foo
pada dasarnya hal yang sama seperti:g/^ /norm foo
peretasan Vim yang menyenangkan. : Dnorm
?^F
, bukan<C-f>
notasi kunci Silly Vim. Dalam hal ini^
, lompat ke karakter non-spasi pertama, danF<space>
Yang menemukan ruang pertama di belakang kursor.Perl, 41 byte
Jalankan dengan
-p
bendera, seperti:Ganti
␉
dengan tab (dalam Bash, coba ketikkan Control-V Tab.)sumber
perl
mengganti referensi balik itu di tempat, saya berharapsed
itu juga.Cheddar ,
605756 byteDisimpan 3 byte berkat @Conor O'Brien
Saya berharap Cheddar memiliki format string yang lebih baik.
Cobalah online!
Penjelasan
Ini sebuah fungsi.
@
adalah properti yang difungsikan (misalnya ruby&:
) yang memungkinkan Anda melakukan hal-hal seperti: `ar.map (@. head (-1))Jika Anda tidak terbiasa dengan regex:
ini pada dasarnya cocok dengan satu atau lebih (
+
) spasi () di awal (
^
) dari setiapg
baris (m
).sumber
/^ +/
cukup sebagai sebuah regex, karena kita dapat mengasumsikan bahwa ruang terdepan setidaknya akan memiliki panjang 4.Mathematica, 97 byte
Fungsi anonim. Mengambil string sebagai input dan mengembalikan string sebagai output.
sumber
Python 3, 124 byte
Menggunakan regex yang baik.
Ide itu!
sumber
Jawa
210207 byteIni adalah solusi referensi yang mengimplementasikannya secara naif.
sumber
for(int j=0;++j<i-1;)
. Anda juga dapat menghapusint
sebelumnyaj
, dan meletakkannya setelah int yang sudah ada:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
JavaScript ES6, 75 byte
Ganti
\t
dengan tab literal dalam kode Anda.sumber
Java,
185184167152 byteMengingat definisi yang sangat longgar dari array string yang diberikan dalam posting awal, saya telah menggunakan
Stream<String>
yang memungkinkan untuk beberapa penghematan byte akibatnya.Saya menggunakan teknik yang berbeda dari RI untuk mencapai tujuan yang sama. Algoritme itu sendiri agak sama.
Pengujian dan ungolfed :
sumber
Retina , 25 byte
The
\t
harus diganti dengan karakter tab yang sebenarnya (0x09).Cobalah online!
Penjelasan
Ganti setiap tab dengan empat spasi.
Transform setiap baris secara terpisah (
%
) dengan mencocokkan2+N
spasi pada awal baris dan menggantinya dengan/.../
mana...
adalahN
salinan*
.sumber
Python,
125111 bytehttps://repl.it/DGyh/2
sumber
SED (56 +1 untuk -r) 57
Di mana
⇥
tab1. menggantikan tab dengan spasi.
2. menggantikan ruang utama pertama dan terakhir dengan
/
.3. mengganti spasi pertama setelah
/
dan 0+*
dengan*
sampai tidak ada kecocokan.sumber
-f
. Setiap flag tambahan yang digunakan seperti n atau r harus dihitung masing-masing satu byte. Jadi di sini, Anda menghemat 2 byte.;
setelah t juga tidak perlu. Sedangkan untuk kode itu sendiri, Anda memerlukan ^ di awals
perintah ketiga , jika tidak input seperti ini "3/5" diubah menjadi "3 / * 5". Padas
perintah pertama Anda benar-benar memiliki tab di sana, tetapi itu tidak ditampilkan dengan benar dan menyesatkan, jadi gunakan \ t atau tentukan setelahnya, karakter itu adalah tab.Universitas harus mempertimbangkan untuk memberi sedikit lebih banyak ruang untuk program di Emacs Lisp (atau standar untuk
tabify
danuntabify
sendirian), karena mereka mendapatkan lebih banyak kata daripada Java. Ini juga harus memperhatikan siswa (atau guru) yang ukuran identitasnya lebih kecil dari empat atau yang kebetulan kode dalam beberapa bahasa seperti-C.Solusi berikut ini memiliki 206 byte
Dengan asumsi bahwa
tab-width
tidak perlu diatur secara eksplisit, kita dapat menyimpan 20 dari mereka.Dan versi yang tidak serigala akan terlihat seperti ini
Kami pertama
untabify
- tama wilayah sebelum melompat ke awal. Kemudian, ketika kita melihat spasi putih di awal baris, kita menggantinya dengan komentar sepanjang kata spasi putih. Tepatnya, komentar yang akan dimasukkan dibangun olehyang dengan sendirinya membutuhkan 97 byte. Solusi yang lebih pendek untuk menyalin beberapa string dan n kali sangat dihargai.
sumber
Rubi,
5247 + 1 (p flag) = 48 byteSunting : disimpan sepanjang 5 byte, berkat Value Ink
sumber
p
flag untuk mengambil keuntungan dari fakta bahwa (g) sub memodifikasi$_
dan dengan demikian mengubah nilai cetakan?ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
(g)sub
tanpa bang dapat memodifikasi di$_
sini.GNU sed,
6664 +1 (r flag) = 65 byteSunting: 1 byte lebih sedikit berkat saran Riley .
Jalankan: sed -rf formatter.sed input_file
Alasan untuk memisahkan dengan
\n
spasi utama dari sisa teks pada baris itu, adalah karena jika tidak, baris C ++ dimulai dengan komentar seperti ini/* */
akan diubah menjadi/*****/
oleh baris 4 yang lebih disukais,^(/\**) ,\1*,
atau bahkans,^(/\**) ( */),\1*\2,
. Karena sed mengeksekusi skrip untuk setiap baris input, tidak ada\n
yang diperkenalkan dalam ruang pola saat membaca.sumber
/
sampai Anda mengganti\n
. Itu menghemat Anda harus mencocokkannya di baris 4.\t
dengan karakter tab.