Beberapa orang bersikeras menggunakan ruang untuk tabulasi dan indentasi.
Untuk tabulasi, itu tidak dapat disangkal salah. Menurut definisi, tabulator harus digunakan untuk tabulasi.
Bahkan untuk lekukan, tabulator secara obyektif lebih unggul:
Ada konsensus yang jelas di komunitas Stack Exchange.
Menggunakan satu ruang untuk lekukan secara visual tidak menyenangkan; menggunakan lebih dari satu itu boros.
Seperti yang diketahui oleh semua pembuat kode
golf, program harus sesingkat mungkin. Tidak hanya menghemat ruang hard disk, waktu kompilasi juga berkurang jika byte lebih sedikit harus diproses.Dengan menyesuaikan lebar tab 1 , file yang sama terlihat berbeda di setiap komputer, sehingga semua orang dapat menggunakan lebar indentasi favoritnya tanpa mengubah file yang sebenarnya.
Semua editor teks yang baik menggunakan tabulator secara default (dan definisi).
Saya berkata begitu dan saya selalu benar!
Sayangnya, tidak semua orang mendengarkan alasan. Seseorang telah mengirimi Anda file yang melakukan kesalahan pada TM dan Anda harus memperbaikinya. Anda bisa melakukannya secara manual, tetapi akan ada yang lain.
Sudah cukup buruk bahwa spacer membuang-buang waktu berharga Anda, jadi Anda memutuskan untuk menulis program sesingkat mungkin untuk mengatasi masalah tersebut.
Tugas
Tulis program atau fungsi yang melakukan hal berikut:
Baca satu string baik dari STDIN atau sebagai baris perintah atau argumen fungsi.
Identifikasi semua lokasi di mana ruang telah digunakan untuk tabulasi atau indentasi.
Jalankan spasi adalah lekukan jika terjadi di awal garis.
Jalankan dua ruang atau lebih adalah tabulasi jika bukan lekukan.
Sebuah tunggal ruang yang tidak lekukan mungkin atau mungkin tidak telah digunakan untuk tabulasi. Seperti yang diharapkan ketika Anda menggunakan karakter yang sama untuk tujuan yang berbeda, tidak ada cara mudah untuk mengatakannya. Karena itu, kami akan mengatakan bahwa ruang tersebut telah digunakan untuk kebingungan .
Tentukan lebar tab 1 yang paling panjang memungkinkan semua ruang yang digunakan untuk tabulasi atau lekukan dapat diganti dengan tabulator, tanpa mengubah tampilan file.
Jika input tidak mengandung tabulasi, atau lekukan, tidak mungkin untuk menentukan lebar tab. Dalam hal ini, lewati langkah selanjutnya.
Dengan menggunakan lebar tab yang ditentukan sebelumnya, ganti semua ruang yang digunakan untuk tabulasi atau indentasi dengan tabulator.
Juga, bila memungkinkan tanpa mengubah tampilan file, ganti semua ruang yang digunakan untuk kebingungan dengan tabulator. (Jika ragu, singkirkan ruang.)
Kembalikan string yang dimodifikasi dari fungsi Anda atau cetak ke STDOUT.
Contohnya
Semua ruang
a bc def ghij
adalah tabulasi.
Setiap run of space mengisi string sebelumnya dari karakter non-space hingga lebar 5, sehingga lebar tab yang benar adalah 5 dan output yang benar 2 adalah
a--->bc-->def->ghij
Dua ruang pertama dari
ab cde f ghi jk lm
adalah tabulasi, yang lain kebingungan.
Lebar tab yang benar adalah 4, jadi output yang benar adalah 2
ab->cde>f ghi>jk lm
Ruang terakhir tetap tidak tersentuh, karena akan diberikan sebagai dua ruang jika diganti oleh tabulator:
ab->cde>f ghi>jk->lm
Semua kecuali satu ruang
int main( ) { puts("TABS!"); }
adalah lekukan, yang lainnya adalah kebingungan.
Level indentasi adalah 0, 4 dan 8 spasi, sehingga lebar tab yang benar adalah 4 dan output yang benar adalah 2
int --->main( ) --->{ --->--->puts("TABS!"); --->}
Ruang dalam
( )
akan dirender sebagai tiga ruang jika diganti dengan tabulator, sehingga tetap tidak tersentuh.Dua ruang pertama dari
x yz w
lekukan, yang lain kebingungan.
Lebar tab yang tepat adalah 2 dan output yang benar 2 adalah
->x>yz w
Ruang terakhir akan dirender sebagai dua ruang jika diganti dengan tabulator, sehingga tetap tidak tersentuh.
Dua ruang pertama dari
xy zw
adalah lekukan, tiga lainnya adalah tabulasi.
Hanya lebar tab 1 yang memungkinkan untuk menghilangkan semua spasi, sehingga output 2 yang benar adalah
>>xy>>>zw
Semua ruang
a b c d
kebingungan.
Tidak ada terpanjang mungkin lebar tab, sehingga benar keluaran 2 adalah
a b c d
Aturan tambahan
Masukan akan seluruhnya terdiri dari karakter ASCII yang dapat dicetak dan umpan garis.
Anda dapat berasumsi bahwa terdapat paling banyak 100 baris teks dan paling banyak 100 karakter per baris.
Jika Anda memilih STDOUT untuk output, Anda dapat mencetak satu line linefeed tunggal.
Aturan standar kode-golf berlaku.
1 Lebar tab didefinisikan sebagai jarak karakter antara dua penghentian tab berurutan , menggunakan font monospasi.
2 Panah seni ASCII mewakili tabulator Stack Exchange menolak untuk me-render dengan benar, di mana saya telah mengirimkan laporan bug. Output aktual harus mengandung tabulator aktual.
sumber
programs should be as short as possible
Saya percaya saya telah menemukan saudara lelaki Arthur Whitney yang telah lama hilang !!Jawaban:
Pyth,
102103 byteCobalah secara Online
Ide yang menarik, tetapi karena tab di input memecah konsep, tidak bisa digunakan.
Edit: Fixed bug. banyak terima kasih @aditsu
sumber
PowerShell,
414409 byteSaya melanjutkan dan menggunakan baris baru alih-alih
;
memungkinkan untuk membuat tampilan lebih mudah. Saya menggunakan akhiran baris unix sehingga seharusnya tidak mempengaruhi jumlah byte.Cara Menjalankan
Salin kode ke
SpaceMadness.ps1
file, lalu masukkan input ke skrip. Saya akan menganggap file yang perlu dikonversi disebuttaboo.txt
:Dari PowerShell:
Dari command prompt:
Saya mengujinya dengan PowerShell 5, tetapi harus bekerja pada 3 atau lebih tinggi.
Pengujian
Berikut ini adalah skrip PowerShell cepat yang berguna untuk menguji di atas:
Letakkan ini di direktori yang sama dengan
SpaceMadness.ps1
, saya sebut initester.ps1
, sebut seperti ini:Anda mendapatkan idenya. Itu memuntahkan isi setiap file setelah konversi, dijalankan
[RegEx]::Escape()
yang terjadi untuk menghindari spasi dan tab sehingga sangat nyaman untuk melihat apa yang sebenarnya telah diubah.Outputnya terlihat seperti ini (tetapi dengan warna):
Penjelasan
Baris pertama mendefinisikan faktor umum / fungsi pembagi terbesar
g
sejelas yang saya bisa mengelola, yang mengambil array (jumlah angka yang berubah-ubah) dan menghitung GCD secara rekursif menggunakan algoritma Euclidean .Tujuan dari ini adalah untuk mengetahui "lebar tab paling panjang" dengan mengambil indeks + panjang setiap lekukan dan tabulasi seperti yang didefinisikan dalam pertanyaan, kemudian memasukkannya ke fungsi ini untuk mendapatkan GCD yang menurut saya adalah yang terbaik yang kami bisa lakukan untuk lebar tab. Panjang kebingungan akan selalu 1 sehingga tidak memberikan kontribusi apa pun untuk perhitungan ini.
$b
mendefinisikan scriptblock karena mengganggu saya perlu memanggil potongan kode itu dua kali, jadi saya menyimpan beberapa byte dengan cara itu. Blok ini mengambil string (atau larik string)$n
dan menjalankan regex di atasnya (sls
atauSelect-String
), mengembalikan objek yang cocok. Saya benar-benar mendapatkan lekukan dan tabulasi dalam satu di sini, yang benar-benar menyelamatkan saya pemrosesan ekstra dengan menangkapnya secara terpisah.$n
digunakan untuk hal-hal yang berbeda di dalam dan di luar loop utama (benar-benar buruk, tetapi perlu di sini sehingga saya dapat menanamkannya$b
di scriptblock dan menggunakannya di dalam dan di luar loop tanpaparam()
deklarasi panjang dan argumen yang lewat.$s
ditugaskan lebar tab, dengan memanggil$b
blok pada array baris dalam file input, kemudian menjumlahkan indeks dan panjang setiap pertandingan, mengembalikan array jumlah sebagai argumen ke dalam fungsi GCD. Begitu$s
juga ukuran tab kita berhenti sekarang.Kemudian loop dimulai. Kami mengulangi setiap baris dalam larik baris input
$n
. Hal pertama yang saya lakukan dalam loop adalah menetapkan$n
(cakupan lokal) nilai baris saat ini karena alasan di atas.$w
mendapatkan nilai panggilan scriptblock hanya untuk baris saat ini (lekukan dan tabulasi untuk baris saat ini).$c
mendapatkan nilai yang sama, tetapi sebaliknya kami menemukan semua kebingungan .Saya menjumlahkan
$w
dan$c
yang merupakan array, memberi saya satu array dengan semua kecocokan ruang yang saya butuhkan,sort
dalam urutan menurun dengan indeks, dan mulai mengulangi setiap pertandingan untuk baris saat ini.Semacam itu penting. Awalnya saya menemukan cara sulit untuk mengganti bagian-bagian dari string berdasarkan nilai indeks adalah ide yang buruk ketika string pengganti lebih kecil dan mengubah panjang string! Indeks lainnya menjadi tidak valid. Jadi dengan memulai dengan indeks tertinggi di setiap baris, saya memastikan saya hanya membuat string lebih pendek dari ujung, dan bergerak mundur sehingga indeks selalu berfungsi.
Ke dalam loop ini,
$x
ada dalam indeks pertandingan saat ini dan$l
panjang pertandingan saat ini.$s
sebenarnya bisa0
dan itu menyebabkan sial sial oleh nol kesalahan jadi saya memeriksa validitasnya kemudian melakukan matematika.The
!(($x+$l)%$s)
bit ada satu titik di mana saya memeriksa untuk melihat apakah sebuah kebingungan harus diganti dengan tab atau tidak. Jika indeks ditambah panjang dibagi dengan lebar tab tidak memiliki sisa, maka kami baik untuk mengganti pertandingan ini dengan tab (bahwa matematika akan selalu bekerja pada lekukan dan tabulasi , karena ukurannya adalah apa yang menentukan lebar tab memulai dengan).Untuk penggantian, setiap iterasi loop cocok bekerja pada baris input saat ini, jadi itu adalah kumpulan pengganti kumulatif. Regex hanya mencari
$l
spasi yang didahului oleh$x
karakter apa pun. Kami menggantinya dengan$l/$s
karakter tab (atau 1 jika angka itu di bawah nol).Bagian ini
(($l/$s),1-ge1)[0]
adalah cara berbelit-belit yang mewahif (($l/$s) -lt 0) { 1 } else { $l/$s }
atau sebagai alternatif[Math]::Max(1,($l/$s))
. Itu membuat array$l/$s
dan1
, kemudian menggunakan-ge 1
untuk mengembalikan array yang hanya mengandung elemen yang lebih besar atau sama dengan satu, lalu mengambil elemen pertama. Muncul dalam beberapa byte lebih pendek dari[Math]::Max
versi.Jadi setelah semua penggantian selesai, baris saat ini dikembalikan dari iterasi
ForEach-Object
(%
), dan ketika semuanya dikembalikan (array garis tetap), itu-join
diedit dengan baris baru (karena kami membagi baris baru di awal).Saya merasa seperti ada ruang untuk perbaikan di sini bahwa saya terlalu lelah untuk menangkap sekarang, tapi mungkin saya akan melihat sesuatu nanti.
sumber
PHP -
278210 byteFungsi ini bekerja dengan menguji setiap lebar tab, dimulai dengan nilai 100, panjang maksimal garis dan karenanya lebar tab maksimal.
Untuk setiap lebar tab, kami membagi setiap baris menjadi "blok" dengan panjang itu. Untuk masing-masing blok ini:
Setelah setiap blok garis dianalisis, kami menghafal umpan baris. Jika semua blok dari semua baris dianalisis dengan sukses, kami mengembalikan string yang telah kami hafal. Jika tidak, jika setiap lebar tab yang benar-benar positif telah dicoba, tidak ada tabulasi, atau lekukan, dan kami mengembalikan string asli.
Ini adalah versi yang tidak dikoleksi:
Terima kasih khusus kepada DankMemes untuk menghemat 2 byte.
sumber
for($t=101;--$t;)
alih-alihfor($t=100;$t;--$t)
CJam, 112
Cobalah online
Saya harus menjawab tantangan ini, karena saya harus melakukan bagian saya untuk membantu menyingkirkan dunia kekejian ini. Tab jelas lebih unggul, tetapi sayangnya, beberapa orang tidak bisa dibenarkan.
Penjelasan:
sumber
PowerShell ,
165160153152142138137 byteCobalah online!
Kurang bermain golf:
sumber