Hitung ukuran segmen string minimal

8

Optimalisasi umum untuk menghemat ruang dalam biner adalah menggabungkan string literal di mana satu literal adalah akhiran dari yang lain. Misalnya, biner dengan string literal

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

mungkin berisi kumpulan string literal berikut ( #mewakili \0-terminator):

foobar#foobarbaz#

dengan simbol-simbol a, b, c, dan dmemiliki nilai berikut relatif terhadap awal kolam tali:

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

Dalam tugas ini, Anda harus menghitung ukuran minimal kumpulan string untuk serangkaian string input yang diberikan.

Memasukkan

Input adalah serangkaian hingga 999 string yang masing-masing terdiri hingga 80 karakter ASCII (tidak termasuk baris baru) dalam kisaran dari 32 hingga 127 inklusif dan kemudian satu karakter baris baru.

Keluaran

Temukan string terpendek sedemikian rupa sehingga masing-masing string input (termasuk baris yang mengakhiri) adalah substring dari string itu. Outputnya harus sepanjang string terpendek itu. Jangan mengeluarkan string, hanya panjangnya.

Mencetak gol

Tantangan ini adalah kode golf, berlaku celah standar. Solusi dengan panjang paling sedikit dalam oktet menang.

Contohnya

  1. Memasukkan:

    foobar
    bar
    barbaz
    foobarbaz
    baz
    

    string terpendek, #mewakili baris baru:

    foobar#foobarbaz#
    

    panjangnya: 17

  2. Memasukkan:

    foobar
    foobaz
    foobarbaz
    barbaz
    

    string terpendek, #mewakili baris baru:

    foobar#foobaz#foobarbaz#
    

    panjangnya: 24

FUZxxl
sumber
1
Dan test case 80 karakter akan bagus. Juga, apakah ada perbedaan antara "octet" dan "byte"? Kalau tidak, saya tidak yakin apa manfaat menggunakan istilah obscurer.
Martin Ender
1
@ MartinBüttner Pada beberapa mesin, satu byte memiliki lebih atau kurang dari 8 bit (lih. MIX Knuth). Oktet adalah kata standar untuk merujuk pada kuantitas 8 bit, byte mengacu pada unit yang paling tidak dapat dialamatkan dari mesin tertentu yang sedang Anda kerjakan. Batas 80 karakter ada di sana sehingga orang dapat bekerja dengan array tetap dan jadi saya tidak bisa mengatakan "ini tidak valid karena rusak dengan input yang sangat panjang."
FUZxxl
1
Apakah semua string input berpasangan berbeda?
Alexey Burdin
@AlexeyBurdin No.
FUZxxl

Jawaban:

4

Pyth, 20 18 byte

hljb-{.zsmteM./d.z

Demonstrasi.

{ dapat dihapus jika duplikat tidak diizinkan.

Penjelasan:

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.
isaacg
sumber
3

CJam, 22 byte

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

Cobalah online.

Bagaimana itu bekerja

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.
Dennis
sumber
1

python 2, 132

Hanya untuk memulai balapan:

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)

Berhasil:

>>> f(r'''foobar
foobaz
foobarbaz
barbaz''')
24
>>> f(r'''foobar
bar
barbaz
foobarbaz
baz
''')
17
Alexey Burdin
sumber
1

Haskell, 101 85 byte

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

Fungsi tanpa nama. Contoh penggunaan:

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

Cara kerjanya: pisahkan string input di baris baru. Hapus duplikat dari daftar kata l. Simpan kata xdari daftar yang tersisa jika tidak ada dalam daftar semua ekor kata-kata l. Gabung xdengan baris baru di antara (dan di akhir!) Ke satu string dan hitung panjangnya.

nimi
sumber