ลบคำที่ซ้ำกันออกจากสตริง


12

ลบคำที่ซ้ำทั้งหมดออกจากประโยคที่ป้อน

การป้อนข้อมูลจะเป็นสิ่งที่ชอบและผลผลิตที่ควรจะเป็นcat dog cat dog bird dog Snake snake Snake cat dog bird Snake snakeจะมีช่องว่างคั่นคำอยู่เสมอ

คำสั่งเอาต์พุตต้องเหมือนกับอินพุต (ดูตัวอย่าง)

คุณไม่จำเป็นต้องจัดการเครื่องหมายวรรคตอน แต่ต้องใช้ตัวอักษรพิมพ์ใหญ่


13
ฉันขอแนะนำให้รอรับคำตอบอย่างน้อยสองสามวัน ทางออกที่สั้นกว่าอาจยังมา
Alex A.

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/แยกในช่องว่าง, _&ทำซ้ำและใช้ setwise AND (ดังนั้นกำจัดการทำซ้ำ) และS*เชื่อมใหม่ในอวกาศ

ลิงค์ล่ามออนไลน์


1
คุณจะสั้นกว่า 7 ได้อย่างไร? lol
Cruncher

บางคนก็ทำ
Alien 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↓∊∪(∊∘' '⊂⊢)' ',⍵}

สิ่งนี้จะสร้างฟังก์ชัน monadic ที่ไม่มีชื่อซึ่งยอมรับสตริงทางด้านขวาและส่งคืนสตริง

คำอธิบาย:

               ' ',⍵}    ⍝ 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
ฉันรักคำตอบใด ๆ ที่ใช้ภาษาที่ไม่ลึกลับและไม่ใช่กอล์ฟ
Darth Egregious


7

JavaScript (ES6) 33

(ดูคำตอบนี้ )

ทดสอบการเรียกใช้ข้อมูลโค้ดด้านล่างในเบราว์เซอร์ที่สอดคล้องกับ EcmaScript 6 (การใช้ฟังก์ชัน Set, spread operator, สตริงเทมเพลตและฟังก์ชั่นลูกศร - ฉันใช้ Firefox)

หมายเหตุ: การแปลงเป็นชุดปล่อยรายการที่ซ้ำกันทั้งหมดและตั้งค่าจะต้องเรียงลำดับเดิม

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 ในขณะที่ผมไม่ทราบวิธีการที่ฉันรู้ว่าความจริงนี้จะถูกระบุโดยภาษา: วัตถุชุดคอลเลกชันของค่าที่คุณสามารถย้ำองค์ประกอบคู่แข่งแทรก ค่าในชุดอาจเกิดขึ้นเพียงครั้งเดียวเท่านั้น มันเป็นเอกลักษณ์ในคอลเลกชันของชุด ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/
......

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

อ๊ะรายการจริงที่ 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

ถ้าเป็นแบบนี้เกินไป "cheaty" ในสมมติการป้อนข้อมูลที่สามารถเป็นอาร์กิวเมนต์บรรทัดคำสั่งแล้วไปต่อไปนี้ที่24 21 ไบต์ (บันทึกบางไบต์ขอบคุณที่blabb ) ที่น่าสนใจการใช้ตัวดำเนินการเอกในทิศทางนี้จะเกิดขึ้นหากสตริงอินพุตถูกกำหนดเขตด้วยอัญประกาศหรือเป็นอาร์กิวเมนต์แต่ละตัวเนื่องจากค่าดีฟอลต์-splitคือช่องว่าง โบนัส.

-split$args|select -u

ขึ้นอยู่กับพฤติกรรมของสภาพแวดล้อมในการป้อนรหัสด้วยการแบ่งอินพุตอย่างง่ายดาย…?
จัดการ

@ การจัดการงานฉันได้เพิ่มความกระจ่างถ้าการใช้งานครั้งแรกนั้นถูกพิจารณาว่าเป็น "cheaty" ด้วย - เนื่องจากมันไม่ชัดเจนว่าวิธีการป้อนข้อมูลจะถูกระบุไว้อย่างชัดเจนเราจะปล่อยให้มันถึง OP
AdmBorkBork

และตอนนี้มีความชัดเจนว่าประสิทธิภาพเป็นคุณสมบัติของ PowerShell อย่างไร 24 คนนั้นสมควรได้รับการโหวต
จัดการ

@timmyD คุณสามารถตัด 3 ไบต์ไปยังที่ไม่เหมาะสมได้หรือไม่ รุ่นโดยใช้การแบ่งเป็น unary และไม่จำเป็นสำหรับ "" '' ใน commandline args เช่นกัน: \> ls -l split.ps1 & type split.ps1 & echo. & powershell -nologo -f split.ps1 แมวสุนัขแมวสุนัขนกสุนัข งูงู Snake -rw-rw-rw- 1 ผู้ดูแลระบบ 0 21 2015-11-02 19:06 split.ps1 - แยก $ args | เลือก -u สุนัขแมวนกนกงู Snake
blabb

4

Julia, 29 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่แยกสตริงเป็นเวกเตอร์บนช่องว่างเก็บเฉพาะองค์ประกอบที่ไม่ซ้ำกัน (รักษาลำดับ) และรวมอาร์เรย์กลับเข้าไปในสตริงที่มีช่องว่าง


4

R, 22 ไบต์

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

นี้อ่านสตริงจาก STDIN และแยกมันเป็นเวกเตอร์ในช่องว่างใช้scan(,""), เลือกองค์ประกอบที่ไม่ซ้ำเดียวแล้วเชื่อมให้เป็นสตริงและพิมพ์มัน STDOUT catใช้


4

เรติน่า 22 ไบต์

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

บันทึกไฟล์ด้วยการป้อนบรรทัดต่อท้ายและรันด้วย-sแฟล็ก

ตรงนี้ค่อนข้างตรงไปตรงมาว่ามันตรงกับคำเดียวและ lookbehind ตรวจสอบว่าคำเดียวกันปรากฏในสตริงก่อน การป้อนบรรทัดต่อท้ายทำให้ Retina ทำงานในโหมดแทนที่ด้วยสตริงการแทนที่ว่างซึ่งจะเป็นการลบการแข่งขันทั้งหมด


4

Mathematica, 43 39 ไบต์

StringRiffle@*Keys@*Counts@*StringSplit

StringRiffle[]รุ่งโรจน์สำหรับการใช้
Michael Stern

สามารถใช้Keys@CountsแทนDeleteDuplicates
branislav

@ branislav Keys@Countsรักษาความสงบเรียบร้อยหรือไม่?
LegionMammal978

@ LegionMammal978 Counts[list]ให้การเชื่อมโยงที่มีคีย์อยู่ในลำดับเดียวกันกับที่เกิดขึ้นครั้งแรกเป็นองค์ประกอบของรายการ
branislav

3

Pyth - 9 ไบต์

นี่คือเหตุผลที่เราทุกคนกำลังรอ Pyth5 อาจมีขนาด 5 ไบต์

jdoxzN{cz

ลองมันออนไลน์ได้ที่นี่


ทำไม Pyth5 ไม่ถูกต้อง? แต่ดูเหมือนว่ามันจะได้รับการดำเนินการ
lirtosiast

@ThomasKwa ฉันไม่คิดว่ามันจะเสร็จ ยังไม่มีการเผยแพร่เวอร์ชัน
Alex A.

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 หากคุณตระหนักถึงประเด็นของเว็บไซต์นี้คือการหาทางออกที่สั้นที่สุดในแต่ละภาษาคุณจะเห็นว่าทำไมฉันโพสต์คำตอบนี้
Mego

ขอโทษฉันไม่ได้ตระหนักถึงมัน
CroCo

1
ทำไมไม่ใช้set? ไม่อนุญาตให้ซ้ำซ้อนโดยการออกแบบ เพียงแค่ดันเข้าไป
edmz

1
@black A setไม่รับประกันว่าจะมีรายการในลำดับเดียวกันกับที่เพิ่มเข้ามา
Mego

3

K5, 9 ไบต์

" "/?" "\

FYI นี่คือฟังก์ชั่น

คำอธิบาย

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

2

Matlab: 18 ไบต์

unique(d,'stable')

ที่เป็นdd = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}

ผลที่ได้คือ 'cat' 'dog' 'bird' 'Snake' 'snake'


4
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! สิ่งที่ส่งมาที่นี่ต้องเป็นโปรแกรมเต็มรูปแบบที่อ่านจาก STDIN และเขียนไปยัง STDOUT หรือฟังก์ชันที่รับอินพุตและส่งคืนเอาต์พุต มันเป็นเพียงตัวอย่างเท่านั้น มันถือว่าตัวแปรdได้รับมอบหมายแล้ว คุณสามารถแก้ไขสิ่งนี้ได้โดยใช้ตัวจัดการฟังก์ชัน: @(d)unique(d,'stable')ที่ราคา 4 ไบต์
Alex A.

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 อนุญาตอย่างชัดเจน
Martin Ender

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

Lua, 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...
Jonathan Frech


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

คำตอบนี้อยู่ในจาวาสคริปต์ (ECMA5), มี edc65 สำหรับ es6
ยาโคบ


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 ใน x
พิจารณากรณี
หากไม่ใช่ฉันอยู่ใน o ให้ตั้งค่าเป็น & & & ""
ปลาย
ปลาย
โอ

ฉันไม่ทราบคำสำคัญที่พิจารณามาก่อนหน้านี้ ยิ่งคุณรู้ ...


1

ล้อเลียน 6 ไบต์

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

ค่อนข้างง่าย: แบ่งคำ, nub (nub = ลบคำซ้ำ), แปลงกลับเป็นคำ


1

Gema, 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

สกาลา44 47 ไบต์

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

แก้ไข : การใช้toSetอาจไม่รักษาคำสั่งซื้อดังนั้นตอนนี้ฉันใช้ // เฉพาะที่เสียค่าใช้จ่าย 3 ไบต์ :(


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.