Entfernen Sie Buchstaben, während die Zeichenfolgen eindeutig bleiben

15

Inspiriert von dieser wunderbaren Herausforderung (basierend auf der Anzahl der Ansichten und Stimmen), die meiner bescheidenen Meinung nach viel zu wenige Antworten hat.

Geben Sie (mit allen Mitteln) eine Liste von Zeichenfolgen zurück, und geben Sie (mit allen Mitteln) eine Reihe von Buchstaben zurück, die, wenn sie aus den angegebenen Zeichenfolgen entfernt werden, die Gesamtlänge der Zeichenfolgen (die verbleibenden Zeichenfolgen) so gering wie möglich halten Zeichenfolge eindeutig und mindestens ein Zeichen lang.

Beispiele:

Gegeben "Tag" und "Tag"; "ay" zurückgeben, da die angegebenen Zeichenfolgen "D" und "d" sind, wenn die Zeichen "ay" entfernt werden.

Gegeben "Hallo Welt!", "Hallo Welt." Und "Hallo Welt"; return "Helo Wrd" gibt an, dass die Zeichenfolgen "!", "w." und "w" lauten, wenn die Zeichen "Helo Wrd" (mit einem Leerzeichen) entfernt werden.

Angesichts von "Jahrhundert", "Jahrzehnt", "Jahr", "Monat", "Woche", "Tag", "Stunde", "Minute" und "Sekunde"; "centurdowi" zurückgeben, da die angegebenen Wörter "y", "a", "ya", "mh", "k", "ay", "h", "m", "s" sind, wenn die Zeichen "centurdowi" sind " werden entfernt.

Die Reihenfolge und das Format des zurückgegebenen Sets sind nicht wichtig.

Adam
quelle
1
Dein zweiter Fall ist falsch: "Helo Wrd" ergibt eine Gesamtlänge von 4 mit "!", "W." und W".
Luke
1
@ Luke Danke. Ich werde das reparieren. Das zeigt, dass wir einen Algorithmus brauchen, da dies von Hand fehleranfällig ist.
Adám
Und für das dritte ergibt "centurdowi" "y", "a", "ya", "mh", "k", "ay", "h", "m", "s" für eine Gesamtlänge von 12.
Luke
@ Luke Danke.
Adám
+1 für die Verwendung einer Herausforderung, um Ihnen bei einer anderen Herausforderung zu helfen!
Luke

Antworten:

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]

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

Dies ist ein Brute-Force-Ansatz.

     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

Edit: @Seeq hat mir geholfen, 8 Bytes zu sparen. Vielen Dank!

nimi
quelle
Wie wäre es map(#s), damit Sie nicht drehen müssen notElem? EDIT: Oder konntest du es nicht einfach einbinden?
Siehe auch
@Seeq: wenn ein Anruf über map(#s), (#)müssen definiert werden flip (filter . flip notElem). Aber natürlich ist das Inlining viel kürzer. Vielen Dank!
nimi
2

Pyth, 34

Übernimmt Eingaben im Format ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]. Golftipps sind wie immer willkommen.

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

Pyth, 24 Bytes

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

Probieren Sie es online aus. Testsuite.

Beachten Sie, dass der letzte Testfall einige Zeit in Anspruch nimmt.

Nimmt Eingaben in Array-Form wie ["Day", "day"].

Ein anderes interessantes, das ich gefunden und isaacg verbessert habe (auch 24 Bytes):

-J{sQhlDsM.A#f{ITm-RdQyJ
PurkkaKoodari
quelle
Ich konnte den zweiten Ansatz auf 24 Bytes reduzieren: -J{sQhlDsM.A#f{ITm-RdQyJ hier
isaacg