สตริงย่อยที่เพิ่มขึ้นยาวที่สุด


12

รับรายการของจำนวนเต็มบวกเขียนโค้ดที่ค้นหาความยาวของรายการย่อยที่อยู่ติดกันที่ยาวที่สุดที่เพิ่มขึ้น (ไม่เคร่งครัด) นั่นคือรายการย่อยที่ยาวที่สุดซึ่งแต่ละองค์ประกอบนั้นมากกว่าหรือเท่ากับครั้งสุดท้าย

ตัวอย่างเช่นถ้าอินพุตคือ:

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

ที่ยาวที่สุดในการเพิ่มรายการย่อยจะดังนั้นคุณจะเอาท์พุท4[1,1,4,5]4

คำตอบของคุณจะได้รับคะแนนโดยนำแหล่งที่มาของมันเป็นรายการของไบต์แล้วค้นหาความยาวของรายการย่อยที่เพิ่มขึ้นที่ยาวที่สุดของรายการนั้น คะแนนที่ต่ำกว่าคือเป้าหมาย ความสัมพันธ์ระหว่างโปรแกรมต่าง ๆ มีจำนวนน้อยลงโดยรวม


มันจะโอเคที่จะคืนค่าจริงแทนที่จะเป็น 1 หรือไม่? และเราต้องจัดการรายการว่างเปล่าหรือไม่?
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 ฉันไม่แน่ใจว่าจะพูดอะไรกับคะแนนมากกว่านี้ แปลงการส่งของคุณเป็นรายการไบต์และส่งผ่านโปรแกรมของคุณเองและนั่นคือคะแนนของคุณ หากคะแนนเท่ากันไทเบรกเกอร์คือ bytecount
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 จริง ๆ การจัดเรียงใหม่อาจช่วย 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 ไบต์

  • -2 ไบต์ต้องขอบคุณMax Yekhlakov
  • -1 ไบต์ขอบคุณnimi
  • +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

ลองออนไลน์! (ตรวจสอบตัวเอง)

ฉันไม่เคยคิดเลยว่าจะได้คะแนน 2 จาก Haskell และตอนนี้ฉันอยู่ที่นี่!

ฟังก์ชั่นgคำนวณความยาวของวัสดุพิมพ์ที่เพิ่มขึ้นทั้งหมดซ้ำ ๆ foldr1 max.gใช้ความยาวสูงสุดดังกล่าว ( foldr1 maxเทียบเท่าmaximumแต่มีคะแนนต่ำกว่า)


1
ดูเหมือนว่าช่องว่างใน1+a : bนั้นไม่จำเป็นดังนั้นนี่คือ 62 ไบต์
Max Yekhlakov

@ MaxYekhlakov คุณพูดถูกฉันไม่รู้ว่าฉันทำพลาดอย่างไร
Delfad0r

รหัสของคุณจะส่งคืน1สำหรับรายการว่างซึ่งควรส่งคืน0
Jo King

@Jo King แน่นอนฉันพลาดการอภิปรายในความคิดเห็น แก้ไขได้แล้ว
Delfad0r

5

JavaScript (Node.js) , คะแนน 3 53 46 ไบต์คะแนน 2 51 50 ไบต์

-7 ไบต์ขอบคุณ @Arnauld

+5 +4 ช่องว่างในการแลกเปลี่ยนคะแนน -1

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

ลองออนไลน์!

... หรือ 58 หากfalseอนุญาตให้ส่งคืน ยังคงคะแนน 2

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

สิ่งนี้ควรใช้งานได้ 46 ไบต์และมีคะแนนเท่ากัน
Arnauld

1
@Arnauld เพิ่ม 5 ช่องว่างในคำแนะนำของคุณเพื่อให้เป็นคะแนน 2
Shieru Asakoto

4

Husk , 5 ไบต์ , คะแนน = 2

00000000: bc6d 4cdc 14                   ▲mLġ≥

ลองออนไลน์!

มันไม่น่าจะได้คะแนนต่ำกว่า 2 กับ Husk เพราะġ1มี codepoint สูงมากและต้องมีบางอย่างก่อนที่มันจะได้รับความยาวสูงสุด ความพยายามสามารถทำได้ด้วยการพยายามใช้หลายฟังก์ชั่น แต่\nก่อนที่จะมีฟังก์ชั่นตัวช่วยใด ๆ ที่มี codepoint ต่ำมากดังนั้นสิ่งใด ๆ หลังจากนั้นมันจะสร้างลำดับไบต์ที่เพิ่มขึ้นอย่างน้อย 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

Japtet -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

อินพุตสามารถ:

  • อาร์เรย์ของตัวเลข
  • สตริงที่ล้อมรอบด้วยเครื่องหมายคำพูดเดี่ยว อัญประกาศเดี่ยวภายในสตริงจะถูก Escape ด้วยการทำซ้ำ

MATL ใช้การเข้ารหัส ASCII codepoints ของรหัสข้างต้นคือ

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

3

Pascal (FPC)คะแนน 2

111 ไบต์

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.

ลองออนไลน์!

ถือว่าอินพุตไม่ว่างเปล่า ตัวเลขจะถูกนำมาจากอินพุตมาตรฐานคั่นด้วยช่องว่าง


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

ดังนั้นเพียง 5 ไบต์พิเศษเพื่อลดคะแนนถึง 2

แก้ไข: อ่าฉันคิดวิธีลบการบ้านออก แต่แล้วฉันไม่สามารถรับคะแนนต่ำกว่า 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
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

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 etuในreturnและhilในwhileทำให้เป็นไปไม่ได้ที่จะเล่นกอล์ฟให้คะแนน 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 )
  • แต่ละจำนวนเต็มแผนที่โดยฟังก์ชั่นเพื่อ legnth contiguous sub-list that is increasing (not strictly)ของ จากนั้น lengthes ประเภทสคริปต์และใช้เวลาที่ผ่านมา (...|sort)[-1](สูงสุด)

Powershell 6, คะแนน 3, 43 ไบต์

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

เช่นเดียวกับข้างต้น หนึ่งความแตกต่าง: sort -b 1เป็นทางลัดสำหรับการsort -Bottom 1และวิธีการที่ 1 องค์ประกอบจากปลายแถวเรียง [-1]เราจึงไม่ต้องดัชนี



1

งูหลาม 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! คิดว่านี่คือรหัสกอล์ฟ ... แก้ไขคำตอบของฉันตอนนี้
Chas Brown

ตลกที่การถอดชิ้นm=1,o=[1]ส่วนไม่ได้จบลงด้วยการบันทึกไบต์ใด ๆ เมื่อเราลดคะแนน
Jo King

@Jo King: หัวเราะเบา ๆ ! ฉันหวังว่าเมื่อกระรอกด้วยวิธีนี้ฉันก็สามารถหักล้างไบต์อื่นได้ แต่ไม่มีโชคเช่นนี้!
Chas Brown


0

ภาษา Wolfram (Mathematica)คะแนน 3, 45 ไบต์

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

ลองออนไลน์!

SequenceCasesและOrderedQด้วยตนเองให้คะแนน 3 ดังนั้นคะแนนไม่สามารถปรับปรุงโดยไม่เปลี่ยนวิธีการอย่างมีนัยสำคัญ


วิธีที่ถูกต้องในการใช้รูปแบบจะทำให้เราทำMax[Length/@SequenceCases[#,_?OrderedQ]]&แต่_?Orเป็นการเพิ่มความยาวของลำดับที่ 4 (ตามที่เป็น_?AnyCamelCaseCommand)
Misha Lavrov

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

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

อินพุต

[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เพราะbyteจะถูก จำกัด เพียง 8 บิต?
Jo King

@ โจกิ้งฉันไม่แน่ใจว่าคุณหมายถึงอะไร คุณหมายถึงว่าฉันควรเปลี่ยนคลาสไบต์เป็นคลาส int หรือไม่?
Jaden Lee

ใช่เนื่องจากอินพุตเป็นรายการจำนวนเต็ม
โจคิง

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: ถ้าค่าก่อนหน้านี้น้อยกว่าหรือเท่ากันให้บวกบวก 1 ทำต่อไปขณะที่เงื่อนไขเป็นจริง
  3. ขั้นตอนที่ 3: ตรวจสอบการนับก่อนหน้าด้วยการนับถัดไปรักษาจำนวนสูงสุดในตัวแปร d

ตกลงฉันเข้าใจแล้วฉันจะแก้ไขในไม่ช้า
Syed Hamza Hassan

กรุณาตรวจสอบฉันได้ทำฟังก์ชั่นที่สามารถได้รับการป้อนข้อมูล ตามคำตอบสตริงตัวอย่างของฉันจะเป็น [2,4,5,6,7,7,7] คะแนนคือ 7
Syed Hamza Hassan

ฉันได้อัพเดทคะแนนและลิงค์โปรดตรวจสอบ
Syed Hamza Hassan

ตกลงฉันให้การปรับปรุง
Syed Hamza Hassan

ขอให้เรายังคงอภิปรายนี้ในการแชท
Jo King

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() - รับจำนวนสูงสุดของความยาวทั้งหมด

0

Ruby , 64 ไบต์

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

ลองออนไลน์!


1
โปรดทราบว่านี้ไม่ได้เป็นรหัสกอล์ฟ 6คะแนนปัจจุบันของคุณคือ นอกจากนี้โค้ดของคุณไม่ได้จัดการรายการว่างเปล่า (ซึ่งผลลัพธ์ควรเป็น0)
Jo King
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.