Elimine letras mientras mantiene las cadenas únicas

15

Inspirado en este maravilloso desafío (basado en el número de puntos de vista y votos), que, en mi humilde opinión, tiene muy pocas respuestas.

Dada (por cualquier medio) una lista de cadenas, devuelva (por cualquier medio) un conjunto de letras que, cuando se eliminan de las cadenas dadas, deja la longitud total de (lo que queda de) las cadenas lo más pequeña posible, mientras mantiene cada cadena única y al menos un carácter de largo.

Ejemplos:

Dado "Día" y "día"; devuelve "ay", porque las cadenas dadas serán "D" y "d" cuando se eliminen los caracteres "ay".

Dado "Hello World!", "Hello world" y "Hello world"; return "Helo Wrd" da porque las cadenas serán "!", "w." y "w" cuando se eliminan los caracteres "Helo Wrd" (con un espacio).

Dados "siglo", "década", "año", "mes", "semana", "día", "hora", "minuto" y "segundo"; devuelva "centurdowi" porque las palabras dadas serán "y", "a", "ya", "mh", "k", "ay", "h", "m", "s" cuando los caracteres "centurdowi " son removidos.

El orden y el formato del conjunto devuelto no es importante.

Adán
fuente
1
Su segundo caso es incorrecto: "Helo Wrd" da una longitud total de 4 con "!", "W". y W".
Lucas
1
@Luke Gracias. Lo arreglaré Eso muestra que necesitamos un algoritmo, ya que hacerlo a mano es propenso a errores.
Adám
Y para el tercero, 'centurdowi' produce 'y', 'a', 'ya', 'mh', 'k', 'ay', 'h', 'm', 's' para una longitud total de 12.
Lucas
@Luke Gracias.
Adám
¡+1 por usar un desafío para ayudarte en otro desafío!
Lucas

Respuestas:

4

Haskell, 138 130 bytes

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]

Ejemplo de uso: f ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]-> "centurdoki".

Este es un enfoque de fuerza bruta.

     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

Editar: @Seeq me ayudó a ahorrar 8 bytes. ¡Gracias!

nimi
fuente
¿Qué map(#s)tal, así que no necesitas voltear notElem? EDITAR: ¿O no podrías simplemente en línea?
seequ
@Seeq: cuando se llama a través de map(#s), (#)debe definirse como flip (filter . flip notElem). Pero, por supuesto, la alineación es mucho más corta. ¡Gracias!
nimi
2

Pyth, 34

Toma entrada en el formato ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]. Los consejos de golf son apreciados, como siempre.

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

Pyth, 24 bytes

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

Pruébalo en línea. Banco de pruebas.

Tenga en cuenta que el último caso de prueba tardará un poco en ejecutarse.

Toma la entrada en forma de matriz, como ["Day", "day"].

Otro interesante que encontré e isaacg mejorado (también 24 bytes):

-J{sQhlDsM.A#f{ITm-RdQyJ
PurkkaKoodari
fuente
Pude reducir el segundo enfoque a 24 bytes: -J{sQhlDsM.A#f{ITm-RdQyJ aquí
isaacg