Удаление лишних пробелов из строки


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

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

Образец прогона:

(Используя интерпретатор Фаубигуя из его Perl-ответа для Interpret /// (произносится как «косая черта») .)

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


Технически вы не принимаете участие, хотя. ;) Есть такой язык, но я думаю, что читать входные данные все еще довольно больно.
Мартин Эндер

6

Perl, 22

(20 байтов кода плюс 2 ключа командной строки)

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

Необходимо запустить с -npпереключателем, чтобы $_он автоматически заполнялся через стандартный ввод и выводился на стандартный вывод. Я собираюсь предположить, что это добавляет 2 к количеству байтов.


1
sed -E 's/ +/ /g;s/" | "/"/g'
То

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потому что они не являются одинаковыми .
Sheharyar

Что вы подразумеваете под "не то же самое"? Выходы одинаковые.
DickieBoy

1
squeeze ' 'будет только сжимать пробелы. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy

2
Лично я. И некоторые другие ответчики тоже. Но, как я вижу, вы не одиноки со своей интерпретацией ... Было бы желательно получить разъяснения от владельца вопроса. Кстати, и пространство между pи его параметром, squeezeи его параметром не нужны.
manatwork

4

Pyth, 17 15 11 10 байт

(спасибо Ypnypn и FryAmTheEggman )

pjd-cQdkNN

Возможно, будет в гольф больше.

Если выходные данные можно использовать 'вместо, "то мне нужно только 8 байтов:

`jd-cQdk

Вы можете использовать Nвместо\"
Ypnypn

Добро пожаловать в Пиф, Тайлио. Вторая программа может быть сокращена с помощью d.
Исаак

@isaacg разве я уже не использовал dвсе, для чего он может быть использован?
Tyilo

@Tyilo Я думаю, что вы внесли изменения примерно в то же время, что я прокомментировал. Теперь все хорошо.
Исаак

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

3

Баш, 36 32 байта

Как функция, программа или просто труба:

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

объяснение

Первый xargsлишает кавычек.

Вторая xargsобрезает левую сторону и заменяет несколько соседних пробелов в середине строки одним пробелом, беря каждое слово и разделяя каждое пробелом.

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


2
Вот это да! Это сложно. К сожалению, не обрабатывает тестовый пример 4, но все же впечатляет.
manatwork

Да, этот код соответствует четвертому контрольному примеру и короче.
Дельтик

Вы можете сделать что-то подобное? 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. На сайте haskell.org есть онлайн- ответ (требуются файлы 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 -"

Не уверен, что он полностью соответствует правилам, но кошка может не требоваться полностью, просто gsub. Выход из этого[1] "This is a string"
MickyT

@MickyT: Спасибо за предложение. Моя интерпретация, основанная на комментарии ОП (сначала в посте), заключалась в том, что его нужно было распечатать на стандартный вывод. Я попрошу разъяснений.
Алекс А.

Аааа ... не видел этот комментарий или требование
MickyT

2

Python2, 37

Уменьшено на 1 байт благодаря @ygramul.

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

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

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

Тестовые случаи:

Скриншот тестовых случаев


Я действительно хотел использовать print" ".join(raw_input().split()), но у него был бы заключительный пробел в последней
кавычке,

Вы можете сбрить лишний байт, используя форматирование%: 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
Оптимизатор

@ Оптимизатор, спасибо. Обратите внимание, что это работает только после последнего разъяснения о кавычках: eval ('"" "')
потерпит

Когда я тестировал четвертый тестовый пример (используя chrome), всплывающее окно (которое показывает результат) не было видно. Почему?
Спикатрикс

@CoolGuy может быть потому что Chrome не запускает ES6? Я никогда не тестирую ES6 с Chrome. Во всяком случае, я попробовал это сейчас в моем Chrome (42.0.2311.152) и работает для меня.
edc65

-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

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

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

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

Зш , 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.

s.split()

Возвращает список слов (которые разделены произвольными строками пробельных символов) строки s.

" ".join(...)

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


2
Это, кажется, дает неправильные результаты относительно начальных и конечных пробелов. Обратите внимание, что в состоянии вызова вы должны взять ввод с двойными кавычками, а также вывести их с двойными кавычками. Сначала я тоже ошибался, пока не перечитал вызов.
Кевин Круйссен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.