เรียงลำดับที่ยาวที่สุดเท่ากัน


18

คำนิยาม

  • subsequence อาจจะไม่ต่อเนื่องกันเช่น[1, 1, 1]เป็น subsequence [1, 2, 1, 2, 1]ของ
  • ความเท่าเทียมกันเป็นองค์ประกอบที่ทุกองค์ประกอบเท่ากัน
  • เท่ากับ subsequence ที่ยาวที่สุดอาจจะไม่ซ้ำกันเช่น[1, 1]และ[2, 2]มีทั้งที่ยาวที่สุด subsequences [2, 1, 1, 2]เท่ากัน

อินพุต

รายการจำนวนเต็มบวกที่ไม่ว่างเปล่าในรูปแบบใดรูปแบบหนึ่งด้านล่าง:

  • เป็นการใช้งานจริงของอาร์เรย์ของจำนวนเต็มบวกในภาษาของคุณ
  • เป็นสตริงของจำนวนเต็มคั่นด้วยบรรทัดใหม่ในทศนิยม
  • เป็นสตริงของจำนวนเต็มที่คั่นด้วยการขึ้นบรรทัดใหม่ใน unary
  • รูปแบบที่เหมาะสมอื่น ๆ

เอาท์พุต

ลำดับที่เท่ากันยาวที่สุดทั้งหมดในลำดับใดรูปแบบหนึ่งด้านล่าง:

  • เป็นอาร์เรย์ซ้อนซ้อน 2 มิติในภาษาของคุณ (หากอินพุตเป็นอาร์เรย์)
  • ในฐานะที่เป็นอาเรย์แบนที่มีองค์ประกอบเท่ากันที่ต่อเนื่องกัน
  • รูปแบบที่เหมาะสมอื่น ๆ

เกณฑ์การให้คะแนน

แม้ว่าเรากำลังมองหาบางสิ่งบางอย่างยาวรหัสที่ใช้ควรจะสั้นที่สุดในแง่ของจำนวนไบต์เนื่องจากนี่คือ

Testcases

ปัจจัยการผลิต:

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

ขาออก:

[[1], [2], [3]]
[[1, 1], [2, 2]]
[[1, 1], [2, 2]]
[[1, 1, 1]]

โปรดทราบว่าสำหรับผลลัพธ์ข้างต้นคำสั่งซื้อใด ๆ ที่ถูกต้อง

อาเรย์แบบแบนนั้นใช้ได้เช่นกันตราบใดที่องค์ประกอบที่เท่ากันนั้นต่อเนื่องกัน


4
มันจะง่ายกว่าหากจะพูดถึง "องค์ประกอบที่พบบ่อยที่สุด" IMO: การเรียงลำดับจะถูกใช้เมื่อคำสั่งซื้อมีความสำคัญ แต่ที่นี่การเรียงสับเปลี่ยนของอินพุตทุกชุดมีเอาต์พุตที่ถูกต้องที่อนุญาตเหมือนกัน
ShreevatsaR

@ShreevatsaR ขออภัยฉันได้แก้ไขคำถาม
Leun Nun

รายการแฟล็ตทำงานกับเอาต์พุตหรือไม่? เช่น1 2 3, 1 1 2 2, 1 1 2 2, 1 1 1?
Conor O'Brien

@ ConorO'Brien ว่าใช่จะเป็นโมฆะที่สุดของคำตอบที่นี่ ...
รั่วนูน

@LeakyNun ในฐานะเป็นทางเลือกที่ยอมรับได้หรือไม่
Conor O'Brien

คำตอบ:


8

เยลลี่ 5 ไบต์

ĠLÐṀị

ลองออนไลน์!

มันทำงานอย่างไร

ĠLÐṀị  Main link. Argument: A (array)

Ġ      Group; partition the indices of A by their corresponding values.
 LÐṀ   Select all index arrays with maximal length.
    ị  Unindex; retrieve the items of A at the specified indices.

ฉันคิดว่าวุ้นไม่ได้อย่างรวดเร็วสูงสุด ...
รั่วนูน

มันเป็นเทคนิคสูงสุดอย่างรวดเร็ว แต่ใช่มันไม่
Dennis

5

Brachylogขนาด 7 ไบต์

⊇ᶠ=ˢlᵍh

ลองออนไลน์!

คำอธิบาย

⊇ᶠ=ˢlᵍh
⊇ᶠ        Find all subsequences
  =ˢ      Keeping only those for which all elements are equal
    lᵍ    Group by length
      h   Take the first group

คำสั่งตามธรรมชาติของสร้างลำดับที่ยาวที่สุดก่อนดังนั้นมันจึงเป็นลำดับที่สุดท้ายในกลุ่มแรก


1
โอ้เฮ้นัก Brachylogist คนอื่น
Leun Nun

1
คุณและฉันต้องคิดถึงกันซ้ำแล้วซ้ำเล่าในการแชทของ Brachylog ฉันใช้มันมาหลายเดือนแล้วและรู้สึกประหลาดใจที่ได้รู้ว่าคนอื่นนอกจาก Fatalize ก็เช่นกัน

5

Pyth, 5 ไบต์

S.M/Q

ชุดทดสอบ

คำอธิบาย:

S.M/QZQนี่คือโดยปริยาย .Mเป็นฟังก์ชั่นสูงสุดดังนั้น.M/QZQเลือกองค์ประกอบทั้งหมดที่มีค่า/QZนับจำนวนการเกิดขึ้นขององค์ประกอบในการป้อนข้อมูลเป็นสูงสุด Sจากนั้นเรียงลำดับรายการเพื่อให้อิลิเมนต์ที่เหมือนกันติดกัน


3

bash, 66 ไบต์

sort|uniq -c|sort -rn|awk 'NR==1{a=$1}$1==a{for(i=a;i--;)print$2}'

ดูเหมือนว่ามันควรจะสั้นกว่านี้ แต่ฉันไม่สามารถหาวิธีได้

sort                  # sort the input
|uniq -c              # group runs of identical lines and prefix with count
|sort -rn             # sort by count, with largest at top
|awk '                # pipe to awk...
  NR==1{a=$1}         # on the first line, set the variable "a" to field 1
  $1==a{              # on any line, if first field is a (max count)...
    for(i=a;i--;)     # a times...
    print$2           # print the second field
  }
'

ลองออนไลน์!

ขอบคุณLeaky Nunนาน 3 ไบต์!



ลองอัปเดตคำอธิบายของคุณ
Leaky Nun

3

Python 2 , 68 63 ไบต์

lambda x:sorted(n for n in x if x.count(n)/max(map(x.count,x)))

ลองออนไลน์!


ต้องการดูคำตอบใน Python 3: p
Leun Nun

1
แจงคนนี้เป็นที่น่ารำคาญ: เพียงแทนที่ด้วยprint return
Dennis

โอ้ฉันคิดว่างูหลาม 3 mapไม่ได้
Leun Nun

มันแตกต่างกันเล็กน้อยใน 3 (คืนกำเนิดและตัดทอน iterables อีกต่อไปหากมีมากกว่าสองข้อโต้แย้ง) แต่มันมี
Dennis

ฉันคิดว่า Python มีระบบนี้ในตัว
Beta Decay

2

Mathematica, 42 31 25 ไบต์

ขอบคุณ @GregMartin 5 ไบต์และ @MartinEnder อีกไบต์!

MaximalBy[Length]@*Gather

คำอธิบาย

MaximalBy[Length]@*Gather  (*                       {1, 2, 3, 2, 1}       *)
                   Gather  (* Gather same numbers:  {{1, 1}, {2, 2}, {3}} *)
                 @*        (* Function composition                        *)
MaximalBy[Length]          (* Find longest:         {{1, 1}, {2, 2}}      *)

1
คุณสามารถบันทึก 5 Gather@#~MaximalBy~Length&ไบต์ด้วย
Greg Martin

2
@GregMartin MaximalBy[Length]@*Gatherแล้ว
Martin Ender

ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

2

ซ้อนกัน , 55 52 43 ไบต์

sorted rle toarr:[1#]map MAX@K[1#K=]YES rld

ลองออนไลน์!

ทำงานโดยการเข้ารหัสอินพุตแบบยาวเรียงลำดับตามเหตุการณ์เกิดขึ้นรักษาจำนวนครั้งที่เกิดขึ้นสูงสุดและถอดรหัสการรันความยาว แสดงผลผ่านรายการแบบคงที่ตามความท้าทายที่ยอมรับได้


2

ที่จริงแล้ว 23 ไบต์

;╗⌠;╜ck⌡M;♂NM╗⌠N╜=⌡░♂FS

ลองออนไลน์หรือใช้กรณีทดสอบทั้งหมด !

ขอบคุณ Leaky Nun ที่ชี้ให้เห็นถึงการปรับปรุงหนึ่งไบต์ที่ฉันควรจะเห็นได้ชัด

-3 ไบต์จากรูปแบบเอาต์พุตที่ผ่อนคลาย

คำอธิบาย:

;╗⌠;╜ck⌡M;♂NM╗⌠N╜=⌡░♂FS
;╗                        save a copy of the input to register 0
  ⌠;╜ck⌡M                 for each value in the input list:
   ;                        make a copy on the stack
    ╜c                      count the occurrences in the input list (from register 0)
      k                     make a list: [value, count]
         ;♂N             make a copy, take last value of each list in the 2D list
            M╗           store the maximum count in register 0
              ⌠N╜=⌡░     filter the other copy of the list of [value, count] lists:
               N╜=         take items where the count equals the maximum count
                    ♂FS  take first items (values) and sort them

1

Python 2, 138 ไบต์

lambda l:[[x[0]]*x[1] for x in next(__import__('itertools').groupby(__import__('collections').Counter(l).most_common(),lambda x:x[1]))[1]]

itertoolsไม่เคยสั้นที่สุด: p
Leun Nun

ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

1

MATL 10 ไบต์

3#XMg1bX"&

ลองออนไลน์!

คำอธิบาย

คล้ายกับคำตอบระดับแปดเสียงของฉัน พิจารณาการป้อนข้อมูล[10, 20, 30, 20, 10]เป็นตัวอย่าง

3#XM   % Three-output version of mode function. Gives the first mode, the
       % number of repetitions, and a cell array with all modes
       % STACK: 10, 2, {10; 20}
g      % Convert from cell array to matrix
       % STACK: 10, 2, [10; 20]
1      % Push 1
       % STACK: 10, 2, [10; 20], 1
b      % Bubble up in the stack
       % STACK: 10, [10; 20], 1, 2
X"     % Repeat those number of times vertically and horizontally
       % STACK: 10, [10, 10; 20, 20]
&      % Specify that implicit display will show only the top of the stack.
       % Since this is singleton cell array that contains a matrix, that 
       % matrix is directly displayed

ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

@LeakyNun ขอขอบคุณที่แจ้งให้เราทราบ
Luis Mendo

มันเป็นความรับผิดชอบของฉัน
Leun Nun

1

ระดับแปดเสียง 47 ไบต์

[~,b,c]=mode(input(0));disp([repmat(c,1,b){:}])

ลองออนไลน์!

คำอธิบาย

เอาต์พุตที่สองและสามของmode(รับเป็น[~,b,c]=mode(...)) ตามลำดับจะให้จำนวนการทำซ้ำ ( b) และอาร์เรย์เซลล์คอลัมน์ ( c) ขององค์ประกอบที่ทำซ้ำมากที่สุดในอินพุต ( input(0)) อาร์เรย์เซลล์cจะถูกทำซ้ำแล้วแนวนอนbครั้ง ( repmat(c,1,b)) แปลงเป็นรายการคั่นด้วยเครื่องหมายจุลภาค ( {:}) และ contatenated แนวนอน ( [...]) เพื่อให้เมทริกซ์ที่เป็นตัวเลขซึ่งแสดง ( disp(...))


ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

1

05AB1E , 8 5 ไบต์

แสดงรายการตามลำดับ

.M¹Ã{

ใช้การเข้ารหัส05AB1E ลองออนไลน์!


ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

@LeakyNun ขอบคุณสำหรับการแจ้งเตือน :)
Adnan

1

CJam , 22 ไบต์

{$e`z~\__:e>f=.*\]ze~}

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

ลองออนไลน์!

คำอธิบาย

พิจารณาการป้อนข้อมูล[10 20 30 20 10 ]เป็นตัวอย่าง

{      e# Begin block
       e#   STACK: [10 20 30 20 10]
  $    e#   Sort
       e#   STACK: [10 10 20 20 30]
  e`   e#   Run-length encoding
       e#   STACK: [[2 10] [2 20] [1 30]]
  z    e#   Zip
       e#   STACK: [[2 2 1] [10 20 30]]
  ~    e#   Dump array contents onto the stack
       e#   STACK: [2 2 1] [10 20 30]
  \    e#   Swap
       e#   STACK: [10 20 30] [2 2 1]
  __   e#   Duplicate twice
       e#   STACK: [10 20 30] [2 2 1] [2 2 1] [2 2 1]
  :e>  e#   Fold maximum over array. Gives the maximum of the array
       e#   STACK: [10 20 30] [2 2 1] [2 2 1] 2
  f=   e#   Map "is equal" with number (2) over the array ([2 2 1])
       e#   STACK: [10 20 30] [2 2 1] [1 1 0]
  .*   e#   Vectorized multiplication
       e#   STACK: [10 20 30] [2 2 0]
  \    e#   Swap
       e#   STACK: [2 2 0] [10 20 30]
  ]    e#   Pack into array
       e#   STACK: [[2 2 0] [10 20 30]]
  z    e#   Zip
       e#   STACK: [[2 10] [2 20] [0 30]]
  e~   e#   Run-length decoding
       e#   STACK: [10 10 20 20]
}      e# End block


0

APL (Dyalog)ขนาด 22 ไบต์

ต้องใช้⎕ML←3ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ

โปรแกรม: s/⍨(⌈/=⊢)≢¨s←⊂⍨(⍋⊃¨⊂)⎕

 รับอินพุต (ประเมิน) เป็นตัวเลข

(... ) ฟังก์ชั่นโดยนัย
 ดัชนีของรายการ
⊃¨ จากการเลือกแต่ละครั้ง
 อาร์เรย์ทั้งหมด

⊂⍨ พาร์ทิชันโดยการตัดที่เพิ่มขึ้น

s← เก็บเป็นเอส

≢¨ นับแต่ละ

() ฟังก์ชั่นโดยปริยาย
⌈/ ค่าสูงสุด (นับ)
= เท่ากับ
 อาร์กิวเมนต์ (ค่าสูง)

s/⍨ ตัวกรองที่มี

ฟังก์ชั่น: {s/⍨(⌈/=⊢)≢¨s←⊂⍨⍵[⍋⍵]}

{} ฟังก์ชั่นที่ไม่ระบุตัวตนที่มีการโต้แย้ง

⍵[⍋⍵] จัดเรียง (ดัชนี lit. พร้อมดัชนีของรายการจากน้อยไปหามาก)

⊂⍨ พาร์ทิชันโดยการตัดที่เพิ่มขึ้น

s← เก็บเป็นเอส

≢¨ นับแต่ละ

() ฟังก์ชั่นโดยปริยาย
⌈/ ค่าสูงสุด (นับ)
= เท่ากับ
 อาร์กิวเมนต์ (ค่าสูง)

s/⍨ กรองsกับ ลองออนไลน์!


ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

0

PHP, 69 ไบต์

<?print_r(preg_grep("#".max($r=array_count_values($_GET))."#",$r));

เวอร์ชั่นออนไลน์

รูปแบบผลลัพธ์

key = value, value = count

Array
(
    [1] => 2
    [2] => 2
)

PHP, 96 ไบต์

<?foreach($_GET as$v)$r[$m[]=count($l=preg_grep("#^{$v}$#",$_GET))][$v]=$l;print_r($r[max($m)]);

เวอร์ชั่นออนไลน์

รูปแบบผลลัพธ์

คีย์ 1D = ค่า

คีย์ 2D = ตำแหน่งในอาร์เรย์อินพุตสำหรับแต่ละค่า

Array
(
    [1] => Array
        (
            [0] => 1
            [4] => 1
        )

    [2] => Array
        (
            [1] => 2
            [3] => 2
        )

)

PHP, 97 ไบต์

<?foreach($_GET as$v)$r[count($l=preg_grep("#^{$v}$#",$_GET))][$v]=$l;ksort($r);print_r(end($r));

ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

0

JavaScript (ES6), 84 83 ไบต์

ส่งคืนอาร์เรย์ที่เรียงลำดับแบบแบน ๆ

a=>a.sort().filter((_,i)=>b[i]==Math.min(...b),b=a.map(i=>a.filter(j=>i-j).length))

กรณีทดสอบ


ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

@LeakyNun ขอบคุณสำหรับการแจ้งเตือน
Arnauld

0

CJam, 24 ไบต์

{$e`_$W=0=\{0=1$=},e~\;}

ฉันต้องการทำสิ่งนี้ใน 05ab1e แต่ฉันยอมแพ้: P

นี่คือบล็อก อินพุตและเอาต์พุตเป็นอาร์เรย์บนสแต็ก

ลองออนไลน์!

คำอธิบาย:

{                      e# Stack:                | [1 2 3 2 1]
 $                     e# Sort:                 | [1 1 2 2 3]
  e`                   e# RLE encode:           | [[2 1] [2 2] [1 3]]
    _$W=               e# Copy elements:        | [[2 1] [2 2] [1 3]] [2 1]
       0=              e# First element:        | [[2 1] [2 2] [1 3]] 2
         \             e# Swap:                 | 2 [[2 1] [2 2] [1 3]]
          {0=1$=},     e# Filter where x[0]==2: | 2 [[2 1] [2 2]]
                  e~   e# RLE decode:           | 2 [1 1 2 2]
                    \; e# Delete back:          | [1 1 2 2]
                      }

ใช้งานได้ก็ต่อเมื่อจำนวนเต็มที่น้อยที่สุดเป็นองค์ประกอบที่พบบ่อยที่สุด คุณจะต้องแทนที่จะเป็นครั้งแรก$W= 0=
Martin Ender

ฉันได้เพิ่มทางเลือกอื่นที่เป็นที่ยอมรับซึ่งอาจช่วยคุณเล่นกอล์ฟในบางไบต์
Leun Nun

0

Clojure 65 ไบต์

#(let[P partition-by C count](last(P C(sort-by C(P +(sort %))))))

Ungolfed:

(def f #(->> %
             (sort-by      identity)   ; sort so that identical values are one after another, same as sort
             (partition-by identity)   ; partition by identity (duh!)
             (sort-by      count)      ; sort by item count
             (partition-by count)      ; partition by item count
             last))                    ; get the last partition

0

C #, 145 ไบต์

l=>{var t=Enumerable.Range(0,l.Max()+1).Select(i=>l.Count(a=>a==i));return t.Select((a,i)=>Enumerable.Repeat(i,a)).Where(d=>d.Count()==t.Max());}

สิ่งนี้จะต้องเป็นไปได้ที่ดีขึ้นเช่นกัน แต่ฉันก็ติดอยู่

คำอธิบาย

l =>                                                   //Takes the list
{                                                      //...
    var t = Enumerable.Range(0, l.Max() + 1)           //Makes a range till the count, so that the items together with their indices are double defined (i.e. the items are 0,1,2,3... and the indices are the same)
                      .Select(i =>                     //Takes the items
                          l.Count(a => a == i));       //And replaces them with the count of themselves in the list (so the item has the index with its old value and the count as it's actual value)
    return t.Select((a, i) =>                          //Then it takes this list and selects the items together with the indices
        Enumerable.Repeat(i, a))                       //Repeats them as often as they appeared in the list
                  .Where(d => d.Count() == t.Max());   //And just keeps those which appear the maximum amount of times
};                                                     //...

อาจเป็นวิธีที่แตกต่างกันโดยสิ้นเชิงจะสั้นกว่ามากดังนั้นความท้าทาย C # ยังคงเปิดอยู่ :)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.