Видаліть літери, зберігаючи рядки унікальними


15

Натхненний цим чудовим (на основі кількості переглядів та голосів) викликом, на який, на мою скромну думку, є занадто мало відповідей.

Давши (будь-якими способами) список рядків, поверніть (будь-якими способами) набір літер, які, видаляючи з заданих рядків, залишають загальну довжину (що залишилося від) рядків якомога меншою, зберігаючи кожну рядок унікальний і принаймні один символ довгий.

Приклади:

Дано "День" та "день"; поверніть "ay", тому що для видалених символів "ay" дані рядки будуть "D" і "d".

Дано "Привіт, світ!", "Привіт, світ." Та "Привіт, світ"; return "Helo Wrd" дає, тому що рядки будуть "!", "w." та "w", коли символи "Helo Wrd" (з пробілом) будуть видалені.

З огляду на "століття", "десятиліття", "рік", "місяць", "тиждень", "день", "годину", "хвилину" та "секунду"; поверніть "centurdowi", тому що подані слова будуть "y", "a", "ya", "mh", "k", "ay", "h", "m", "s", коли символи "centurdowi "видаляються.

Порядок та формат повернутого набору не важливі.


1
Ваш другий випадок неправильний: "Helo Wrd" дає загальну довжину 4 з "!", "W". і "w".
Лука

1
@Luke Дякую Я це виправлю. Це показує, що нам потрібен алгоритм, оскільки робити це вручну схильно до помилок.
Adám

А для третього "centurdowi" дає "y", "a", "ya", "mh", "k", "ay", "h", "m", "s" на загальну довжину 12.
Лука


+1 за те, що ви використовуєте виклик, щоб допомогти вам у ще одному виклику!
Лука

Відповіді:


4

Haskell, 138 130 байт

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]

Приклад використання: f ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]-> "centurdoki".

Це підхід грубої сили.

     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

Редагувати: @Seeq допомогло мені зберегти 8 байт. Спасибі!


Як щодо map(#s), так що вам не потрібно гортати notElem? EDIT: Або ти не міг просто накреслити це?
seequ

@Seeq: при дзвінку через map(#s), (#)необхідно визначити як flip (filter . flip notElem). Але, звичайно, вкладка набагато коротша. Спасибі!
німі

2

Піта, 34

Здійснює введення у форматі ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]. Підказки з гольфу цінуються, як завжди.

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

2

Pyth, 24 байти

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

Спробуйте в Інтернеті. Тестовий набір.

Зауважте, що останній тестовий випадок займе небагато часу.

Приймає введення у формі масиву, як ["Day", "day"].

Ще один цікавий, який я знайшов і покращив isaacg (також 24 байти):

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

Мені вдалося зменшити другий підхід до 24 байт: -J{sQhlDsM.A#f{ITm-RdQyJ ось
isaacg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.