Xóa các chữ cái trong khi giữ các chuỗi duy nhất


15

Lấy cảm hứng từ thử thách tuyệt vời này (dựa trên số lượt xem và lượt bình chọn), mà theo ý kiến ​​khiêm tốn của tôi, có quá ít câu trả lời.

Đưa ra (bằng bất kỳ phương tiện nào) một danh sách các chuỗi, trả về (bằng bất kỳ phương tiện nào) một tập hợp các chữ cái, khi được loại bỏ khỏi các chuỗi đã cho, để lại tổng chiều dài (phần còn lại của) các chuỗi càng nhỏ càng tốt, trong khi giữ từng chuỗi chuỗi duy nhất và dài ít nhất một ký tự.

Ví dụ:

Cho "Ngày" và "ngày"; trả về "ay", vì các chuỗi đã cho sẽ là "D" và "d" khi các ký tự "ay" bị xóa.

Đưa ra "Hello World!", "Hello world." Và "Hello world"; trả về "Helo Wrd" vì các chuỗi sẽ là "!", "w." và "w" khi các ký tự "Helo Wrd" (có dấu cách) bị xóa.

Cho "thế kỷ", "thập kỷ", "năm", "tháng", "tuần", "ngày", "giờ", "phút" và "giây"; trả về "centurdowi" vì các từ đã cho sẽ là "y", "a", "ya", "mh", "k", "ay", "h", "m", "s" khi các ký tự "centurdowi " được loại bỏ.

Thứ tự và định dạng của bộ trả về không quan trọng.


1
Trường hợp thứ hai của bạn là sai: "Helo Wrd" cho tổng chiều dài là 4 với "!", "W." và W".
Lu-ca

1
@Luke Cảm ơn. Tôi sẽ sửa nó. Điều đó cho thấy rằng chúng ta cần một thuật toán, vì làm nó bằng tay là dễ bị lỗi.
Adám

Và đối với người thứ ba, 'centurdowi' mang lại 'y', 'a', 'ya', 'mh', 'k', 'ay', 'h', 'm', 's' trong tổng chiều dài 12.
Lu-ca


+1 để sử dụng thử thách giúp bạn trong thử thách khác!
Lu-ca

Câu trả lời:


4

Haskell, 138 130 byte

import Data.List
c=concat
f i=snd$minimum[(length$c q,s)|s<-subsequences$nub$c i,q<-[map(filter(`notElem`s))i],nub q==q,all(>"")q]

Ví dụ sử dụng: f ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]->"centurdoki" .

Đây là một cách tiếp cận vũ phu.

     s<-subsequences$nub$c i  -- concatenate input i to a single string, remove
                              -- duplicates and make a list of all subsequences
       q<-[map(filter(...))i] -- remove chars appearing in subsequence s from all
                              -- input words, call result q
          nub q==q            -- keep those s where q has no duplicates (i.e. each
                              -- resulting string is unique) and
            all(>"")q         -- contains no empty strings
  (length$c q,s)              -- make pairs from all kept s, where the first element
                              -- is the combines length of all strings in q,
                              -- second element is s itself
snd$minimum                   -- find minimum of those pairs and discard length

Chỉnh sửa: @Seeq giúp tôi tiết kiệm 8 byte. Cảm ơn!


Còn map(#s)bạn thì sao, bạn không cần phải lật notElem? EDIT: Hoặc bạn không thể chỉ nội tuyến nó?
xem

@Seeq: khi gọi qua map(#s), (#)phải được xác định là flip (filter . flip notElem). Nhưng tất nhiên nội tuyến là ngắn hơn nhiều. Cảm ơn!
nimi

2

Bình thường, 34

Đưa đầu vào theo định dạng ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]. Lời khuyên chơi golf được đánh giá cao, như mọi khi.

hh.mlsebfqlQl{eTf!}keTm,dm-kdQy{sQ

2

Bình thường, 24 byte

hols-RNQf<}kJ-RTQ{IJy{sQ

Hãy thử trực tuyến. Bộ thử nghiệm.

Lưu ý rằng trường hợp thử nghiệm cuối cùng sẽ mất một chút thời gian để chạy.

Đưa đầu vào ở dạng mảng, như ["Day", "day"].

Một điều thú vị khác tôi đã tìm thấy và isaacg được cải thiện (cũng là 24 byte):

-J{sQhlDsM.A#f{ITm-RdQyJ

Tôi đã có thể giảm cách tiếp cận thứ hai xuống còn 24 byte: -J{sQhlDsM.A#f{ITm-RdQyJ tại đây
isaacg
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.