最長増加部分文字列


12

正の整数のリストが与えられたら、増加している(厳密ではない)最長の連続したサブリストの長さを見つけるコードを記述します。これは、各要素が最後の要素以上であるような最長のサブリストです。

たとえば、入力が次の場合:

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

最長増加サブリストは次のようになり[1,1,4,5]あなたは出力だろうので、4

回答は、ソースをバイトのリストとして取得し、そのリストの最も長く増加しているサブリストの長さを見つけることによってスコアリングされます。より低いスコアが目標です。全体のバイト数が少ないプログラムを優先して、関係が壊れています。


1の代わりにtrueを返しても大丈夫ですか?空のリストを処理する必要がありますか?
ジョーキング

最初の1つについては、メタデータコンセンサスが数字の出力にどのようなものであっても、私がTrue代わりに1なったことを思い出しませんが、そうかもしれません。空のリストを処理できるはずです(出力はもちろん0です)。
ポストロックガーフハンター

2
推奨テストケース:[] => 0[0] => 1[3,2,1] => 1[1,2,1,2] => 2
ソック

「スコア」についてもう少し詳しく説明していただけますか?
ouflak

1
@ouflakスコアでこれ以上言うことがあるかわかりません。提出物をバイトのリストに変換し、独自のプログラムに渡すと、それがスコアになります。スコアが等しい場合、タイブレーカは:バイトである
チョキング

回答:


6

Pyth、スコア2(8バイト)

lefSIT.:

ここで試してみてください!

コードポイント[108, 101, 102, 83, 73, 84, 46, 58]。もう1つの短いソリューションである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

オンラインでお試しください!(それ自体を検証します)。

Haskellで2点を獲得できるとは思っていませんでしたが、ここにいます!

関数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

-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バイトと同じスコアで機能するはずです。
アーナルド

1
それは今、スコア2だよう@Arnauldはあなたの提案に5つのスペースを追加
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

Retina 0.8.2、40バイト、スコア3

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

オンラインでお試しください!リンクには、入力としてバイトコードとして自身が含まれます。説明:

\d+
$*

単項に変換します。

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

減少するペアで分割します。

T`1`_

数字を削除します。

^O`

コンマを逆順に並べ替えます。(私は通常、これを次のように書きO^ますが、明白な理由でここではできません。)

\G,?

最長のカンマ実行をカウントし、最後の数を含めるために1つ追加します。


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,|@_}

したがって、スコアを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うん、そこにあなたのようないくつかの注意事項は、(任意の空白を持つことができないのですすべてで)、しかし、あなたもでそれを使用することができます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]およびの2つのサブリスト[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;}

オンラインでお試しください!

私のポート(Arnauldからの提案を含む)JS回答。etureturnhilwhileメイクそれが不可能ゴルフに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

同上。違いの1つsort -b 1、ソートされた配列の末尾から1つの要素へのショートカットでsort -Bottom 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言語(Mathematica)、スコア3,45バイト

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

オンラインでお試しください!

SequenceCasesそしてOrderedQ、それ自体でスコア3を与えるため、アプローチを大幅に変更せずにスコアを改善することはできません。


使用パターンへの正しい方法は、私たちが行う必要がありますMax[Length/@SequenceCases[#,_?OrderedQ]]&が、_?Or長さ4の増加部分列(ASがあるである_?AnyCamelCaseCommand。)
ミーシャラブロフ

0

Java(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]

8ビットに制限さbyteれるためint、であってbyteはなりませんか?
ジョーキング

@JoKing私はあなたが何を意味するのか正確にはわかりません。バイトクラスをintクラスに変更する必要があるということですか?
ジェイデンリー

はい、入力は整数のリストであるため
ジョーキング

0

Kotlin、スコア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:前の値が以下である場合、条件がtrueの間、プラス1を続ける
  3. ステップ3:前のカウントを次のカウントで確認し、変数dに最高のカウントを保持します。

わかりました、すぐに編集します。
サイードハムザハッサン

確認してください、私は入力を与えることができる機能を作りました。私のサンプル列あたりのような答えは次のようになります[2,4,5,6,7,7,7]スコアは7です
サイードハムザ・ハッサン

スコアとリンクを更新しましたので確認してください。
サイードハムザハッサン

OK、更新しました。
サイードハムザハッサン


0

Kotlin、スコア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.