En Uzun Artan Substring


12

Pozitif tamsayıların bir listesi verildiğinde, artmakta olan (kesin olarak değil) en uzun bitişik alt listenin uzunluğunu bulan kodu yazın. Bu, her öğenin sonuncudan daha büyük veya ona eşit olduğu en uzun alt listedir.

Örneğin, giriş şuysa:

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

En uzun artan alt liste [1,1,4,5] , böylece 4 çıktısı alırsınız .

Yanıtınız kaynağını bayt listesi olarak alarak ve ardından bu listenin en uzun süre artan alt listesinin uzunluğunu bularak puanlanacaktır. Daha düşük bir puan hedeftir. Bağları, daha az toplam bayt içeren programlar lehine kesilir.


1 yerine true değerine dönmek uygun mudur? Ve boş bir listeyi işlemek zorunda mıyız?
Jo King

Birincisi için, sayısal çıktıda meta konsensüs ne olursa olsun, Truebunun yerine bir şey olduğunu hatırlamıyorum 1ama olabilir. Boş listeyi işleyebilmeniz gerekir (Çıktı elbette 0'dır).
Ad Hoc Garf Hunter

2
Önerilen test durumları: [] => 0, [0] => 1, [3,2,1] => 1,[1,2,1,2] => 2
Sok

'Puan' üzerinde biraz daha ayrıntılı düşünür müsünüz?
ouflak

1
@ouflak Skorda daha ne söyleneceğinden emin değilim. Gönderinizi bir bayt listesine dönüştürün ve kendi programınızdan geçirin ve bu sizin puanınız. Skorlar eşitse, kravat kırıcı bayttır
Jo King

Yanıtlar:


6

Pyth , skor 2 (8 bayt)

lefSIT.:

Burada deneyin!

Kod noktaları [108, 101, 102, 83, 73, 84, 46, 58]. Başka bir kısa çözüm, leSI#.:puanlar 3, ancak kod noktaları [108, 101, 83, 73, 35, 46, 58], aslında 1 puana çok yakın. Biraz yeniden düzenlemek Nevermind'e yardımcı olabilir , yerleşik alt dizeler .:yeniden düzenlenemez, bu nedenle program bunu kullanıyorsa en düşük puan 2 olmalıdır.

Nasıl?

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 , skor 2, 66 64 61 60 65 bayt

  • Max Yekhlakov sayesinde -2 bayt
  • Nimi sayesinde -1 bayt
  • Boş listeyi işlemek için +5 bayt
foldr1 max.g
g[]=[0]
g(x:y:z)|x>y=1: g(y:z)
g(_:y)|a:b<-g y=1+a:b

Çevrimiçi deneyin! (kendini doğrular).

Haskell ile 2 puan alabileceğimi hiç düşünmemiştim ama yine de buradayım!

İşlev g, artan tüm alt dizelerin uzunluklarını özyineli olarak hesaplar. foldr1 max.gbu uzunlukların maksimumunu alır ( foldr1 maxeşdeğer maximum, ancak daha düşük bir puanla).


1
Beyaz boşluk 1+a : bgerekli değil gibi görünüyor , bu yüzden bu 62 bayt.
Max Yekhlakov

@MaxYekhlakov Haklısın, bunu nasıl özlediğimi bilmiyorum.
Delfad0r

Kodunuz 1boş liste için geri döner , burada dönmesi gerekir0
Jo King

@Jo King Gerçekten, yorumlarda tartışmayı kaçırmıştım. Bunu şimdi düzeltiyorum.
Delfad0r

5

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

-7 bayt teşekkürler @Arnauld

-1 puan karşılığında +5 +4 boşluk

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

Çevrimiçi deneyin!

Boş olmayan giriş olduğunu varsayar. Boş listenin işlenmesi gerekiyorsa 61 bayt. Hala 2 puan.

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

Çevrimiçi deneyin!

... veya geri dönüşe falseizin veriliyorsa 58 . Hala 2 puan.

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

Bu 46 bayt ve aynı skor için çalışmalıdır.
Arnauld

1
@Arnauld, önerinize 5 boşluk ekledi, böylece artık bir skor 2
Shieru Asakoto

4

Kabuk , 5 bayt , puan = 2

00000000: bc6d 4cdc 14                   ▲mLġ≥

Çevrimiçi deneyin!

Husk ile 2'den daha düşük bir puan elde etmek pek mümkün değildir, çünkü ġ1 gerçekten yüksek bir kod noktasına sahiptir ve maksimum ve uzunluğu elde etmek için ondan önce bir şey olması gerekir. Birden fazla işlevi kullanmaya çalışmakla bir girişimde bulunulmuş olabilir, ancak \ngerçekten düşük bir kod noktasına sahip herhangi bir yardımcı işlevden önce olurdu, böylece herhangi bir şey en az 2 uzunluğunda artan bir bayt dizisi oluşturacaktır.

1: Bu karşılaştırma operatörleri için ( span) gibi çeşitli bölünmüş fonksiyonları takip etmek gerekir kullanmanın en iyi yolu gibi görünüyor .

açıklama

▲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 bayt, puan 3

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

Çevrimiçi deneyin! Bağlantı kendisini girdi olarak bayt kodları olarak içerir. Açıklama:

\d+
$*

Tekli'ye dönüştür.

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

Azalan çiftler üzerinde bölün.

T`1`_

Rakamları silin.

^O`

Virgülleri ters sırada sıralayın. (Normalde bunu şöyle yazardım O^ama burada bariz nedenlerle yapamam.)

\G,?

En uzun virgül çalışmasını sayın ve son sayıyı eklemek için bir tane ekleyin.


3

Japt -h, 6 bayt, skor 2

Do not düşünüyorum 1'lik bir skor mümkündür. Dizeler ve karakter dizileri ile de çalışmalıdır.

ò>¹mÊn

Deneyin - dahil test çantası çözümün kodlarıdır.


açıklama

ò          :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 , skor 2, 13 bayt

d0< ~Y'w)X>sQ

Giriş olabilir:

  • Bir sayı dizisi.
  • Tek tırnak içine alınmış bir dize. Dize içindeki tek tırnak işaretleri çoğaltılarak çıkarılır.

MATL ASCII kodlamasını kullanır. Yukarıdaki kodun kod noktaları

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

Çevrimiçi deneyin!

açıklama

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

3

Pascal (FPC) , skor 2

111 bayt

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.

Çevrimiçi deneyin!

Boş olmayan giriş olduğunu varsayar. Sayılar, boşluklarla ayrılmış standart girdiden alınır.


2

Jelly , 8 bayt , skor 2

Muhtemelen bir şekilde bir skor 1 çözümü var ...

IṠµṣ-ZL‘

Çevrimiçi deneyin!

Bayt değerlerinin listesi olarak kaynak kodu:

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

Nasıl?

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 , skor 2, 46 bayt

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

Çevrimiçi deneyin!

Boş listeyi işler. Orijinal kod:

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

Yani skoru 2'ye düşürmek için sadece 5 ekstra bayt.

Düzenleme: Ah, ödevi nasıl kaldıracağımı anladım , ama sonra 3'ün altında bu puanı alamıyorum çünkü )]]...

Açıklama:

{                                  }  # 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

Yani [[&(*+*)]]böyle [+]mi çalışıyor ? İnanılmaz ...
nwellnhof

@nwellnhof Evet, herhangi bir boşluğa sahip olamayacağınız gibi birkaç uyarı var ( hiç ), Zve hatta ve ile de kullanabilirsiniz X. Çevrimiçi deneyin!
Jo King

1
Ben şöyle bir şey deneyecektim:{max 0,|.[[X..] ^$_ xx 2].map({+$_ if [<=] $_})}
Brad Gilbert b2gills

1

05AB1E , skor 3 (9 bayt )

Œʒ¥dP}éθg

Büyük olasılıkla bir şekilde 2 puanı olabilir.

Program baytlarının kod noktaları: [140,1,90,100,80,125,233,9,103](uzunluk 3'ün iki alt listesi: [1,90,100]ve [80,125,233])

Çevrimiçi deneyin.

Açıklama:

Œ            # 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) , skor 3, 94 bayt

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

Çevrimiçi deneyin!

Bağlantı noktası benim (Arnauld önerileri ile) JS cevap. etuin returnve hilin whilegolf 2 puan yapmak imkansız hale getirmek.

for burada kullanılamaz çünkü:

  • ;for yükseliyor
  • forlambda gövdesinin başında kullanılamaz (kapsam kısıtlamaları). Kaydetmek mümkündür {}ama görünüşe göre whiletasarruf bayt kullanarak .

Muhtemelen \ubazı yerlerde kullanmayı önerecektim , ama sonra 00yine de 3 olan bir rakam
izlemelisin

1

Powershell, skor 3, 44 bayt

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

Test komut dosyası:

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

Çıktı:

True: 4

Açıklama:

  • Betik tam sayıları argüman listesi ( spaltting ) olarak alır .
  • Her tamsayı legnth işleviyle eşler contiguous sub-list that is increasing (not strictly). Sonra senaryo uzunlukları sıralar ve son (maksimum) değer alır (...|sort)[-1].

Powershell 6, skor 3, 43 bayt

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

Yukarıdaki gibi. Bir fark: sort -b 1kısayoludur sort -Bottom 1ve sıralı dizinin sonundaki 1 öğe anlamına gelir . Yani bir endekse ihtiyacımız yok [-1].



1

Python 2 , 87 bayt, 5 puan , skor 2 101 93 92 101 bayt

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

Çevrimiçi deneyin!

Posta ile gönder Bu kod-golf ilk kez düşündüm ...



2
4 puan almak için sekmeleri girinti
mypetlion

@ mypetition: D'oh! Bu kod golf olduğunu düşündüm ... şimdi cevabımı düzenliyor.
Chas Brown

Puanı m=1,o=[1]
Jo King

@ Kral: Chuckle! Bu şekilde kıvrılarak başka bir bayt parçalayabileceğimi umdum; ama böyle bir şans yok!
Chas Brown


0

Wolfram Dili (Mathematica) , skor 3, 45 bayt

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

Çevrimiçi deneyin!

SequenceCasesve OrderedQkendi başına 3 puan verir, bu nedenle yaklaşım önemli ölçüde değiştirilmeden puan artırılamaz.


Desenleri kullanmanın doğru yolu bize yapar Max[Length/@SequenceCases[#,_?OrderedQ]]&, ancak _?Oruzunluk 4'ün artan bir alt _?AnyCamelCaseCommand
Misha Lavrov

0

Java (JDK), 126 bayt, Puan 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;
}

Giriş

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

Olmamalı byteolmak intberi byte8 bit ile sınırlı olacaktır?
Jo King

@JoKing Ne demek istediğinden tam olarak emin değilim. Yani bayt sınıfını int sınıfına değiştirmem gerekir mi?
Jaden Lee

Evet, girdi bir tamsayılar listesi olduğundan
Jo King

0

Kotlin, Puan 6, 119 bayt

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

Çevrimiçi Deneyin

açıklama

  1. Adım 1: Önceki değeri sonraki değere kontrol etme
  2. Adım 2: Önceki değer daha az veya eşitse, koşul doğruyken artı 1 ekleyin
  3. Adım 3: Bir sonraki sayım ile önceki sayımı kontrol edin, d değişkeninde en yüksek sayıyı koruyun.

Tamam, anladım, kısa süre içinde düzenleyeceğim.
Syed Hamza Hassan

Lütfen kontrol edin, girdi verilebilecek bir işlev yaptım. Örnek dize cevabım gereği [2,4,5,6,7,7,7] olacaktır. Puan 7'dir.
Syed Hamza Hassan

Güncelleme puanı ve bağlantı lütfen kontrol edin.
Syed Hamza Hassan

Tamam, güncellenmiş verdim.
Syed Hamza Hassan


0

Kotlin, Puan 4, 67 bayt

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

Ana fikir şudur: Her tamsayıyı artan (kesin olarak değil) bitişik alt dizilerin uzunluğuna dönüştürün. Maksimum dönüş.

  • a.map{...} - dizideki her tamsayı için
  • if(it<p){i=0} - geçerli tamsayı bir önceki tamsayıdan küçükse sayacı sıfırla
  • p=it - geçerli tamsayıyı önceki
  • (++i) - ifadenin artış sayacı ve dönüş değeri
  • .max() - tüm uzunluklardan en üst düzeye çıkın

0

Ruby , 64 bayt

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

Çevrimiçi deneyin!


1
Bunun kod golf olmadığını unutmayın . Şu anki puanınız 6. Ayrıca, kodunuz boş listeyi işlemez (çıktının olması gereken yerde 0)
Jo King
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.