Substring Peningkatan Terpanjang

12

Diberikan daftar bilangan bulat positif, tulis kode yang menemukan panjang sub-daftar bersebelahan terpanjang yang meningkat (tidak ketat). Itu adalah sublist terpanjang sehingga setiap elemen lebih besar atau sama dengan yang terakhir.

Misalnya jika inputnya adalah:

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

Sub-daftar yang paling lama bertambah adalah , jadi Anda akan menghasilkan .[1,1,4,5]4

Jawaban Anda akan dinilai dengan mengambil sumbernya sebagai daftar byte dan kemudian menemukan panjang sub-daftar terpanjang yang meningkat dari daftar itu. Skor yang lebih rendah adalah tujuannya. Ikatan rusak demi program dengan byte keseluruhan lebih sedikit.

Ad Hoc Garf Hunter
sumber
Apakah saya tetap bisa mengembalikan benar, bukan 1? Dan apakah kita harus menangani daftar kosong?
Jo King
Untuk yang pertama Anda, apa pun konsensus meta pada hasil angka yang dapat Anda lakukan, saya tidak ingat Truemenjadi pengganti 1tetapi mungkin demikian. Anda harus dapat menangani daftar kosong (Output tentu saja 0).
Ad Hoc Garf Hunter
2
Disarankan kasus uji: [] => 0, [0] => 1, [3,2,1] => 1,[1,2,1,2] => 2
Sok
Maukah Anda mengelaborasi 'skor' sedikit lebih banyak?
ouflak
1
@ouflak Saya tidak yakin apa lagi yang bisa dikatakan tentang skor. Konversikan kiriman Anda ke daftar byte dan sampaikan melalui program Anda sendiri dan itulah skor Anda. Jika skornya sama, tie-breaker adalah bytecount
Jo King

Jawaban:

6

Pyth , skor 2 (8 byte)

lefSIT.:

Coba di sini!

Poin kode [108, 101, 102, 83, 73, 84, 46, 58]. Solusi lain yang lebih pendek, leSI#.:skor 3, tetapi poin kode-nya adalah [108, 101, 83, 73, 35, 46, 58], yang sangat dekat dengan skor 1, sebenarnya. Mengatur ulang sedikit dapat membantu Nevermind, substring bawaan adalah .:yang tidak dapat diatur ulang, sehingga skor terendah harus 2 jika program memanfaatkannya.

Bagaimana?

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.
Tuan Xcoder
sumber
5

Haskell , skor 2, 66 64 61 60 65 byte

  • -2 byte terima kasih kepada Max Yekhlakov
  • -1 byte terima kasih kepada nimi
  • +5 byte untuk menangani daftar kosong
foldr1 max.g
g[]=[0]
g(x:y:z)|x>y=1: g(y:z)
g(_:y)|a:b<-g y=1+a:b

Cobalah online! (memverifikasi sendiri).

Saya tidak pernah berpikir saya bisa mendapatkan skor 2 dengan Haskell, namun di sinilah saya!

Fungsi gmenghitung panjang semua substring yang meningkat secara rekursif. foldr1 max.gmengambil maksimum dari panjang tersebut ( foldr1 maxsetara dengan maximum, tetapi dengan skor yang lebih rendah).

Delfad0r
sumber
1
Sepertinya spasi putih 1+a : btidak diperlukan, jadi ini adalah 62 byte.
Max Yekhlakov
@ Maxyekhlakov Anda benar, saya tidak tahu bagaimana saya melewatkan itu.
Delfad0r
Kode Anda kembali 1untuk daftar kosong, di mana ia harus kembali0
Jo King
@ Jo King Memang, saya telah melewatkan diskusi di komentar. Memperbaiki itu sekarang.
Delfad0r
5

JavaScript (Node.js) , skor 3, 53 46 byte skor 2, 51 50 byte

-7 byte terima kasih @Arnauld

+5 +4 spasi sebagai ganti skor -1

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

Cobalah online!

Mengasumsikan input tidak kosong. 61 byte jika daftar kosong harus ditangani. Skor 2 masih.

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

Cobalah online!

... atau 58 jika pengembalian falsediperbolehkan. Skor 2 masih.

a=> a.map($= p=n=>$=(p<=(p=n)?++ x:x=1)<$?$: x)&& a>[ ]&&$
Shieru Asakoto
sumber
Ini harus bekerja untuk 46 byte dan skor yang sama.
Arnauld
1
@Arnauld menambahkan 5 spasi ke saran Anda sehingga skor sekarang menjadi 2
Shieru Asakoto
4

Sekam , 5 byte , skor = 2

00000000: bc6d 4cdc 14                   ▲mLġ≥

Cobalah online!

Tidak mungkin untuk mendapatkan skor lebih rendah dari 2 dengan Husk karena ġ1 memiliki codepoint yang sangat tinggi dan perlu ada sesuatu sebelum itu untuk mendapatkan maksimum dan panjangnya. Suatu usaha dapat dilakukan dengan mencoba menggunakan beberapa fungsi tetapi \nakan ada sebelum fungsi pembantu yang memiliki titik kod sangat rendah sehingga apa pun setelah itu akan membuat urutan byte meningkat setidaknya panjang 2.

1: Ini sepertinya cara terbaik untuk digunakan karena operator perbandingan harus mengikuti berbagai fungsi pemisahan seperti ( span).

Penjelasan

▲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
ბიმო
sumber
3

Retina 0.8.2 , 40 byte, skor 3

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

Cobalah online! Tautan menyertakan dirinya sebagai kode byte sebagai input. Penjelasan:

\d+
$*

Konversikan ke unary.

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

Berpisah pada pasangan yang menurun.

T`1`_

Hapus digit.

^O`

Urutkan koma dalam urutan terbalik. (Saya biasanya menulis ini O^tetapi tidak dapat melakukannya di sini karena alasan yang jelas.)

\G,?

Hitung jangka koma terpanjang, dan tambahkan satu untuk memasukkan angka terakhir.

Neil
sumber
3

Japt -h, 6 byte, skor 2

Jangan berpikir skor 1 adalah mungkin. Harus bekerja dengan array string & karakter juga.

ò>¹mÊn

Cobalah - termasuk test case adalah kode dari solusi.


Penjelasan

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

MATL , skor 2, 13 byte

d0< ~Y'w)X>sQ

Input dapat berupa:

  • Array angka.
  • Sebuah string tertutup dengan tanda kutip tunggal. Kutipan tunggal dalam string diloloskan dengan duplikasi.

MATL menggunakan pengkodean ASCII. Codepoint dari kode di atas adalah

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

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
3

Pascal (FPC) , skor 2

111 byte

var a,b,c,t:bYte;bEgIn repeat read(a); iNc(c); if a<b then c:=1; if c>t then t:= c;b:= a;until eOf;write(t)eNd.

Cobalah online!

Mengasumsikan input tidak kosong. Angka diambil dari input standar yang dipisahkan oleh spasi.

AlexRacer
sumber
2

Jelly , 8 byte , skor 2

Mungkin ada solusi skor 1 entah bagaimana ...

IṠµṣ-ZL‘

Cobalah online!

Kode sumber sebagai daftar nilai byte:

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

Bagaimana?

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
Jonathan Allan
sumber
2

Perl 6 , skor 2, 46 byte

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

Cobalah online!

Menangani daftar kosong. Kode aslinya adalah:

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

Jadi hanya 5 byte tambahan untuk mengurangi skor menjadi 2.

Sunting: Ah, saya tahu cara menghapus tugas , tapi kemudian saya tidak bisa mendapatkan skor di bawah 3 karena )]]...

Penjelasan:

{                                  }  # 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
Jo King
sumber
Jadi [[&(*+*)]]bekerja seperti apa [+]? Luar biasa ...
nwellnhof
@nwellnhof Ya, ada beberapa peringatan seperti Anda tidak dapat memiliki spasi ( sama sekali ), tetapi Anda bahkan dapat menggunakannya dengan Zdan X. Cobalah online!
Jo King
1
Saya akan mencoba sesuatu seperti:{max 0,|.[[X..] ^$_ xx 2].map({+$_ if [<=] $_})}
Brad Gilbert b2gills
1

05AB1E , skor 3 (9 byte )

Œʒ¥dP}éθg

Kemungkinan besar bisa menjadi skor 2 entah bagaimana.

Poin kode dari byte-program: [140,1,90,100,80,125,233,9,103](dua sublist dengan panjang 3: [1,90,100]dan [80,125,233])

Cobalah online.

Penjelasan:

Œ            # 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
Kevin Cruijssen
sumber
1

Java (JDK) , skor 3, 94 byte

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

Cobalah online!

Port saya (dengan saran dari Arnauld) jawaban JS. etudi returndan hildi whilemembuatnya mustahil untuk golf untuk mencetak 2.

for tidak dapat digunakan di sini karena:

  • ;for sedang naik
  • fortidak dapat digunakan di awal badan lambda (batasan ruang lingkup). Dimungkinkan untuk membungkusnya dengan {}tetapi tampaknya menggunakan whilebyte menghemat.
Shieru Asakoto
sumber
Saya akan menyarankan kemungkinan menggunakan \udi beberapa tempat, tetapi kemudian Anda harus 00diikuti oleh digit yang adalah 3 tetap ...
ETHproduksi
1

Powershell, skor 3, 44 byte

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

Skrip uji:

$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"
}

Keluaran:

True: 4

Penjelasan:

  • Script mengambil bilangan bulat sebagai daftar argumen ( spaltting ).
  • Setiap integer memetakan berdasarkan fungsi sampai dengan contiguous sub-list that is increasing (not strictly). Kemudian skrip memilah panjang dan mengambil yang terakhir (maksimum) (...|sort)[-1].

Powershell 6, skor 3, 43 byte

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

Sama seperti di atas. Satu perbedaan: sort -b 1adalah pintasan untuk sort -Bottom 1dan berarti 1 elemen dari akhir array yang diurutkan . Jadi kita tidak perlu indeks [-1].

mazzy
sumber
1

Python 2 , skor 5 , skor 87 byte 2, 101 93 92 101 byte

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>[ ])

Cobalah online!

Ups! Kupikir ini adalah golf kode pertama kali melalui ...

Chas Brown
sumber
2
Nilai 5. Coba online!
mypetlion
2
Indentasi dengan tab untuk mendapatkan skor 4.
mypetlion
@ kompetisi: Doh! Kupikir ini kode golf ... mengedit jawaban saya sekarang.
Chas Brown
Lucu bahwa menghapus m=1,o=[1]bagian tidak berakhir menghemat byte setelah kami mengurangi skor
Jo King
@ Jo King: Terkekeh! Saya terus berharap bahwa dengan menggeliat-geliat dengan cara itu, saya bisa memotong byte lain; tapi tidak beruntung!
Chas Brown
1

Dyalog APL , skor 2, 20 byte

{⍵≡⍬:0⋄⌈/≢¨⍵⊂⍨1,2>/⍵}

Cobalah online!

Zacharý
sumber
0

Bahasa Wolfram (Mathematica) , skor 3, 45 byte

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

Cobalah online!

SequenceCasesdan OrderedQdengan sendirinya memberikan skor 3, sehingga skor tidak dapat ditingkatkan tanpa mengubah pendekatan secara signifikan.

Misha Lavrov
sumber
Cara yang benar untuk menggunakan pola akan kita lakukan Max[Length/@SequenceCases[#,_?OrderedQ]]&, tetapi _?Ormerupakan peningkatan selanjutnya dari panjang 4. (Seperti apa adanya _?AnyCamelCaseCommand)
Misha Lavrov
0

Java (JDK), 126 byte, Skor 6

Golf

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

Tidak disatukan

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

Memasukkan

[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]
Jaden Lee
sumber
Seharusnya tidak bytemenjadi int, karena byteakan dibatasi untuk 8 bit?
Jo King
@JoKing Saya tidak yakin apa yang Anda maksud. Apakah maksud Anda bahwa saya harus mengubah kelas byte ke kelas int?
Jaden Lee
Ya, karena inputnya adalah daftar bilangan bulat
Jo King
0

Kotlin, Skor 6, 119 byte

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

Coba Online

Penjelasan

  1. Langkah 1: Periksa nilai sebelumnya ke nilai selanjutnya
  2. Langkah 2: Jika nilai sebelumnya kurang atau sama maka tambahkan tambah 1 terus lakukan sementara kondisinya benar
  3. Langkah 3: periksa jumlah sebelumnya dengan jumlah berikutnya, pertahankan jumlah tertinggi dalam variabel d.
Syed Hamza Hassan
sumber
Ok, saya mengerti, saya akan segera mengeditnya.
Syed Hamza Hassan
Silakan periksa, saya telah membuat fungsi di mana input dapat diberikan. Sesuai sampel saya, jawaban string adalah [2,4,5,6,7,7,7] Skor adalah 7.
Syed Hamza Hassan
Saya telah memperbarui skor dan tautan, harap periksa.
Syed Hamza Hassan
Ok, saya berikan diperbarui.
Syed Hamza Hassan
0

Kotlin, Skor 4, 67 byte

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

Gagasan utama adalah: Transformasikan setiap bilangan bulat ke panjang sub-urutan yang berdekatan yang meningkat (tidak ketat). Pengembalian maksimum.

  • a.map{...} - untuk setiap integer dalam array lakukan
  • if(it<p){i=0} - jika integer saat ini kurang dari integer sebelumnya, maka reset counter
  • p=it - Menyimpan integer saat ini di sebelumnya
  • (++i) - increment counter dan mengembalikan nilai ekspresi
  • .max() - dapatkan maksim panjang lebar
mazzy
sumber
0

Ruby , 64 byte

->e{e.size.downto(1).find{|l|e.each_cons(l).find{|c|c==c.sort}}}

Cobalah online!

Idva
sumber
1
Perhatikan bahwa ini bukan kode-golf . Skor Anda saat ini adalah 6. Juga, kode Anda tidak menangani daftar kosong (di mana output seharusnya 0)
Jo King