Удалить повторяющиеся слова из строки


12

Удалите все повторяющиеся слова из введенного предложения.

На входе будет что-то похожее, cat dog cat dog bird dog Snake snake Snakeа на выходе должно быть cat dog bird Snake snake. Там всегда будет один пробел, разделяющий слова.

Порядок вывода должен совпадать с порядком ввода. (См. Пример)

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


13
Я рекомендую подождать, чтобы принять ответ хотя бы на несколько дней. Более короткое решение все еще может прийти.
Алекс А.

1
Я ожидаю аналогичных решений для uniqchars , за исключением того, что это не запрещает встроенные модули, которые удаляют дубликаты.
xnor

2
Видя , например, не существует специальной обработки заглавной буквы: Snakeи snakeрассматриваются просто как разные
edc65

@AlexA .: На самом деле, он уже есть. codegolf.stackexchange.com/questions/62044/…
ev3commander

Ответы:


1

gs2 , 3 байта

,É-

Закодировано в CP437 .

STDIN выдвигается в начале программы. ,разбивает его на пробелы. Éесть uniq, который фильтрует дубликаты. -соединяется пробелами.


10

CJam, 7 символов

qS/_&S*

Возможно, может быть намного короче ... но все, что я почти никогда не использовал CJam. ^. ^

qсчитывает ввод, S/разбивает на пробелы, _&дублирует и применяет заданное AND (следовательно, избавляется от дубликатов) и S*повторно объединяет пробелы.

Онлайн переводчик ссылка


1
Как вы можете получить намного меньше, чем 7? LOL
Cruncher

Кто-то только что сделал.
Чужой G

8

Haskell, 34 байта

import Data.List
unwords.nub.words

Пример использования: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".


8

APL, 22 20 байт

{1↓∊∪(∊∘' '⊂⊢)' ',⍵}

Это создает безымянную монадическую функцию, которая принимает строку справа и возвращает строку.

Объяснение:

               ' ',⍵}    ⍝ Prepend a space to the input string
     (∊∘' '⊂⊢)          ⍝ Split the string on spaces using a fork
    ∪                    ⍝ Select the unique elements
{1↓∊                     ⍝ Join into a string and drop the leading space

Попробуйте онлайн

Сохранено 2 байта благодаря Денису!


3
Мне нравится любой ответ, в котором используется неэзотерический язык, не относящийся к гольфу.
Дарт Egregious


7

JavaScript (ES6) 33

(см. этот ответ )

Протестируйте приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6 (реализуя Set, оператор распространения, строки шаблонов и функции стрелок - я использую Firefox).

Примечание: при преобразовании в Set удаляются все дубликаты, а в Set сохраняется исходный порядок.

f=s=>[...Set(s.split` `)].join` `

function test() { O.innerHTML=f(I.value) }

test()
#I { width: 70% }
<input id=I value="cat dog cat dog bird dog Snake snake Snake"/><button onclick="test()">-></button>
<pre id=O></pre>


Ух-у-у-у-у ... Я постоянно удивляюсь твоей способности сократить любое решение, которое я думаю, на 25% и более. +1
ETHproductions

1
Посмотрел на проблему и сразу подумал о множествах ... только чтобы понять, что ты уже сделал это = P, очень приятно!
Mwr247

Как можно установить сохранить первоначальный порядок?
njzk2

@ njzk2 спроси у разработчиков языка. Это может быть: набор внутренне является массивом, и при каждой вставке есть проверка, чтобы отклонить дубликаты. В любом случае, это деталь реализации
edc65 31.10.15

@ njzk2, хотя я не знаю, как , я знаю, что этот факт определяется языком: объекты Set являются коллекциями значений, вы можете перебирать его элементы в порядке вставки . Значение в наборе может встречаться только один раз; это уникально в коллекции набора. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65,

6

TeaScript , 12 байт

TeaScript - это JavaScript для игры в гольф.

xs` `u()j` `

Это довольно коротко. Он разделяется на каждое пространство, отфильтровывает дубликаты, а затем возвращается.

Попробуйте онлайн


Это tee-a scriptили tee script?

@MathiasFoster это будет "сценарий"
Downgoat

Есть ли в TeaScript буквы, зарезервированные для имен переменных? Большинство из них, похоже, являются сокращенными для встроенных свойств.
intrepidcoder

@intrepidcoder да все из них: cdfghijklmnopstuvwзарезервированы для переменных, все они предварительно инициализированы в 0. bтакже зарезервированы для имени переменной, предварительно инициализированы в пустую строку
Downgoat

6

PowerShell, 15 байт

$args|select -u

Вау, реальная запись, где PowerShell несколько конкурентоспособен? Это невозможно!

Принимает строку в качестве входных аргументов, передает Select-Objectс -Uniqueфлагом. Выплевывает массив строк, сохраняя порядок и заглавные буквы в соответствии с запросом.

Использование:

PS C:\Tools\Scripts\golfing> .\remove-repeated-words-from-string.ps1 cat dog cat dog bird dog Snake snake Snake
cat
dog
bird
Snake
snake

Если это слишком «обманчиво», если предположить, что входные данные могут быть аргументами командной строки, тогда перейдите к следующему, в 24 21 байт (сэкономлено несколько байтов благодаря blabb ) . Интересно, что использование унарного оператора в этом направлении также работает, если входная строка разграничена кавычками или отдельными аргументами, поскольку по умолчанию -splitиспользуется пробел. Бонус.

-split$args|select -u

Полагаться на поведение окружения, когда он кормит ложкой код с легко разделяемым вводом…?
manatwork

@manatwork Я добавил пояснение, если первое использование считается слишком «обманным» - поскольку неясно, как именно указан ввод, мы оставим это до ОП.
AdmBorkBork

И в настоящее время ясно , как efficients являются собственные возможности PowerShell в. Это 24 действительно заслуживает одобрения.
manatwork

@timmyD ты можешь отрубить 3 байта до неприличия ?? версия с использованием унарного разбиения и не требует "" "в аргументах командной строки: \> ls -l split.ps1 & type split.ps1 & echo. & powershell -nologo -f split.ps1 cat dog cat dog bird dog Змея змея Змея -rw-rw-rw- 1 Admin 0 21 2015-11-02 19:06 split.ps1 -split $ args | select -u кошка-собака птица Змея змея
блабб

4

Юлия, 29 байт

s->join(unique(split(s))," ")

Это создает безымянную функцию, которая разбивает строку на вектор по пробелам, сохраняет только уникальные элементы (сохраняя порядок) и объединяет массив обратно в строку с пробелами.


4

R, 22 байта

cat(unique(scan(,"")))

Это читает строку из STDIN и разбивает ее на вектор по пробелам, используя scan(,""), выбирает только уникальные элементы, затем объединяет их в строку и печатает ее в STDOUT, используя cat.


4

Сетчатка , 22 байта

 (\w+)\b(?<=\b\1\b.+)

Сохраните файл с завершающим переводом строки и запустите его с -sфлагом.

Это довольно просто в том смысле, что оно соответствует одному слову, и просмотр за спиной проверяет, появилось ли то же слово в строке ранее. Конечный перевод строки заставляет Retina работать в режиме Replace с пустой строкой замены, удаляя все совпадения.


4

Mathematica, 43 39 байт

StringRiffle@*Keys@*Counts@*StringSplit

Престижность для использования StringRiffle[].
Майкл Стерн

можно было бы использовать Keys@CountsвместоDeleteDuplicates
branislav

@branislav Сохраняет ли Keys@Countsпорядок?
LegionMammal978

@ LegionMammal978 Counts[list]дает ассоциацию, ключи которой расположены в том же порядке, в котором они сначала появляются, как элементы списка.
Бранислав


3

C ++ 11, 291 байт

#include<iostream>
#include<string>
#include<list>
#include<sstream>
#include<algorithm>
using namespace std;main(){string s;getline(cin,s);list<string>m;stringstream b(s);while(getline(b,s,' '))if(find(m.begin(),m.end(),s)==m.end())m.push_back(s);for(auto a:m)cout<<a<<' ';cout<<endl;}

Я не вижу много ответов C ++ по сравнению с языками игры в гольф, так почему бы и нет. Обратите внимание, что здесь используются функции C ++ 11, и поэтому, если ваш компилятор застрял в достаточно темном возрасте , вам может потребоваться передать специальный параметр компиляции, чтобы он использовал стандарт C ++ 11. Для g++, это -std=c++11(необходимо только для версий <5.2). Попробуйте онлайн


Если вы сравните количество байтов с другими языками, вы поймете, почему никто не использует C ++.
CroCo

3
@CroCo Если вы поймете, что цель этого сайта - найти самое короткое решение для каждого языка, вы поймете, почему я разместил этот ответ.
Мего

извините, я не знаю об этом.
CroCo

1
Почему бы не использовать set? Это позволяет не дублировать дизайн. Просто нажмите на это.
edmz

1
@black A setне гарантирует, что элементы будут в том же порядке, в котором они были добавлены.
Мего

3

К5, 9 байт

" "/?" "\

К вашему сведению, это функция.

объяснение

     " "\    Split the input on spaces
    ?        Find all the unique elements
" "/         Join them back together

2

Matlab: 18 байт

unique(d,'stable')

где dнаходится d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

Результат 'cat' 'dog' 'bird' 'Snake' 'snake'


4
Добро пожаловать в Программирование головоломок и Code Golf! Представления здесь должны быть либо полными программами, которые читают из STDIN и записывают в STDOUT, либо функциями, которые принимают ввод и возвращают вывод. В нынешнем виде это всего лишь фрагмент; предполагается, что переменная dуже назначена. Вы можете исправить это, используя функцию handle: @(d)unique(d,'stable')стоимостью 4 байта.
Алекс А.

2

Python 3, 55

l=[]
for x in input().split():l+=[x][x in l:]
print(*l)

Да, это долго. К сожалению, Python setне сохраняет порядок элементов, поэтому мы должны сделать работу сами. Мы перебираем входные слова, сохраняя список lэлементов, которых еще нет l. Затем мы печатаем содержимое через lпробел.

Строковая версия lне будет работать, если некоторые слова являются подстрока других слов.


2

C #, 38 байт

String.Join(" ",s.Split().Distinct());

2
Я не уверен, что вы можете предположить, что ввод уже введен s, я думаю, вы должны получить его в качестве аргумента.
Джейкоб

3
Добро пожаловать в PPCG! Пожалуйста, ознакомьтесь с нашими форматами ответов по умолчанию . Ответы должны быть либо полными программами, либо функциями. Неназванные функции (такие как лямбда-литералы) хороши, но фрагменты, которые ожидают, что код уже существует в некоторой переменной / в стеке и т. Д. Или требуют среды REPL, обычно запрещены, если OP явно не разрешает их.
Мартин Эндер

2

Perl 6, 14 байт

В целом для программы единственный способ написать ее - длина 21 байт

say $*IN.words.unique # 21 bytes

Как лямбда-выражение самое короткое составляет 14 байтов

*.words.unique # 14 bytes
say ( *.words.unique ).('cat dog cat dog bird dog Snake snake Snake')

my &foo = *.words.unique;
say foo $*IN;

Хотя выводом является список, если вы поместите его в строковый контекст, он поместит пробел между элементами. Если требовалось вернуть строку, вы можете просто добавить a ~в начало ~*.words.unique.


Если фрагменты были разрешены, вы можете сократить их до 13 байтов, удалив *.

$_ = 'cat dog cat dog bird dog Snake snake Snake';

say .words.unique

1

Python 3, 87 80 байт

оказывается полная версия программы короче

s=input().split(' ')
print(' '.join(e for i,e in enumerate(s)if e not in s[:i]))

Сделал это без регулярных выражений, я счастлив

Попробуйте онлайн


1

Луа, 94 байта

function c(a)l={}return a:gsub("%S+",function(b)if l[b]then return""else l[b]=true end end)end

Анонимный пользователь предложил заменить ... return""else l[b]=true end end...на ...return""end l[b]=""end....
Джонатан Фрех


1

JavaScript, 106 102 100 байт

function(s){o={};s.split(' ').map(function(w){o[w]=1});a=[];for(w in o)a.push(w);return a.join(' ')}

// слишком долго для JS :(


Попробуйте использовать функции стрелок JS (иначе ECMAScript) , которые должны сохранить 6 байтов. Кроме того, я уже вижу, что портирование этого на CoffeeScript сэкономит как минимум 30 байтов.
kirbyfan64sos

Этот ответ на родном JavaScript (ECMA5), есть edc65 для es6.
Джейкоб


1

PHP 64 59 байт

function r($i){echo join(" ",array_unique(split(" ",$i)));}

explode()split(), implode()join()?
manatwork

Благодарность! Хорошие предложения. Похоже split, что это унижается, но, думаю, это не имеет значения для разработки кода.
Йероен

1

AppleScript, 162 байта

Интересно, что это почти идентично неповторяющимся символам.

установить x в (отобразить диалог "" ответ по умолчанию "") возвращаемый текст
установить "в"
повторить с я в х
рассматривает дело
если нет, то я в o, тогда установите o в o & i & ""
конец
конец
о

Я на самом деле не знал рассматриваемого ключевого слова до этого. чем больше ты знаешь...


1

Бурлеск, 6 байтов

blsq ) "cat dog cat dog bird dog Snake snake Snake"wdNBwD
cat dog bird Snake snake

Довольно просто: разделить слова, nub (nub = удалить дубликаты), преобразовать обратно в слова.


1

Гема, 21 персонаж

*\S=${$0;$0}@set{$0;}

(Очень похоже на уникальное решение для персонажей , так как в Gema нет массивов, поэтому использование встроенных уникальных функций не очень нам помогает.)

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

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 

1

Scala, 44 47 байт

(s:String)=>s.split(" ").distinct.mkString(" ")

РЕДАКТИРОВАТЬ : использование toSetможет не сохранить порядок, поэтому я теперь использую различные //, которые просто стоят мне 3 байта :(


0

PHP, 37 байт

Предполагается $s, что входная строка.

print_r(array_flip(explode(' ',$s)));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.