Самая длинная увеличивающаяся подстрока


12

Учитывая список натуральных чисел, напишите код, который находит длину самого длинного непрерывного подсписка, который увеличивается (не строго). Это самый длинный подсписок, так что каждый элемент больше или равен последнему.

Например, если вход был:

[1,1,2,1,1,4,5,3,2,1,1]

Самый длинный увеличивающийся будет , поэтому вы получите .[1,1,4,5]4

Ваш ответ будет оценен, если взять его источник в виде списка байтов, а затем найти длину самого длинного увеличивающегося подсписка этого списка. Более низкая оценка - цель. Связи нарушаются в пользу программ с меньшим общим байтом.


Можно ли вернуть true вместо 1? И нужно ли нам обрабатывать пустой список?
Джо Кинг,

Для вашего первого, какой бы мета-консенсус не был на числовом выводе, который вы можете сделать, я не помню, Trueчтобы он был заменой, 1но это может быть. Вы должны быть в состоянии обработать пустой список (вывод, конечно, 0).
Специальный охотник на Гарф

2
Предлагаемые тестовые случаи: [] => 0, [0] => 1, [3,2,1] => 1,[1,2,1,2] => 2
Sok

Не могли бы вы подробнее остановиться на «счете»?
ouflak

1
@ouflak Я не уверен, что еще можно сказать на счет. Преобразуйте ваше представление в список байтов и передайте его через вашу собственную программу, и это ваш счет. Если очки равны, тай-брейк - бай-кант
Джо Кинг,

Ответы:


6

Pyth , оценка 2 (8 байт)

lefSIT.:

Попробуй это здесь!

Кодовые точки [108, 101, 102, 83, 73, 84, 46, 58]. Другое более короткое решение - leSI#.:3 балла, но его кодовые баллы [108, 101, 83, 73, 35, 46, 58], которые на самом деле очень близки к 1 баллу. Перестановка немного может помочь Nevermind, встроенные подстроки .:не могут быть переставлены, поэтому наименьшее значение должно быть 2, если программа его использует.

Как?

lefSIT.:     Full program. Accepts either a list or a string from STDIN.
      .:     Substrings.
  f  T       Only keep those that are...
   SI        Sorting-Invariant.
le           Length of the last item.

5

Haskell , оценка 2, 66 64 61 60 65 байт

foldr1 max.g
g[]=[0]
g(x:y:z)|x>y=1: g(y:z)
g(_:y)|a:b<-g y=1+a:b

Попробуйте онлайн! (проверяет себя).

Я никогда не думал, что смогу получить счет 2 с Haskell, и все же я здесь!

Функция gвычисляет длины всех увеличивающихся подстрок рекурсивно. foldr1 max.gпринимает максимум из этих длин ( foldr1 maxэквивалентно maximum, но с более низким баллом).


1
Похоже, что пробел в 1+a : bне является необходимым, так что это 62 байта.
Макс Ехлаков

@MaxYekhlakov Вы правы, я не знаю, как я это пропустил.
Delfad0r

Ваш код возвращается 1для пустого списка, куда он должен вернуться0
Джо Кинг,

@Jo King Действительно, я пропустил обсуждение в комментариях. Исправить это прямо сейчас.
Delfad0r

5

JavaScript (Node.js) , оценка 3, 53 46 байтов, оценка 2, 51 50 байтов

-7 байт спасибо @Arnauld

+5 +4 пробела в обмен на -1 очко

a=> a.map($= p=n=>$=(p<=(p=n)?++ x:x=1)<$?$: x)&&$

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

Предполагается не пустой ввод. 61 байт, если пустой список должен быть обработан. Оценка 2 еще.

a=> a.map($= p=n=>$=(p<=(p=n)?++ x:x=1)<$?$: x)&& a.length&&$

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

... или 58, если возвращение falseразрешено. Оценка 2 еще.

a=> a.map($= p=n=>$=(p<=(p=n)?++ x:x=1)<$?$: x)&& a>[ ]&&$

Это должно работать для 46 байтов и того же результата.
Арно

1
@Arnauld добавил 5 пробелов к вашему предложению, так что теперь это оценка 2
Shieru Asakoto

4

Шелуха , 5 байт , оценка = 2

00000000: bc6d 4cdc 14                   ▲mLġ≥

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

Маловероятно, что Husk получит оценку ниже 2, потому что ġ1 имеет действительно высокий код и ему нужно что-то, чтобы получить максимум и длину. Можно было бы попытаться использовать несколько функций, но это \nбыло бы перед любыми вспомогательными функциями, которые имеют действительно низкую кодовую точку, поэтому что-нибудь после этого будет создавать увеличивающуюся последовательность байтов по крайней мере длиной 2.

1: кажется, что лучший способ использования операторов сравнения должен следовать различным функциям разделения, таким как ( span).

объяснение

▲mLġ≥  -- example input: [1,1,2,1,1,4,5,3,2,1,1]
   ġ≥  -- group elements by geq: [[1,1,2],[1,1,4,5],[3],[2],[1,1]]
 mL    -- map length: [3,4,1,1,2]
▲      -- maximum: 4

3

Сетчатка 0.8.2 , 40 байт, оценка 3

\d+
$*
(?<=(1+)),(?!\1)
¶
T`1`_
^O`
\G,?

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

\d+
$*

Преобразовать в одинарный.

(?<=(1+)),(?!\1)
¶

Сплит по убывающим парам.

T`1`_

Удалить цифры.

^O`

Сортировать запятые в обратном порядке. (Я обычно писал бы это как, O^но не могу сделать это здесь по очевидным причинам.)

\G,?

Подсчитайте самый длинный запятую и добавьте один, чтобы включить окончательное число.


3

Japt -h, 6 байт, оценка 2

Не думайте, что оценка 1 возможна. Должен работать со строками и массивами символов тоже.

ò>¹mÊn

Попробуйте - включенный контрольный пример - это коды решения.


объяснение

ò          :Partition after each integer
 >         :  That's greater than the integer that follows it
  ¹        :End partition
   m       :Map
    Ê      :  Length
     n     :Sort
           :Implicitly output last element

3

MATL , оценка 2, 13 байт

d0< ~Y'w)X>sQ

Ввод может быть:

  • Массив чисел.
  • Строка, заключенная в одинарные кавычки. Одинарные кавычки внутри строки экранируются путем дублирования.

MATL использует кодировку ASCII. Кодовые точки приведенного выше кода

100, 48, 60, 32, 126, 89, 39, 119, 41, 88, 62, 115, 81

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

объяснение

d     % Implicit input. Consecutive differences (of code points) 
0<    % Less than 0? Element-wise. Gives true or false
      % Space. This does nothing; but it breaks an increasing substring
~     % Negate
Y'    % Run-length encoding. Gives array of true/false and array of lengths
w     % Swap
)     % Index. This keeps only lenghts of runs of true values
X>    % Maximum. Gives empty array if input is empty
s     % Sum. This turns empty array into 0
Q     % Add 1. Implicit display


2

Желе , 8 байт , оценка 2

Вероятно, есть решение 1 балла как-то ...

IṠµṣ-ZL‘

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

Исходный код в виде списка байтовых значений:

[73, 205, 9, 223, 45, 90, 76, 252]

Как?

IṠµṣ-ZL‘ - Link: list of integers  e.g. [ 1, 1, 2, 1, 1, 4, 5, 3, 2, 1, 1]
I        - increments                    [ 0, 1,-1, 0, 3, 1,-2,-1,-1, 0]
 Ṡ       - sign                          [ 0, 1,-1, 0, 1, 1,-1,-1,-1, 0]
  µ      - start a new monadic chain (a low byte to stop score being 3)
    -    - literal minus one             -1
   ṣ     - split at                      [[0, 1], [0, 1, 1], [], [], [0]]
     Z   - transpose                     [[0, 0, 0], [1, 1], 1]
      L  - length                        3
       ‘ - increment                     4

2

Perl 6 , оценка 2, 46 байт

{my&g=1+*×*;+max 0,|[\[&g]] [ |@_] Z>=0,|@_ }

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

Обрабатывает пустой список. Оригинальный код был:

{my&g=1+*×*;+max 0,|[\[&g]] @_ Z>=0,|@_}

Таким образом, только 5 дополнительных байтов, чтобы уменьшить счет до 2.

Изменить: Ах, я выяснил, как удалить назначение , но тогда я не могу получить этот счет ниже 3 из-за )]]...

Объяснение:

{                                  }  # Anonymous code block
 my&g=     ;  # Assign to &g an anonymous Whatever lambda
      1+*×*   # That multiplies the two inputs together and adds 1
                            @_ Z  0,|@_   # Zip the list with itself off-set by one
                                >=        # And check if each is equal or larger than the previous
                                         # e.g. [5,7,7,1] => [1,1,1,0]
                    [\[&g]]  # Triangular reduce it by the function declared earlier
                          # This results in a list of the longest substring at each index
                          # e.g. [5,7,7,1] => [1,2,3,1]
            +max 0,|      # And return the max value from this list, returning 0 if empty

Так [[&(*+*)]]работает как [+]? Удивительно ...
nwellnhof

@nwellnhof Да, есть несколько предостережений, будто у вас не может быть пробелов ( вообще ), но вы даже можете использовать их с Zи X. Попробуйте онлайн!
Джо Кинг

1
Я собирался попробовать что-то вроде:{max 0,|.[[X..] ^$_ xx 2].map({+$_ if [<=] $_})}
Брэд Гилберт b2gills

1

05AB1E , оценка 3 (9 байт )

Œʒ¥dP}éθg

Скорее всего, может быть 2 балла как-то.

Кодовые точки байтов программы: [140,1,90,100,80,125,233,9,103](два подсписка длины 3: [1,90,100]и [80,125,233])

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

Объяснение:

Œ            # Sublists
 ʒ   }       # Filter by:
  ¥          #  Take the deltas
   d         #  Check for each whether the number is >= 0
    P        #  And check if it was truthy for all deltas
      é      # Then sort by length
       θ     # Take the last element
        g    # And take its length as result

1

Java (JDK) , оценка 3, 94 байта

a->{int m=0,p=0,x=0,i=0,n;while(i<a.length){n=a[i++];m=(p<=(p=n)?++x:(x=1)) <m?m:x;}return m;}

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

Порт моего (с предложениями от Арнаулда) JS ответа. etuв returnи hilв whileделают невозможным гольф забить 2.

for не может быть использован здесь, потому что:

  • ;for восходящий
  • forнельзя использовать в начале лямбда-тела (ограничения объема). Можно обернуть его, {}но, видимо, с помощью whileсохраненных байтов.

Я собирался предложить, возможно, использовать \uв некоторых местах, но тогда вы должны были 00следовать за цифрой, которая все равно 3 ...
ETHproductions

1

Powershell, оценка 3, 44 байта

($args|%{$i*=$_-ge$p;$p=$_;(++$i)}|sort)[-1]

Тестовый скрипт:

$f = {

(
    $args|%{        # for each integer from argument list
        $i*=$_-ge$p # -ge means >=.
                    # This statement multiplies the $i by the comparison result.
                    # A result of a logical operator is 0 or 1.
                    # So, we continue to count a current sequence or start to count a new sequence
        $p=$_       # let $p stores a 'previous integer'
        (++$i)      # increment and return incremented as length of a current sequence
    }|sort          # sort lengthes 
)[-1]               # take last one (maximum)

}

@(
    ,(4, 1,1,2,1,1,4,5,3,2,1,1)
) | % {
    $e,$a = $_
    $r = &$f @a
    "$($r-eq$e): $r"
}

Выход:

True: 4

Объяснение:

  • Скрипт принимает целые числа в качестве списка аргументов ( spaltting ).
  • Каждое целое число отображается функцией с длиной до contiguous sub-list that is increasing (not strictly). Затем сценарий сортирует длину и берет последний (максимум) (...|sort)[-1].

Powershell 6, оценка 3, 43 байта

$args|%{$i*=$_-ge$p;$p=$_;(++$i)}|sort -b 1

То же, что и выше. Одно отличие: sort -b 1это сокращение для sort -Bottom 1и означает 1 элемент от конца отсортированного массива . Поэтому нам не нужен индекс [-1].



1

Python 2 , оценка 5, 87 байт, оценка 2, 101 93 92 101 байт

lambda a,m=1,o=[1]:max(reduce(lambda B,c:[B[:-m]+[B[-m]+m],B+o][c[0]>c[m]],zip(a,a[m:]), o)) *(a>[ ])

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

По электронной почте Ой! Думал, что это был код-гольф впервые ...



2
Сделайте отступ для вкладок, чтобы получить 4 балла.
mypetlion

@mypetition: D'oh! Думал, что это был код гольф ... редактирование моего ответа сейчас.
Час Браун

Забавно, что удаление m=1,o=[1]части не приводит к экономии байтов, как только мы уменьшаем счет
Джо Кинг,

@ Джо Кинг: Смешок! Я продолжал надеяться, что, извиваясь таким образом, я смогу отколоть другой байт; но нет такой удачи!
Час Браун


0

Wolfram Language (Mathematica) , оценка 3, 45 байт

Max[Length/@SequenceCases[#,x_/;OrderedQ@x]]&

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

SequenceCasesи OrderedQсами по себе дают оценку 3, поэтому оценка не может быть улучшена без существенного изменения подхода.


Правильный способ использования шаблонов должен был бы сделать нас Max[Length/@SequenceCases[#,_?OrderedQ]]&, но _?Orэто увеличивающаяся подпоследовательность длины 4. (Как есть _?AnyCamelCaseCommand.)
Миша Лавров

0

Java (JDK), 126 байт, оценка 6

Golfed

private static int l(byte[] o){int m=0;int c=1;int p=0;for(byte i:o){if(m<c){m=c;}if(i>=p){p= i;c++;}else{c=1;p=0;}}return m;}

Ungolfed

private static int longest(byte[] input) {
    int maxc = 0;
    int consec = 1;
    int prev = 0;
    for (byte i : input) {
        if (maxc < consec) {
            maxc = consec;
        }
        if (i >= prev) {
            prev = i;
            consec++;
        }
        else {
            consec = 1;
            prev = 0;
        }
    }
    return maxc;
}

вход

[112, 114, 105, 118, 97, 116, 101, 32, 115, 116, 97, 116, 105, 99, 32, 105, 110, 116, 32, 108, 40, 98, 121, 116, 101, 91, 93, 32, 111, 41, 123, 105, 110, 116, 32, 109, 61, 48, 59, 105, 110, 116, 32, 99, 61, 49, 59, 105, 110, 116, 32, 112, 61, 48, 59, 102, 111, 114, 40, 98, 121, 116, 101, 32, 105, 58, 111, 41, 123, 105, 102, 40, 109, 60, 99, 41, 123, 109, 61, 99, 59, 125, 105, 102, 40, 105, 62, 61, 112, 41, 123, 112, 61, 32, 105, 59, 99, 43, 43, 59, 125, 101, 108, 115, 101, 123, 99, 61, 49, 59, 112, 61, 48, 59, 125, 125, 114, 101, 116, 117, 114, 110, 32, 109, 59, 125]

Не должно byteбыть int, так как byteбудет ограничено до 8 бит?
Джо Кинг

@ Шучу, я не совсем уверен, что ты имеешь в виду. Вы имеете в виду, что я должен изменить байтовый класс на int?
Джейден Ли

Да, поскольку входные данные представляют собой список целых чисел
Джо Кинг,

0

Котлин, оценка 6, 119 байт

 fun x(a : IntArray){var m=1;var k=0;var d=1;while(k<a.size-1){if(a[k]<=a[k+1])m++;else{if(d<m)d=m;m=1};k++};println(d)}

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

объяснение

  1. Шаг 1: Проверьте предыдущее значение до следующего значения
  2. Шаг 2: Если предыдущее значение меньше или равно, тогда добавьте плюс 1, продолжайте, пока условие выполнено
  3. Шаг 3: проверить предыдущий счет со следующим счетом, сохранить наибольшее количество в переменной d.

Хорошо, я получил это, я скоро отредактирую это.
Сайед Хамза Хасан

Пожалуйста, проверьте, я сделал функцию, в которой могут быть введены. Согласно моему примеру строки ответом будет [2,4,5,6,7,7,7]. Оценка - 7.
Сайед Хамза Хасан

Я обновил счет и ссылку, пожалуйста, проверьте.
Сайед Хамза Хасан

Хорошо, я дал обновленный.
Сайед Хамза Хасан


0

Котлин, оценка 4, 67 байт

{a:IntArray->var i=0;var p=0;a.map{if(it<p){i=0};p=it;(++i)}.max()}

Основная идея: преобразовать каждое целое число в длину непрерывных подпоследовательностей, которая увеличивается (не строго). Вернуть максимум.

  • a.map{...} - для каждого целого числа в массиве сделать
  • if(it<p){i=0} - если текущее целое число меньше предыдущего, тогда сбросить счетчик
  • p=it - сохранить текущее целое число в предыдущем
  • (++i) - счетчик приращений и возвращаемое значение выражения
  • .max() - получить максимальную длину

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