Tước không gian thừa từ một chuỗi


12

Bạn được cung cấp một chuỗi. Xuất chuỗi với một khoảng trắng trên mỗi từ.

Thử thách

Đầu vào sẽ là một chuỗi (không nullhoặc trống), được bao quanh bằng dấu ngoặc kép ( ") được gửi quastdin . Loại bỏ không gian hàng đầu và dấu từ nó. Ngoài ra, nếu có nhiều hơn một khoảng trắng giữa hai từ (hoặc ký hiệu hoặc bất cứ thứ gì), hãy cắt nó thành một khoảng trắng. Xuất chuỗi sửa đổi với dấu ngoặc kép.

Quy tắc

  • Chuỗi sẽ không dài hơn 100 ký tự và sẽ chỉ chứa các ký tự ASCII trong phạm vi (dấu cách) đến ~(dấu ngã) (mã ký tự 0x20 đến 0x7E, bao gồm) ngoại trừ ", chuỗi sẽ không chứa dấu ngoặc kép ( ") và các ký tự khác bên ngoài phạm vi quy định ở trên. Xem bảng ASCII để tham khảo.
  • Bạn phải lấy đầu vào từ stdin(hoặc thay thế gần nhất).
  • Đầu ra phải chứa dấu ngoặc kép ( ").
  • Bạn có thể viết một chương trình đầy đủ hoặc một hàm lấy đầu vào (từ stdin) và xuất chuỗi cuối cùng

Các trường hợp thử nghiệm

"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 -" 

Chấm điểm

Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.


1
Bạn nói must take input from stdin, và sau đó bạn nói ...or a function which takes input, and outputs the final string. Điều này có nghĩa là chức năng phải lấy đầu vào stdinlà tốt?
blutorange

@blutorange, vâng. Chỉnh sửa để làm rõ nó.
Spikatrix

2
" "aa" "-> ""aa""(các trích dẫn có hợp lệ trong chuỗi đầu vào không?)
edc65

@ edc65, Điểm tốt. Câu trả lời cho điều này là không. Chỉnh sửa để làm rõ nó.
Spikatrix

Vui lòng xem bình luận của MickeyT về câu trả lời của tôi. Là những gì ông đề xuất hợp lệ? Trong R, kết quả trả về được in ngầm, nhưng trong câu trả lời của tôi, tôi đã in rõ ràng đến thiết bị xuất chuẩn.
Alex A.

Câu trả lời:


12

CJam, 7 byte

q~S%S*p

Giải thích mã

CJam đã dành tất cả các chữ in hoa dưới dạng các biến sẵn có. Vì vậy, Scó một giá trị của một không gian ở đây.

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.

Điều này cũng loại bỏ dấu vết và không gian hàng đầu

Dùng thử trực tuyến tại đây


10

/// : 18 ký tự

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

Chạy mẫu:

(Sử dụng trình thông dịch của faubiguy từ câu trả lời Perl của anh ấy cho Phiên dịch /// (phát âm là 'dấu gạch chéo') .)

bash-4.3$ ( echo -n '/  / //" /"// "/"/'; echo '"   foo  *  bar   "'; ) | slashes.pl
"foo * bar"


Về mặt kỹ thuật bạn không lấy đầu vào mặc dù. ;) Có ngôn ngữ này nhưng đọc đầu vào vẫn còn khá đau tôi nghĩ.
Martin Ender

6

Perl, 22

(20 byte mã, cộng với 2 công tắc dòng lệnh)

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

Cần phải được chạy với công -nptắc để $_tự động được điền thông qua stdin và được in ra thiết bị xuất chuẩn. Tôi sẽ giả sử điều này thêm 2 vào số byte.


1
cùng một giải pháp:sed -E 's/ +/ /g;s/" | "/"/g'
izabera

3
Điều tương tự là 12 byte trong Retina . :)
Martin Ender

-pngụ ý -n, vì vậy bạn chỉ phải thực hiện một hình phạt +1 ở đây (giả sử bạn không chỉ chuyển sang một ngôn ngữ khác, như những người bình luận khác đề nghị).

4

Ruby, 31 29 25 23 byte

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

Giải thích mã:

  • pchuỗi đầu ra trong dấu ngoặc kép thành STDOUT( Có nhiều hơn cho nó mặc dù ...)
  • $*là một mảng của STDINđầu vào, $*[0]lấy cái đầu tiên
  • strip loại bỏ không gian bắt đầu và kết thúc
  • squeeze ' ' thay thế> 1 ký tự khoảng trắng bằng một khoảng trắng

Các trường hợp thử nghiệm:

nhập mô tả hình ảnh ở đây


1
Bạn có thể thay thế ARGVbằng cách $*lưu hai byte. gsub /\s+/, ' 'có thể được thay thế bằng squeeze ' '4 byte khác
DickieBoy

@DickieBoy, cảm ơn bạn vì $*tôi không biết điều đó. Nhưng chúng ta không thể thay thế gsub /\s+/, ' 'với squeezehọ không giống nhau .
Sheharyar

Bạn có ý gì bởi "không giống nhau"? Các đầu ra là như nhau.
DickieBoy

1
squeeze ' 'sẽ chỉ bóp không gian. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy

2
Cá nhân tôi là. Và một số người trả lời khác nữa. Nhưng như tôi thấy, cả bạn đều không đơn độc với cách diễn giải của mình. Một sự làm rõ từ chủ sở hữu câu hỏi sẽ được hoan nghênh. Nhân tiện, cả không gian giữa pvà tham số squeezecủa nó và tham số của nó là không cần thiết.
manatwork 22/05/2015

4

Pyth, 17 15 11 10 byte

(cảm ơn YpnypnFryAmTheEggman )

pjd-cQdkNN

Có lẽ có thể được chơi golf nhiều hơn.

Nếu đầu ra có thể sử dụng 'thay vì "thì tôi chỉ cần 8 byte:

`jd-cQdk

Bạn có thể sử dụng Nthay vì\"
Ypnypn

Chào mừng đến với Pyth, Tylio. Chương trình thứ hai có thể được rút ngắn bằng cách sử dụng d.
isaacg

@isaacg tôi đã không sử dụng dcho tất cả mọi thứ nó có thể được sử dụng cho?
Tyilo

@Tyilo Tôi nghĩ bạn đã thực hiện chỉnh sửa cùng lúc tôi nhận xét. Bây giờ tất cả đều tốt.
isaacg

Bạn có thể sử dụng pđể lưu một vài byte vào nối chuỗi thay vì nhiều +es. pjd-cQdkNN
FryAmTheEggman

3

Bash, 36 32 byte

Là một chức năng, một chương trình, hoặc chỉ trong một đường ống:

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

Giải trình

Đầu tiên xargsdải các dấu ngoặc kép.

Cái thứ hai xargscắt cạnh bên trái và thay thế nhiều khoảng trắng liền kề ở giữa chuỗi bằng một khoảng trắng bằng cách lấy từng "từ" và tách từng khoảng bằng một khoảng trắng.

Các xargs -i echo '"{}"'Trims phía bên phải và rewraps chuỗi kết quả trong dấu ngoặc kép.


2
Ồ Đó là khó khăn. Thật không may, không xử lý trường hợp thử nghiệm 4, nhưng vẫn gây ấn tượng.
thao tác

Vâng, mã này đáp ứng trường hợp thử nghiệm thứ tư và ngắn hơn.
Deltik

Bạn có thể làm một cái gì đó như thế này? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce

@Cyoce: Bạn thực sự có thể làm điều đó để tiết kiệm một byte với chi phí mất chức năng đường ống. Vẫn không ngắn như giải pháp này và vẫn không thỏa mãn trường hợp thử nghiệm thứ tư.
Deltik

3

Haskell, 31 25 byte

fmap(unwords.words)readLn

words chia chuỗi thành một danh sách các chuỗi có khoảng trắng dưới dạng dấu phân cách và unwords nối danh sách các chuỗi có một khoảng trống ở giữa. Các trích dẫn "được loại bỏ và đặt lại bởi các hàm của Haskell readshow(ngầm thông qua các hàm REPL) trên các chuỗi.

Đầu ra của hàm tự dài hơn ba byte, tức là 28 byte:

print.unwords.words=<<readLn

Chỉnh sửa: @Mauris chỉ vào readLnhàm, đã lưu một số byte.


Tôi nhận được Parse error: naked expression at top levelkhi tôi kiểm tra cả hai mã ở đây
Spikatrix

@CoolGuy: rextester.com mong đợi toàn bộ chương trình, không phải chức năng, vì vậy hãy thử main=interact$show.unwords.words.read. Có REPL trực tuyến ở mặt trước của haskell.org (yêu cầu bật cookie) nơi bạn có thể thử fmap(unwords.words.read)getLine.
nimi

1
fmap(unwords.words)readLnprint.unwords.words=<<readLnngắn hơn một chút.
Lynn

@Mauris: cảm ơn bạn đã chỉ vào readLn.
nimi

2

R, 45 byte

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

Các readline()chức năng đọc từ STDIN, tự động tước bất kỳ hàng đầu và dấu khoảng trắng. Không gian thừa giữa các từ được loại bỏ bằng cách sử dụnggsub() . Cuối cùng, dấu ngoặc kép được thêm vào và thêm vào và kết quả được in thành STDOUT.

Ví dụ:

> 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 -"

Không chắc chắn nếu nó tuân thủ hoàn toàn các quy tắc, nhưng con mèo có thể không hoàn toàn bắt buộc, chỉ là gsub. Đầu ra từ đó là[1] "This is a string"
MickyT

@MickyT: Cảm ơn lời đề nghị. Giải thích của tôi dựa trên nhận xét của OP (đầu tiên trên bài đăng) là nó phải được in ra thiết bị xuất chuẩn. Tôi sẽ yêu cầu làm rõ.
Alex A.

Ahhh ... không thấy nhận xét hoặc yêu cầu đó
MickyT

2

Python2, 37

Giảm 1 byte nhờ @ygramul.

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

Phiên bản gốc:

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

Các trường hợp thử nghiệm:

Ảnh chụp màn hình trường hợp thử nghiệm


Tôi thực sự muốn sử dụng print" ".join(raw_input().split()), nhưng nó sẽ có một khoảng trắng ở bên trong dấu ngoặc kép cuối cùng nếu có khoảng trắng sau từ cuối cùng ...
mbomb007

Bạn có thể tắt một byte thừa bằng cách sử dụng% format: print '"% s"'% '' .join (input (). Split ())
ygramul

2

JavaScript (ES6), 49 52 58

Chỉnh sửa ngắn hơn 6 byte, nhờ @Optimizer

Chỉnh sửa 2 -3, nhờ @nderscore

Nhập / xuất thông qua cửa sổ bật lên. Sử dụng chuỗi mẫu để cắt 1 byte trong nối chuỗi.

Chạy đoạn trích để kiểm tra trong Firefox.

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


alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) - 52
Tối ưu hóa

@Optimizer thx. Lưu ý, chỉ hoạt động sau lần làm rõ cuối cùng về dấu ngoặc kép: eval ('"" "') sẽ bị sập.
edc65

Khi tôi kiểm tra trường hợp thử nghiệm thứ tư (sử dụng chrome), không thấy cửa sổ bật lên (hiển thị kết quả). Tại sao?
Spikatrix

@CoolGuy có lẽ vì Chrome không chạy ES6? Tôi không bao giờ kiểm tra ES6 với Chrome. Dù sao, tôi đã thử nó ngay bây giờ trong Chrome của tôi (42.0.2311.152) và hoạt động với tôi.
edc65

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


1

Toán học, 75 byte

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

1

KDB (Q), 28 byte

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

Giải trình

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

Kiểm tra

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

1

Java 8, 43 byte

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

Giải trình:

Hãy thử nó ở đây.

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)



1

Jq 1.5 , 42 byte

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

Chạy mẫu

$ 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

Dùng thử trực tuyến


Tôi đã bắt gặp vấn đề đầu ra trước đó (xem chỉnh sửa 5) nhưng không nhận thấy vấn đề đầu vào. Lệnh đã được sửa bây giờ. Cảm ơn!
jq170727



0

golfua, 42 byte

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

Thay thế khớp mẫu đơn giản: tìm bất kỳ dấu ngoặc kép ( \") nào được bao quanh bởi 0 hoặc nhiều khoảng trắng ( %s*) và trả về dấu ngoặc đơn, sau đó thay thế tất cả 1 hoặc nhiều khoảng trắng ( %s+) bằng một khoảng trắng .

Tương đương Lua sẽ là

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

0

Rắn hổ mang - 68

Là một chức năng ẩn danh:

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

0

Mục tiêu-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];}

Phiên bản không nén:

-(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];
}

0

Bash, 14 byte

read f;echo $f       # assume f="this  is  a    string   "

1
Còn về việc giả sử thanh foo * bar hay bất cứ thứ gì khác có ký tự đại diện thì sao?
manatwork

0

Powershell, 40 byte

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

Khá thẳng về phía trước và không ấn tượng lắm.

Giải trình

Lấy tham số đầu vào thông qua biến args (tiền định sẵn), thay thế tất cả nhiều khoảng trắng bằng một, cắt khoảng trắng ở đầu và cuối bằng cách sử dụng phương thức trim () -, thêm dấu ngoặc kép. Powershell sẽ in các chuỗi lên bàn điều khiển như hành vi mặc định.


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

0

Zsh , 15 byte

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

Hãy thử trực tuyến!

Chuỗi đầu vào chứa các trích dẫn nhúng. Tháo Qcho 14 byte nếu chuỗi đầu vào không chứa dấu ngoặc kép nhúng, như được thực hiện trong một số các câu trả lời khác ở đây.

Cờ mở rộng tham số: Qdequote, sau đó zchia thành các từ như shell. Các từ sau đó được ngầm định tham gia bởi không gian.


0

Wren , 56 byte

Chờ đợi. Việc thay thế chỉ làm một lần ? Bây giờ tôi phải sử dụng kết hợp chia nhỏ.

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

Hãy thử trực tuyến!

Giải trình

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


-1

Python2, 28 byte

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

Giải trình

lambda s

Hàm ẩn danh dùng làm đầu vào s.

s.split()

Trả về một danh sách các từ (được phân tách bằng các chuỗi ký tự khoảng trắng tùy ý) của chuỗi s.

" ".join(...)

Tham gia liệt kê lại thành một chuỗi, với mỗi từ được phân tách bằng khoảng trắng ("").


2
Điều này dường như cho kết quả không chính xác về không gian hàng đầu và dấu. Lưu ý rằng trạng thái thử thách bạn nên lấy đầu vào với dấu ngoặc kép và cũng xuất chúng với dấu ngoặc kép. Tôi cũng đã sai điều này lúc đầu, cho đến khi tôi đọc lại thử thách.
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.