Máy thời gian chứng khoán


35

Máy thời gian chứng khoán

Bạn đã có quyền truy cập vào bộ dữ liệu, tomorrowStockschứa giá cổ phiếu từ doanh nghiệp yêu thích của bạn trên NASDAQ. Bộ dữ liệu này là một container được lập chỉ mục bởi vài phút trước khi mở. Mỗi chỉ số chứa giá của cổ phiếu tại thời điểm đó.

// Assume the stock market opens at 9:30AM EDT
// tomorrowStocks[] contains the prices of your target stock.
// If the stock is $22 @ 10:30AM EDT
tomorrowStocks[60] == 22

Đầu ra

Nhiệm vụ của bạn là để xác định kết quả tốt nhất có thể có của 1 purchase1 salecủa 1 stocktừ tập dữ liệu nhất định.

Gotchas

  • Bạn phải mua và bán đúng 1 cổ phiếu.
  • Bạn không thể mua bán trong cùng một thời điểm.
  • Bạn phải mua trước khi bán.

Kiểm tra dữ liệu

[1,2,3,4,5]    # 4
[1,99,2,105]   # 104
[99,1,99,100]  # 99
[99,1,1,2,1,3] # 2
[5,4,3,3,1]    # 0
[5,4,3,1]      # -1
[5,2,1]        # -1
[5,4,1]        # -1
[55,45,20,1]   # -10
[5,1]          # -4
[10,7,5,1]     # -2
[7]            # Invalid input -- assume size >= 2

Đây là một ; gửi câu trả lời ngắn nhất bằng ngôn ngữ yêu thích của bạn!


11
Chào mừng bạn đến với PPCG, câu hỏi đầu tiên tốt đẹp! :)
FryAmTheEggman

Chúng ta có thể cho rằng đầu ra là xác định (nghĩa là luôn có một giải pháp chắc chắn là tốt nhất và không có ràng buộc nào)
MayorMonty

1
Thật tệ là trình thông dịch cho một ngôn ngữ mà tôi đang xây dựng chưa hoàn thành, vì nó có thể giải quyết vấn đề này trong 4 byte ... Tôi cần hoàn thành càng sớm càng tốt để tôi không bỏ lỡ quá nhiều câu hỏi hay!
Steven H.

1
@SpeedyNinja Đây thực sự là trong các trường hợp thử nghiệm. Trong trường hợp thử nghiệm [5,4,3,1]bạn có thể nhưng đối 5và bán cho 4hoặc mua cho 4và bán cho 3để có được kết quả tối ưu -1.
Martin Ender

1
@Fawful Bạn có thể thêm câu trả lời của mình là không cạnh tranh sau này. Tôi chắc chắn sẽ rất thích thú khi nhìn thấy nó
CocoaBean

Câu trả lời:


14

05AB1E , 4 byte

Sử dụng phương pháp của FryAmTheEggman . Mã số:

¥ŒOà

Giải trình:

¥     # Calculate the increments of the array.
 Œ    # Get all substring of the array.
  O   # Sum the arrays in the array.
   à  # Get the largest sum and implicitly print that.

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


2
Khỉ thật, tôi đã thử 4 ngôn ngữ chơi gôn và quên mất 05AB1E. Điều đó sẽ học cho tôi vào lần tới: P
FryAmTheEggman 16/07/2016

19

Python 2, 46 byte

f=lambda x:-min(x.pop(0)-max(x),x[1:]and-f(x))

Kiểm tra nó trên Ideone .

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

Đây là một cách tiếp cận đệ quy tận dụng các so sánh kiểu hỗn hợp đẹp mắt của Python 2.

Kết quả tốt nhất có thể là sự khác biệt của mức tối đa của danh sách với phần tử đầu tiên bị loại bỏ và phần tử đầu tiên đó hoặc phần khác biệt không liên quan đến phần tử đầu tiên.

Sau khi trích xuất phần tử đầu tiên bằng x.pop(0)(loại bỏ vĩnh viễn nó khỏi x ), chúng tôi tính toán x.pop(0)-max(x). Lưu ý rằng sự khác biệt này có dấu hiệu "sai".

Nếu danh sách được cập nhật x vẫn chứa ít nhất hai phần tử, x[1:]sẽ tạo ra một danh sách không trống và andthay thế nó bằng âm của cuộc gọi đệ quy, được tính là -f(x). Khi có quá ít yếu tố để tiếp tục, hãy x[1:]and-f(x)đánh giá vào một danh sách trống.

Để chọn kết quả tối đa, chúng tôi lấy mức tối thiểu của chênh lệch và âm của cuộc gọi đệ quy (hoặc []). Vì tất cả các số nguyên hoàn toàn nhỏ hơn [], minsẽ chỉ trả về đối số bên trái của nó nếu đúng [].

Cuối cùng, dấu trừ đơn nguyên -sửa chữa dấu hiệu của kết quả tính toán.


Cái này đẹp lạ lùng.
MrDuk

11

MATL , 7 byte

2XN!dX>

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

2XN  % Take input implicitly. Two-column 2D array with all combinations of 2 elements.
     % Each combination is a row. Elements in each row are in increasing order
!    % Transpose
d    % Difference of the two numbers in each column
X>   % Maximum value. Display implicitly

Hóa ra, đây là ý tưởng giống như trong câu trả lời của Dennis
Luis Mendo

1
À ... Đánh tôi đi!
DJMcMayhem

8

Thạch , 5 byte

Œcḅ-Ṁ

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

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

Œcḅ-Ṁ  Main link. Argument: A (integer array)

Œc     Generate all combinations of two elements of A, in order.
  ḅ-   Convert each pair from base -1 to integer.
       This maps [a, b] to b - a.
    Ṁ  Take the maximum of all computed differences.

IŒṡS€ṀĐộ dài gần như nhau, việc sử dụng quá tệ trước khi tóm tắt đôi khi đưa ra câu trả lời sai ...
FryAmTheEggman

7

Bình thường, 9

eSsM.:-Vt

Dùng thử tại đây hoặc chạy Test Suite .

Tìm sự khác biệt liên tiếp giữa mỗi phần tử, sau đó tìm từng chuỗi con của mảng đó. Cuối cùng, tổng hợp các phần tử và trả về giá trị cực đại.

Giải trình:

eSsM.:-Vt
eSsM.:-VtQQ   ## Auto-fill variables
      -VtQQ   ## Splat subtraction on each element of zip(Q[1:], Q)
    .:        ## Get all substrings
  sM          ## Sum each list
eS            ## Take the largest number

Tôi đã đề cập rằng thuật toán này hoạt động không hoàn toàn trực quan. Hy vọng ví dụ này sẽ minh họa tại sao thuật toán này hoạt động:

[a, b, c, d]
difference between each element (reversed because of how Pyth does this)
[b-a, c-b, d-c]
"substrings" or each continuous slice
[b-a], [c-b], [d-c], [b-a, c-b], [c-b, d-c], [b-a, c-b, d-c]
sum each
[b-a], [c-b], [d-c], [b-a+c-b], [c-b+d-c], [b-a+c-b+d-c]
simplify
[b-a], [c-b], [d-c], [c-a], [d-b], [d-a]

5

Bình thường, 9

_hS-M.cQ2

Yay pfns!

_hS-M.cQ2

     .cQ2 # generate all 2-elements combinations of Q (argument)
   -M     # map-splat with -: for each combination, substract the elements together
  S       # tort
 h        # take the first
_         # absolute value

Tôi tin _hS-M.cQ2là tương đương.
FryAmTheEggman

@FryAmTheEggman ah, cảm ơn. Bây giờ cố gắng nghĩ làm thế nào tôi có thể đảo ngược -trật tự đối số ... vì tôi phải sử dụng _hSvà không thể sử dụngeS
Ven

4

PowerShell v2 +, 58 byte

param($n)($n|%{($n[++$i..$n.count]|sort)[-1]-$_}|sort)[-1]

Đưa đầu vào $n, ống từng phần tử thành một vòng lặp |%{...}. Mỗi lần lặp, chúng tôi cắt $ndựa trên mức tăng ++$itrước đến cuối của mảng đầu vào |sort, và lấy cực đại [-1], sau đó trừ phần tử hiện tại $_. Chúng tôi sau đó |sorttất cả những khác biệt, và một lần nữa lấy tối đa [-1].

Loại bỏ một lỗi chỉ mục mảng dài, bởi vì chúng tôi cố gắng vượt qua phần cuối của mảng. Nhưng, vì STDERR bị bỏ qua theo mặc định , chúng tôi không quan tâm.


4

JavaScript (ES6), 57 54 byte

a=>(m=Math.max)(...a.map((x,i)=>m(...a.slice(i+1))-x))

Trong JavaScript, dễ dàng hơn để lấy tối đa phần còn lại của mảng và trừ phần tử hiện tại. (Trong trường hợp phần tử cuối cùng, kết quả sẽ vẫn là -Infality.) Chỉnh sửa: Đã lưu 3 byte nhờ @CharlieWynn.


Tôi nghĩ (M = Math.max) và sử dụng M sau này sẽ giúp bạn tiết kiệm 3 byte
Charlie Wynn

@CharlieWynn Cảm ơn, tôi chỉ thử with(không giúp được gì trong trường hợp này).
Neil

3

J, 21 byte

[:>./@;i.@#<@{."_1-/~

Lấy một mảng các giá trị làm đối số và trả về kết quả.

Giải trình

[:>./@;i.@#<@{."_1-/~  Input: p
                  -/~  Make a table of all differences between every pair
          #            Get the count of values in p
       i.@             Create a range [0, 1, ..., len(p)-1]
             {."_1     Take that many values from each row of the table
           <@          Box each row of selected values
[:    ;                Unbox and concatenate them
  >./@                 Reduce it by the max and return

2

Java, 141 byte

a->java.util.stream.IntStream.range(0,a.size()-1).map(i->a.subList(i+1,a.size()).stream().reduce(Math::max).get()-a.get(i)).max().getAsInt();

Lambda chấp nhận một ArrayList và trả về một Integer.

Mã không hợp lệ với các trường hợp thử nghiệm:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Function;
import java.util.stream.IntStream;

class Test {

    public static void main(String[] args) {
        Function<ArrayList<Integer>, Integer> f = a -> IntStream
            .range(0, a.size()-1)
            .map(i -> a.subList(i+1, a.size()).stream().reduce(Math::max).get() - a.get(i))
            .max()
            .getAsInt();

        System.out.println(f.apply(new ArrayList<>(Arrays.asList(1,2,3,4,5))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(1,99,2,105))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(99,1,99,100))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(99,1,1,2,1,3))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(5,4,3,3,1))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(5,4,3,1))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(5,2,1))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(5,4,1))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(55,45,20,1))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(5,1))));
        System.out.println(f.apply(new ArrayList<>(Arrays.asList(10,7,5,1))));
    }
}

Theo như tôi biết, Java không có cách nào để mong đợi trong một luồng và thao tác với phương thức mà luồng được tạo ra tạo ra kết quả lạ. Vì vậy, làm a.remove(0)trong một bản đồ khủng khiếp phá vỡ dòng.


1

VBA, 154

Lấy đầu vào trong cột A bắt đầu bằng A1, đầu ra ở C1. Phải được chạy với ô cuối cùng trong A được chọn. Lưu ý rằng Excel tự động thêm khoảng trắng giữa các thuật ngữ trong VBA, nếu không, điều này có thể được đánh gôn thêm.

Sub s
i = Selection.Row
r = "B1:B" + i-1
Range(r).FormulaArray = "MAX(A2:A$" + i + "-A1)"
Range(r).FillDown
Range("C1").Formula = "MAX(" + r + ")"
End Sub

1

Java, 116

Một giải pháp java khác, tôi đã sử dụng giải pháp này để chứng minh rằng, các luồng có thể trông đẹp, nhưng không phải lúc nào cũng hữu ích cho việc chơi golf.

int a(int[]a){int t,d=a[1]-a[0],i,j,l=a.length;for(i=0;i<l;i++)for(j=i+1;j<l;j++){t=a[j]-a[i];d=d<t?t:d;}return d;}

có rất nhiều không gian để cải tiến trong giải pháp này


1

Clojure, 99 byte

(fn[x](apply max(map #(-(apply max(% 1))(apply min(% 0)))(map #(split-at % x)(range 1(count x))))))

Chia nhỏ danh sách đầu vào ở vị trí đầu tiên rồi thứ hai, v.v., vì vậy chúng tôi nhận được một danh sách trông như thế này:

[[[n1][n2 ... nk]][[n1 n2][n3 ... nk]]...[[n1...n(k-1)][nk]]]sau đó cho mỗi cặp trừ tối thiểu các phần tử đầu tiên từ max của phần tử thứ hai và sau đó tìm max từ chúng. Sẽ ngắn hơn nếu Clojure min maxđang thực hiện các chuỗi thay vì bất kỳ số lượng đối số.

Xem trực tuyến: https://ideone.com/b2nllT


1

hồng ngọc, 52 byte

->a{b=[];(x=a.pop;b+=a.map{|v|x-v})while a[0];b.max}

bật giá bán có thể và nhìn vào tất cả các trước đó để tìm kiếm lợi nhuận. Sau đó nhận được lợi nhuận tối đa.


1

C, 101 99 byte

int i,j,m,h;int f(int*a){m=1<<31;for(;a[i];i++){for(j=i+1;a[j];h=a[j++]-a[i],m=h<m?m:h);}return m;}

Đầu vào: mảng kết thúc null. Ví dụ: {1,2,3,4,5,0}
Kết quả: trả về kết quả tốt nhất

Bạn có thể lưu 8 byte ( tổng cộng 93 91) nếu bạn không bao giờ muốn mất tiền:

int i,j,m,h;int f(int*a){for(;a[i];i++){for(j=i+1;a[j];h=a[j++]-a[i],m=h<m?m:h);}return m;}

1

R, 58 44 byte

max(unlist(sapply(seq(y<-scan()),diff,x=y)))

vô dụng

y=scan()                #input
s=1:length(y)           #sequence of same length from 1
l = sapply(s,diff,x=y)  #applies the function diff to each 'lag' in sequence s
                        #and differencing on y
max(unlist(l))          #reforms as vector and finds maximum

EDIT: thay đổi chức năng. bản gốc dưới đây.

f=function(x)max(max(x[-1]-x[1]),if(length(x)-2)f(x[-1]))

hoặc, nếu bạn sẵn sàng đưa ra một loạt các thông báo cảnh báo, hãy loại bỏ -2 sau độ dài, với 56 byte.

f=function(x)max(max(x[-1]-x[1]),if(length(x))f(x[-1]))

Và nếu bạn cảm thấy không giao dịch và mất tiền khi đó là khả năng duy nhất, bạn có thể xuống tới 52

f=function(x)max(max(x-x[1]),if(length(x))f(x[-1]))

f=không cần thiết
NoOneIsHere

@NoOneIsĐược đệ quy sẽ không hoạt động nếu không có nó. Tôi có thể sử dụng Recall, nhưng nó nhặt được nhiều chữ hơn tôi mất.
dùng5957401

Ồ xin lỗi. Tôi luôn nhớ đệ quy.
NoOneIsHere
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.