가장 긴 부분 문자열


12

양의 정수 목록이 주어지면 증가하는 가장 긴 연속 하위 목록의 길이를 찾는 코드를 작성하십시오 (엄격하지는 않음). 각 요소가 마지막 요소보다 크거나 같은 가장 긴 하위 목록입니다.

예를 들어 입력이 다음과 같은 경우

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

가장 길게 증가하는 하위 목록은 [1,1,4,5] 이므로 4 출력 합니다.

답은 소스를 바이트 목록으로 가져온 다음 해당 목록에서 가장 긴 하위 목록의 길이를 찾아 점수를 매 깁니다. 낮은 점수가 목표입니다. 전체 바이트 수가 적은 프로그램에 유리하게 연결됩니다.


1 대신에 true를 반환해도 괜찮습니까? 빈 목록을 처리해야합니까?
Jo King

첫 번째 경우, 메타 합의가 숫자 출력에 관계없이 무엇이든 True대신 1할 수 는 있지만 기억하지 못할 수도 있습니다. 빈 목록을 처리 할 수 ​​있어야합니다 (출력은 물론 0입니다).
Ad Hoc Garf Hunter

2
제안 된 테스트 케이스 : [] => 0, [0] => 1, [3,2,1] => 1,[1,2,1,2] => 2

'점수'를 좀 더 자세히 설명해 주시겠습니까?
ouflak

1
@ouflak 나는 더 많은 점수가 있을지 모르겠습니다. 제출물을 바이트 목록으로 변환하고 자신의 프로그램을 통과하면 점수입니다. 점수가 같으면 타이 브레이커가 바이트 수
Jo King

답변:


6

Pyth , 점수 2 (8 바이트)

lefSIT.:

여기 사용해보십시오!

코드 포인트 [108, 101, 102, 83, 73, 84, 46, 58]. 또 다른 더 짧은 솔루션은 leSI#.:3 점이지만 코드 포인트는 [108, 101, 83, 73, 35, 46, 58]입니다. 실제로는 1 점에 매우 가깝습니다. 비트를 재 배열하면 신경 .:쓰지 않아도 됩니다. 내장 된 하위 문자열은 재 배열 할 수 없으므로 프로그램에서 사용하는 경우 최저 점수는 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 바이트

  • Max Yekhlakov 덕분에 -2 바이트
  • nimi 덕분에 -1 바이트
  • 빈 목록을 처리하기 위해 +5 바이트
foldr1 max.g
g[]=[0]
g(x:y:z)|x>y=1: g(y:z)
g(_:y)|a:b<-g y=1+a:b

온라인으로 사용해보십시오! (자체 검증).

나는 Haskell로 2 점을 얻을 수있을 줄은 몰랐지만, 나는 여기 있습니다!

함수 g는 증가하는 모든 하위 문자열의 길이를 재귀 적으로 계산합니다. foldr1 max.g그 길이의 최대 값을 취하면 ( foldr1 max동등 maximum하지만 더 낮은 점수).


1
공백 1+a : b이 필요하지 않은 것 같으므로 62 바이트입니다.
Max Yekhlakov

@MaxYekhlakov 당신이 맞아요, 내가 어떻게 그리웠는지 모르겠어요.
Delfad0r

당신의 코드는 1빈리스트로 돌아갑니다.0
Jo King

@ 조 킹 실제로, 나는 의견에서 토론을 놓쳤다. 지금 고치세요.
Delfad0r

5

JavaScript (Node.js) , 점수 3, 53 46 바이트 점수 2, 51 50 바이트

@Arnauld 덕분에 -7 바이트

-1 점수 대신 +5 +4 자리

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&&$

온라인으로 사용해보십시오!

... 또는 반품 false이 허용되는 경우 58 . 여전히 2 점.

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

이것은 46 바이트와 동일한 점수에서 작동합니다.
Arnauld

1
@Arnauld는 귀하의 제안에 5 개의 공간을 추가하여 현재 점수 2를 획득하였습니다
Shieru Asakoto

4

껍질 , 5 바이트 , 점수 = 2

00000000: bc6d 4cdc 14                   ▲mLġ≥

온라인으로 사용해보십시오!

ġ1 은 코드 포인트가 높고 최대 길이를 얻기 전에 무언가가 필요하기 때문에 Husk에서 2보다 낮은 점수를 얻을 가능성은 없습니다 . 여러 함수를 사용하려고 시도했지만 \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

펄 6 , 점수 2, 46 바이트

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

온라인으로 사용해보십시오!

빈 목록을 처리합니다. 원래 코드는 다음과 같습니다.

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

따라서 점수를 2로 줄이려면 5 바이트 만 추가하십시오.

편집 : 아, 과제제거하는 방법을 알아 냈지만 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 그래, 거기에 당신이 (공백 할 수 없습니다와 같은 몇 가지주의의 전혀를 )하지만, 당신도 함께 사용할 수 있습니다 ZX. 온라인으로 사용해보십시오!
Jo King

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

자바 (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;}

온라인으로 사용해보십시오!

내 포트 (Arnauld의 제안 포함) JS 답변. etu에서 returnhil에서 while메이크업 것은 불가능 골프에 2 점.

for 다음과 같은 이유로 여기에서 사용할 수 없습니다 :

  • ;for 오름차순
  • for람다 본체의 시작 부분에는 사용할 수 없습니다 (범위 제한). 랩핑하는 것이 가능 {}하지만 분명히 whilesaves 바이트를 사용 합니다.

나는 \u몇몇 장소에서 사용을 제안 할 것이지만, 당신은 00어쨌든 3 인 숫자를 따라야
만합니다

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 ).
  • 각 정수는 함수로 legnth of에 매핑됩니다 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은 바로 가기 이며 정렬 된 배열의 끝에서 1 개의 요소를sort -Bottom 1 의미 합니다. 따라서 색인이 필요하지 않습니다 .[-1]



1

파이썬 2 , 점수 5, 87 바이트 점수 2, 101 93 92101 바이트

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! 이것이 코드 골프라고 생각했습니다 ... 지금 내 대답을 편집하십시오.
Chas Brown

점수를 줄이면 부품제거해m=1,o=[1] 도 바이트가 절약되지 않습니다.
Jo King

@ 조 왕 : Chuckle! 나는 그런 식으로 물음으로써 다른 바이트를 잘라낼 수 있기를 바랐다. 그러나 그런 행운은 없습니다!
Chas Brown


0

Wolfram Language (Mathematica) , 3, 45 바이트 점수

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

온라인으로 사용해보십시오!

SequenceCases그리고 OrderedQ점수가 크게 접근 방식을 변경하지 않고 개선 될 수 있도록 그 자체로, 3의 점수를 제공합니다.


사용 패턴에 대한 올바른 방법은 우리가 할 것이다 Max[Length/@SequenceCases[#,_?OrderedQ]]&, 그러나 _?Or(AS는 길이 4의 증가의 서브 _?AnyCamelCaseCommand.)
미샤 라브 로프

0

자바 (JDK), 126 바이트, 점수 6

골프

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;}

언 골프

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있기 때문에, byte8 비트에 제한 될 것입니다?
Jo King

@ JoKing 나는 당신이 무슨 뜻인지 정확히 모르겠습니다. 바이트 클래스를 int 클래스로 변경해야한다는 것을 의미합니까?
Jaden Lee

예, 입력은 정수 목록이므로
Jo King

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에서 가장 높은 카운트를 유지하십시오.

알았어요. 곧 편집하겠습니다.
Syed Hamza Hassan

입력을 할 수있는 기능을 만들었습니다. 내 샘플 문자열 답변에 따라 [2,4,5,6,7,7,7] 점수는 7입니다.
Syed Hamza Hassan

점수를 업데이트하고 링크를 확인하십시오.
Syed Hamza Hassan

좋아, 나는 업데이트했다.
Syed Hamza Hassan


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() -모든 길이를 최대한 활용

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.