การถอดช่องว่างเพิ่มเติมจากสตริง


12

คุณจะได้รับสตริง ส่งออกสตริงที่มีหนึ่งช่องว่างต่อคำ

ท้าทาย

การป้อนข้อมูลจะเป็นสตริง (ไม่ได้nullหรือเปล่า) ล้อมรอบด้วยคำพูด ( ") stdinส่งผ่านทาง ลบช่องว่างนำหน้าและต่อท้ายออกจากช่องว่างนั้น นอกจากนี้หากมีมากกว่าหนึ่งช่องว่างระหว่างคำสองคำ (หรือสัญลักษณ์หรืออะไรก็ตาม) ให้ตัดออกเป็นช่องว่าง เอาต์พุตสตริงที่แก้ไขด้วยเครื่องหมายคำพูด

กฎระเบียบ

  • สตริงจะต้องไม่ยาวเกิน 100 ตัวอักษรและจะมีเฉพาะอักขระ ASCII ในช่วง(ช่องว่าง) ถึง~(ตัวหนอน) (รหัสตัวอักษร 0x20 ถึง 0x7E, รวม) ยกเว้น"กล่าวคือสตริงจะไม่มีคำพูด ( ") และตัวละครอื่น ๆ นอก ช่วงที่ระบุข้างต้น ดูตาราง 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 ได้สงวนอักษรตัวใหญ่ทั้งหมดเป็นตัวแปร inbuilt ดังนั้น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 ตัวอักษร

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

วิ่งตัวอย่าง:

(การใช้ล่าม faubiguyจากคำตอบ Perlของเขาสำหรับการตีความ /// (ออกเสียง 'slashes') )

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


ในทางเทคนิคคุณไม่ได้ป้อนข้อมูล ;) มีภาษานี้แต่อินพุตการอ่านยังคงเป็นความเจ็บปวดที่ฉันคิด
Martin Ender

6

Perl, 22

(รหัส 20 ไบต์พร้อมสวิตช์บรรทัดคำสั่ง 2 ตัว)

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

ต้องรันด้วย-npสวิตช์เพื่อให้$_เต็มโดยอัตโนมัติผ่าน stdin และพิมพ์ไปยัง stdout ฉันจะสมมติว่านี่จะเพิ่ม 2 เข้ากับจำนวนไบต์


1
วิธีแก้ปัญหาเดียวกัน:sed -E 's/ +/ /g;s/" | "/"/g'
izabera

3
สิ่งเดียวกันคือ 12 ไบต์ในจอประสาทตา :)
Martin Ender

-pหมายความว่า-nคุณต้องรับโทษ +1 ที่นี่เท่านั้น (สมมติว่าคุณไม่ได้เปลี่ยนเป็นภาษาอื่นอย่างที่ผู้วิจารณ์คนอื่นแนะนำ)

4

Ruby, 31 29 25 23 Bytes

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

คำอธิบายรหัส:

  • pสตริงออกภายในเครื่องหมายคำพูดคู่ถึงSTDOUT( มีมากกว่านั้น ... )
  • $*คืออาร์เรย์ของSTDINอินพุต$*[0]ใช้ค่าแรก
  • strip เอาช่องว่างเริ่มต้นและสิ้นสุด
  • squeeze ' ' แทนที่> 1 อักขระเว้นวรรคด้วยช่องว่างเดียว

กรณีทดสอบ:

ป้อนคำอธิบายรูปภาพที่นี่


1
คุณสามารถแทนที่ARGVด้วย$*การบันทึกสองไบต์ gsub /\s+/, ' 'สามารถแทนที่ด้วยsqueeze ' 'อีก 4 ไบต์
DickieBoy

@DickieBoy ขอบคุณสำหรับ$*ฉันไม่ทราบว่า แต่เราไม่สามารถแทนที่gsub /\s+/, ' 'ด้วยsqueezeเพราะพวกเขาจะไม่เหมือนกัน
Sheharyar

คุณหมายถึงอะไร "ไม่เหมือนกัน" ผลลัพธ์จะเหมือนกัน
DickieBoy

1
squeeze ' 'จะบีบช่องว่างเท่านั้น "yellow moon".squeeze "l" => "yelow moon"
DickieBoy

2
ส่วนตัวฉัน และผู้ให้คำตอบบางคนด้วย แต่เท่าที่ฉันเห็นคุณไม่ได้อยู่คนเดียวกับการตีความของคุณ ... ขอชี้แจงจากเจ้าของคำถาม โดยวิธีการทั้งช่องว่างระหว่างpและพารามิเตอร์และsqueezeและพารามิเตอร์ที่ไม่จำเป็น
จัดการ

4

Pyth, 17 15 11 10 ไบต์

(ขอบคุณYpnypnและFryAmTheEggman )

pjd-cQdkNN

อาจจะเล่นกอล์ฟมากกว่านี้

หากเอาต์พุตสามารถใช้'แทนได้"ฉันต้องใช้เพียง 8 ไบต์เท่านั้น:

`jd-cQdk

คุณสามารถใช้Nแทน\"
Ypnypn

ยินดีต้อนรับสู่ Pyth, Tylio โปรแกรมที่สองอาจจะ shorterned dโดยการใช้งานของ
isaacg

@isaacg ฉันไม่ได้ใช้dทุกอย่างที่สามารถใช้ได้ใช่หรือไม่
Tyilo

@Tyilo ฉันคิดว่าคุณทำการแก้ไขในเวลาเดียวกันกับที่ฉันแสดงความคิดเห็น ตอนนี้ก็ดีแล้ว
isaacg

คุณสามารถใช้pเพื่อบันทึกสองสามไบต์ในการต่อสายอักขระแทนการใช้หลาย+เอส pjd-cQdkNN
FryAmTheEggman

3

Bash, 36 32 ไบต์

ในฐานะที่เป็นฟังก์ชั่นโปรแกรมหรือเพียงแค่ในไพพ์:

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

คำอธิบาย

xargsแถบแรกจะใส่เครื่องหมายคำพูด

ที่สองxargsตัดแต่งด้านซ้ายและแทนที่ช่องว่างที่อยู่ติดกันหลายรายการในช่วงกลางของสตริงด้วยช่องว่างหนึ่งโดยใช้แต่ละ "คำว่า" และแยกแต่ละช่องด้วยช่องว่าง

xargs -i echo '"{}"'จดจ้องด้านขวาและ rewraps สตริงส่งผลให้ในราคาคู่


2
ว้าว! นั่นเป็นเรื่องยุ่งยาก น่าเสียดายที่ไม่สามารถจัดการกับกรณีทดสอบ 4 ได้ แต่ยังคงประทับใจ
จัดการ

ใช่รหัสนี้ตรงกับกรณีทดสอบที่สี่และสั้นกว่า
Deltik

คุณสามารถทำอะไรแบบนี้ได้ไหม x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce

@Cyoce: คุณสามารถทำเช่นนั้นเพื่อประหยัดหนึ่งไบต์ที่ค่าใช้จ่ายของการสูญเสียการทำงานของท่อ ยังไม่สั้นเท่ากับโซลูชันนี้และยังไม่ตรงกับกรณีทดสอบที่สี่
Deltik

3

Haskell, 31 25 ไบต์

fmap(unwords.words)readLn

wordsแยกสตริงออกเป็นรายการของสตริงด้วยช่องว่างเป็นตัวคั่นและunwordsรวมรายการของสตริงด้วยช่องว่างเดียวระหว่าง เครื่องหมายคำพูด"ถูกถอดออกและนำกลับมาโดยฟังก์ชันของ Haskell readและshow(โดยนัยผ่าน REPL) บนสตริง

การส่งออกโดยฟังก์ชั่นนั้นมีความยาวสามไบต์เช่น 28 ไบต์:

print.unwords.words=<<readLn

แก้ไข: @Mauris ชี้ไปที่readLnฟังก์ชั่นซึ่งบันทึกบางไบต์


ฉันได้รับParse error: naked expression at top levelเมื่อฉันทดสอบโค้ดทั้งสองที่นี่
Spikatrix

@CoolGuy: rextester.com main=interact$show.unwords.words.readคาดว่าโปรแกรมทั้งหมดไม่ฟังก์ชั่นเพื่อให้ลอง มี REPL ออนไลน์ที่ด้านหน้าของhaskell.org (ต้องเปิดใช้งานคุกกี้) ซึ่งคุณสามารถลองfmap(unwords.words.read)getLineใช้ได้
nimi

1
fmap(unwords.words)readLnและprint.unwords.words=<<readLnจะสั้นกว่านี้เล็กน้อย
ลินน์

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

ไม่แน่ใจว่ามันสอดคล้องกับกฎทั้งหมดหรือไม่ แต่แมวอาจไม่ต้องการทั้งหมดเพียงแค่ gsub ผลลัพธ์จากนั้นคือ[1] "This is a string"
MickyT

@MickyT: ขอบคุณสำหรับคำแนะนำ การตีความของฉันขึ้นอยู่กับความคิดเห็นของ OP (โพสต์แรก) คือต้องพิมพ์ให้ stdout ฉันจะขอคำชี้แจง
Alex A.

Ahhh ... ไม่เห็นความคิดเห็นหรือข้อกำหนด
MickyT

2

Python2, 37

ลดลง 1 ไบต์ด้วย @ygramul

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

รุ่นเดิม:

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

กรณีทดสอบ:

ภาพหน้าจอกรณีทดสอบ


ผมอยากจะใช้print" ".join(raw_input().split())แต่มันจะมีพื้นที่ต่อท้ายภายในเครื่องหมายคำพูดสุดท้ายถ้ามีช่องว่างหลังคำสุดท้าย ...
mbomb007

คุณสามารถโกนไบต์พิเศษได้โดยใช้การจัดรูปแบบ%: พิมพ์ '"% s"'% '' .join (อินพุต (). split ())
ygramul

2

JavaScript (ES6), 49 52 58

แก้ไขสั้นลง 6 ไบต์ด้วย @Optimizer

แก้ไข 2 -3 ขอบคุณ @nderscore

อินพุต / เอาต์พุตผ่านป๊อปอัพ การใช้สตริงเท็มเพลตเพื่อตัด 1 ไบต์ในการต่อสตริง

เรียกใช้ตัวอย่างเพื่อทดสอบใน Firefox

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


alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) - 52
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ขอบคุณ หมายเหตุที่เพิ่งทำงานหลังจากที่ชี้แจงสุดท้ายที่เกี่ยวกับคำพูด: EVAL ( '"" "') จะผิดพลาด.
edc65

เมื่อฉันทดสอบกรณีทดสอบที่สี่ (โดยใช้โครเมียม) จะไม่เห็นป๊อปอัป (ซึ่งแสดงผล) ทำไม?
Spikatrix

@CoolGuy อาจเป็นเพราะ Chrome ไม่ได้เรียกใช้ ES6? ฉันไม่เคยทดสอบ ES6 กับ Chrome ยังไงก็ตามฉันลองตอนนี้ใน Chrome (42.0.2311.152) และใช้งานได้สำหรับฉัน
edc65

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



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

Java 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+) ด้วยช่องว่างเดียว

Lua จะเทียบเท่า

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

Bash ขนาด 14 ไบต์

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

1
แล้วสมมติว่า“ foo * bar” หรืออะไรก็ได้ที่มีอักขระไวด์การ์ด?
ผลิต

0

Powershell ขนาด 40 ไบต์

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

ค่อนข้างตรงไปตรงมาและไม่น่าประทับใจมาก

คำอธิบาย

ใช้พารามิเตอร์อินพุตผ่าน (args-variable ที่กำหนดค่าไว้ล่วงหน้า) แทนที่ช่องว่างหลายช่องทั้งหมดด้วยช่องว่างช่องว่างนำหน้าและช่องว่างส่วนท้ายโดยใช้ trim () - เมธอดเพิ่มคำพูด Powershell จะพิมพ์สตริงไปยังคอนโซลเป็นพฤติกรรมเริ่มต้น



0

Zsh , 15 ไบต์

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

ลองออนไลน์!

สตริงอินพุตมีเครื่องหมายคำพูดฝังอยู่ ลบQสำหรับ14 ไบต์ถ้าสายเข้าไม่ได้มีคำพูดที่ฝังตัวเป็นจะทำในบางส่วนของคำตอบอื่น ๆ ที่นี่

การตั้งค่าสถานะการขยายพารามิเตอร์: Qdequotes แล้วzแยกออกเป็นคำตามที่เชลล์ทำ คำนั้นจะเข้าร่วมโดยปริยายโดยช่องว่าง


0

นกกระจิบ , 56 ไบต์

รอ. แทนที่เท่านั้นไม่ได้ครั้งเดียว ? ตอนนี้ฉันต้องใช้คำสั่งผสมแบบแยกส่วน

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

0

GolfScriptขนาด 8 ไบต์

' '%' '*

ลองออนไลน์!

คำอธิบาย

ตรรกะค่อนข้างง่าย:

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

-1

Python2, 28 ไบต์

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

คำอธิบาย

lambda s

ฟังก์ชั่นไม่ระบุชื่อซึ่งใช้เป็นอินพุต s

s.split()

ส่งคืนรายการคำ (ซึ่งถูกคั่นด้วยสตริงที่กำหนดเองของอักขระช่องว่าง) ของสตริง

" ".join(...)

เข้าร่วมรายการกลับเข้าไปในสตริงโดยแต่ละคำคั่นด้วยช่องว่าง ("")


2
ดูเหมือนว่าจะให้ผลลัพธ์ที่ไม่ถูกต้องเกี่ยวกับช่องว่างนำหน้าและต่อท้าย โปรดทราบว่าสถานะความท้าทายที่คุณควรรับอินพุตด้วยเครื่องหมายคำพูดคู่และส่งออกด้วยเครื่องหมายคำพูดคู่ ฉันยังมีข้อผิดพลาดนี้ในตอนแรกจนกระทั่งฉันอ่านการท้าทายอีกครั้ง
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.