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.


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


¡+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!


¿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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.