Скільки мес починаються із заданого рядка?


11

Назвемо не порожній список рядків mes, якщо виконуються такі умови:

  1. Кожен перелічений рядок є не порожнім і використовує лише символи, які зустрічаються в першому рядку.
  2. Кожен наступний рядок точно на один символ довший за попередній рядок.
  3. Жоден рядок у списку не є послідовністю будь-якого іншого рядка у списку.

Термін "меса" походить від подібного візуалізації (де xмають бути різні символи):

    xx..x
    xx..xx
    xx..xxx
    .
    .
    .
    xx..xxx..x 

NB: Це математичний факт, що лише задано багато мес починається з заданого рядка. Зверніть увагу на відмінність підрядності від підрядка ; наприклад, "anna" - це підряд (але не підрядок) "банана".

Виклик:

  • Напишіть найкоротшу програму, яка приймає довільну не порожню буквено-числову рядок введення та виводить кількість мес, що починаються з цього рядка.

Введення (stdin):

  • Будь-яка не порожня буквено-числова рядок.

Вихід (stdout):

  • Кількість мес, які починаються з вхідного рядка.

Оцінка:

  • Переможець - програма з найменшою кількістю байтів.

Приклад мез

Лише одна меса починається з a:

a

Лише одна меса починається з aa:

aa

Багато мес починаються з ab:

ab        ab        ab        ab        (and so on)
          baa       aaa       bbb
                    bbba      bbaa
                              baaaa
                              aaaaaa

Як визначається унікальність меса? Наприклад, я міг би ab, bbbяк Меса тільки зупинивши на другий термін. Це дійсно? Або їх завжди потрібно робити якомога довше? Крім того , якщо є кілька можливих перестановки в nthперспективі (наприклад baa, aba, aab), не всі вони враховуються як окремі месас , а також ( при умови , звичайно , всі вони дотримуються правил)?
mellamokb

@mellamokb - це різні меси, якщо вони взагалі різняться. Наприклад, ab, ab/baa, ab/bbb, ab/bbb/bbaa, ab/bbb/bbaa/baaaa, ab/bbb/bbaa/baaaa/aaaaaaрізні Mesas.
res

@mellamokb - Ви ставите інші хороші запитання; наприклад, скільки мес максимальної довжини починається з заданого рядка, і яка максимальна довжина. Інші версії цих запитань виправлять алфавіт заданого розміру (розмір алфавіту буде вхідним) і розглядають усі меси (переосмислені без умови №1), які використовують лише літери з даного алфавіту - знову їх є лише кінцево багато.
res

Відповіді:



2

Рубі, 142 символи

m=->l{[*l[0].chars].repeated_permutation(l[-1].size+1).reduce(1){|s,x|l.any?{|y|x*''=~/#{[*y.chars]*'.*'}/}?s:s+m[l+[x*'']]}}
p m[[gets.chop]]

Цей алгоритм є конструктивним, тобто він будує всі можливі меси для вхідного рядка і рахує їх. Це робить програму дуже-дуже повільною - але ей, це кодогольф.

Приклад виконання:

> a
1
> aa
1
> ab
43

Я сподівався, що всі меси, що починаються з деяких нетривіальних бінарних рядків довжиною 3 (наприклад aab), мають можливу довжину, але я не впевнений - ваша програма працює на цьому прикладі близько години. Примітка: не буде можливим висновок для будь-якого вводу, що включає більше двох різних літер; наприклад, деякі меси, які починаються з, abcмають довжину більше 7000-го числа Акермана .
res

Я створив оптимізовану версію в C #, і після того, як я створив 300,000записи, aabя все ще бачив, що перші 10 або більше термінів є однаковими. Тому я думаю, що це може бути неможливим для нічого більшого, ніж два символи. Принаймні, не без деяких інтелектуальних та евристичних розрахунків.
mellamokb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.