Tính kích thước phân đoạn chuỗi tối thiểu


8

Một tối ưu hóa phổ biến để tiết kiệm không gian trong các nhị phân là hợp nhất các chuỗi ký tự trong đó một chữ là hậu tố của một chuỗi khác. Ví dụ, một nhị phân với chuỗi ký tự

a: foobar
b: bar
c: barbaz
d: foobarbaz
e: baz

có thể chứa nhóm chuỗi ký tự sau ( #đại diện cho \0-terminator):

foobar#foobarbaz#

với các biểu tượng a, b, c, và dcó các giá trị sau so với đầu của hồ bơi chuỗi:

a:  0
b:  3
c: 10
d:  7
e: 13

Trong tác vụ này, bạn phải tính kích thước tối thiểu của nhóm chuỗi cho một chuỗi các chuỗi đầu vào đã cho.

Đầu vào

Đầu vào là một chuỗi gồm tối đa 999 chuỗi, mỗi chuỗi bao gồm tối đa 80 ký tự ASCII (không bao gồm dòng mới) trong phạm vi từ 32 đến 127, bao gồm một ký tự dòng mới.

Đầu ra

Tìm chuỗi ngắn nhất sao cho mỗi chuỗi đầu vào (bao gồm cả dòng mới kết thúc) là chuỗi con của chuỗi đó. Đầu ra phải là độ dài của chuỗi ngắn nhất đó. Không xuất chuỗi, chỉ chiều dài của nó.

Chấm điểm

Thách thức này là mã golf, sơ hở tiêu chuẩn áp dụng. Giải pháp có độ dài ít nhất trong octet thắng.

Ví dụ

  1. Đầu vào:

    foobar
    bar
    barbaz
    foobarbaz
    baz
    

    chuỗi ngắn nhất, #đại diện cho dòng mới:

    foobar#foobarbaz#
    

    chiều dài: 17

  2. Đầu vào:

    foobar
    foobaz
    foobarbaz
    barbaz
    

    chuỗi ngắn nhất, #đại diện cho dòng mới:

    foobar#foobaz#foobarbaz#
    

    chiều dài: 24


1
Và trường hợp thử nghiệm 80 ký tự sẽ tốt. Ngoài ra, có sự khác biệt nào giữa "octet" và "byte" không? Mặt khác, tôi không chắc lợi ích của việc sử dụng thuật ngữ che khuất là gì.
Martin Ender

1
@ MartinBüttner Trên một số máy, một byte có nhiều hơn hoặc ít hơn 8 bit (xem MIX của Knuth). Octet là từ tiêu chuẩn để chỉ số lượng 8 bit, byte dùng để chỉ đơn vị ít địa chỉ nhất của máy cụ thể mà bạn đang làm việc. Giới hạn 80 ký tự chỉ ở đó để mọi người có thể làm việc với các mảng cố định và vì vậy tôi không thể nói rằng điều này không hợp lệ vì nó bị hỏng với đầu vào rất dài.
FUZxxl

1
Có phải tất cả các chuỗi đầu vào cặp khác nhau?
Alexey Burdin

@AlexeyBurdin số
FUZxxl

Câu trả lời:


4

Bình thường, 20 18 byte

hljb-{.zsmteM./d.z

Trình diễn.

{ có thể được loại bỏ nếu trùng lặp không được phép.

Giải trình:

hljb-{.zsmteM./d.z
                .z     The input, as a list of strings.
         m             Map each strings to
             ./d       all possible partitions of the string into separate strings.
           eM          take the last element of each, giving all suffixes.
          t            Remove the first suffix, giving all suffixes other than
                       the string itself.
        s              Sum, combining the list of lists into a single list.
    -{.z               From the set of input strings, remove all suffixes.
                       This is the list of strings in the minimal segment.
  jb                   Join the strings together on newlines.
 l                     Take the length of the resulting string.
h                      Add one and print.

3

CJam, 22 byte

qN%_&Nf+:G{Gs\/,3<},s,

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

qN%   e# Split the input from STDIN at linefeeds, discarding the last, empty chunk.
_&    e# Intersect the array with itself to remove duplicates.
Nf+   e# Append a linefeed to each chunk.
:G    e# Save the result in G.
{     e# Filter; for each chunk in G:
  Gs  e#   Flatten the array of strings G.
  \/  e#   Split at occurrences of G.
  ,3< e#   Compare the resulting number of chunks with 3.
},    e#   Keep the chunk iff the comparision pushed 1 (true).
s,    e# Flatten the resulting array of strings and push the result's length.

1

trăn 2, 132

Chỉ để bắt đầu một cuộc đua:

def f(s):
    l=set(s.split('\n'))
    for x in l:
        for y in l:
            if x!=y and x.endswith(y):l.remove(y)
    return sum(len(x)+1 for x in l)

Nó hoạt động:

>>> f(r'''foobar
foobaz
foobarbaz
barbaz''')
24
>>> f(r'''foobar
bar
barbaz
foobarbaz
baz
''')
17

1

Haskell, 101 85 byte

import Data.List
length.unlines.(\l->[x|x<-nub l,x`notElem`((tails.tail)=<<l)]).lines

Một chức năng không có tên. Ví dụ sử dụng:

*Main>  length.unlines.(\l->[x|x<-nub l,x`notElem`((tails.tail)=<<l)]).lines $ "foobar\nbar\nfoobaz"
14

Cách thức hoạt động: tách chuỗi đầu vào tại dòng mới. Loại bỏ các bản sao khỏi danh sách từ l. Giữ một xtừ trong danh sách còn lại nếu nó không có trong danh sách tất cả các đuôi của từ l. Tham gia những người xcó dòng mới ở giữa (và ở cuối!) Đến một chuỗi và đếm chiều dài của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.