Зняття зайвих пробілів з рядка


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.
Олексій А.

Відповіді:


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 символів

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

Проба зразка:

(Використовуючи перекладача Faubiguy з його відповіді Perl для інтерпретації /// (вимовляється "косої риски") .)

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


Технічно ви не берете вклад. ;) Існує ця мова, але читання введення все ще дуже болить, я думаю.
Мартін Ендер

6

Перл, 22

(20 байт коду, плюс 2 комутатори командного рядка)

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

Потрібно запустити -npперемикач, щоб $_він автоматично заповнювався через stdin та друкувався у stdout. Я припускаю, що це додає 2 до кількості байтів.


1
те саме рішення:sed -E 's/ +/ /g;s/" | "/"/g'
izabera

3
Те саме - 12 байт у сітківці . :)
Мартін Ендер

-pМається на увазі -n, тож вам доведеться взяти лише покарання +1 (якщо ви не просто переходите на іншу мову, як це пропонують інші коментатори).

4

Рубі, 31 29 25 23 байт

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

Пояснення коду:

  • pРядок пристрою Виходів в подвійних лапках STDOUT( Там більше до цього , хоча ...)
  • $*є масивом STDINвходів, $*[0]приймає перший
  • strip видаляє пробіли початку та закінчення
  • squeeze ' ' замінює> 1 пробіл символів одним пробілом

Випробування:

введіть тут опис зображення


1
Ви можете замінити ARGVз $*зберігає два байта. gsub /\s+/, ' 'можна замінити squeeze ' 'ще на 4 байти
DickieBoy

@DickieBoy, дякую за те $*, я цього не знав. Але ми не можемо замінити gsub /\s+/, ' 'з , squeezeтому що вони не є однаковими .
Шехаряр

Що ви маєте на увазі під «не однакові»? Виходи однакові.
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. Друга програма може бути скорочена за рахунок використання d.
isaacg

@isaacg я вже не використовував dвсе, для чого це можна використовувати?
Тіїло

@Tyilo Я думаю, що ви внесли зміни приблизно в той же час, коли я прокоментував це. Зараз все добре.
isaacg

Ви можете використовувати pдля збереження декількох байтів на конкатенації рядків замість багатьох +es. pjd-cQdkNN
FryAmTheEggman

3

Bash, 36 32 байти

Як функція, програма або просто в трубі:

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

Пояснення

Перший xargsзнімає лапки.

Друга xargsобрізає ліву сторону і замінює кілька суміжних проміжків посередині рядка одним пробілом, беручи кожне «слово» і відокремлюючи кожен пробілом.

xargs -i echo '"{}"'Обріже праву сторону і rewraps отриманого рядка в подвійних лапках.


2
Оце Так! Це хитро. На жаль, не займається тестовим випадком 4, але все ж вражає.
манатура

Так, цей код відповідає четвертому тестовому випадку і коротший.
Делтік

Ви можете зробити щось подібне? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce

@Cyoce: Ви дійсно можете це зробити, щоб зберегти один байт ціною втрати функціональності труби. Однак це не так коротко, як це рішення, і все ще не задовольняє четвертий тестовий випадок.
Делтік

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. На фронталі сайту haskell.org є онлайн- REPL (потрібні файли cookie), де можна спробувати fmap(unwords.words.read)getLine.
німі

1
fmap(unwords.words)readLnі print.unwords.words=<<readLnтрохи коротше.
Лінн

@Mauris: дякую за вказівку на readLn.
німі

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: Дякую за пропозицію. Моя інтерпретація, заснована на коментарі ОП (спочатку на посаді), полягала в тому, що його потрібно було надрукувати до stdout. Попрошу роз'яснення.
Олексій А.

А-а-а ... не бачив цього коментаря чи вимоги
MickyT

2

Python2, 37

Зменшено на 1 байт завдяки @ygramul.

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

Оригінальна версія:

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

Тестові приклади:

Скріншот тестових випадків


Я дуже хотів використати print" ".join(raw_input().split()), але у останнього лапки залишився пробіл, якщо після останнього слова залишились пробіли ...
mbomb007

Ви можете голити зайвий байт, використовуючи% formatting: print '"% s"'% '' .join (input (). 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 thx. Зауважте, що якраз працює після останнього роз'яснення щодо цитат: eval ('""' ') вийде з
ладу

Коли я тестував четвертий тестовий випадок (використовуючи хром), не з’являється спливаючих вікон (які показують результат). Чому?
Spikatrix

@CoolGuy, можливо, тому що Chrome не працює ES6? Я ніколи не тестую ES6 з Chrome. У будь-якому разі я спробував це зараз у своєму Chrome (42.0.2311.152) і працює для мене.
edc65

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



1

КДБ (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

гольфу, 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

Завдання-С 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" або що-небудь ще з символом wildcard?
манатура

0

Powershell, 40 байт

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

Досить прямо вперед і не дуже ефектно.

Пояснення

Візьміть вхідний параметр через (заздалегідь задану) змінну args, замініть всі декілька пробілів на один, обріжте провідні та кінцеві пробіли за допомогою методу trim (), додайте лапки. 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 байт

Зачекайте. Заміна робить це лише один раз ? Тепер мені потрібно використовувати комбінований спліт-приєднання.

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.

s.split()

Повертає список слів (які розділені довільними рядками пробілів символів) рядка s.

" ".join(...)

Список приєднується назад до рядка, кожне слово розділене пробілом ("").


2
Це, здається, дає невірні результати щодо провідних та кінцевих просторів. Зауважте, що в стані виклику ви повинні приймати дані з подвійними лапками, а також виводити їх подвійними лапками. Я також спочатку помилився, поки не перечитав виклик.
Kevin Cruijssen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.