Pengguna lekukan luar angkasa, satukan ! Kita harus berjuang melawan semua pengguna tab rendahan !
Misi Anda (jika Anda memilih untuk menerimanya) adalah menulis program atau fungsi yang menggunakan dua argumen:
- Sebuah string: Ini adalah input.
- Bilangan bulat positif: Ini jumlah ruang per tab.
Anda harus melewati setiap baris string dan mengganti setiap tab yang digunakan untuk indentasi dengan jumlah spasi yang diberikan, dan setiap tab yang tidak digunakan untuk indentasi (misalnya di tengah-tengah garis) dengan satu spasi.
Perhatikan bahwa garis-garis seperti \t \tabc
perilaku tidak terdefinisi; mereka dimasukkan oleh pengguna tab jahat untuk menyulitkan program Anda.
Menurut Tabs Must Die Society, program Anda harus sesingkat mungkin untuk menghindari deteksi oleh pengguna tab jahat.
Contoh
\t
digunakan untuk mewakili tab di sini.
String input:
a
\t\tb\tc
d
Nomor input:
4
Keluaran:
a
b c
d
Garis tengah diindentasi oleh 8 spasi, 4 per tab (karena angka yang diberikan adalah 4).
String input:
\ta\t\tb
Nomor input:
4
Keluaran:
a b
CATATAN: Ini bukan duplikat dari tantangan ekspansi tab ; itu memerlukan format input yang sangat berbeda dan persyaratan yang sedikit berbeda.
sumber
\ta\t\tb
,4
(revisi saya sebelumnya gagal yang satu)Jawaban:
CJam,
302423 byteSaya biasanya menolak untuk mengirim kode berbahaya di internet ...
Ini adalah program lengkap yang membaca string dari STDIN dan angka sebagai argumen baris perintah.
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
Apa yang
NA=
dilakukan:Untuk karakter pertama,
N
akan berisi nilai default-nya, yaitu string"\n"
.Untuk semua karakter selanjutnya,
N
akan berisi hasil iterasi terakhir, yaitu karakter terakhir dari input, karakter spasi atau string dari satu atau lebih spasi.Jika
N
adalah string,NA=
pilih elemen pada indeks 10 dari N (membungkus). Hasilnya adalah spasi atau karakter linefeed. Keduanya benar.Jika N adalah karakter,
NA=
tekan 1 untuk umpan baris dan 0 sebaliknya.Karena hal di atas,
NA=
akan mendorong nilai kebenaran untuk karakter pertama, karakter yang didahului oleh linefeed atau karakter yang didahului oleh string spasi (lekukan yang sudah diganti).Dalam semua kasus lain (termasuk tabulator yang telah diganti oleh karakter spasi ),
NA=
akan mendorong nilai falsy.sumber
K5,
5345 byteBeraksi:
Saya hanya ingin catatan menunjukkan bahwa pertanyaan ini secara moral tercela.
sumber
... this question is morally reprehensible.
`0:
dan `" \ n "\`.Perl, 23 byte
22 byte kode + 1 byte baris perintah
Semoga tidak terlalu nakal untuk menganggap input numerik dapat diberikan melalui parameter -i! Pastikan untuk mengganti \ t dalam kode di bawah ini dengan karakter tab yang sebenarnya.
Contoh penggunaan:
Atau untuk kenyamanan:
Penjelasan:
Menggunakan
-p
argumen akan menjalankan program untuk setiap baris dalam input, lalu mencetak hasilnya di akhir.Dalam contoh di atas, substitusi pengganti diganti
\G\t
dengan" "x4
(spasi diulang empat kali).\G
adalah konstruksi regex yang kurang dikenal yang cocok dengan posisi pertandingan pertama jika iterasi pertama, atau dari posisi pertandingan sebelumnya jika bukan iterasi pertama, artinya hanya akan mengganti semua tab pada awal string, dan akan lakukan satu per satu. They/\t/ /
hanya menggantikan semua tab yang tersisa dengan spasi.sumber
Julia,
6959 byteTidak Disatukan:
Menyimpan 10 byte dan memperbaiki masalah berkat Glen O!
sumber
"hello\t\t1"
?"\t \t"
situasi), Anda bisa melakukan inif(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")
:, yang menggunakan fungsi pengganti dan akan menangkap semua tab lekukan dalam satu pukulan.Haskell, 82 byte
Lalu
g 3 "a\n\t\tb\tc\nd"
lakukan hal itu.sumber
Mathematica,
4237 byteTerima kasih kepada @ LegionMammal978 untuk beberapa saran penghematan kode. Parameter pertama,
#
adalah untuk teks input, parameter kedua#2
,, untuk jumlah spasi per tab.sumber
Table[" ",{#2}]
ke" "~Table~{#2}
untuk menyimpan satu byte. Mengapa AndaStringJoin
memasukkan string kosong ke dalamnya?Ruby 49 byte
sumber
JavaScript (ES6), 70
Menggunakan string template, baris baru itu signifikan dan dihitung
Tes menjalankan cuplikan di bawah ini di Firefox.
sumber
CoffeeScript, 72 byte
(Mencoba untuk bermain golf setidaknya 2 gigitan lagi, jadi itu akan mengalahkan solusi ES6 ... Bantuan dihargai: D)
Pemakaian:
sumber
Retina, 42 byte
Semua kemunculan
.
adalah spasi, semua\t
adalah tab literal (1 byte), dan<empty>
merupakan file kosong. Itu hanya untuk keterbacaan. Saya juga tidak sepenuhnya yakin bahwa saya melakukan loop dengan benar, tetapi saya rasa begitu. Setiap baris harus ditempatkan di file sendiri. Saya telah menambahkan 1 byte untuk setiap file tambahan.Input diasumsikan berada di Unary pada jalurnya sendiri di akhir input.
Penjelasan
Saya menambahkan
_
sebelum masukan Unary untuk membatasi itu selama penggantian, sehingga saya tidak menghapus yang tertinggal dari string input. Lalu, saya mengganti semua tab tidak di awal baris dengan satu spasi. Lalu, saya loop, menghapus satu1
dan menambahkan satu spasi setelah setiap tab, sampai saya kehabisan input. Akhirnya, saya membersihkan dengan menghapus tab dan garis bawah.sumber
Python,
7268 byteTab adalah tab literal (1 byte), jadi
r'...'
tidak diperlukan. Sayangnya, Python membutuhkan "fixed-width" look-behinds / look-aheads, jadi saya tidak bisa menggunakan(?<!^|\t)
. Menggunakan metode yang hampir sama dengan solusi Retina saya.sumber
Stax , 20 byte
Jalankan dan debug itu
Program ini membaca baris pertama sebagai lebar indent, dan sisanya dari input sebagai program.
sumber
Japt v2.0a0, 17 byte
Cobalah
sumber
Haskell , 75 byte
Cobalah online! Ini mengasumsikan input hanya berisi karakter yang dapat dicetak serta tab dan baris baru, sebagaimana diizinkan oleh OP dalam komentar.
Penjelasan:
Fungsi luar
#
mengambil strings
dan angkam
dan memanggil#
fungsi yang didefinisikan secara lokal dengan argumen yang sama. Ini dilakukan untuk melacak nilai aslim
, karena#
fungsi bagian dalam mengubah angka:('\t':r)#n=(' '<$[1..n])++r#n
Jika Anda menemukan tab, gantilah dengann
spasi dan biarkann
tidak berubah.(x:r)#n=x:r#(m^sum[1|x<' '])
Jika beberapax
yang bukan tab ditemui, pertahankan sebagaimana adanya tetapi tetapkann
ke nomor aslim
jikax
merupakan baris baru dan1
sebaliknya. Hal ini dilakukan olehm^sum[1|x<' ']
:m
dibawa ke kekuatansum[1|x<' ']
yang mengevaluasi1
kapanx
lebih kecil dari spasi (yaitu baris baru), jadi kita dapatkanm^1 = m
. Kalau tidak, itu yang0
kita milikim^0 = 1
.sumber
Java 11, 134 byte
Cobalah online.
CATATAN: Java 11 belum pada TIO, jadi
" ".repeat(n)
telah ditiru sebagairepeat(" ",n)
gantinya (dengan jumlah byte yang sama).Penjelasan:
sumber