Chạy tối đa giữa các yếu tố giống hệt nhau


24

Đây là một đại tu của câu hỏi hiện đã bị xóa bởi ar kang . Nếu OP của câu hỏi đó muốn lấy lại câu hỏi này hoặc có vấn đề với tôi khi đăng bài này, tôi rất vui lòng đáp ứng

Đưa ra một danh sách các số nguyên làm đầu vào, tìm tổng tối đa có thể có của một danh sách con liên tục bắt đầu và kết thúc với cùng một giá trị. Danh sách phụ phải có độ dài ít nhất 2. Ví dụ cho danh sách

[1, 2, -2, 4, 1, 4]

Có 2 danh sách con liên tục khác nhau bắt đầu và kết thúc với cùng một giá trị

[1,2,-2,4,1] -> 6
[4,1,4]      -> 9

Tổng lớn hơn là 9 vì vậy bạn xuất 9.

Bạn có thể giả sử mỗi đầu vào chứa ít nhất 1 bản sao.

Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

Các trường hợp thử nghiệm

[1,2,-2,4,1,4]  -> 9
[1,2,1,2]       -> 5
[-1,-2,-1,-2]   -> -4
[1,1,1,8,-1,8]  -> 15
[1,1,1,-1,6,-1] -> 4
[2,8,2,-3,2]    -> 12
[1,1,80]        -> 2
[2,8,2,3,2]     -> 17

Nên [2,8,2,3,2]là 12 hay 17? Tôi đoán 17.
NikoNyrh

@NikoNyrh Phải là 17.
Thuật sĩ lúa mì

Hoan hô cho CC BY / SA. Bạn có quyền đăng một câu hỏi phái sinh của một câu hỏi khác, ngay cả khi sau đó nó sẽ bị các thành viên cộng đồng gắn cờ. Có vẻ như bạn nên thêm một liên kết đến trang của OP khi tôi nhận được từ bài đăng trên blog này. "3. Hiển thị tên tác giả cho mọi câu hỏi và câu trả lời [...] 4. Siêu liên kết mỗi tên tác giả trực tiếp trở lại trang hồ sơ người dùng của họ trên trang nguồn" - Tôi không có đặc quyền để xem các câu hỏi đã bị xóa, vì vậy tôi không Tôi không biết ai đã tạo ra bản gốc.
Mindwin

@Mindwin Cảm ơn, tôi đã thêm một liên kết đến trang của OP. Tôi đã để nó ban đầu vì tôi nghĩ rằng nếu OP xóa bài đăng của họ, họ có thể muốn tránh bị liên kết với câu hỏi.
Phù thủy lúa mì

Lý do xóa là không liên quan và không minh bạch đối với người dùng thông thường (tôi). Nhưng thuộc tính là loại từ chối. Bằng cách nộp và đồng ý với giấy phép, họ đã cấp cho chúng tôi các quyền đó theo các điều kiện đó. Bất cứ điều gì bên ngoài nó là một ngoại lệ. GJ.
Mindwin

Câu trả lời:


9

Haskell , 62 byte

f lấy một danh sách các số nguyên và trả về một số nguyên.

f l=maximum[x+sum m-sum n|x:m<-t l,y:n<-t m,x==y]
t=scanr(:)[]

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

  • tlà tiêu chuẩn "lấy tất cả các hậu tố của danh sách mà không cần nhập Data.List.tails".
  • Trong f l, việc hiểu danh sách lặp đi lặp lại qua tất cả các hậu tố không trống của danh sách đối số l, với phần tử đầu tiên xvà phần còn lại m.
  • Đối với mỗi, nó làm tương tự cho tất cả các hậu tố không trống m, chọn phần tử đầu tiên yvà phần còn lại n.
  • Nếu xybằng nhau, việc hiểu danh sách bao gồm tổng các phần tử giữa chúng. Danh sách con này giống như x:mvới hậu tố nbị loại bỏ, do đó tổng có thể được tính là x+sum m-sum n.

8

JavaScript (ES6), 68 62 byte

a=>a.map(m=(x,i)=>a.map((y,j)=>m=j<=i||(x+=y)<m|y-a[i]?m:x))|m

Các trường hợp thử nghiệm

Đã bình luận

a =>                    // a = input array
  a.map(m =             // initialize m to a function (gives NaN in arithmetic operations)
    (x, i) =>           // for each entry x at position i in a:
    a.map((y, j) =>     //   for each entry y at position j in a:
      m =               //     update m:
        j <= i ||       //       if j is not after i
        (x += y) < m |  //       or the sum x, once updated, is less than m
        y - a[i] ?      //       or the current entry is not equal to the reference entry:
          m             //         let m unchanged
        :               //       else:
          x             //         update m to the current sum
    )                   //   end of inner map()
  ) | m                 // end of outer map(); return m

Tôi đã hơi bối rối khi đặt hàng y - a[i](x += y) < m- IMHO mã sẽ rõ ràng hơn một chút với chúng được trao đổi, kể từ đó nó trông giống như một sân golf đơn giản từ đó (x += y) < m || y != a[i].
Neil

@Neil Tôi thấy quan điểm của bạn nhưng (x+=y)<m|y-a[i]cũng có thể bị hiểu sai (x+=y)<(m|y-a[i]). Tôi không chắc nó sẽ thực sự loại bỏ sự mơ hồ. (Dù sao cũng được chỉnh sửa vì tôi có xu hướng thích phiên bản này.)
Arnauld

Chà, điều đó giả định rằng họ sẽ không hiểu sai y-a[i]|(x+=y)<m(y-a[i]|(x+=y))<m...
Neil

5

Thạch , 12 byte

ĠŒc€Ẏr/€ịḅ1Ṁ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ĠŒc€Ẏr/€ịḅ1Ṁ  Main link. Argument: A (array)

Ġ             Group the indices of A by their corresponding values.
 Œc€          Take all 2-combinations of grouped indices.
    Ẏ         Dumps all pairs into a single array.
     r/€      Reduce each pair by range, mapping [i, j] to [i, ..., j].
        ị     Index into A.
         ḅ1   Convert each resulting vector from base 1 to integer, effectively
              summing its coordinates.
           Ṁ  Take the maximum.

5

Husk , 10 byte

▲mΣfΓ~€;ṫQ

Hãy thử trực tuyến!

Giải trình

▲mΣfΓ~€;ṫQ  Input is a list, say x=[1,2,-2,4,1,4]
         Q  Slices: [[1],[2],[1,2],..,[1,2,-2,4,1,4]]
   f        Keep those that satisfy this:
    Γ        Deconstruct into head and tail, for example h=2 and t=[-2,4,1]
        ;    Wrap h: [2]
      ~€     Is it an element of
         ṫ   Tails of t: [[-2,4,1],[4,1],[1]]
            Result: [[1,2,-2,4,1],[4,1,4]]
 mΣ         Map sum: [6,9]
▲           Maximum: 9


3

R , 108 103 90 88 83 byte

function(l)max(combn(seq(l),2,function(x)"if"(rev(p<-l[x[1]:x[2]])-p,-Inf,sum(p))))

Hãy thử trực tuyến!

combnlại đình công! Tạo ít nhất tất cả các danh sách con có độ dài 2, đặt tổng danh sách phụ thành -Infnếu đầu tiên và cuối cùng không bằng nhau và lấy tối đa của tất cả các khoản tiền.

Ý "if"chí sẽ đưa ra một loạt các cảnh báo nhưng chúng không thể biết được một cách an toàn - đó có lẽ là trò đánh gôn tốt nhất ở đây, rev(p)-plà số 0 trong phần tử đầu tiên p[1]==tail(p,1)"if"sử dụng yếu tố đầu tiên trong tình trạng của nó.




2

Thạch , 13 , 12 byte

=ṚṖḢ
ẆÇÐfS€Ṁ

Hãy thử trực tuyến!

Một byte được lưu bởi ông Xcoder, người hiện đang cạnh tranh với tôi. : D

Giải trình:

        # Helper link:
=Ṛ      # Compare each element of the list to the element on the opposite side (comparing the first and last)
  Ṗ     # Pop the last element of the resulting list (so that single elements return falsy)
   Ḣ    # Return the first element of this list (1 if the first and last are equal, 0 otherwise)

        # Main link:
Ẇ       # Return every sublist
 Ç      # Where the helper link
  Ðf    # Returns true (1)
    S€  # Sum each resulting list
      Ṁ # Return the max


1

Bình thường, 15 byte

eSsMf&qhTeTtT.:

Dùng thử trực tuyến

Giải trình

eSsMf&qhTeTtT.:
             .:Q  Take all sublists of the (implicit) input.
    f qhTeT       Take the ones that start and end with the same number...
     &     tT     ... and have length at least 2.
  sM              Take the sum of each.
eS                Get the largest.

1

05AB1E , 9 byte

ŒʒćsθQ}OZ

Hãy thử trực tuyến!

Giải trình

Œ          # push sublists of input
 ʒ    }    # filter, keep values where
  ć        # the head of the list, extracted
     Q     # is equal to
   sθ      # the last element of the rest of the list
       O   # sum the resulting sublists
        Z  # get the max


1

Python 2 , 86 byte

Bị ruồng bỏ bởi Dennis

lambda x:max(sum(x[i:j+1])for i,v in enumerate(x)for j in range(i+1,len(x))if v==x[j])

Hãy thử trực tuyến!

Tạo tất cả các danh sách con lớn hơn chiều dài 2, trong đó phần tử đầu tiên bằng phần cuối cùng, sau đó ánh xạ từng phần vào tổng của nó và chọn giá trị lớn nhất.


88 byte sử dụng chức năng lambda
Halvard Hummel

@HalvardHummel 86 byte bằng cách sử dụng enumerate.
Jonathan Frech

Bị ruồng bỏ bởi Dennis - Thành thật mà nói, bạn đã mong đợi điều gì?
Ông Xcoder

@ Mr.Xcoder Tôi sẽ có giải pháp của anh ấy, nhưng tôi đã đi ngủ :(
FlipTack



1

Thạch , 11 byte

Sử dụng một số tính năng mà sau ngày thử thách.

Ẇµ.ịEȧḊµƇ§Ṁ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động?

Ẇ Mạnh.ịEȧḊ vìƇƇ | | Chương trình đầy đủ. Lấy đầu vào từ CLA, đầu ra thành STDOUT.
| | | Danh sách con.
 Tiêu chí | | Lọc-Giữ những
    | | | ... Có chiều dài ít nhất là 2 và ...
 .ị | | ... Các yếu tố tại sàn (0,5) và trần (0,5) (mô-đun, 1 chỉ mục) ...
    E | | ... Bằng nhau
         § | | Tính tổng mỗi.
          | | | Tối đa.

-1 với sự giúp đỡ từ caird .


0

Hàng loạt, 179 byte

@set s=%*
@set/a"m=-1<<30
:l
@set/at=n=%s: =,%
@set s=%s:* =%
@for %%e in (%s%)do @set/at+=%%e&if %%e==%n% set/a"m+=(m-t)*(m-t>>31)
@if not "%s%"=="%s: =%" goto l
@echo %m%

Lấy đầu vào là tham số dòng lệnh.



0

Clojure, 92 byte

#(apply max(for[i(range(count %))j(range i):when(=(% i)(% j))](apply +(subvec % j(inc i)))))

0

Tạm biệt Java 8, 129

a->a.stream().map(b->a.subList(a.indexOf(b),a.lastIndexOf(b)+1).stream().mapToLong(Long::intValue).sum()).reduce(Long::max).get()

Đối với mỗi số nguyên Xtrong danh sách, hàm tìm tổng của danh sách con lớn nhất với bắt đầu và kết thúc X. Sau đó, nó tìm thấy số tiền tối đa như OP chỉ định.


Tôi chưa thử nó, nhưng có vẻ như nó có thể thất bại trong [2,8,2,-3,2]trường hợp thử nghiệm, và có thể [1,1,80]cũng vậy.
Ørjan Johansen

0

Perl, 61 59 byte

Bao gồm +3cho -p:

max_ident_run.pl:

#!/usr/bin/perl -p
s:\S+:$%=$&;($%+=$_)<($\//$%)||$_-$&or$\=$%for<$' >:eg}{

Chạy như:

max_ident_run.pl <<< "1 2 -2 4 1 4 1"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.