ストックタイムマシン


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

出力が決定論的であると仮定できますか(つまり、常に最良の1つのソリューションがあり、関係がない)
MayorMonty

1
私が構築している言語のインタープリターは、4バイトでこれを解決できるはずなので、まだ完成していません...多くの良い質問を見逃すことができないように、できるだけ早く終了する必要があります!
スティーブンH.

1
@SpeedyNinjaこれは実際にテストケースにあります。テストケースで[5,4,3,1]は、最適な結果を得るために、for 5とsell for 4またはbuy for 4とsellのいずれかを行うことができます。3-1
マーティンエンダー

1
@Fawful後で非競合として回答を追加できます。私は間違いなくそれを見ることに興味があるでしょう
CocoaBean

回答:


14

05AB1E、4バイト

FryAmTheEggmanのアプローチを使用します。コード:

¥ŒOà

説明:

¥     # 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.

CP-1252エンコードを使用します。オンラインでお試しください!


2
Dammit 4つのゴルフ言語を試してみたが、05AB1Eを忘れた。それは次回のために私を学びます:P
FryAmTheEggman

19

Python 2、46バイト

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

Ideoneでテストします。

使い方

これは、Python 2の見栄えの悪い混合型の比較を利用する再帰的なアプローチです。

最良の結果は、最初の要素が削除されたリストの最大値とその最初の要素の差、または最初の要素を含まない別の差です。

x.pop(0)xから永久に削除する)で最初の要素を抽出した後、を計算しx.pop(0)-max(x)ます。この違いには「間違った」サインがあることに注意してください。

更新されたリストxに少なくとも2つの要素が含まれている場合、x[1:]空でないリストが生成され、andそれをとして計算された再帰呼び出しの否定で置き換え-f(x)ます。続行するには要素が少なすぎるx[1:]and-f(x)と、空のリストに評価されます。

最大の結果を選択するために、差の最小値と再帰呼び出し(または[])の負を取ります。すべての整数は厳密に未満であるため[]min右側のものがの場合、単に左の引数を返し[]ます。

最後に、単項マイナス-は計算結果の符号を修正します。


これは奇妙に美しいです。
MrDuk

11

MATL、7バイト

2XN!dX>

オンラインでお試しください!または、すべてのテストケースを確認します

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

結局のところ、これはデニスの答え
ルイスメンド

1
ああ...打ち負かして!
DJMcMayhem

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

Pyth、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

Pyth、9

_hS-M.cQ2

やったー

_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ああ、ありがとう。今、私は逆の可能性がどのように考えるようにしようと-、私が使用する必要があるため...」sの引数の順序を_hSして使用することはできませんeS
ヴェン

4

PowerShell v2 +、58バイト

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

入力を受け取り$n、各要素をループにパイプします|%{...}。各反復では、入力配列の最後まで$n事前にインクリメントさ++$iれたものに基づいてスライスし|sort、maximalを取得してから[-1]、現在の要素を減算します$_。次に|sort、これらの違いをすべて調べ、再び最大値を取り[-1]ます。

配列の末尾を超えてスライスしようとするため、冗長な配列インデックスエラーを破棄します。ただし、STDERRはデフォルトは無視されるため、気にしません。


4

JavaScript(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バイト節約されると思います
チャーリーウィン

@CharlieWynnありがとう、私は試しただけでしたwith(この場合は役に立ちません)。
ニール

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

Java、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を受け入れ、整数を返します。

テストケース付きのゴルフを解かれたコード:

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

Java、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

Clojure、99バイト

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

入力リストを最初の位置で分割し、次に2番目の位置で分割します。したがって、次のようなリストを取得します。

[[[n1][n2 ... nk]][[n1 n2][n3 ... nk]]...[[n1...n(k-1)][nk]]]次に、各ペアについて、最初の要素の最小値を2番目の要素の最大値から減算し、それらから最大値を見つけます。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]))

または、大量の警告メッセージに耐える場合は、長さの後に-2を削除し、56バイトにします。

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

そして、それが唯一の可能性であるときに、取引をせず、お金を失うことを望まない場合、

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

f=必要ありません。
NoOneIsHere

@NoOneIsHere再帰はそれなしでは機能しません。Recallを使用できますが、失うよりも多くの文字をピックアップします。
user5957401 16

あ、ごめんなさい。私はいつも再帰を欠場しています。
NoOneIsHere
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.