ลบตัวอักษรในขณะที่รักษาสตริงที่ไม่ซ้ำกัน


15

แรงบันดาลใจจากนี้ยอดเยี่ยม (ขึ้นอยู่กับจำนวนการดูและออกเสียงลงคะแนน) ความท้าทายซึ่งในความต่ำต้อยของฉันมีคำตอบวิธีที่น้อยเกินไป

รับ (โดยวิธีการใด ๆ ) รายการของสตริงคืน (โดยวิธีการใด ๆ ) ชุดของตัวอักษรที่เมื่อลบออกจากสตริงที่กำหนดออกจากความยาวรวมของ (สิ่งที่เหลืออยู่) สตริงที่มีขนาดเล็กที่สุดในขณะที่รักษาแต่ละ สตริงที่ไม่ซ้ำกันและอย่างน้อยหนึ่งตัวอักษร

ตัวอย่าง:

ให้ "วัน" และ "วัน"; ส่งคืน "ay" เนื่องจากสตริงที่กำหนดจะเป็น "D" และ "d" เมื่อลบอักขระ "ay" ออก

ได้รับ "Hello World!", "Hello world." และ "Hello world"; ส่งคืน "Helo Wrd" ให้เนื่องจากสตริงจะเป็น "!", "w." และ "w" เมื่ออักขระ "Helo Wrd" (มีช่องว่าง) ถูกลบออก

ให้ "ศตวรรษ", "ทศวรรษ", "ปี", "เดือน", "สัปดาห์", "วัน", "ชั่วโมง", "นาที", "นาที" และ "วินาที"; ส่งคืน "centurdowi" เพราะคำที่ระบุจะเป็น "y", "a", "ya", "mh", "k", "ay", "h", "h", "m", "s" เมื่อตัวละคร "centurdowi "ถูกลบ

ลำดับและรูปแบบของชุดที่ส่งคืนมานั้นไม่สำคัญ


1
กรณีที่สองของคุณผิด: "Helo Wrd" ให้ความยาวรวม 4 ด้วย "!", "w." และ "w"
ลุค

1
@ ลุคขอบคุณ ฉันจะแก้ไขมัน นั่นแสดงให้เห็นว่าเราต้องการอัลกอริทึมเนื่องจากการทำด้วยมือนั้นเกิดข้อผิดพลาดได้ง่าย
อดัม

และสำหรับอันที่สาม 'centurdowi' ให้ผลผลิต 'y', 'a', 'ya', 'mh', 'k', 'ay', 'h', 'm', 's' สำหรับความยาวทั้งหมดของ 12.
ลุค


+1 สำหรับการใช้การท้าทายเพื่อช่วยคุณในการท้าทายอื่น!
ลุค

คำตอบ:


4

Haskell, 138 130 ไบต์

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]

ตัวอย่างการใช้งาน: ->f ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]"centurdoki"

นี่เป็นวิธีการที่ดุร้าย

     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

แก้ไข: @Seeq ช่วยให้ฉันประหยัดได้ 8 ไบต์ ขอบคุณ!


วิธีการเกี่ยวกับmap(#s)ดังนั้นคุณจึงไม่จำเป็นต้องพลิกnotElem? แก้ไข: หรือคุณไม่เพียงแค่ใส่มัน?
Seequ

@Seeq: เมื่อมีการโทรผ่านmap(#s), ต้องได้รับการกำหนดให้เป็น(#) flip (filter . flip notElem)แต่แน่นอนว่าการทำอินไลน์นั้นสั้นกว่ามาก ขอบคุณ!
nimi

2

Pyth, 34

["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]จะเข้าในรูปแบบ เคล็ดลับการเล่นกอล์ฟได้รับการชื่นชมเช่นเคย

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

2

Pyth, 24 ไบต์

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

ลองออนไลน์ ชุดทดสอบ

โปรดทราบว่ากรณีทดสอบล่าสุดจะใช้เวลาสักครู่ในการทำงาน

["Day", "day"]จะเข้าในรูปแบบอาร์เรย์เช่น

อีกสิ่งหนึ่งที่น่าสนใจที่ฉันพบและปรับปรุงisaacg (เช่น 24 ไบต์):

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

ฉันสามารถลดวิธีที่สองเป็น 24 ไบต์ได้-J{sQhlDsM.A#f{ITm-RdQyJ ที่นี่
isaacg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.