Видаліть повторені слова з рядка


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/розбиває на пробіли, _&дублює і застосовує встановлене І (тому позбавляючись від дублікатів) і S*знову приєднується до простору.

Інтернет-перекладач посилання


1
Як ви можете навіть набагато коротше, ніж 7? lol
Cruncher

Хтось просто це зробив.
Чужий G

8

Хаскелл, 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
Я люблю будь-яку відповідь, що використовує неезотеричну, не гольф мову.
Дарт Егрегійний


7

JavaScript (ES6) 33

(див. цю відповідь )

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

Примітка: для перетворення на Set скинути всі дублікати та встановити mantains оригінальне замовлення.

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

@ 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 це був би "tee-script"
Downgoat

Чи мають у TeaScript букви, зарезервовані для імен змінних? Більшість з них видаються скороченими для вбудованих властивостей.
intrepidcoder

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

6

PowerShell, 15 байт

$args|select -u

Whoa, фактичний запис, коли 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 байт (збережено кілька байтів завдяки бабу ) . Цікаво, що використання одинарного оператора в цьому напрямку також може працювати, якщо вхідний рядок розмежований цитатами або окремими аргументами, оскільки типовим -splitє пробіли. Бонус.

-split$args|select -u

Спираючись на поведінку навколишнього середовища, коли подає коду ложкою з колом, що легко розбивається…?
манастирство

@manatwork Я додав роз'яснення, якщо перше використання вважається занадто "шахрайським" - оскільки не ясно, як саме вказаний вхід, ми залишимо його до ОП.
AdmBorkBork

І тепер зрозуміло, наскільки ефективні - це особливості PowerShell. Ці 24 справді заслуговують на надбавку.
манастирство

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

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

Математика, 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 ++ 11, і тому, якщо ваш компілятор застряг у темній віці, достатньо старої, вам може знадобитися передати спеціальний компіляційний коммутатор, щоб використовувати його для стандарту C ++ 11. Бо g++це -std=c++11(потрібне лише для версій <5.2). Спробуйте в Інтернеті


Якщо порівнювати кількість байтів з іншими мовами, ви побачите, чому ніхто не використовує C ++.
CroCo

3
@CroCo Якщо ви усвідомлюєте, що сенс цього сайту полягає в тому, щоб знайти найкоротше рішення на кожній мові, ви побачите, чому я опублікував цю відповідь.
Мего

вибачте, що я цього не знаю.
CroCo

1
Чому б не використовувати a set? Це не дозволяє копій за конструкцією. Просто натисніть на це.
edmz

1
@black A setне гарантує наявність елементів у тому ж порядку, в якому вони були додані.
Мего

3

К5, 9 байт

" "/?" "\

FYI, це функція.

Пояснення

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

2

Матлаб: 18 байт

unique(d,'stable')

де dє d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

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


4
Ласкаво просимо до головоломки програмування та коду для гольфу! Подані тут матеріали повинні бути або повноцінними програмами, які читають зі STDIN і записують у STDOUT, або функціями, які приймають введення та повернення виводу. На даний момент це просто фрагмент; він припускає, що змінна dвже призначена. Виправити це можна за допомогою функціональної ручки:, @(d)unique(d,'stable')за ціною 4 байти.
Олексій А.

2

Пітон 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, як правило, заборонені, якщо ОП прямо не дозволяє.
Мартін Ендер

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;

У той час як вихід - це Список, якщо ви поставите його в контекст, що зміцнює, він поставить пробіл між елементами. Якщо це була вимога повернути рядок, ви можете просто додати ~передню частину ~*.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 (aka ECMAScript) 6 стрілочних функцій , які повинні зберігати 6 байтів. Крім того, я вже бачу, що перенесення цього файлу в CoffeeScript збереже принаймні 30 байт.
kirbyfan64sos

Ця відповідь знаходиться в рідному JavaScript (ECMA5), а для es6 - edc65.
Яків


1

PHP 64 59 байт

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

explode()split(), implode()join()?
манатура

Дякую! Гарні пропозиції. Здається split, оприлюднюється, але, мабуть, це не має значення для кодування.
Jeroen

1

AppleScript, 162 байти

Цікаво, що це майже ідентично речі, що не повторюється.

встановити x на (відобразити діалогове вікно "" відповідь за замовчуванням "") текст, що повертається словами
встановити o на ""
повторити з i в х
розглядаючи випадок
якщо ні, я перебуваю в 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(" ")

EDIT : використання toSetможе не зберегти порядок, тому я зараз використовую чіткий // що просто коштував мені 3 байти :(


0

PHP, 37 байт

Припускаючи, що $sце вхідний рядок.

print_r(array_flip(explode(' ',$s)));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.