Bir dizeden fazladan boşluk bırakma


12

Size bir dize verilir. Dizeyi sözcük başına bir boşluk bırakarak çıktı.

Meydan okuma

Giriş, üzerinden gönderilen nulltırnak işaretleri ( ") ile çevrili bir dize ( boş veya boş) olacaktır stdin. Öndeki ve arkadaki boşlukları kaldırın. Ayrıca, iki kelime (veya semboller veya herhangi bir şey) arasında birden fazla boşluk varsa, onu tek bir boşluğa kesin. Değiştirilen dizeyi tırnak işaretleri ile çıktılar.

kurallar

  • Dize 100 karakterden uzun olmayacak ve yalnızca (boşluk) ila ~(yaklaşık işareti) (0x20 - 0x7E karakter kodları dahil) ASCII karakterlerini içerecektir ( "ör. Dize tırnak işaretleri ( ") ve yukarıda belirtilen aralık. Referans için ASCII tablosuna bakınız .
  • Girdiyi stdin(veya en yakın alternatifi) almalısınız .
  • Çıktı tırnak ( ") içermelidir .
  • Tam bir program veya giriş (itibaren stdin) alan ve son dizeyi çıkaran bir işlev yazabilirsiniz

Test Durumları

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

puanlama

Bu kod golf, yani en kısa gönderme (bayt cinsinden) kazanır.


1
Diyorsun must take input from stdinve sonra diyorsun ...or a function which takes input, and outputs the final string. Bu, işlevin de girdi alması gerektiği anlamına mı geliyor stdin?
blutorange

@blutorange, Evet. Açıklığa kavuşturmak için düzenlendi.
Spikatrix

2
" "aa" "-> ""aa""(tırnaklar giriş dizesinin içinde geçerli mi?)
edc65

@ edc65, İyi bir nokta. Bunun cevabı hayır. Açıklığa kavuşturmak için düzenlendi.
Spikatrix

Lütfen MickeyT'nin cevabım hakkındaki yorumuna bakın . Önerdiği şey geçerli mi? R'de, döndürülen sonuçlar örtülü olarak yazdırılır, ancak cevabımda açıkça stdout'a yazdırdım.
Alex A.

Yanıtlar:


12

CJam, 7 bayt

q~S%S*p

Kod Açıklaması

CJam tüm büyük harfleri dahili değişken olarak ayırmıştır. Yani Sburada bir boşluk bir değere sahiptir.

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.

Bu, sondaki ve önde gelen alanları da kaldırır

Buradan çevrimiçi deneyin



6

Perl, 22

(20 bayt kod artı 2 komut satırı anahtarı)

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

-npAnahtarla $_otomatik olarak doldurulması ve stdout'a basılması için anahtarla çalıştırılması gerekir . Bunun bayt sayısına 2 eklediğini varsayacağım.


1
aynı çözüm:sed -E 's/ +/ /g;s/" | "/"/g'
izabera

3
Aynı şey Retina'da 12 bayt . :)
Martin Ender

-pima eder -n, bu yüzden burada sadece +1 ceza almanız gerekir (diğer yorumcular tarafından önerildiği gibi yalnızca farklı bir dile geçiş yapmadığınızı varsayarsak).

4

Yakut, 31 29 25 23 Bayt

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

Kod Açıklaması:

  • pçift ​​tırnak içinde dize çıktılar STDOUT( Ama daha fazlası var ...)
  • $*bir dizi STDINgirdi, $*[0]ilki alır
  • strip başlangıç ​​ve bitiş alanlarını kaldırır
  • squeeze ' ' > 1 boşluk karakterini tek bir boşlukla değiştirir

Test Durumları:

resim açıklamasını buraya girin


1
Sen yerini alabilir ARGVile $*iki bayt tasarrufu. başka bir 4 bayt gsub /\s+/, ' 'ile değiştirilebilirsqueeze ' '
DickieBoy

@DickieBoy, teşekkür ederim $*, bilmiyordum. Fakat aynı şeyleri değiştiremeyiz gsub /\s+/, ' ', squeezeçünkü aynı şey değildirler .
Sheharyar

"Aynı değil" ile ne demek istiyorsun? Çıkışlar aynı.
DickieBoy

1
squeeze ' 'yalnızca boşlukları sıkar. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy

2
Şahsen ben. Ve diğer bazı cevaplayıcılar da. Ama gördüğüm kadarıyla, yorumunuzda yalnız değilsiniz ... Soru sahibinden bir açıklama memnuniyetle karşılanacaktır. Bu arada, pve parametresi ile parametresi arasındaki boşluk squeezegereksizdir.
manatwork

4

Pyth, 17 15 11 10 bayt

( Ypnypn ve FryAmTheEggman sayesinde )

pjd-cQdkNN

Muhtemelen daha fazla golf olabilir.

Çıktı 'yerine kullanabilirsiniz , "o zaman ben sadece 8 bayt gerekir:

`jd-cQdk

Sen kullanabilirsiniz Nyerine\"
Ypnypn

Pyth'e hoş geldiniz, Tylio. İkinci programın kullanımı kısaltılabilir d.
isaacg

@isaacg Kullanılabilecek dher şey için daha önce kullanmadım mı?
Tyilo

@Tyilo Ben yorum aynı anda bir düzenleme yaptı sanırım. Artık her şey yolunda.
isaacg

pBirçok +es yerine dize birleştirme işlemine birkaç bayt kaydetmek için kullanabilirsiniz . pjd-cQdkNN
FryAmTheEggman

3

Bash, 36 32 bayt

Bir işlev olarak, bir program olarak veya sadece bir boruda:

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

açıklama

Birincisi xargstırnak işaretlerini kaldırır.

İkincisi xargssol tarafı keser ve her "sözcüğü" alarak ve her birini bir boşlukla ayırarak dizenin ortasındaki birden çok bitişik boşluğu bir boşlukla değiştirir.

xargs -i echo '"{}"'Sağ tarafını keser ve çift tırnak sonuç dizesi REWRAPS.


2
Vaov! Bu zor. Maalesef test durumu 4'ü ele almıyor, ancak yine de etkileyici.
manatwork

Evet, bu kod dördüncü test senaryosunu karşılar ve daha kısadır.
Deltik

Böyle bir şey yapabilir misin? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce

@Cyoce: Gerçekten de, bir bayt tasarruf etmek için boru işlevselliğini kaybetme pahasına bunu yapabilirsiniz. Hala bu çözüm kadar kısa değil ve dördüncü test vakasını tatmin etmiyor.
Deltik

3

Haskell, 31 25 bayt

fmap(unwords.words)readLn

wordsdizeyi sınırlayıcı olarak boşluklu bir dizeler listesine böler ve arada unwordstek bir boşluk bulunan dizeler listesine ekler. Tırnaklar ", dizelerdeki Haskell readve show(dolaylı olarak REPL aracılığıyla) işlevlerinden çıkarılır ve geri konur .

İşlevin kendisinin çıktısı üç bayt daha uzun, yani 28 bayt:

print.unwords.words=<<readLn

Edit: @Mauris readLnbazı baytlar kaydetti işlevi işaret etti .


Her Parse error: naked expression at top leveliki kodu da burada
Spikatrix

@CoolGuy: rextester.com fonksiyonlar değil tüm programları bekliyor, bu yüzden deneyin main=interact$show.unwords.words.read. Haskell.org'un cephesinde, deneyebileceğiniz bir çevrimiçi REPL (çerezlerin etkinleştirilmesini gerektirir) vardır fmap(unwords.words.read)getLine.
nimi

1
fmap(unwords.words)readLnve print.unwords.words=<<readLnbiraz daha kısadır.
Lynn

@Mauris: işaret ettiğiniz için teşekkürler readLn.
nimi

2

R, 45 bayt

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

readline()Fonksiyonu otomatik olarak ön ve arka boşluk sıyırma, STDIN'den okur. Kelimeler arasındaki fazla boşluk kullanılarak kaldırılır gsub(). Son olarak, çift tırnak işaretleri eklenir ve eklenir ve sonuç STDOUT'a yazdırılır.

Örnekler:

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

Kurallara tamamen uyup uymadığından emin değilim, ancak kedi tamamen gerekli olmayabilir, sadece gsub. Bunun çıktısı[1] "This is a string"
MickyT

@MickyT: Öneri için teşekkürler. OP'nin yorumuna (ilk olarak yazı üzerine) dayanan yorumum, stdout'a basılması gerektiğiydi. Açıklık isteyeceğim.
Alex A.

Ahhh ... bu yorumu veya gereksinimi
görmedi

2

Python2, 37

@Ygramul sayesinde 1 bayt azalır.

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

Orijinal versiyon:

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

Test senaryoları:

Test case ekran görüntüsü


Gerçekten kullanmak istedim print" ".join(raw_input().split()), ancak son kelimeden sonra boşluklar olsaydı son tırnak işareti içinde bir boşluk olurdu ...
mbomb007

% Biçimlendirmeyi kullanarak fazladan bir baytı tıraş edebilirsiniz: print '"% s"'% '' .join (input (). Split ())
ygramul

2

JavaScript (ES6), 49 52 58

Düzenleme 6, @Optimizer sayesinde daha kısa bayt

@Nderscore sayesinde 2 -3'ü düzenleyin

Açılır pencereden giriş / çıkış. Dize birleştirme işleminde 1 bayt kesmek için şablon dizesini kullanma.

Firefox'ta test etmek için snippet'i çalıştırın.

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


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

@Optimizer thx. Sadece tırnak işaretleri hakkında son açıklamadan sonra işe yaradığını unutmayın: eval ('"" "')
çökecektir

Dördüncü test senaryosunu (krom kullanarak) test ettiğimde, hiçbir açılır pencere (sonucu gösteren) görülmez. Neden?
Spikatrix

@CoolGuy, Chrome ES6'yı çalıştırmadığı için olabilir mi? ES6'yı asla Chrome ile test etmiyorum. Her neyse, şimdi Chrome'umda (42.0.2311.152) denedim ve benim için çalışıyor.
edc65

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


1

Mathematica, 75 bayt

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

1

KDB (Q), 28 bayt

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

açıklama

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

Ölçek

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

1

Java 8, 43 bayt

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

Açıklama:

Burada deneyin.

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 bayt

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

Örnek Çalışma

$ 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

Çevrimiçi deneyin


Çıktı sorununu daha önce yakaladım (bkz. Düzenleme 5), ancak girdi sorununu fark etmedim. Komut şimdi düzeltildi. Teşekkürler!
jq170727

1

Tcl , 69 bayt

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

Çevrimiçi deneyin!

Tcl , 79 bayt

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

Çevrimiçi deneyin!


@KevinCruijssen Düzeltildi. ne yazık ki, birçok bayt pahasına. Bana söylediğin için teşekkürler.
sergiol


0

golfua, 42 bayt

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

Basit desen eşleştirme değiştirme: \"0 veya daha fazla boşlukla çevrilmiş herhangi bir çift tırnak işareti ( ) bulun ( %s*) ve tek alıntıyı döndürün, ardından 1 veya daha fazla boşluğu değiştirin (%s+ ) tek bir boşlukla değiştirin.

Lua eşdeğeri

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

0

Kobra - 68

Anonim bir işlev olarak:

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

0

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

Sıkıştırılmamış sürüm:

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

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

1
“Foo * bar” veya joker karakterli başka bir şey varsayalım?
manatwork

0

Powershell, 40 bayt

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

Oldukça düz ileri ve çok etkileyici değil.

açıklama

Girdi parametresini (önceden tanımlanmış) args değişkeni ile alın, tüm çoklu boşlukları bir ile değiştirin, ön ve arka boşlukları trim () - yöntemini kullanarak kesin, tırnak ekleyin. Powershell, dizeleri konsola varsayılan davranış olarak yazdırır.


0

k4, 23 bayt

" "/: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 bayt

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

Çevrimiçi deneyin!

Giriş dizesi katıştırılmış tırnak işaretleri içerir. Kaldır Qiçin 14 bayt burada diğer bazı yanıtlar yapıldığı gibi girdi dizesi, gömülü tırnak içermiyorsa.

Parametre genişletme bayrakları: Qayrıştırır, sonra zkabuk gibi kelimelere ayrılır. Kelimeler daha sonra örtük olarak boşluklarla birleştirilir.


0

Wren , 56 bayt

Bekle. Değiştirme yalnızca bir kez mi yapılır? Şimdi split-join kombinasyonunu kullanmalıyım.

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

Çevrimiçi deneyin!

açıklama

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 bayt

' '%' '*

Çevrimiçi deneyin!

açıklama

Mantık oldukça basit:

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

-1

Python2, 28 Bayt

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

açıklama

lambda s

Giriş s olarak anonim işlev.

s.split()

S dizesinin sözcüklerin (boşluk karakterlerinin gelişigüzel dizeleri ile ayrılmış) bir listesini döndürür.

" ".join(...)

Listeyi, her sözcük bir boşlukla ("") ayrılmış bir dizeye geri ekler.


2
Bu, önde gelen ve arkadaki boşluklarla ilgili yanlış sonuçlar veriyor gibi görünüyor. Zorluk durumunun, girdiyi çift tırnak işareti ile almanız ve bunları çift tırnak işareti ile çıkarmanız gerektiğini unutmayın. İlk başta, bu meydan okumayı tekrar okuyana kadar da yanlış yapmıştım.
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.