Самая длинная повторяющаяся последовательность из одной цифры


17

Вызов:

Учитывая положительное целое число, выведите самую длинную однозначную подпоследовательность, которая встречается не менее двух раз, и имеет границы другой цифры (или начало / конец целого числа).

Пример:

Входные данные: 7888885466662716666
Самая длинная подпоследовательность одной цифры будет 88888( 7[88888]5466662716666) длиной 5. Однако эта подпоследовательность встречается только один раз в целом числе.
Вместо этого результат для ввода 7888885466662716666должен быть 6666( 78888854[6666]271[6666]), так как это происходит (по крайней мере) дважды.

Правила соревнований:

  • Длина подпоследовательности имеет приоритет над количеством раз, когда это происходит. (То есть с помощью ввода 8888858888866656665666мы выводим 88888( [88888]5[88888]66656665666; длина 5 встречается дважды), а не 666( 88888588888[666]5[666]5[666]; длина 3 встречается трижды).
  • Если длина нескольких подпоследовательностей одинакова, мы выводим ту, которая имеет наибольшее количество вхождений. Т.е. при вводе 3331113331119111мы выводим 111( 333[111]333[111]9[111]; длина 3 встречается трижды), а не 333( [333]111[333]1119111тоже длина 3; но встречается дважды)
  • Если число вхождений и длина нескольких подпоследовательностей равны, вы можете вывести либо их, либо все (в любом порядке). Т.е. при вводе 777333777333возможными выходами являются 777:; 333; [777, 333]; или [333, 777].
  • Подпоследовательность должна иметь границы других цифр (или начало / конец целого числа). Т.е. при вводе 122222233433результат равен 33( 1222222[33]4[33]; длина 2 встречается дважды), а не 222( 1[222][222]33433длина 3 встречается дважды, причем оба значения недопустимы).
    • Это относится ко всем числам, которые засчитываются в счетчик событий. Т.е. при вводе 811774177781382результат равен 8( [8]117741777[8]13[8]2;; длина 1 встречается трижды), а не 77( 811[77]41[77]781382/ 811[77]417[77]81382; длина 2 встречается дважды с одним неверным) или 1( 8[1][1]774[1]7778[1]382; длина 1 встречается четыре раза с двумя ошибочными).
  • Вы можете предположить, что ввод не будет содержать никаких цифр 0(он будет соответствовать [1-9]+). (Это сделано для того, чтобы избежать необходимости иметь дело с тестовыми примерами, 10002000которые должны выводиться 000, где большинство языков выводили бы 0по умолчанию.)
  • Можно предположить, что входные данные всегда будут содержать хотя бы один допустимый выходной результат.
  • Ввод / вывод оба являются гибкими. Может быть списком / массивом / потоком цифр / байтов / символов или в виде строки вместо одного целого числа.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

Тестовые случаи:

Input:  7888885466662716666 / [7,8,8,8,8,8,5,4,6,6,6,6,2,7,1,6,6,6,6]
Output: 6666                / [6,6,6,6]

Input:  3331113331119111 / [3,3,3,1,1,1,3,3,3,1,1,1,9,1,1,1]
Output: 111              / [1,1,1]

Input:            777333777333                   / [7,7,7,3,3,3,7,7,7,3,3,3]
Possible outputs: 777; 333; [777,333]; [333;777] / [7,7,7]; [3,3,3]; [[7,7,7],[3,3,3]]; [[3,3,3],[7,7,7]]

Input:  122222233433 / [1,2,2,2,2,2,2,3,3,4,3,3]
Output: 33           / [3,3]

Input:  811774177781382 / [8,1,1,7,7,4,1,7,7,7,8,1,3,8,2] 
Output: 8               / [8]

Input:  555153333551 / [5,5,5,1,5,3,3,3,3,5,5,1] 
Output: 1            / [1]

Input:            12321              / [1,2,3,2,1]
Possible outputs: 1; 2; [1,2]; [2,1] / [1]; [2]; [[1],[2]]; [[2],[1]]

Input:  944949949494999494 / [9,4,4,9,4,9,9,4,9,4,9,4,9,9,9,4,9,4]
Output: 4                  / [4]

Input:  8888858888866656665666 / [8,8,8,8,8,5,8,8,8,8,8,6,6,6,5,6,6,6,5,6,6,6]
Output: 88888                  / [8,8,8,8,8]

Input:  1112221112221111               / [1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1]
Output: 111; 222; [111,222]; [222,111] / [1,1,1]; [2,2,2]; [[1,1,1],[2,2,2]]; [[2,2,2],[1,1,1]]

Input:  911133111339339339339339 / [9,1,1,1,3,3,1,1,1,3,3,9,3,3,9,3,3,9,3,3,9,3,3,9]
Output: 111                      / [1,1,1]

1
Похожий тест: 8888858888866656665666. Если я правильно интерпретировал проблему, оба решения, Brachylog и 05AB1E, терпят неудачу.
г-н Xcoder

@ Mr.Xcoder Добавлено, спасибо.
Кевин Круйссен

@Arnauld Хммм, в любом случае это был бы один из победителей, на мой взгляд, потому что это происходит столько раз, сколько 222ограничено другими целыми числами. Я думаю, мы просто не должны считать вхождение, которое является подстрокой 1111. Лучше подождать ОП, хотя, действительно.
г-н Xcoder

2
@Arnauld Для 1112221112221111них подпоследовательности и их подсчет: 1111 (1), 111 (2), 222 (2). Так как мы только выводит последовательности происходит , по крайней мере в два раза, то выход может быть одним из: 111, 222, [111,222], [222,111]. (См. Четвертое правило для получения дополнительной информации.) В основном 1111будет учитываться только как 1111, а не как 1и 111или или 11и 11. Я добавлю ваш тестовый пример, но вывод будет либо или оба 111и 222.
Кевин Круйссен

Ответы:


6

05AB1E , 14 байтов

γТ1›ÏD€gZQÏ.M

Попробуйте онлайн!

объяснение

γ                # group consecutive equal elements
 Т              # count the occurrence of each group among the list of groups
   1›Ï           # keep only groups with a count greater than 1
      D€gZQÏ     # keep only those with a length equal to the greatest length
            .M   # get the most common item

@Riley: К сожалению, это даст первый элемент, который не обязательно является самым распространенным.
Эминья

Упс .. Я пропустил эту пулю.
Райли

5

Желе , 12 байт

Œgœ-Q$LÐṀÆṃ'

Попробуйте онлайн!

Предыдущая версия - 14 байт

ŒgŒQ¬TịƲLÐṀÆṃ'

Попробуйте онлайн!

Как это устроено?

Œgœ-Q$LÐṀÆṃ' – Full program. Receives a list of digits as input.
Œg           – Group equal adjacent values.
  œ-Q$       – Multiset difference with itself deduplicate.
      LÐṀ    – Keep those that are maximal by length.
         Æṃ' – Mode. Returns the most common element(s).
-------------------------------------------------------------------------
ŒgŒQ¬TịƲLÐṀÆṃ' – Full program. Receives a list of digits as input.
Œg             – Group equal adjacent values.
  ŒQ           – Distinct sieve. Replace the first occurrences of each value by 1.
                 and the rest by 0. [1,2,3,2,3,2,5]ŒQ -> [1,1,1,0,0,0,1]       
    ¬T         – Negate and find the truthy indices.
      ịƲ       – Then index in the initial list of groups.
               – This discards the groups that only occur once.
        LÐṀ    – Find all those which are maximal by length.
           Æṃ' – And take the mode.

5

JavaScript (ES6), 79 73 68 байт

Принимает ввод в виде строки. Возвращает целое число.

s=>[...s,r=q=0].map(o=d=>q=s^d?o[!o[q]|r[q.length]?q:r=q]=s=d:q+d)|r

Попробуйте онлайн!

комментарии

s =>                      // s = input string, also used as the current digit
  [ ...s,                 // split s into a list of digit characters
    r =                   // r is the final result
    q =                   // q is the current digit sequence
    0                     // append a final dummy entry to force the processing of the last
  ]                       // sequence
  .map(o =                // o is an object used to keep track of encountered sequences
       d =>               // for each digit d in the array defined above:
    q =                   //   update q:
      s ^ d ?             //     if d is not equal to the current digit:
        o[                //       this statement will ultimately update o[q]
          !o[q] |         //         if q has not been previously seen
          r[q.length] ?   //         or the best result is longer than q:
            q             //           leave r unchanged
          :               //         else:
            r = q         //           set r to q
        ] = s = d         //       reset q to d, set the current digit to d
                          //       and mark q as encountered by setting o[q]
      :                   //     else:
        q + d             //       append d to q
  ) | r                   // end of map(); return r, coerced to an integer

Может быть, я говорю здесь что-то неправильное, но, поскольку ...sпреобразовывает ввод в список цифровых символов, не короче ли просто взять ввод как список цифровых символов вместо строки? Я позволил гибкий ввод / вывод. (Но я предполагаю, что это мешает другой части вашего кода?)
Кевин Круйссен

2
@KevinCruijssen Проблема в том, что мне нужна дополнительная итерация для обработки последней последовательности. Так что мне нужно сделать, [...s,0]даже если sуже есть список.
Арно

4

Сетчатка , 56 байт

L`(.)\1*
O`
L$m`^(.+)(¶\1)+$
$#2;$1
N`
.+;

N$`
$.&
-1G`

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

L`(.)\1*

Перечислите все максимально повторяющиеся подпоследовательности цифр.

O`

Сортировать список по порядку.

L$m`^(.+)(¶\1)+$
$#2;$1

Перечислите все несколько подпоследовательностей с их «количеством».

N`

Сортировка по возрастанию.

.+;

Удалить счет.

N$`
$.&

Сортировка в порядке возрастания длины. (Если длины равны, предыдущий порядок из-за количества сохраняется.)

-1G`

Сохраняйте последнее, т.е. самое длинное значение.


4

R , 102 байта

function(i)rep(names(sort(-(x=(x=table(rle(i)))[rowSums(x>1)>0,,drop=F])[m<-max(rownames(x)),])[1]),m)

Попробуйте онлайн!

Поскольку ответа R еще не было, я решил попробовать, и ну ... это было нелегко. Я действительно не знаю, хороший ли это подход, но здесь все идет.

Входы и выходы векторов символов.


Близко к 100 байтам довольно хорошо для R с этим вызовом.
НГМ



3

Powershell, 101 байт

($args|sls '(.)\1*'-a|%{$_.Matches}|group|?{$_.Count-1}|sort @{e={$_.Name.Length,$_.Count}})[-1].Name

Объясненный тестовый скрипт:

$f = {

(
    $args|          # for each argument (stings)
    sls '(.)\1*'-a| # searches all
    %{$_.Matches}|  # regex matches
    group|          # group it (Note: Count of each group > 0 by design)
    ?{$_.Count-1}|  # passthru groups with Count not equal 1
    sort @{         # sort all groups by 2 values
        e={$_.Name.Length,$_.Count}
    }
)[-1].Name          # returns name of last group (group with max values)

}

@(
    ,('7888885466662716666', '6666')
    ,('3331113331119111', '111')
    ,('777333777333', '777','333')
    ,('122222233433', '33')
    ,('811774177781382', '8')
    ,('555153333551','1')
    ,('12321', '1','2')
    ,('944949949494999494','4')
    ,('8888858888866656665666','88888')
    ,('1112221112221111','111','222')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-in$e): $r"
}

Выход:

True: 6666
True: 111
True: 777
True: 33
True: 8
True: 1
True: 1
True: 4
True: 88888
True: 111


3

Haskell, 72 байта

import Data.Lists
g!x|y<-countElem x g=(y>1,1<$x,y)
(argmax=<<(!)).group

Как это устроено

(argmax=<<(!)).group       -- expands to: f i = argmax (group i !) (group i)
    group                  -- split the input list into subsequences of equal digits
                           -- e.g. "1112211" -> ["111","22","11"]

                           -- find the element of this list where the function !
                           -- returns the maximum value. First parameter to !
                           -- is the grouped input list, second parameter the
                           -- the element to look at 

g!x|
    y<-countElem x g       -- let y be the number of occurrences of x in g
  = (  ,   ,  )            -- return a triple of
     y>1                   -- a boolean y>1  (remember: True > False)  
        1<$x               -- length of x (to be exact: all elements in x
                           -- replaced by 1. This sorts the same way as the
                           -- length of x)
             y             -- y
                           -- a triples sorts lexicographical

Вам не нужно использовать списки Haskell + в качестве языка, потому что Data.Lists не является частью базы?
18:02

@BWO: не знаю. Я всегда использовал простой «Haskell», даже когда импортировал экзотическую библиотеку (например, Glossдля графического вывода или Matrix). Я использую «Haskell + что-то», если я не хочу включать количество байтов для импорта. Я думаю, что у нас была эта тема на мета, но я больше не могу ее найти. Если я правильно помню, у нас не было общего определения «стандартной библиотеки». Какой должна быть ссылка для Haskell? Отчет о Haskell, база GHC, Haskell Plattform, что-то еще?
Nimi

IMO должно быть так же, как и в C / JavaScript / .., что (если это имеет значение) нам нужно использовать Haskell (GHC) или Haskell (Hugs) и т. Д., Потому что реализация указывает язык на PPCG. Так что для ответа GHC, который будет включать в себя базу, а для всех остальных я бы не знал: D
ბიმო

Возможно, у вас есть ссылка TIO, чтобы ее можно было проверить? Или Data.Listsбиблиотека недоступна на TIO или другом онлайн-компиляторе Haskell?
Кевин Круйссен

1
@KevinCruijssen: да Data.Lists, отсутствует на TIO. Вы можете проверить это с этой версией .
Ними

3

R 85 байт

function(x,R=rle(x),a=ave(R$v,R,FUN=length))rep(R$v[o<-order(a<2,-R$l,-a)[1]],R$l[o])

Попробуйте онлайн!

  • Входные данные: вектор разделенных целых цифр, напримерc(1,8,8...)

  • Вывод: вектор разделенных целых цифр

Развернутый код с объяснением:

function(x){                # x is a vector of digits : e.g. c(1,1,8,8,1,1)

R = rle(x)                  # Get the sequences of consecutive repeating digits
                            # doing run length encoding on x, i.e. : R is a list
                            # with the digits (R$values) and the number of their
                            # consecutive occurrencies (R$lengths)
                            # N.B. you can use R$v for R$values and R$l for R$lenghts

a=ave(R$v,R,FUN=length)     # Group R$v by R$l AND R$v, count the occurrencies 
                            # for each group and "unroll" the value of each 
                            # group to the original R$v length.
                            # Here basically we count the occurrencies of the same 
                            # sequence.

o<-order(a<2,-R$l,-a)[1]    # Get the indexes used to order by a < 2 then by -R$l and
                            # finally by -a; store the first index in "o".
                            # Here basically we use order to select the first sequence 
                            # repeated at least twice, in case of ties the sequence 
                            # with the greatest length and in case of ties the most 
                            # repeated sequence.

rep(R$v[o],R$v[o])          # Using the index "o", we reconstruct the sequence repeating
                            # R$l[o] times R$v[o]
}

Альтернативная версия, принимающая вектор целых или символьных цифр:

R , 88 байт

function(x,R=rle(x),a=ave(R$v,R,FUN=length))rep(R$v[o<-tail(order(a>1,R$l,a),1)],R$l[o])

Попробуйте онлайн!

  • Ввод: вектор разделенных символов или цифр, например, c("1","8","8"...)илиc(1,8,8...)

  • Вывод: вектор разделенных символов, если на входе был вектор символов, вектор цифр, если на входе был вектор цифр


Можете ли вы добавить объяснение? Я не понимаю, как это работает.
JayCe

@JayCe: готово! (Я добавил подробности, которые вы хорошо знаете, только для пользователей, не относящихся к R;))
digEmAll

ти! Это имеет смысл сейчас.
JayCe

2

Красный , 256 250 байт

func[s][p: func[b][sort parse b[collect[any keep[copy a skip thru any a]]]]first
last sort/compare collect[foreach d p p s[if 1 < k: length? to-block d[keep/only
reduce[form unique d k]]]]func[x y][(reduce[length? x/1 x/2])< reduce[length? y/1 y/2]]]

Попробуйте онлайн!

Действительно, действительно долгое решение на этот раз ... (вздох)

Принимает ввод в виде строки.

Объяснение:

f: func [ s ] [
    p: func [ b ] [                        ; groups and sorts the adjacent repeating items
        sort parse b [ 
            collect [                      
                any keep[
                    copy a skip thru any a ; gather any item, optionally followed by itself  
                ]
            ]
        ]
    ]
    t: copy []
    foreach d p p s [                     ; p p s transforms the input string into a block of sorted blocks of repeating digits
        if 1 < k: length? to-block d [    ; filters only the blocks that occur more than once
            insert/only t reduce [ form unique d k ] ; stores the digits and the number of occurences
                                          ; "8888858888866656665666" -> [["5" 3] ["666" 3] ["88888" 2]]
        ]
    ]
    first last sort/compare t func [ x y ] ; takes the first element (the digits) of the last block of the sorted block of items
        [ (reduce [ length? x/1 x/2 ]) < reduce [ length? y/1 y/2 ] ] ; direct comparison of the blocks
]

2

Java (JDK 10) , 213 байтов

s->{int l=99,X[][]=new int[10][l],d,D=0,m=0,M=0;for(var x:s.split("(?<=(.))(?!\\1)"))X[x.charAt(0)-48][x.length()]++;for(;M<1&&l-->1;)for(d=0;d++<9;)if((m=X[d][l])>1&m>M){M=m;D=d;}for(;l-->0;)System.out.print(D);}

Попробуйте онлайн!

Объяснение (устарело)

s->{                                    // Lambda for Consumer<String>
 int l=99,                              //  Length of token, max is 99.
     X[][]=new int[10][l],              //  Array containing the occurrences per token
     d,                                 //  digit value
     D=0,                               //  digit holder for best sequence candidate
     m=0,                               //  holder of the current candidate
     M=0;                               //  best candidate for the current length of token.
 for(var x:s.split("(?<=(.))(?!\\1)"))  //  Tokenize the string into digit-repeating sequences
  X[x.charAt(0)-48][x.length()]++;      //   Add one occurrence for the token
 for(;M<1&&l-->1;)                      //  While no value has been found and for each length, descending. Do not decrease length if a value has been found.
  for(d=0;d++<9;)                       //   for each digit
   if((m=X[d][l])>1&m>M){               //    if the current occurrence count is at least 2 and that count is the current greatest for the length
    M=m;D=d;                            //     mark it as the current best
   }                                    //
 for(;l-->0;)System.out.print(D);       //  Output the best-fitting subsequence.
}                                       // 

кредиты


1
Боюсь, в вашем j*o>Mчеке есть небольшой недостаток . Если я правильно понимаю, это берет макс length * occurrence-count. Но для тестового примера, такого как, 1113311133933933933933например, 111будет (3 * 2 = 6), а 33будет (2 * 6 = 12). Таким образом, он выводится 33с самым высоким вхождением, а 111не самым длинным, по крайней мере, дважды. Кроме того , var r="";for(;O-->0;)r+=D;return r;может быть golfed к for(;O-->0;)System.out.print(D);в Java 10, или даже короче в Java 11: return(D+"").repeat(O);.
Кевин Круйссен,

@KevinCruijssen Я думаю, я это исправил.
Оливье Грегуар,

1
Это действительно выглядит лучше, и хороший способ игры в гольф в то же время. Вы просто забыли обновить свое объяснение. И вы можете сыграть в гольф еще 1 байт, изменив int X[][]=new int[10][99],d,l=99,на int l=99,X[][]=new int[10][l],d,.
Кевин Круйссен,

1
@KevinCruijssen Спасибо! Я также сыграл в гольф еще один байт, написав d++<9вместо ++d<10. Извините за остальное: я довольно устал сегодня = _ =
Оливье Грегуар

2

Рубин , 68 67 байт

->a{(b=a.chunk &:+@).max_by{|x|[(c=b.count x)<2?0:x[1].size,c]}[1]}

Попробуйте онлайн!

Входы и выходы массивов символов.

Подход довольно прост: мы идентифицируем серии последовательных цифр ( chunkиспользуя унарные в +качестве функции тождественности) и берем максимум - сначала по размеру серии (сбрасываем в ноль, если счетчик его числа <2), затем по самому счету. ,


2

PCRE, 152 байта

(\d)(?<!(?=\1)..)(?=(\1*)(?!\1).*(?!\1).\1\2(?!\1))(?!(?:(?=\2((\3?+)(\d)(\5*)))){1,592}?(?=\2\3.*(?!\5).\5\6(?!\5))(?:\1(?=\1*\4\5(\7?+\5)))*+(?!\1))\2

Смотрите его в действии на: https://regex101.com/r/0U0dEp/1 (просто посмотрите на первое совпадение в каждом тестовом примере)

Это просто для удовольствия, поскольку регулярное выражение не является реальным языком программирования само по себе, и решение ограничено: P

Поскольку группа нулевой ширины, такая как (?:)+совпадает только один раз, не повторяется бесконечно, и поскольку PCRE внутренне создает копии групп, количественно определенных с ограничениями, мне пришлось использовать там магическое число ("{1,592}"), которое означает, что мы можем только искать до 592 смежных наборов цифр впереди, чтобы найти конкурирующий набор, который может быть длиннее, чем тот, который в настоящее время проверяется. Подробнее об этой концепции здесь .


1

Perl 5 , 88 байт

my($m,%s);++$i%2*$s{$_}++&&($n=$s{$_}/9+length)>$m&&($a=$_,$m=$n)for pop=~/((.)\2*)/g;$a

Попробуйте онлайн!

Слегка раздутый, с тестами:

sub f {
  my($m,%s);
  my($i,$n,$a);           #not needed in golfed version
  ++$i % 2  *  $s{$_}++
  && ($n=$s{$_}/9+length) > $m
  && ($a=$_, $m=$n)
    for pop=~/((.)\2*)/g; #i.e. 7888885466662716666 => 7 88888 5 4 6666 2 7 1 6666
  $a
}
for(map[/\d+/g],split/\n/,join"",<DATA>){ #tests
  my($i,@e)=@$_;
  printf "%-6s   input %-24s   expected %-10s   got %s\n",
    (grep f($i) eq $_, @e) ? "Ok" : "Not ok", $i, join('|',@e), f($i);
}
__DATA__
Input:  7888885466662716666     Output: 6666
Input:  3331113331119111        Output: 111
Input:  777333777333            Output: 777|333
Input:  122222233433            Output: 33
Input:  811774177781382         Output: 8
Input:  555153333551            Output: 1
Input:  12321                   Output: 1|2
Input:  944949949494999494      Output: 4
Input:  8888858888866656665666  Output: 88888
Input:  1112221112221111        Output: 111|222

1

Wolfram Language (Mathematica) , 67 байт

#&@@@MaximalBy[Select[Tally@Split@#,Last@#>1&],{Length@#,#2}&@@#&]&

Чистая функция. Принимает список цифр в качестве входных данных и возвращает список подпоследовательностей (в произвольном порядке) в качестве выходных данных. Не уверен, что предложение «должно появиться хотя бы дважды» может быть обработано более аккуратно. Попробуйте онлайн!


1
Не могли бы вы добавить ссылку TIO для этого?
Кевин Cruijssen

Если вы действительно настаиваете ...
LegionMammal978

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.