Xóa các từ trùng lặp khỏi một câu


10

Trong thử thách này, bạn sẽ loại bỏ các từ trùng lặp khỏi mỗi câu .

Ví dụ

Hello Hello, World!
Hello, World!

Code Code! Golf Code
Code! Golf Code

Hello  hello   World
Hello   World

Programming Golf Programming!
Programming Golf!

Sự chỉ rõ

  • Đầu vào sẽ là một chuỗi các ký tự ASCII.
  • Một câu được định nghĩa là bất cứ điều gì cho đến khi kết thúc chuỗi, linefeed ( \n) hoặc dấu chấm câu ( .!?).
  • Một từ được định nghĩa là một chuỗi A-Za-z.
  • Các từ không phân biệt chữ hoa chữ thường ( Hello== heLlO).
  • Chỉ có sự xuất hiện đầu tiên của một từ trong câu.
  • Nếu một từ bị xóa, khoảng trắng trước từ bị xóa sẽ bị xóa. (ví dụ A A B-> A B).

Đây là để mã ngắn nhất trong byte thắng!


1
a b a.đi để làm gì
lirtosiast

@ThomasKwa a b.vì `a` bị xóa.
Hạ cấp

Đối với a__b_b_a, bạn có nhận được a_b_a( bloại bỏ đầu tiên ) hoặc a__b_a( bloại bỏ thứ hai )?

@CamilStaps bạn sẽ nhận được a__b__vì lặp đi lặp lại bbị xóa và lặp lại abị xóa
Downgoat

1
@ BradGilbertb2gills Tất cả các ký tự ASCII được cho phép trong đầu vào. Chỉ có các chữ cái được coi là từ mặc dù
Downgoat

Câu trả lời:


3

Vim, 27 byte

:s/\v\c(<\a+>).{-}\zs\s+\1

Lưu ý rằng 27 byte bao gồm cả trả về vận chuyển ở cuối.

Hãy thử trực tuyến! Lưu ý bên lề: Đây là liên kết đến một ngôn ngữ khác mà tôi đang viết có tên là "V". V chủ yếu tương thích ngược với vim, vì vậy đối với tất cả ý định và mục đích, nó có thể được tính là một trình thông dịch vim. Tôi cũng đã thêm một byte %để bạn có thể xác minh tất cả các trường hợp thử nghiệm cùng một lúc.

Giải trình:

:s/\v                       "Substitute with the 'Magic flag' on. This magic flag allows us
                            "to shorten the regex by removing a lot of \ characters.
     \c(<\a+>)              "A case-insensitive word
              .{-}          "Any character (non-greedy)
                  \zs       "Start the selection. This means everything after this atom
                            "will be removed
                     \s+    "One or more whitespace characters,
                        \1  "Followed by the first word

6

JavaScript (ES6), 98

Lưu ý trong khi tôi tự tìm thấy nó, nó tương tự khó chịu với @ Neil, chỉ với logic bổ sung để phân chia toàn bộ chuỗi đầu vào trong câu.

s=>s.replace(/[^\n.!?]+/g,s=>s.replace(/ *([a-z]+)/ig,(r,w)=>k[w=w.toUpperCase()]?'':k[w]=r,k=[]))

Kiểm tra

f=s=>s.replace(/[^\n.!?]+/g,s=>s.replace(/ *([a-z]+)/ig,(r,w)=>k[w=w.toUpperCase()]?'':k[w]=r,k=[]))

console.log=x=>O.textContent+=x+'\n'

;[['Hello Hello, World!','Hello, World!']
,['Code Code! Golf Code','Code! Golf Code']
,['Hello  hello   World','Hello   World']
,['Programming Golf Programming!','Programming Golf!']]
.forEach(t=>{
  var i=t[0],k=t[1],r=f(i)
  console.log((r==k?'OK ':'KO ')+i+' -> '+r)
})  
<pre id=O></pre>


6

Võng mạc , 66 46 byte

Số lượng byte giả định mã hóa ISO 8859-1.

i`[a-z]+
·$0·
i` *(·[a-z]+·)(?<=\1[^.!?¶]+)|·

Hãy thử trực tuyến!

Giải trình

Vì chỉ các chữ cái nên được coi là ký tự từ (nhưng regex cũng xử lý các chữ số và dấu gạch dưới là ký tự từ), chúng ta cần tạo ranh giới từ của riêng mình. Vì đầu vào được đảm bảo chỉ chứa các ký tự ASCII, tôi đang chèn ·(bên ngoài ASCII, nhưng bên trong ISO 8859-1) xung quanh tất cả các từ và xóa chúng lại bằng các bản sao. Điều đó tiết kiệm 20 byte bằng cách sử dụng giao diện để thực hiện các ranh giới từ chung.

i`[a-z]+
·$0·

Điều này phù hợp với từng từ và bao quanh nó trong ·.

i` *(·[a-z]+·)(?<=\1[^.!?¶]+)|·

Đây là hai bước nén thành một. <sp>*(·[a-z]+·)(?<=\1[^.!?¶]+)khớp với một từ đầy đủ (được đảm bảo bằng cách bao gồm ·trong trận đấu), cùng với bất kỳ khoảng trắng nào trước nó, với điều kiện (như được đảm bảo bởi cái nhìn) chúng ta có thể tìm thấy cùng một từ ở đâu đó trước đó trong câu. ( Phù hợp với một nguồn cấp dữ liệu.)

Phần khác chỉ đơn giản là ·, phù hợp với tất cả các ranh giới từ nhân tạo không phù hợp như một phần của nửa đầu. Trong cả hai trường hợp, trận đấu chỉ đơn giản là loại bỏ khỏi chuỗi.


4

C, 326 byte

Ai cần biểu thức thường xuyên?

#include <ctype.h>
#define a isalpha
#define c(x)*x&&!strchr(".?!\n",*x)
#define f(x)for(n=e;*x&&!a(*x);++x);
main(p,v,n,e,o,t)char**v,*p,*n,*e,*o,*t;{for(p=v[1];*p;p=e){f(p)for(e=p;c(e);){for(;a(*++e););f(n)if(c(n)){for(o=p,t=n;a(*o)&&(*o-65)%32==(*t-65)%32;o++,t++);if(a(*t))e=n;else memmove(e,t,strlen(t)+1);}}}puts(v[1]);}

3

Perl 6 , 104 byte

{[~] .split(/<[.!?\n]>+/,:v).map(->$_,$s?{.comb(/.*?<:L>+/).unique(as=>{/<:L>+/;lc $/}).join~($s//'')})} # 104

Sử dụng:

# give it a lexical name
my &code = {...}

say code "Hello Hello, World!
Code Code! Golf Code
Hello  hello   World
Programming Golf Programming!";
Hello, World!
Code! Golf Code
Hello   World
Programming Golf!

Giải trình

{
  [~]                         # join everything that follows:

  .split(/<[.!?\n]>+/,:v)     # split on boundaries, keeping them
  .map(                       # loop over sentence and boundary together
    -> $_, $s? {              # boundary is optional (at the end of the string)
      .comb(/.*?<:L>+/)       # grab the words along with leading non letters
      .unique(                # keep the unique ones by looking at …
        as => {/<:L>+/;lc $/} # only the word chars in lowercase
      )
      .join                   # join the sentence parts
      ~                       # join that with …
      ($s//'')                # the boundary characters or empty string 
    }
  )
}

1

Perl 5, 57 byte

Mã 56 byte + 1 cho -p

s/[^.!?
]+/my%h;$&=~s~\s*([A-z]+)~!$h{lc$1}++&&$&~egr/eg

Sử dụng:

perl -pe 's/[^.!?
]+/my%h;$&=~s~\s*([A-z]+)~!$h{lc$1}++&&$&~egr/eg' <<< 'Hello Hello, World!
Code Code! Golf Code
Hello  hello   World
Programming Golf Programming!
'
Hello, World!
Code! Golf Code
Hello   World
Programming Golf!

Có thể cần phải là +1, hiện tại tôi đang giả định rằng sẽ chỉ có khoảng trắng trong đầu vào, không có tab.


Từ một nhận xét "Tất cả các ký tự ASCII đều được cho phép trong đầu vào. Chỉ có các chữ cái được coi là từ" (tôi sẽ chỉnh sửa điều này thành thử thách, tôi nghĩ vậy)
Martin Ender

@ MartinBüttner Chết tiệt, ok tôi sẽ cập nhật để sử dụng \sthay thế ... Vẫn không có câu trả lời nào cho võng mạc của bạn!
Dom Hastings

Oh tôi hiểu tại sao bạn hỏi bây giờ. Nếu chúng ta cần xóa khoảng trắng trước các từ, thì tôi cũng cần một byte khác. Câu hỏi đặc biệt nói "không gian" mặc dù. Tôi đã yêu cầu làm rõ.
Martin Ender

@ MartinBüttner Tôi đoán nhận xét của tôi cũng không thực sự rõ ràng! Cảm ơn ý kiến ​​của bạn mặc dù!
Dom Hastings
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.