Mengupas ruang ekstra dari string

12

Anda diberi string. Keluarkan string dengan satu spasi per kata.

Tantangan

Input akan berupa string (tidak nullatau kosong), dikelilingi dengan tanda kutip ( ") yang dikirim melalui stdin. Hapus spasi awal dan akhir dari itu. Juga, jika ada lebih dari satu ruang antara dua kata (atau simbol atau apa pun), pangkas menjadi hanya satu ruang. Keluarkan string yang dimodifikasi dengan tanda kutip.

Aturan

  • String tidak akan lebih dari 100 karakter dan hanya akan berisi karakter ASCII dalam rentang (spasi) hingga ~(tilde) (kode karakter 0x20 hingga 0x7E, inklusif) kecuali ", yaitu string tidak akan berisi tanda kutip ( ") dan karakter lain di luar rentang yang ditentukan di atas. Lihat tabel ASCII untuk referensi.
  • Anda harus mengambil input dari stdin(atau alternatif terdekat).
  • Output harus mengandung tanda kutip ( ").
  • Anda dapat menulis program lengkap, atau fungsi yang mengambil input (dari stdin), dan mengeluarkan string terakhir

Uji Kasus

"this  is  a    string   "         --> "this is a string"

"  blah blah    blah "             --> "blah blah blah"

"abcdefg"                          --> "abcdefg"

"           "                      --> ""

"12 34  ~5 6   (7, 8) - 9 -  "     --> "12 34 ~5 6 (7, 8) - 9 -" 

Mencetak gol

Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.

Spikatrix
sumber
1
Anda berkata must take input from stdin, dan kemudian Anda berkata ...or a function which takes input, and outputs the final string. Apakah ini berarti fungsi juga harus mendapat input stdin?
blutorange
@blutorange, Ya. Diedit untuk memperjelasnya.
Spikatrix
2
" "aa" "-> ""aa""(apakah kutipan berlaku di dalam string input?)
edc65
@ edc65, Poin bagus. Jawabannya adalah tidak. Diedit untuk memperjelasnya.
Spikatrix
Silakan lihat komentar MickeyT pada jawaban saya. Apakah yang dia usulkan valid? Di R, hasil yang dikembalikan dicetak secara implisit, tetapi dalam jawaban saya, saya secara eksplisit mencetak ke stdout.
Alex A.

Jawaban:

12

CJam, 7 byte

q~S%S*p

Penjelasan Kode

CJam telah memesan semua huruf kapital sebagai variabel bawaan. Jadi Smemiliki nilai ruang di sini.

q~          e# Read the input (using q) and evaluate (~) to get the string
  S%        e# Split on running lengths (%) of space
    S*      e# Join (*) the splitted parts by single space
      p     e# Print the stringified form (p) of the string.

Ini menghilangkan spasi tambahan dan ruang terdepan juga

Cobalah online di sini

Pengoptimal
sumber
10

/// : 18 karakter

/  / //" /"// "/"/

Contoh dijalankan:

(Menggunakan penerjemah faubiguy dari jawaban Perl untuk Interpret /// (diucapkan 'garis miring') .)

bash-4.3$ ( echo -n '/  / //" /"// "/"/'; echo '"   foo  *  bar   "'; ) | slashes.pl
"foo * bar"
manatwork
sumber
Secara teknis Anda tidak mengambil input. ;) Ada bahasa ini tapi saya pikir input membaca masih cukup menyakitkan.
Martin Ender
6

Perl, 22

(20 byte kode, ditambah 2 sakelar baris perintah)

s/ +/ /g;s/" | "/"/g

Perlu dijalankan dengan -npsakelar sehingga $_secara otomatis diisi melalui stdin dan dicetak ke stdout. Saya akan menganggap ini menambahkan 2 ke jumlah byte.

r3mainer
sumber
1
solusi yang sama:sed -E 's/ +/ /g;s/" | "/"/g'
izabera
3
Hal yang sama adalah 12 byte di Retina . :)
Martin Ender
-ptersirat -n, jadi Anda hanya perlu mengambil penalti +1 di sini (dengan asumsi Anda tidak hanya beralih ke bahasa yang berbeda, seperti yang disarankan komentator lain).
4

Ruby, 31 29 25 23 Bytes

p$*[0].strip.squeeze' '

Penjelasan Kode:

  • pmenghasilkan string dalam tanda kutip ganda ke STDOUT( Masih ada lebih dari itu ...)
  • $*adalah array STDINinput, $*[0]mengambil yang pertama
  • strip menghapus ruang awal dan akhir
  • squeeze ' ' mengganti> 1 karakter spasi dengan satu spasi

Kasus uji:

masukkan deskripsi gambar di sini

Sheharyar
sumber
1
Anda dapat mengganti ARGVdengan $*menyimpan dua byte. gsub /\s+/, ' 'dapat diganti dengan squeeze ' 'untuk 4 byte lainnya
DickieBoy
@DickieBoy, terima kasih $*, saya tidak tahu itu. Tetapi kita tidak dapat mengganti gsub /\s+/, ' 'dengan squeezekarena mereka tidak sama .
Sheharyar
Apa yang Anda maksud dengan "tidak sama"? Outputnya sama.
DickieBoy
1
squeeze ' 'hanya akan menekan ruang. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy
2
Secara pribadi saya. Dan beberapa penjawab lain juga. Tapi seperti yang saya lihat, Anda tidak sendirian dengan interpretasi Anda ... Klarifikasi dari pemilik pertanyaan akan disambut. By the way, ruang antara pdan parameternya dan squeezedan parameternya tidak perlu.
manatwork
4

Pyth, 17 15 11 10 byte

(terima kasih kepada Ypnypn dan FryAmTheEggman )

pjd-cQdkNN

Mungkin bisa bermain golf lebih banyak.

Jika output dapat menggunakan 'bukannya "maka saya hanya perlu 8 byte:

`jd-cQdk
Tyilo
sumber
Anda dapat menggunakan Nsebagai gantinya\"
Ypnypn
Selamat datang di Pyth, Tylio. Program kedua dapat disingkat dengan penggunaan d.
isaacg
@isaacg bukankah saya sudah menggunakan dsemua yang bisa digunakan untuk itu?
Tyilo
@ Tyilo Saya pikir Anda sudah mengedit sekitar waktu yang sama saya berkomentar. Semuanya baik sekarang.
isaacg
Anda dapat menggunakan puntuk menyimpan beberapa byte pada rangkaian string daripada banyak +es. pjd-cQdkNN
FryAmTheEggman
3

Bash, 36 32 byte

Sebagai fungsi, program, atau hanya dalam pipa:

xargs|xargs|xargs -i echo '"{}"'

Penjelasan

xargsStrip pertama menandai tanda kutip.

Yang kedua xargsmemotong sisi kiri dan mengganti beberapa ruang yang berdekatan di tengah-tengah string dengan satu ruang dengan mengambil setiap "kata" dan memisahkan masing-masing dengan spasi.

The xargs -i echo '"{}"'trims sisi kanan dan rewraps string yang dihasilkan dalam tanda kutip ganda.

Deltik
sumber
2
Wow! Itu rumit. Sayangnya tidak menangani test case 4, tetapi tetap mengesankan.
manatwork
Ya, kode ini memenuhi test case keempat dan lebih pendek.
Deltik
Bisakah Anda melakukan sesuatu seperti ini? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce
@Cyoce: Anda memang bisa melakukan itu untuk menghemat satu byte dengan biaya kehilangan fungsi pipa. Masih tidak sesingkat solusi ini dan masih belum memenuhi uji kasus keempat.
Deltik
3

Haskell, 31 25 byte

fmap(unwords.words)readLn

wordsmembagi string menjadi daftar string dengan spasi sebagai pembatas dan unwordsbergabung dengan daftar string dengan spasi tunggal di antaranya. Kutipan "dilucuti dan dikembalikan oleh Haskell readdan show(secara implisit melalui REPL) fungsi pada string.

Outputing oleh fungsi itu sendiri adalah tiga byte lebih lama, yaitu 28 byte:

print.unwords.words=<<readLn

Sunting: @Mauris menunjuk ke readLnfungsi, yang menyimpan beberapa byte.

nimi
sumber
Saya mendapatkan Parse error: naked expression at top levelketika saya menguji kedua kode di sini
Spikatrix
@CoolGuy: rextester.com mengharapkan seluruh program, bukan fungsi, jadi cobalah main=interact$show.unwords.words.read. Ada REPL online di bagian depan haskell.org (memerlukan cookie yang diaktifkan) tempat Anda dapat mencoba fmap(unwords.words.read)getLine.
nimi
1
fmap(unwords.words)readLndan print.unwords.words=<<readLnsedikit lebih pendek.
Lynn
@Mauris: terima kasih sudah menunjuk readLn.
nimi
2

R, 45 byte

cat('"',gsub(" +"," ",readline()),'"',sep="")

The readline()fungsi membaca dari STDIN, otomatis stripping setiap terkemuka dan trailing spasi. Kelebihan ruang di antara kata-kata dihapus menggunakan gsub(). Akhirnya, tanda kutip ganda diawali dan ditambahkan dan hasilnya dicetak ke STDOUT.

Contoh:

> cat('"',gsub(" +"," ",readline()),'"',sep="")
    This   is     a   string  
"This is a string"

> cat('"',gsub(" +"," ",readline()),'"',sep="")
12 34  ~5 6   (7, 8) - 9 -  
"12 34 ~5 6 (7, 8) - 9 -"
Alex A.
sumber
Tidak yakin apakah itu sepenuhnya mematuhi aturan, tetapi kucing mungkin tidak sepenuhnya diperlukan, hanya gsub. Output dari itu adalah[1] "This is a string"
MickyT
@MickyT: Terima kasih atas sarannya. Interpretasi saya berdasarkan komentar OP (pertama pada postingan) adalah harus dicetak ke stdout. Saya akan meminta klarifikasi.
Alex A.
Ahhh ... tidak melihat komentar atau persyaratan itu
MickyT
2

Python2, 37

Dikurangi 1 byte berkat @ygramul.

print'"%s"'%' '.join(input().split())

Versi asli:

print'"'+' '.join(input().split())+'"'

Kasus uji:

Tangkapan layar uji kasus

pengguna12205
sumber
Saya benar-benar ingin menggunakannya print" ".join(raw_input().split()), tetapi akan memiliki spasi tambahan di dalam tanda kutip terakhir jika ada spasi setelah kata terakhir ...
mbomb007
Anda dapat mencukur byte tambahan menggunakan% format: print '"% s"'% '' .join (input (). Split ())
ygramul
2

JavaScript (ES6), 49 52 58

Sunting 6 byte lebih pendek, terima kasih kepada @Optimizer

Sunting 2 -3, terima kasih kepada @nderscore

Input / output melalui popup. Menggunakan string template untuk memotong 1 byte dalam rangkaian string.

Jalankan cuplikan untuk menguji di Firefox.

alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)

edc65
sumber
alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) - 52
Pengoptimal
@Optimizer thx. Perhatikan, itu hanya berfungsi setelah klarifikasi terakhir tentang tanda kutip: eval ('"" "') akan macet.
edc65
Ketika saya menguji test case keempat (menggunakan chrome), tidak ada popup (yang menunjukkan hasilnya) terlihat. Mengapa?
Spikatrix
@ CoolGuy mungkin karena Chrome tidak menjalankan ES6? Saya tidak pernah menguji ES6 dengan Chrome. Pokoknya saya mencobanya sekarang di Chrome saya (42.0.2311.152) dan bekerja untuk saya.
edc65
-3:alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)
nderscore
2

05AB1E , 9 byte

#õKðý'".ø

Cobalah online!


#         | Split on spaces.
 õK       | Remove empty Strings.
   ðý     | Join with spaces.
     '".ø | Surround with quotes.
Guci Gurita Ajaib
sumber
1

Mathematica, 75 byte

a=" ";b=a...;Print[InputString[]~StringReplace~{b~~"\""~~b->"\"",a..->a}]
LegionMammal978
sumber
1

KDB (Q), 28 byte

" "sv except[;enlist""]" "vs

Penjelasan

                       " "vs    / cut string by space
      except[;enlist""]         / clear empty strings
" "sv                           / join back with space

Uji

q)" "sv except[;enlist""]" "vs"12 34  ~5 6   (7, 8) - 9 -  "
"12 34 ~5 6 (7, 8) - 9 -"
WooiKent Lee
sumber
1

Java 8, 43 byte

s->'"'+s.replaceAll(" +|\""," ").trim()+'"'

Penjelasan:

Coba di sini.

s->                           // Method with String as parameter and return-type
  '"'                         //  Return a leading quote
  +s.replaceAll(" +           //  + Replace all occurrences of multiple spaces
                   |\"",      //     and all quotes
                        " ")  //    with a single space
    .trim()                   //  And remove all leading and trailing spaces
  +'"'                        //  And add the trailing quote
                              // End of method (implicit / single-line return statement)
Kevin Cruijssen
sumber
1

Perl 5 , 17 byte

16 byte kode +1 untuk -p

s/ *("| ) */$1/g

Cobalah online!

Xcali
sumber
1

Jq 1,5 , 42 byte

split(" ")|map(select(length>0))|join(" ")

Contoh Jalankan

$ jq -M 'split(" ")|map(select(length>0))|join(" ")' < data
"this is a string"
"blah blah blah"
"abcdefg"
""
"12 34 ~5 6 (7, 8) - 9 -"

$ echo -n 'split(" ")|map(select(length>0))|join(" ")' | wc -c
  42

Cobalah online

jq170727
sumber
Saya menangkap masalah keluaran sebelumnya (lihat edit 5) tetapi tidak melihat masalah input. Perintah sudah diperbaiki sekarang. Terima kasih!
jq170727
1

Tcl , 69 byte

puts [string map {{ "} \" {" } \"} [regsub -all \ + [gets stdin] \ ]]

Cobalah online!

Tcl , 79 byte

puts \"[string trim [regsub -all \ + [string range [gets stdin] 1 end-1] \ ]]\"

Cobalah online!

sergiol
sumber
@KevinCruijssen Diperbaiki. sayangnya, dengan mengorbankan banyak byte. Tks untuk memberitahuku.
sergiol
0

golfua, 42 byte

L=I.r():g('%s*\"%s*','"'):g('%s+',' ')w(L)

Penggantian pencocokan pola sederhana: temukan tanda kutip ganda ( \") yang dikelilingi oleh 0 spasi atau lebih ( %s*) & kembalikan penawaran tunggal, lalu ganti semua 1 spasi atau lebih ( %s+) dengan spasi tunggal.

Setara dengan Lua

Line = io.read()
NoSpaceQuotes = Line:gsub('%s*\"%s*', '"')
NoExtraSpaces = NoSpaceQuotes:gsub('%s+', ' ')
print(NoExtraSpaces)
Kyle Kanos
sumber
0

Cobra - 68

Sebagai fungsi anonim:

do
    print'"[(for s in Console.readLine.split where''<s).join(' ')]"'
Suram
sumber
0

Tujuan-C 215

-(NSString*)q:(NSString*)s{NSArray*a=[s componentsSeparatedByString:@" "];NSMutableString*m=[NSMutableString new];for(NSString*w in a){if(w.length){[m appendFormat:@"%@ ",w];}}return[m substringToIndex:m.length-1];}

Versi tidak terkompresi:

-(NSString*)q:(NSString*)s{
    NSArray *a=[s componentsSeparatedByString:@" "];
    NSMutableString *m=[NSMutableString new];
    for (NSString *w in a) {
        if (w.length) {
            [m appendFormat:@"%@ ",w];
        }
    }
    return[m substringToIndex:m.length-1];
}
Fennelouski
sumber
0

Bash, 14 byte

read f;echo $f       # assume f="this  is  a    string   "
michael501
sumber
1
Bagaimana dengan asumsi "foo * bar" atau apa pun dengan karakter wildcard?
manatwork
0

Powershell, 40 byte

"`"$(($args-Replace' +'," ").trim())`""

Cukup lurus ke depan dan tidak terlalu mengesankan.

Penjelasan

Ambil parameter input melalui variabel-variabel args (predfined), ganti semua spasi berganda dengan satu, trim spasi terdepan dan spasi tambahan menggunakan metode trim () -, tambahkan kutipan. Powershell akan mencetak string ke konsol sebagai perilaku default.

Masa bodo
sumber
0

k4, 23 byte

" "/:x@&~~#:'x:" "\:0:0

                    0:0  / read from stdin
             x:" "\:     / split string on spaces and assign to x
        ~~#:'            / boolean true where string len>0, bool false otherwise
     x@&                 / x at indices where true
" "/:                    / join with spaces
tulisan cakar ayam
sumber
0

Zsh , 15 byte

<<<\"${(Qz)1}\"

Cobalah online!

String input berisi kutipan yang disematkan. Hapus Quntuk 14 byte jika string input tidak mengandung tanda kutip tertanam, seperti yang dilakukan dalam beberapa jawaban lain di sini.

Bendera ekspansi parameter: Qdequote, lalu dipisah zmenjadi kata seperti halnya shell. Kata-kata tersebut kemudian secara implisit bergabung dengan spasi.

Fungsi Gamma
sumber
0

Gelisah , 56 byte

Tunggu. Ganti hanya melakukannya sekali ? Sekarang saya harus menggunakan combo split-join.

Fn.new{|x|x.trim().split(" ").where{|i|i!=""}.join(" ")}

Cobalah online!

Penjelasan

Fn.new{|x|                                             } // New anonymous function with the operand x
          x.trim()                                       // Trim out whitespace from both sides of the string
                  .split(" ")                            // Split the string into space-separated chunks
                             .where{|i|i!=""}            // Keep all of those that aren't the null string (due to two consecutive spaces)
                                             .join(" ")  // Join the replaced list together

sumber
0

GolfScript , 8 byte

' '%' '*

Cobalah online!

Penjelasan

Logikanya cukup sederhana:

' '%     # Split on spaces, remove empty results
    ' '* # Join on spaces

sumber
-1

Python2, 28 Bytes

lambda s:" ".join(s.split())

Penjelasan

lambda s

Fungsi anonim yang dianggap sebagai input s.

s.split()

Mengembalikan daftar kata-kata (yang dipisahkan oleh string karakter spasi kosong) dari string s.

" ".join(...)

Bergabung kembali daftar menjadi string, dengan setiap kata dipisahkan oleh spasi ("").

Triggernometri
sumber
2
Ini tampaknya memberikan hasil yang salah mengenai ruang memimpin dan tertinggal. Perhatikan bahwa status tantangan Anda harus mengambil input dengan tanda kutip ganda, dan juga mengeluarkannya dengan tanda kutip ganda. Saya juga salah pada awalnya, sampai saya membaca ulang tantangannya.
Kevin Cruijssen