Rimuovi le lettere mantenendo le stringhe uniche


15

Ispirato da questa meravigliosa sfida (basata sul numero di opinioni e voti), che, secondo la mia modesta opinione, ha troppe poche risposte.

Dato (con ogni mezzo) un elenco di stringhe, restituisce (con ogni mezzo) un insieme di lettere che, quando rimosse dalle stringhe date, lascia la lunghezza totale di (ciò che rimane di) le stringhe il più piccolo possibile, mantenendo ciascuna stringa unica e lunga almeno un carattere.

Esempi:

Dato "giorno" e "giorno"; restituisce "ay", perché le stringhe fornite saranno "D" e "d" quando i caratteri "ay" vengono rimossi.

Dato "Hello World!", "Hello world." E "Hello world"; return "Helo Wrd" dà perché le stringhe saranno "!", "w." e "w" quando i caratteri "Helo Wrd" (con uno spazio) vengono rimossi.

Dato "secolo", "decennio", "anno", "mese", "settimana", "giorno", "ora", "minuto" e "secondo"; restituisce "centurdowi" perché le parole fornite saranno "y", "a", "ya", "mh", "k", "ay", "h", "m", "s" quando i caratteri "centurdowi "vengono rimossi.

L'ordine e il formato del set restituito non sono importanti.


1
Il tuo secondo caso è sbagliato: "Helo Wrd" ha una lunghezza totale di 4 con "!", "W." e W".
Luca,

1
@Luke Grazie. Lo aggiusterò. Ciò dimostra che abbiamo bisogno di un algoritmo, poiché farlo a mano è soggetto a errori.
Adám,

E per il terzo, 'centurdowi' produce 'y', 'a', 'ya', 'mh', 'k', 'ay', 'h', 'm', 's' per una lunghezza totale di 12.
Luca,


+1 per l'utilizzo di una sfida per aiutarti in un'altra sfida!
Luca,

Risposte:


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]

Esempio di utilizzo: f ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]-> "centurdoki".

Questo è un approccio a forza 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

Modifica: @Seeq mi ha aiutato a salvare 8 byte. Grazie!


Che ne dici map(#s), quindi non è necessario capovolgere notElem? EDIT: O non potresti semplicemente incorporarlo?
Seequ,

@Seeq: quando la chiamata via map(#s), (#)deve essere definito come flip (filter . flip notElem). Ma naturalmente l'allineamento è molto più breve. Grazie!
nimi,

2

Pyth, 34

Accetta input nel formato ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]. I consigli sul golf sono apprezzati, come sempre.

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

2

Pyth, 24 byte

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

Provalo online. Suite di test.

Si noti che l'ultimo caso di test richiederà un po 'di tempo per essere eseguito.

Accetta input in forma di array, ad esempio ["Day", "day"].

Un altro interessante che ho trovato e isaacg migliorato (anche 24 byte):

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

Sono stato in grado di ridurre il secondo approccio a 24 byte: -J{sQhlDsM.A#f{ITm-RdQyJ qui
isaacg il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.