문자열에서 추가 공백 제거


12

당신은 문자열이 제공됩니다. 단어 당 하나의 공백으로 문자열을 출력하십시오.

도전

입력은을 통해 전송 된 null인용 부호 ( ")로 묶인 문자열 (아니 거나 비어 있지 않음 ) stdin입니다. 선행 및 후행 공백을 제거하십시오. 또한 두 단어 (또는 기호 등) 사이에 공백이 둘 이상 있으면 공백을 하나의 공백으로 자릅니다. 따옴표로 수정 된 문자열을 출력하십시오.

규칙

  • 문자열은 100자를 초과 할 수 없습니다 만 범위에서 ASCII 문자를 포함 에 (공간) ~(물결)하기 (문자 코드 0x7E가 포괄적으로가 0x20) "즉, 문자열은 따옴표 (포함되지 않습니다 "외부) 및 다른 문자를 위에서 지정한 범위. 보기 ASCII 테이블을 참조.
  • stdin(또는 가장 가까운 대안) 에서 입력을 받아야합니다 .
  • 출력에는 따옴표 ( ") 가 포함되어야합니다 .
  • 전체 프로그램 또는로부터 입력을 stdin받아 최종 문자열을 출력 하는 함수를 작성할 수 있습니다.

테스트 사례

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

채점

이것은 코드 골프이므로 가장 짧은 제출 (바이트)이 이깁니다.


1
당신은 말하고 must take input from stdin나중에 말합니다 ...or a function which takes input, and outputs the final string. 이것은 함수가 입력을 받아야한다는 것을 의미합니까 stdin?
blutorange

@blutorange입니다. 명확히하기 위해 편집했습니다.
Spikatrix

2
" "aa" "-> ""aa""(입력 문자열 내에서 따옴표가 유효합니까?)
edc65

@ edc65, 좋은 지적. 그것에 대한 대답은 '아니요'입니다. 명확히하기 위해 편집했습니다.
Spikatrix

내 답변에 대한 MickeyT의 의견 을 참조하십시오 . 그가 제안한 것이 유효합니까? R에서는 반환 된 결과가 암시 적으로 인쇄되지만 내 대답에서는 stdout에 명시 적으로 인쇄했습니다.
Alex A.

답변:


12

CJam, 7 바이트

q~S%S*p

코드 설명

CJam은 모든 대문자를 내장 변수로 예약했습니다. 그래서 S여기에 공간의 값을 갖는다.

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.

이것은 후행과 선행 공간을 제거합니다.

여기에서 온라인으로 사용해보십시오


10

/// : 18 자

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

샘플 실행 :

( Interpret에 대한 그의 Perl 답변 에서 faubiguy 의 통역사 사용 /// ( '슬래시'로 발음) .)

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


기술적으로는 입력을받지 않습니다. ;) 이 언어가 있지만 입력을 읽는 것은 여전히 ​​아픈 고통입니다.
Martin Ender

6

펄, 22

(20 바이트의 코드와 2 개의 명령 행 스위치)

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

stdin을 통해 자동으로 채워지고 stdout으로 인쇄 -np되도록 스위치 와 함께 실행해야합니다 $_. 이것이 바이트 수에 2를 더한다고 가정합니다.


1
동일한 솔루션 :sed -E 's/ +/ /g;s/" | "/"/g'
izabera 16:01에

3
같은 것은 Retina 에서 12 바이트입니다 . :)
Martin Ender

-p암시 -n, 그래서 당신은 여기에 +1의 페널티를 갖기 만하면됩니다.

4

루비, 31 29 25 23 바이트

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

코드 설명 :

  • p큰 따옴표 안에 문자열을 출력합니다 STDOUT( 더 많은 것이 있습니다 ...)
  • $*STDIN입력 배열이며 $*[0]첫 번째를 취합니다.
  • strip 시작과 끝 공간을 제거합니다
  • squeeze ' ' > 1 공백 문자를 단일 공백으로 바꿉니다.

테스트 사례 :

여기에 이미지 설명을 입력하십시오


1
당신은 대체 할 수 ARGV$*2 바이트를 절약. gsub /\s+/, ' '로 대체 할 수 squeeze ' '다른 4 바이트
DickieBoy

@DickieBoy, 감사합니다 $*, 나는 그것을 몰랐습니다. 그러나 우리는 대체 할 수 없습니다 gsub /\s+/, ' 'squeeze있기 때문에 그들이 동일하지 않습니다 .
Sheharyar

"동일하지 않다"는 것은 무엇을 의미합니까? 출력은 동일합니다.
DickieBoy

1
squeeze ' '공백 만 쥐게됩니다. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy

2
개인적으로 나는입니다. 그리고 다른 응답자도 있습니다. 그러나 내가 알듯이, 당신은 당신의 해석에 혼자가 아닙니다 ... 질문 소유자의 설명이 환영받을 것입니다. 그건 그렇고, p매개 변수와 매개 변수 사이의 공간 squeeze이 필요하지 않습니다.
manatwork

4

Pyth, 17 15 11 10 바이트

( YpnypnFryAmTheEggman 덕분에 )

pjd-cQdkNN

아마도 더 많은 골프를했을 수 있습니다.

출력이 '대신 사용할 수 있다면 "8 바이트 만 필요합니다.

`jd-cQdk

N대신 사용할 수 있습니다\"
Ypnypn

Tylio Pyth에 오신 것을 환영합니다. 두 번째 프로그램은을 사용하여 단축 할 수 있습니다 d.
isaacg

@isaacg 내가 사용할 d수있는 모든 것에 이미 사용하지 않았 습니까?
Tyilo

@Tyilo 나는 당신이 내가 언급 한 것과 거의 같은 시간에 편집했다고 생각합니다. 이제 다 괜찮아
isaacg

p많은 +es 대신 문자열 연결에 몇 바이트를 저장하는 데 사용할 수 있습니다 . pjd-cQdkNN
FryAmTheEggman

3

배쉬, 36 32 바이트

함수, 프로그램 또는 파이프로 :

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

설명

첫 번째 xargs는 따옴표를 제거합니다.

두 번째 xargs는 왼쪽을 자르고 각 "단어"를 가져 와서 공백으로 분리하여 문자열 가운데의 여러 인접한 공백을 하나의 공백으로 바꿉니다.

xargs -i echo '"{}"'오른쪽 트림 및 따옴표 결과 문자열을 rewraps.


2
와! 까다 롭습니다. 불행히도 테스트 사례 4를 처리하지는 않지만 여전히 인상적입니다.
manatwork

예, 이 코드 는 네 번째 테스트 사례를 충족하며 더 짧습니다.
Deltik

이런 식으로 할 수 있습니까? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce

@Cyoce : 파이프 기능을 잃는 대신 1 바이트를 절약하기 위해 실제로 그렇게 할 수 있습니다. 여전히이 솔루션 만큼 짧지 않고 네 번째 테스트 사례를 만족시키지 못합니다.
Deltik

3

하스켈, 31 25 바이트

fmap(unwords.words)readLn

words공백을 구분 기호로 사용하여 문자열 목록으로 문자열을 분할하고 그 unwords사이에 단일 공백이 포함 된 문자열 목록을 결합합니다. 따옴표 "는 문자열에서 Haskell의 함수 readshow(암시 적으로 REPL을 통해) 함수에 의해 제거됩니다.

함수 자체의 출력은 3 바이트 더 길어집니다 (예 : 28 바이트).

print.unwords.words=<<readLn

편집 : @Mauris는 readLn함수를 가리키며 일부 바이트를 저장했습니다.


내가지고있어 Parse error: naked expression at top level내가 모두 코드를 테스트 할 때 여기에
Spikatrix을

@CoolGuy : rextester.com은 기능이 아닌 전체 프로그램을 예상하므로 시도하십시오 main=interact$show.unwords.words.read. haskell.org 의 전면에 온라인 REPL이 있습니다 (쿠키 활성화 필요) fmap(unwords.words.read)getLine.
nimi

1
fmap(unwords.words)readLn그리고 print.unwords.words=<<readLn조금 짧다.
Lynn

@Mauris :를 가리켜 주셔서 감사합니다 readLn.
nimi

2

R, 45 바이트

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

readline()함수는 STDIN에서 읽으며 선행 및 후행 공백을 자동으로 제거합니다. 단어 사이의 초과 공간은을 사용하여 제거됩니다 gsub(). 마지막으로 큰 따옴표가 앞에 붙고 추가되며 결과는 STDOUT에 인쇄됩니다.

예 :

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

그것이 규칙을 완전히 준수하는지 확실하지 않지만 고양이는 완전히 필요하지 않을 수도 있습니다. 그 결과는 다음과 같습니다.[1] "This is a string"
MickyT

@MickyT : 제안 해 주셔서 감사합니다. OP의 의견 (첫 번째 게시물)을 기반으로 한 나의 해석은 stdout으로 인쇄되어야한다는 것입니다. 설명을 요청하겠습니다.
Alex A.

아 ... ... 그 의견이나 요구 사항을 보지 못했다
MickyT

2

파이썬 2, 37

@ygramul 덕분에 1 바이트 줄였습니다.

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

원본 버전 :

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

테스트 사례 :

테스트 사례


정말 사용 print" ".join(raw_input().split())하고 싶었지만 마지막 단어 뒤에 공백이 있으면 마지막 따옴표 안에 후행 공백이 생길 것입니다 ...
mbomb007

% 서식을 사용하여 여분의 바이트를 제거 할 수 있습니다 : print ' "% s"'% ''.join (input (). split ())
ygramul

2

자바 스크립트 (ES6), 49 52 58

@Optimizer 덕분에 6 바이트 더 짧은 편집

편집 2 -3, @nderscore 덕분에

팝업을 통한 입출력. 템플릿 문자열을 사용하여 문자열 연결에서 1 바이트를 자릅니다.

스 니펫을 실행하여 Firefox에서 테스트하십시오.

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


alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) -52
Optimizer

@ 최적화 기 thx. eval ( ' "" "')은 따옴표에 대한 마지막 설명 후에 작동합니다.
edc65

크롬을 사용하여 네 번째 테스트 사례를 테스트했을 때 팝업이 표시되지 않습니다 (결과 표시). 왜?
Spikatrix

Chrome에서 ES6을 실행하지 않기 때문에 @CoolGuy? Chrome으로 ES6을 테스트하지 않습니다. 어쨌든 나는 지금 내 Chrome (42.0.2311.152)에서 시도해 보았습니다.
edc65 10

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



1

KDB (Q), 28 바이트

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

설명

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

테스트

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

1

자바 8, 43 바이트

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

설명:

여기에서 시도하십시오.

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 바이트

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

샘플 런

$ 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

온라인으로 사용해보십시오


이전에 출력 문제를 발견했지만 (편집 5 참조) 입력 문제를 알지 못했습니다. 명령이 수정되었습니다. 감사!
jq170727



0

golfua, 42 바이트

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

단순 패턴 일치 대체 : \"0 개 이상의 공백 ( %s*)으로 묶은 큰 따옴표 ( )를 찾아 작은 따옴표를 리턴 한 다음 1 개 이상의 공백 ( %s+)을 모두 단일 공백으로 바꾸십시오 .

루아에 해당하는 것은

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

0

코브라-68

익명 함수로 :

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

0

목표 -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];}

비 압축 버전 :

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

배쉬, 14 바이트

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

1
“foo * bar”또는 와일드 카드 문자가있는 다른 것을 가정하면 어떻습니까?
manatwork

0

파워 쉘, 40 바이트

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

매우 직설적이고 인상적이지 않습니다.

설명

(predfined) args-variable을 통해 입력 매개 변수를 취하고 모든 여러 공백을 하나로 바꾸고 trim ()-method를 사용하여 선행 및 후행 공백을 자르고 따옴표를 추가하십시오. Powershell은 기본 동작으로 콘솔에 문자열을 인쇄합니다.


0

k4, 23 바이트

" "/: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 바이트

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

온라인으로 사용해보십시오!

입력 문자열에 따옴표가 포함되어 있습니다. 현상 제거 Q를위한 14 바이트를 여기에 다른 답변의 일부에서 수행 될 때 입력 문자열이 포함 된 따옴표를 포함하지 않는 경우.

매개 변수 확장 플래그 : Q인용 부호를 제거한 후 z쉘처럼 단어로 분할합니다. 그런 다음 단어는 공백으로 내재적으로 연결됩니다.


0

, 56 바이트

기다림. 교체는 한 번만 수행 합니까? 이제 split-join 콤보를 사용해야합니다.

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

온라인으로 사용해보십시오!

설명

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 바이트

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

설명

lambda s

입력으로 사용되는 익명 함수.

s.split()

문자열의 단어 목록 (임의의 공백 문자로 구분)을 반환합니다.

" ".join(...)

각 단어를 공백 ( "")으로 구분하여 목록을 다시 문자열로 조인합니다.


2
이것은 선행 및 후행 공백과 관련하여 잘못된 결과를 제공하는 것 같습니다. 챌린지 상태는 큰 따옴표로 입력하고 큰 따옴표로도 출력해야합니다. 나는 또한 도전을 다시 읽을 때까지 처음에는 이것이 잘못되었다.
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.