Najdłuższe zwiększenie podciągów

12

Biorąc pod uwagę listę dodatnich liczb całkowitych, napisz kod, który znajduje długość najdłuższej ciągłej podlisty, która rośnie (nie ściśle). Jest to najdłuższa podlista, tak że każdy element jest większy lub równy ostatniemu.

Na przykład, jeśli dane wejściowe to:

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

Najdłużej rosnąca lista podrzędna to [1,1,4,5] , więc wypiszesz 4 .

Twoja odpowiedź zostanie oceniona, biorąc jej źródło jako listę bajtów, a następnie znajdując długość najdłużej rosnącej podlisty tej listy. Niższy wynik to gol. Więzi są zrywane na korzyść programów o mniejszej liczbie bajtów ogólnych.

Ad Hoc Garf Hunter
źródło
Czy w porządku jest zwrócenie wartości true zamiast 1? I czy musimy obsłużyć pustą listę?
Jo King,
Po pierwsze, bez względu na to, jaki meta konsensus dotyczy liczbowych danych wyjściowych, jakie możesz zrobić, nie przypominam sobie, aby Truebyć substytutem, 1ale może być. Powinieneś być w stanie obsłużyć pustą listę (Wyjście to oczywiście 0).
Ad Hoc Garf Hunter,
2
Sugerowane przypadki testowe: [] => 0, [0] => 1, [3,2,1] => 1,[1,2,1,2] => 2
Sok
Czy mógłbyś bardziej szczegółowo opracować „partyturę”?
ouflak
1
@ouflak Nie jestem pewien, co więcej można powiedzieć na temat wyniku. Przekształć swoje zgłoszenie w listę bajtów i przekaż je przez własny program, a to twój wynik. Jeśli wyniki są równe, rozstrzygającym jest bajt
Jo King

Odpowiedzi:

6

Pyth , wynik 2 (8 bajtów)

lefSIT.:

Wypróbuj tutaj!

Punkty kodowe [108, 101, 102, 83, 73, 84, 46, 58]. Inne krótsze rozwiązanie, leSI#.:wyniki 3, ale jego punkty kodowe są [108, 101, 83, 73, 35, 46, 58], które są bardzo zbliżone do wyniku 1. Trochę przegrupowania może pomóc Nevermind, wbudowane podciągi .:nie mogą być przestawione, więc najniższy wynik musi wynosić 2, jeśli program z niego korzysta.

W jaki sposób?

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.
Pan Xcoder
źródło
5

Haskell , wynik 2, 66 64 61 60 65 bajtów

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

Wypróbuj online! (weryfikuje się).

Nigdy nie myślałem, że mogę uzyskać wynik 2 z Haskellem, a jednak oto jestem!

Funkcja goblicza rekurencyjnie długości wszystkich rosnących podciągów. foldr1 max.gprzyjmuje maksimum tych długości ( foldr1 maxjest równoważne maximum, ale z niższym wynikiem).

Delfad0r
źródło
1
Wygląda na to, że białe znaki w 1+a : bnie są konieczne, więc jest to 62 bajty.
Max Yekhlakov
@ MaxYekhlakov Masz rację, nie wiem, jak mi tego brakowało.
Delfad0r
Twój kod zwraca 1pustą listę, do której powinien zwrócić0
Jo King,
@Jo King Rzeczywiście, przegapiłem dyskusję w komentarzach. Napraw to teraz.
Delfad0r,
5

JavaScript (Node.js) , wynik 3, 53 46 bajtów wynik 2, 51 50 bajtów

-7 bajtów dzięki @Arnauld

+5 +4 spacje w zamian za wynik -1

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

Wypróbuj online!

Zakłada niepuste dane wejściowe. 61 bajtów, jeśli należy obsłużyć pustą listę. Jeszcze 2 punkty.

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

Wypróbuj online!

... lub 58, jeśli zwrot falsejest dozwolony. Jeszcze 2 punkty.

a=> a.map($= p=n=>$=(p<=(p=n)?++ x:x=1)<$?$: x)&& a>[ ]&&$
Shieru Asakoto
źródło
Ten powinien działać przez 46 bajtów i w takim samym wynikiem.
Arnauld,
1
@Arnauld dodał 5 spacji do twojej sugestii, dzięki czemu jest teraz wynikiem 2
Shieru Asakoto
4

Łuska , 5 bajtów , wynik = 2

00000000: bc6d 4cdc 14                   ▲mLġ≥

Wypróbuj online!

Jest mało prawdopodobne, aby Husk uzyskał wynik niższy niż 2, ponieważ ġ1 ma naprawdę wysoki punkt kodowy i musi być coś przed nim, aby uzyskać maksimum i długość. Próba może być podjęta przy próbie użycia wielu funkcji, ale \nbyłoby to przed dowolnymi funkcjami pomocniczymi, które mają naprawdę niski punkt kodowy, więc cokolwiek po tym stworzyłoby rosnącą sekwencję bajtów o długości co najmniej 2.

1: Wydaje się, że najlepszym sposobem użycia operatorów porównania byłoby śledzenie różnych funkcji podziału, takich jak ( span).

Wyjaśnienie

▲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
ბიმო
źródło
3

Siatkówka 0.8.2 , 40 bajtów, wynik 3

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

Wypróbuj online! Link zawiera się jako kody bajtów jako dane wejściowe. Wyjaśnienie:

\d+
$*

Konwertuj na unary.

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

Podziel na malejące pary.

T`1`_

Usuń cyfry.

^O`

Sortuj przecinki w odwrotnej kolejności. (Normalnie bym to napisał, O^ale nie mogę tego zrobić tutaj z oczywistych powodów.)

\G,?

Policz najdłuższy bieg przecinków i dodaj jeden, aby dołączyć końcową liczbę.

Neil
źródło
3

Japt -h, 6 bajtów, wynik 2

Nie sądzę, że możliwy jest wynik 1. Powinien również działać z łańcuchami znaków i tablic znaków.

ò>¹mÊn

Spróbuj - dołączony przypadek testowy jest kodem rozwiązania.


Wyjaśnienie

ò          :Partition after each integer
 >         :  That's greater than the integer that follows it
  ¹        :End partition
   m       :Map
    Ê      :  Length
     n     :Sort
           :Implicitly output last element
Kudłaty
źródło
3

MATL , wynik 2, 13 bajtów

d0< ~Y'w)X>sQ

Dane wejściowe mogą być:

  • Tablica liczb.
  • Ciąg zamknięty pojedynczymi cudzysłowami. Pojedyncze cudzysłowy w ciągu są usuwane przez duplikowanie.

MATL używa kodowania ASCII. Punktami kodowymi powyższego kodu są

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

Wypróbuj online!

Wyjaśnienie

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
źródło
3

Pascal (FPC) , wynik 2

111 bajtów

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.

Wypróbuj online!

Zakłada niepuste dane wejściowe. Liczby są pobierane ze standardowego wejścia oddzielone spacjami.

AlexRacer
źródło
2

Galaretka , 8 bajtów , wynik 2

Prawdopodobnie istnieje jakoś 1 wynik ...

IṠµṣ-ZL‘

Wypróbuj online!

Kod źródłowy jako lista wartości bajtów:

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

W jaki sposób?

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
źródło
2

Perl 6 , wynik 2, 46 bajtów

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

Wypróbuj online!

Obsługuje pustą listę. Oryginalny kod to:

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

Tak więc tylko 5 dodatkowych bajtów, aby zmniejszyć wynik do 2.

Edycja: Ach, wymyśliłem, jak usunąć zadanie , ale potem nie mogę uzyskać tego wyniku poniżej 3 z powodu)]] ...

Wyjaśnienie:

{                                  }  # 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
źródło
Więc [[&(*+*)]]działa jak [+]? Niesamowite ...
nwellnhof,
@nwellnhof Tak, jest kilka ostrzeżeń, takich jak, że nie możesz mieć żadnych białych znaków ( w ogóle ), ale możesz nawet używać ich z Zi X. Wypróbuj online!
Jo King
1
Chciałem spróbować czegoś takiego:{max 0,|.[[X..] ^$_ xx 2].map({+$_ if [<=] $_})}
Brad Gilbert b2gills
1

05AB1E , wynik 3 (9 bajtów )

Œʒ¥dP}éθg

Najprawdopodobniej może to być wynik 2.

Punkty kodowe bajtów programu: [140,1,90,100,80,125,233,9,103](dwie listy podrzędne o długości 3: [1,90,100]i [80,125,233])

Wypróbuj online.

Wyjaśnienie:

Œ            # 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
źródło
1

Java (JDK) , wynik 3, 94 bajty

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

Wypróbuj online!

Port mojej (z sugestiami Arnaulda) odpowiedzi JS. etuin returni hilin whileuniemożliwiają golfa zdobycie 2.

for nie można tutaj użyć, ponieważ:

  • ;for rośnie
  • fornie można używać na początku korpusu lambda (ograniczenia zakresu). Możliwe jest owijanie go, {}ale najwyraźniej użycie whilebajtów zapisywania.
Shieru Asakoto
źródło
Chciałem zasugerować użycie \uw niektórych miejscach, ale potem musisz 00
podać
1

PowerShell, wynik 3, 44 bajtów

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

Skrypt testowy:

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

Wynik:

True: 4

Wyjaśnienie:

  • Skrypt przyjmuje liczby całkowite jako listę argumentów ( spaltting ).
  • Każda liczba całkowita jest odwzorowywana przez funkcję na legnth of contiguous sub-list that is increasing (not strictly). Następnie skrypt sortuje wydłużenia i bierze ostatnie (maksimum) (...|sort)[-1].

Powershell 6, wynik 3, 43 bajty

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

Jak powyżej. Jedna różnica: sort -b 1jest skrótem sort -Bottom 1i oznacza 1 element z końca posortowanej tablicy . Więc nie potrzebujemy indeksu [-1].

mazzy
źródło
1

Python 2 , wynik 5, 87 bajtów wynik 2, 101 93 92 101 bajtów

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

Wypróbuj online!

Ups! Myślałem, że to był kod-golf pierwszy raz ...

Chas Brown
źródło
2
Ocena 5. Wypróbuj online!
mypetlion
2
Wcięcie za pomocą zakładek, aby uzyskać wynik 4.
mypetlion
@mypetition: D'oh! Myślałem, że to kod golfowy ... teraz edytuję odpowiedź.
Chas Brown,
Zabawne, że usunięcie m=1,o=[1]części nie kończy się na oszczędzeniu bajtów, gdy obniżymy wynik
Jo King,
@Jo King: Chuckle! Miałem nadzieję, że skręcając się w ten sposób, mogę odłamać kolejny bajt; ale nie ma takiego szczęścia!
Chas Brown,
0

Wolfram Language (Mathematica) , wynik 3, 45 bajtów

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

Wypróbuj online!

SequenceCasesi OrderedQsame dają wynik 3, więc wyniku nie można poprawić bez znaczącej zmiany podejścia.

Misza Ławrow
źródło
Właściwy sposób użycia wzorców kazałby nam to zrobić Max[Length/@SequenceCases[#,_?OrderedQ]]&, ale _?Orjest to rosnąca podsekwencja długości 4. (Jak jest _?AnyCamelCaseCommand.)
Misha Lavrov
0

Java (JDK), 126 bajtów, wynik 6

Grał w golfa

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

Nie golfił

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

Wejście

[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
źródło
Nie powinno bytebyć int, ponieważ bytebyłoby ograniczone do 8 bitów?
Jo King,
@JoKing Nie jestem do końca pewien, co masz na myśli. Czy masz na myśli, że powinienem zmienić klasę bajtów na klasę int?
Jaden Lee,
Tak, ponieważ na wejściu znajduje się lista liczb całkowitych
Jo King,
0

Kotlin, wynik 6, 119 bajtów

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

Wypróbuj online

Wyjaśnienie

  1. Krok 1: Sprawdź poprzednią wartość do następnej wartości
  2. Krok 2: Jeśli poprzednia wartość jest mniejsza lub równa, dodaj plus 1, kontynuuj, dopóki warunek jest spełniony
  3. Krok 3: sprawdź poprzednią liczbę z następną liczbą, zachowaj najwyższą liczbę w zmiennej d.
Syed Hamza Hassan
źródło
Ok, rozumiem, wkrótce go edytuję.
Syed Hamza Hassan
Proszę sprawdzić, stworzyłem funkcję, w której można podać dane wejściowe. Jak na mój przykładowy ciąg odpowiedzi brzmiałaby [2,4,5,6,7,7,7] Wynik to 7.
Syed Hamza Hassan
Zaktualizowałem wynik i link, proszę sprawdzić.
Syed Hamza Hassan
Ok, dałem zaktualizowane.
Syed Hamza Hassan
0

Kotlin, wynik 4, 67 bajtów

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

Główną ideą jest: Przekształć każdą liczbę całkowitą na długość ciągłych podsekwencji, która rośnie (nie ściśle). Zwróć maksimum.

  • a.map{...} - dla każdej liczby całkowitej w tablicy wykonaj
  • if(it<p){i=0} - jeśli bieżąca liczba całkowita jest mniejsza niż poprzednia liczba całkowita, zresetuj licznik
  • p=it - zapisz bieżącą liczbę całkowitą w poprzednim
  • (++i) - licznik przyrostów i zwracana wartość wyrażenia
  • .max() - zdobądź maximun całej długości
mazzy
źródło
0

Rubinowy , 64 bajty

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

Wypróbuj online!

Idva
źródło
1
Pamiętaj, że to nie jest golf golfowy . Twój obecny wynik to 6. Ponadto twój kod nie obsługuje pustej listy (gdzie wynik powinien być 0)
Jo King,