Perang suci telah diperebutkan ruang vs tab. (Dan tentu saja ruang, menjadi superior secara objektif, menang.) - Alex A.
S ome PEO p le masih menolak untuk sebuah ccept yang WHI c h adalah cl e Arly s upreme. Anda baru saja menerima sebuah file dengan menggunakan incor ulang ct, b iklan, dan inf e bentuk rior dari WHI t espace, dan sekarang t dia cont e nts dari file r e tercemar dan hancur.
Anda memutuskan untuk menunjukkan kepada orang yang mengirim file kepada Anda betapa salahnya mereka — dengan kekerasan.
Deskripsi
Seperti judulnya, tantangan Anda adalah mengambil file yang berisi satu tab atau lebih:
this is an evil tab onoes
dan dengan kejam menghancurkannya menjadi beberapa bagian:
this is an evil tab
o
n
o
e
s
Perhatikan bahwa perangkat lunak Stack Exchange mengubah tab literal menjadi empat spasi (karena benar), sehingga tab dalam pos ini akan ditampilkan sebagai empat spasi. Input untuk program Anda, bagaimanapun, akan berisi tab yang sebenarnya.
Tantangan
Solusinya harus mengambil string tunggal sebagai input, yang mungkin mengandung ASCII yang dapat dicetak, baris baru, dan tab. Akan selalu ada setidaknya satu tab di input.
Outputnya harus string yang sama, dengan aturan berikut diterapkan:
Mulai kursor pada koordinat (0,0) dan dengan arah kanan. Koordinatnya adalah (kolom, baris), indeks-nol, dan arahnya adalah ke mana Anda harus memindahkan kursor setelah mencetak karakter.
Untuk setiap karakter dalam string:
Jika itu adalah baris baru, pindah ke koordinat (0, n), di mana n adalah jumlah baris baru dalam string sejauh ini (termasuk yang ini), dan reset arah ke kanan.
Jika itu tab, output dua spasi, putar arah kursor 90 derajat searah jarum jam , dan output dua spasi lagi, secara efektif "memecah" tab menjadi dua. Berikut adalah contoh visual, di mana tab direpresentasikan sebagai
--->
dan spasi sebagai·
:foo--->bar--->baz
menjadi
foo··· · b a r · · zab··
Jika tidak, cukup keluarkan karakter pada kursor dan gerakkan kursor satu langkah ke arah saat ini.
Karena Anda membaca string dari awal hingga akhir, ada kemungkinan Anda harus menulis "di atas" karakter yang ada — ini tidak apa-apa. Misalnya input
foo--->bar
spaces are superior
harus menghasilkan keluaran dari
foo
b
spaces are superior
r
Anda dapat memilih apakah "tab rusak" harus menimpa karakter lain — maksud awalnya adalah tidak ada, tetapi speknya ambigu, jadi ini keputusan Anda.
Selanjutnya, setelah menerapkan aturan-aturan ini, Anda juga bisa
menambah atau menghapus spasi tambahan sebanyak yang Anda inginkan.
tambahkan maksimum satu baris baru.
Masukan tidak akan pernah mengandung spasi tambahan; itu juga tidak akan mengandung baris baru atau akhir. Anda juga dapat selalu berasumsi bahwa Anda tidak akan pernah perlu menulis ke kolom atau baris kurang dari 0 (yaitu dari layar).
Kasus cobaan
Tab pada test case ini diwakili --->
karena jika tidak SE akan melahapnya.
Memasukkan:
Test case. Here's a tab--->there's a tab--->everywhere a tab--->tab--->this is some more text
blah
blah
blah blah blah blah blah blah--->blaah--->blaah--->blah--->blaaaaah--->blah--->blah--->blah--->blah--->blah
Keluaran:
Test case. Here's a tab
blah
blah t
blah blah blah blah blah blah
blaablah
r b
e l b
h 'h a l
a sa a a
l l h h
this is some mobe tbxt
haalhalb
b a
a b
t
bat a erehwyreve
Animasi mewah:
Aturan
- Ini adalah kode-golf , jadi kode terpendek dalam byte akan menang!
sumber
(0,0)
maksud Anda, kami perlu menghapus konsol terlebih dahulu, atau Anda hanya maksudkan posisi default kursor dengan itu?Jawaban:
MATLAB, 144 byte
Senjata pilihan untuk berurusan dengan string tentu saja bahasa yang dirancang untuk memanipulasi angka [rujukan?]. Selain itu, hal hebat tentang Matlab adalah tidak peduli jika Anda menetapkan array 'out of bounds': itu hanya akan membuat matriks yang lebih besar. Selanjutnya, elemen matriks default
0
,, diberikan sebagai spasi alih-alih anull
karakter yang ditentukan oleh spesifikasi ASCII.Tab hanyalah lompatan dalam koordinat, jadi tidak ada spasi yang dihasilkan untuk tab.
Saya mulai dengan 209 byte, tetapi beberapa golf yang lebih hati-hati menyingkirkan sebagian besar itu; ada banyak pengulangan dalam kode ini, jadi saya melakukan beberapa percobaan-dan-kesalahan alternatif mana yang paling berhasil. Saya tidak berpikir ada banyak ruang untuk lebih banyak optimasi dengan kode ini, tapi saya selalu senang terbukti salah. Sunting: Tom Carpenter berhasil membuktikan saya salah; ia berhasil menghemat 9 byte yang saya optimalkan untuk menghemat 29 byte. Bita terakhir disimpan dengan mengasumsikan tidak ada karakter kontrol (ASCII <9) pada input - string MATLAB tidak-
null
dimusnahkan.sumber
q('hello<tab>my name<tab>is tom<tab>c')
, tetapi sesuatu di sepanjang garisAttempted to access o(11,-2); on line 7
. Meskipun ini mungkin lebih berkaitan dengan masalah dalam pertanyaan - jika kursor mengarah ke belakang dan melampaui kolom pertama apa yang terjadi pada sisa baris.d
variabel dan sebaliknya memiliki 4 variabel yang untuk loop membuat pola [1 0 -1 0] seperti itu:function o=q(t) u=1;v=0;w=-1;z=0;x=0;y=1;n=1;for s=t if s==9 x=x+2*u-2*v;y=y+2*v+2*u;a=z;z=w;w=v;v=u;u=a;elseif s==10 n=n+1;x=0;y=n;else x=x+u;y=y+v;o(y,x)=s;end end
(jelas di komentar itu menghapus semua baris, jadi Anda harus memiliki memformat ulang seperti milik Anda untuk melihat apa yang saya lakukan)Python 3,
272270266262255253244 byteThe
\t
harus menjadi karakter tab yang sebenarnya.Kode bekerja agak seperti jawaban Zach Gates, pertama-tama menghasilkan
M
denganM
kotak di manaM
adalah jumlah dari panjang garis. (Itu jumlah berlebih yang sangat besar, tetapi membuat kodenya lebih pendek.) Ia kemudian melewati karakter, menempatkan mereka di tempat yang benar, melacak baris paling bawah yang dikunjungi. Akhirnya, ia mencetak semua garis hingga baris itu.Outputnya berisi (biasanya sejumlah besar) spasi tambahan dan 1 spasi tambahan.
sumber
Javascript (ES6),
264245 byteMencoba pendekatan "create a grid of space, fill and trim" raksasa, yang berakhir 19 byte lebih pendek dari yang lain.
Dengan memodifikasi baris kedua hingga terakhir seperti itu, Anda dapat menghapus sejumlah besar ruang tambahan di setiap baris:
Coba di sini:
Tampilkan cuplikan kode
Penjelasan segera hadir; saran diterima!
sumber
JavaScript (ES6), 180
183Menggunakan string template, ada beberapa baris baru yang signifikan dan dihitung.
Itu fungsi mengembalikan output yang diminta (diisi dengan banyak spasi tambahan)
Hanya ada sedikit yang bisa dijelaskan: baris-baris itu dibangun sesuai kebutuhan. Tidak ada variabel arah, hanya 2 offset untuk x dan y, karena dalam rotasi searah jarum jam mereka mudah dikelola:
dx <= -dy, dy <= dx
Tes menjalankan cuplikan di bawah ini di Firefox
sumber
Python 2,
370369368 byteTerima kasih kepada @sanchises dan @ edc65 karena telah menyelamatkan saya setiap byte.
Ini menghasilkan grid terbesar yang mungkin dan kemudian loop, karakter demi karakter, beralih arah pada setiap tab.
sumber
if !d
danif d>2
!d
bukan sintaks yang valid. @sanchises Terima kasih atasd>2
tipnya.d==0
->d<1