Kita sekarang sudah bagaimana cara menghilangkan string dari spasi.
Namun, sebagai tuan-tuan yang baik, kita harus membuka pakaian itu.
Menanggalkan suatu string sama dengan melepasnya, hanya saja lebih halus. Alih-alih menghapus semua ruang depan dan belakang secara bersamaan, kami menghapusnya satu per satu . Kami juga bergantian antara memimpin dan mengekor, agar tidak membakar langkah.
Contoh, dimulai dengan " codegolf "
(lima spasi depan dan belakang):
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
Output pertama string tidak berubah. Lalu, keluarkan setiap langkah. Mulailah dengan menghapus a spasi terdepan (jika ada - lihat aturan # 2).
Input mungkin memiliki jumlah ruang awal dan akhir yang berbeda. Jika Anda kehabisan ruang di satu sisi, terus membuka baju yang lain sampai string kosong.
Input mungkin tidak memiliki spasi awal atau spasi tambahan. Jika itu masalahnya, output apa adanya.
Gunakan metode I / O standar PPCG . Celah default PPCG dilarang.
Perilaku tidak terdefinisi pada input kosong, atau input yang hanya berisi spasi, adalah OK.
Anda dapat mengasumsikan bahwa string hanya akan berisi karakter dari ruang ASCII yang dapat dicetak (
0x20
ke0x7E
).
Contoh - spasi diganti dengan titik .
untuk keterbacaan yang lebih baik:
4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!
6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing
0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello
0 leading, 0 trailing: "World"
World
21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a
Seorang pria / wanita ringkas, jadi jawaban tersingkat dalam byte menang .
0x20
untuk0x7E
). Yang lainnya adalah Perilaku Tidak Terdefinisi." test\r "
atau" \v test"
baik.".....................a....."
? Jika demikian, saya sarankan untuk menambahkannya karena beberapa jawaban tampaknya gagal dalam tes semacam ini. (Titik adalah untuk keterbacaan yang lebih baik tentu saja)Jawaban:
Retina , 26 byte
Cobalah online! (Test suite menggunakan periode untuk kejelasan. Footer dan header mengkonversinya ke dan dari spasi untuk kode utama.)
Penjelasan
Alangkah baiknya jika kita hanya bisa bergantian antara menjatuhkan ruang depan dan spasi dan mencetak hasil antara setiap kali. Masalahnya adalah bahwa saat ini Retina tidak dapat mencetak secara kondisional, sehingga bahkan akan mencetak hasil antara ini jika tidak ada spasi tambahan atau tidak ada spasi tambahan yang tersisa, menghasilkan duplikat. (Retina 1.0 akan mendapatkan opsi yang hanya mencetak hasilnya jika string diubah oleh operasi, tapi kami belum ada di sana ...)
Jadi alih-alih, kami membuat string tunggal yang berisi semua hasil antara dan mencetaknya pada akhirnya.
The
{
membungkus kedua tahapan program dalam satu lingkaran yang mengulangi sampai string berhenti berubah (yang berarti ada ada terkemuka / spasi kiri). Tahap itu sendiri cocok dengan ruang terdepan pada baris terakhir dari string, dan baris terakhir, dan kemudian menulis kembali pertandingan, serta hal-hal setelah ruang pada baris baru (dengan demikian menjatuhkan ruang terdepan dalam salinan).Menghapus ruang trailing sedikit lebih mudah. Jika kita hanya mencocokkan ruang terakhir, kita dapat mengakses barang-barang di depannya (pada baris yang sama) dengan
$%`
yang merupakan varian garis-sadar dari substitusi awalan$`
.sumber
Python 2 ,
12210710310298959391908887 byteCobalah online!
Python 3 ,
97959390 byteCobalah online!
sumber
s=input()
alih-alih fungsi akan membutuhkan lebih sedikit byte.5. Undefined behaviour on empty input, or input that only contains spaces, is OK.
, 98 byte .a
dengan fungsiid
bawaan untuk menyimpan harus mendefinisikannya di awal. -2 byte.Perl 6 , 55 byte
Disimpan 3 byte berkat @nwellnhof.
Cobalah online!
Penjelasan :
($_,{$++%2??S/" "$//!!S/^" "//}...*)
adalah urutan berulang tak terbatas yang dimulai dengan string asli ($_
) dan elemen berikutnya diberikan oleh blok yang dipanggil pada elemen sebelumnya.Blok itu sendiri mendapatkan string dalam
$_
variabel. OperatorS/(regex)/(string)/
akan mencari kejadian pertama(regex)
in$_
, menggantinya(string)
, dan mengembalikan hasilnya. Jika tidak ada kecocokan, itu mengembalikan konten$_
tidak berubah. Kami menggunakan operator ternary?? !!
dengan kondisi$++%2
, yang bergantian antaraFalse
danTrue
($
adalah variabel bebas yang menyimpan kontennya di seluruh panggilan ke blok.)Dalam kasus terburuk (semua spasi di satu sisi dan 1 karakter lainnya), kami menghapus 1 spasi setiap 2 langkah. Jadi kita dapat yakin bahwa dalam langkah 2 * (panjang string), semua spasi akan dihapus. Kami mengambil banyak elemen dari urutan rekursif dengan
[^.comb*2]
dan akhirnya membuang duplikat (yang terjadi setiap kali ruang harus dihapus tetapi tidak ada di sana) dengan.unique
. Ini mengembalikan daftar string, semakin banyak ruang dilucuti.sumber
[^.comb*2]
menghemat 2 byte. Untuk beberapa alasan ini berhasil, tetapi[^2*.comb]
tidak. Tidak tahu kenapa. Menggunakan terner?? !!
untuk memilih regex menyimpan byte lain.[^2*.comb]
dan tidak berhasil, jadi saya gunakan saja[0..2*.comb]
. Dan terima kasih untuk ternary, saya hanya berpikir itu terlalu mahal dan tidak terpikir oleh saya untuk menggantinya dengan sesuatu yang bahkan lebih mahal ...05AB1E ,
2115 byteCobalah online!
Penjelasan ^
sumber
C (gcc) ,
8984 byteVersi rekursif lebih pendek ;-)
Cobalah online!
C (gcc) ,
10710210110099 byteDisimpan 2 byte berkat @Jonathan Frech menggunakan spasi dan ~
Cobalah online!
sumber
==46
dengan<33
karena spasi adalah karakter terkecil yang dapat dicetak dan Anda hanya perlu mengatasinya.++k+
dilakukan?k
dan menambahkan satu, yang setara dengank = k + 1; i = k + 1;
ataui = k + 2; k = k + 1
.i=k+++2
juga bekerja yang saya akan gunakan karena+++
terlihat aneh: PJavaScript (ES6) 92
@ Pengunggah: lihat jawaban JS lainnya di bawah yang panjangnya 76 byte
Sebuah loop mencari ruang di depan atau di ujung. Jika ditemukan, hapus spasi dan string keluaran. Jika tidak ada ruang yang ditemukan 2 kali, berhenti.
sumber
<'!'
. Untuk membuat cuplikan Anda tetap berfungsi, Anda dapat menentukanreplace
titik dengan spasi sebelum meneruskan ke fungsi Anda.Perl 5, 32 byte
Disimpan 4 byte karena @Abigail .
Harus
-pl
dihitung sebagai 2, dipanggil dengan-E
.Contoh Penggunaan
Cobalah online!
sumber
print;s/^ //&&print,s/ $//&&print while/^ | $/
bekerja dengan-n
bendera, juga-l
tidak diperlukanC # (.NET Core) ,
192183182181179178 byte-3 byte terima kasih kepada Kevin Cruijssen
Cobalah online!
sumber
var e=1;while(n.Trim()!=n)
->for(var e=1;n.Trim()!=n;)
;if(n[0]==' ')
->if(n[0]<33)
<33
mungkin karena aturan OP yang baru ditambahkan: " Anda dapat mengasumsikan bahwa string hanya akan berisi karakter dari ruang ASCII yang dapat dicetak (0x20
ke0x7E
). "Java 8,
150146145137 byte-4 byte berkat @Nevay berubah
(f<1&s.charAt(0)<33)
menjadif+s.charAt(0)<33
.-1 byte dengan menggunakan
!s.trim().equals(s)
trik dari @someone 's C # .NET sebagai gantinyas.matches(" .*|.* ")
.-8 byte berkat @Nevay lagi dengan mengubah
!s.trim().equals(s)
kes!=s.trim()
, karenaString#trim
akan kembali " Salinan string ini dengan memimpin dan trailing spasi dihapus, atau string ini jika tidak memiliki terkemuka atau trailing spasi ", sehingga tetap referensi yang sama dan!=
dapat digunakan untuk memeriksa apakah mereka referensi yang sama, bukan.equals
untuk memeriksa nilai yang sama.Penjelasan:
Cobalah di sini (atau coba versi yang lebih visual di sini dengan
#
bukan spasi).sumber
s=f+s.charAt(0)<33
sebagai ganti(f<1&s.charAt(0)<33)
(-4 bytes).s!=s.trim()
sebagai ganti!s.trim().equals(s);
(-8 bytes).C,
9190 byteCobalah online!
sumber
Jelly , 16 byte
Cobalah online!
-2 byte terima kasih kepada Erik the Outgolfer
-1 byte berkat mil
Penjelasan
sumber
ḣ1Ḣ=⁶
->=⁶Ḣ
ƭ
hanya membutuhkan nilad jika rantai lebih panjang dari dua.¹Ṛƭ
berfungsi dengan baik di sini.Ruby , 63 byte
Cobalah online!
sumber
Java (OpenJDK 8) ,
161 147146 byteCobalah online!
-1 byte terima kasih kepada @Kevin Cruijssen !
sumber
(u=32-x.charAt(l)>>-1)
ke(u=32-x.charAt(l)>>k)
k
adalah0
setiap iterasi kedua.u
. Ini tidak ketika saya juga berubah-1
untukk
untukv
. Saya bingung mengapa ini bekerja, karenak
memang akan menjadi0
setelahk=~k
..: Sk=0
skenario: Jika dibiarkan memiliki spasi, makau
memiliki nilai yang sama seperti sebelumnya (0
); jika kiri tidak memiliki spasi tersisa, maka(k=~k)&~v|u
mengevaluasi ke-1|u
(~0&-1|u
), sehingga nilai undefined (negatif)u
tidak masalah (-1|x==-1
).05AB1E ,
2517 byte-8 byte dengan meminjam ide no-need-an-end-check dari Emigna
Cobalah online!
Saya cukup yakin pendekatan yang tidak langsung dapat mengalahkan solusi itu dengan mudah. Untuk sekarang...
Penjelasan:
sumber
S
bukan#
(-1 byte). Loop ... well ... menghemat 1 byte kekalahan dibandingkan dengan pendekatan langsung. Saat ini saya sedang mencari cara yang lebih pendek untuk mendeteksi akhir tugas (5 byte untuk ini banyak), dan saya juga mempertimbangkan pendekatan yang berbeda sama sekali. Saya pikir ada cara yang lebih pintar untuk menyelesaikan tantangan ini.R ,
145133111 byte-12 byte terima kasih kepada @Giuseppe, dengan menyimpan hasil
sub
dalam variabel baru dan menguji apakah sudah berubah-22 byte dengan mengembalikan vektor string daripada string dengan baris baru
Cobalah online!
Penjelasan tentang versi yang sebagiannya tidak mengandung ungolf:
sumber
C(s<-sub(),\n)
alih-alih pernyataan cetak yang terpisah? Ah, tidak, karenasep=" "
sep=""
. Dalam sebagian besar tantangan, ruang tambahan tidak akan menjadi masalah, tetapi sayangnya di sini tidak!sub
hanya menyarankan ini, IDK mengapaL=s
dan mengembalikan vektor string?Java (OpenJDK 8) ,
137125121120124 byteCobalah online!
sumber
s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}
(124 byte) (tampaknya benar tetapi tidak banyak menguji).MATL ,
2116 byteIni menggunakan titik alih-alih ruang untuk kejelasan yang lebih besar. Untuk spasi diganti
46
dengan32
.Cobalah online!
Penjelasan
sumber
Sekam ,
2322 byteTerima kasih kepada Leo untuk -1 byte.
Cobalah online!
Penjelasan
Fungsi ini
`G`I
harus benar-benar built-in ...sumber
?
tampak jelas di belakang ...C ++,
196193189186183 bytes-10 byte terima kasih kepada Jonathan Frech
-3 byte terima kasih kepada Zacharý
Kompilasi dengan MSVC membutuhkan pembatalan pemeriksaan SDL
sumber
==32
dengan<33
.#include<string>
benar-benar diperlukan ?if(...){...;D;}
->if(...)...,D;
.#define R ...<33
,||R){
danif(R){
->#define R ...<33)
,||R{
danif(R{
.C # (.NET Core) ,
176170 byteCobalah online!
Ini adalah alternatif untuk jawaban seseorang , dan hanya menampilkan string secara langsung.
sumber
JavaScript (ES6), 76 byte
Output sebagai string multiline.
Uji Kasus
Menggunakan titik alih-alih spasi, seperti yang dilakukan sebagian besar jawaban.
Tampilkan cuplikan kode
sumber
Sed, 24 byte
Cobalah secara Online!
sumber
Oktaf ,
8883 byte5 byte off berkat Stewie Griffin!
Cobalah online!
sumber
min
diperlukan karenas
menyusut secara dinamiskode mesin x86 untuk Linux, 60 byte
Ini adalah fungsi untuk Linux x86. Dibutuhkan sebagai pointer input ke string
edi
dan panjang stringebp
.Ungolfed, dengan beberapa infrastruktur untuk diuji (kompilasi dengan FASM, jalankan dengan string sebagai argumen program; cari
undress:
label untuk kode fungsi aktual):sumber
sys_write()
membuateax
non-nol (khusus1
, jumlah karakter yang ditulis, dengan asumsi tidak-errno
), begitu jugaprint
jika Anda tidakpop eax
di akhir. Anda bisaxor eax,eax
sebelumcmp byte [edi], ' '
dan menyimpanmov al,1
, dan mungkin beberapaeax
save / restore. Meskipun Anda tidak benar-benar menyimpannya sampai setelah musnahSYS_WRITE
. Hmm, alih-alih0
, Anda bisa menggunakanSYS_WRITE
vs.1
, karenacmp al, imm8
ukurannya sama dengantest al,al
.'\n'
array ke dalammov byte [ecx + edx], '\n'
daripada melakukan yang ke-2write()
? (Dan mengurangi panjang setelah mencetak?) Mungkin menghemat beberapa instruksi.print()
saat ini'\n'
masukeax
, yang berbeda dariSYS_WRITE
, sehingga Anda masih bisa memeriksanya. Saya pikir Anda menyimpan / memulihkaneax
, tetapi itu hanya menyimpan byte menyalin konstan di sekitar. Untuk string yang panjang,sys_write()
dapat meninggalkan byte tinggi dari eax non-nol, sehingga sayangnya tidak digunakanmov al, SYS_WRITE
.mov al, 1
tidak cocok. -2 byte sekarang, terima kasih.PHP , 117 byte
Saya menambahkan ruang ekstra di awal sehingga akan mengambil ruang dan menunjukkan aslinya tanpa kode tambahan.
Agak baru dalam hal ini ... apakah <? Php dan spasi di awal file PHP menambah 6 byte tambahan atau apakah saya mendapatkannya secara gratis?
Cobalah online!
sumber
php -r "echo 1;"
Tetapi jika Anda ingin menggunakan sesuatu seperti<?=1;
Anda harus memasukkan tag dalam hitungan byte.Pyth , 28 byte
Coba di sini! atau Verifikasi semua kasus uji!
Penjelasan
sumber
Python 2 , 79 byte
-1 byte terima kasih kepada @JonathanFrech
Cobalah online!
Setelan uji diganti
"."
dengan" "
sebelum memanggil fungsi dan menggantikan" "
kembali"."
sebelum mencetak hasil untuk kejelasan.sumber
'!'*i and
->i*'!'and
.C # - lagi, 125 byte
Tepuk tangan!
Cobalah online!
sumber
Oktaf , 89 byte
Cobalah online!
Saya akan menambahkan penjelasan nanti, ketika saya punya waktu. Saya mungkin bisa bermain golf beberapa byte jika saya mengubah pendekatan sepenuhnya, tetapi saya tidak bisa melihat betapa sayangnya.
Huruf terakhir di sini menjelaskan: "sendendendendend". Saya berharap ada cara untuk menyimpan
end
sebagai variabel dan menggunakannya, tapi coba tebak ...sumber
s = ...
? (Pertanyaan biasa, saya tahu)Pesta,
9894 byteDisimpan 4 byte menggunakan subkulit bukan urutan (kinerja buruk)
Jawaban pertama
Perhatikan bahwa
!
harus melarikan diri dalam mode interaktifsumber