재고 시간 기계


35

재고 시간 기계

tomorrowStocksNASDAQ에서 선호하는 비즈니스의 주가가 포함 된 데이터 세트에 액세스 할 수 있습니다. 이 데이터 세트는 개봉 후 분 단위로 색인이 생성 된 컨테이너입니다. 각 지수는 당시 주식의 가격을 포함합니다.

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

산출

당신의 작업은의 최선의 결과를 결정하는 것입니다 1 purchase1 sale의를 1 stock주어진 데이터 집합에서.

잡았다

  • 정확히 1 개의 주식을 사고 팔아야합니다.
  • 당신은 살 수 동일한 시간 슬롯에 판매하고 있습니다.
  • 판매 하기 전에 구입해야합니다 .

테스트 데이터

[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

이것은 . 가장 좋아하는 언어로 짧은 답변을 제출하십시오!


11
좋은 첫 질문 인 PPCG에 오신 것을 환영합니다! :)
FryAmTheEggman

출력이 결정 론적이라고 가정 할 수 있습니까 (즉, 결정적으로 가장 우수하고 관계가없는 솔루션이 항상 있습니다)
MayorMonty

1
내가 만들고있는 언어에 대한 통역이 너무 나쁘다 .4 바이트로 해결할 수 있어야하기 때문에 아직 완성되지 않았다 ... 나는 많은 좋은 질문을 놓치지 않도록 최대한 빨리 끝내야한다!
Steven H.

1
@SpeedyNinja 이것은 실제로 테스트 사례에 있습니다. 테스트 케이스에서 [5,4,3,1]할 수 있습니다 중 하나지만위한 5및 판매에 대한 4또는에 대한 구매 4및 판매를위한 3최적의 결과를 얻을 -1.
Martin Ender

1
@Fawful 나중에 경쟁이 아닌 답변을 추가 할 수 있습니다. 나는 그것을보고 관심을 가질 것이다
CocoaBean

답변:



19

파이썬 2, 46 바이트

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

Ideone에서 테스트하십시오 .

작동 원리

이것은 파이썬 2의 아름답고 복잡한 혼합 유형 비교를 이용하는 재귀 적 접근 방식입니다.

최상의 결과는 첫 번째 요소가 제거 된 첫 번째 요소와 첫 번째 요소가 포함 된 목록의 최대 값의 차이 또는 첫 번째 요소와 관련되지 않은 다른 차이입니다.

x.pop(0)( x 에서 영구적으로 제거 하는) 첫 번째 요소를 추출한 후 계산 x.pop(0)-max(x)합니다. 이 차이에는 "잘못된"부호가 있습니다.

업데이트 된 목록 x에 여전히 두 개 이상의 요소가 포함 된 경우 x[1:]비어 있지 않은 목록을 생성하고 and이를 재귀 호출의 음수 ()로 바꿉니다 -f(x). 계속할 요소가 너무 적 으면 x[1:]and-f(x)빈 목록으로 평가됩니다.

최대 결과를 선택하기 위해 재귀 호출의 차이와 최소값최소화 합니다 (또는 []). 모든 정수 엄격 미만이기 때문에 [], min바로 하나 인 경우 단순히 왼쪽 인자를 반환합니다 [].

마지막으로 단항 빼기 -계산 결과의 부호를 수정합니다.


이상하게 아름답습니다.
MrDuk


8

젤리 , 5 바이트

Œcḅ-Ṁ

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

Œ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€Ṁ거의 같은 길이, 때로는 합산하기 전에 사용하는 것이 너무 나쁘다. 때때로 잘못 대답한다.
FryAmTheEggman

7

피스, 9

eSsM.:-Vt

여기에서 시도 하거나 테스트 스위트를 실행 하십시오 .

각 요소 간의 연속적인 차이점을 찾은 다음 해당 배열의 각 하위 문자열을 찾습니다. 마지막으로 요소를 합산하고 최대 값을 반환합니다.

설명:

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

이 알고리즘이 작동하는 것은 전적으로 직관적이지 않다고 언급되었습니다. 이 예제가이 알고리즘이 작동하는 이유를 설명하기를 바랍니다.

[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

피스, 9

_hS-M.cQ2

예 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

나는 _hS-M.cQ2동등 하다고 생각 합니다.
FryAmTheEggman

@FryAmTheEggman 아, 감사합니다. 이제 -내가 사용 _hS하고 사용할 수 없기 때문에 인수 순서를 어떻게 바꿀 수 있을지 생각하려고eS
Ven

4

PowerShell v2 +, 58 바이트

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

입력을 받아서 $n각 요소를 루프로 파이프합니다 |%{...}. 반복 할 때마다 입력 배열의 끝까지 $n미리 증분 된 값 ++$i을 기준으로 슬라이스 |sort하고 최대 값 [-1]을 취한 다음 현재 요소를 뺍니다 $_. 우리는 그 |sort모든 차이점을 다시 한번 최대한 활용 [-1]합니다.

우리는 배열의 끝을 지나서 슬라이스하려고하기 때문에 자세한 배열 인덱스 오류를 던져냅니다. 그러나 STDERR은 기본적으로 무시 되므로 걱정하지 않습니다.


4

자바 스크립트 (ES6), 57 54 바이트

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

JavaScript에서는 나머지 배열을 최대한 활용하고 현재 요소를 빼는 것이 더 쉽습니다. (마지막 요소의 경우 결과는 여전히 -Infinity입니다.) 편집 : @CharlieWynn 덕분에 3 바이트가 저장되었습니다.


나는 (M = Math.max) 생각하고 나중에 M을 사용하면 3 바이트를 절약 할 수있다
Charlie Wynn

@CharlieWynn 감사합니다, 나는 시도했지만 with(이 경우에는 도움이되지 않습니다).
Neil

3

J, 21 바이트

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

값의 배열을 인수로 사용하여 결과를 반환합니다.

설명

[:>./@;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

자바, 141 바이트

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();

람다는 ArrayList를 허용하고 정수를 반환합니다.

테스트 사례가 포함 된 ungolfed 코드 :

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

내가 아는 한, Java에는 스트림을 기대할 수있는 방법이 없으며 스트림이 생성되는 방법을 조작하면 이상한 결과가 발생합니다. 따라서 a.remove(0)지도 안에서하는 것은 끔찍한 흐름을 끊습니다.


1

VBA, 154

A1부터 시작하여 A 열의 입력을 받아 C1으로 출력합니다. A의 마지막 셀을 선택한 상태에서 실행해야합니다. Excel은 VBA에서 용어 사이에 공백을 자동으로 추가합니다.

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

자바, 116

또 다른 Java 솔루션은 스트림을 멋지게 보일 수는 있지만 항상 골프에 유용한 것은 아니라는 것을 증명하기 위해이 솔루션을 사용했습니다.

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

이 솔루션을 개선 할 공간이 많이 있습니다


1

클로저, 99 바이트

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

입력 목록을 첫 번째 위치에서 두 번째 등으로 나누면 다음과 같은 목록이 나타납니다.

[[[n1][n2 ... nk]][[n1 n2][n3 ... nk]]...[[n1...n(k-1)][nk]]]그런 다음 각 쌍에 대해 두 번째 요소의 최대 값에서 첫 번째 요소의 최소값을 빼고 최대 값을 찾습니다. Clojure가 min max여러 개의 인수가 아닌 시퀀스를 취하는 경우 더 짧을 것입니다.

온라인으로보십시오 : https://ideone.com/b2nllT


1

루비, 52 바이트

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

가능한 판매 가격을 팝하고 이전의 모든 것을 살펴보고 이익을 찾습니다. 그런 다음 최대 이익을 얻습니다.


1

C, 101 99 바이트

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

입력 : 널 종료 배열. 예 : {1,2,3,4,5,0}
출력 : 최상의 결과를 반환

돈을 잃고 싶지 않다면 8 바이트 ( 93 91 총)를 절약 할 수 있습니다 .

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 바이트

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

언 골프

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

편집 : 기능이 변경되었습니다. 아래의 원본.

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

또는 많은 경고 메시지를 기꺼이 감추려면 56 바이트 길이의 -2를 제거하십시오.

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

그리고 그것이 유일한 가능성 일 때 거래하지 않고 돈을 잃고 싶지 않다면, 52 세로 떨어질 수 있습니다

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

f=필요하지 않습니다.
NoOneIsHere 여기

@NoOneIs 여기서는 재귀가 작동하지 않습니다. 리콜을 사용할 수는 있지만 잃어버린 것보다 더 많은 글자를받습니다
user5957401

미안 나는 항상 재귀를 그리워합니다.
NoOneIsHere 여기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.