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.


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!


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.