เครื่องสต็อกเวลา


35

เครื่องสต็อกเวลา

คุณได้รับการเข้าถึงชุดข้อมูลtomorrowStocksซึ่งมีราคาหุ้นจากธุรกิจที่คุณชื่นชอบใน NASDAQ ชุดข้อมูลนี้เป็นคอนเทนเนอร์ที่จัดทำดัชนีโดยการเปิดผ่านมาไม่กี่นาที แต่ละดัชนีมีราคาของหุ้นในเวลานั้น

// 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 purchaseและ1 saleของ1 stockจากชุดข้อมูลที่ได้รับ

gotchas

  • คุณต้องซื้อและขาย 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

คำตอบ:


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ยังคงมีอย่างน้อยสององค์ประกอบx[1:]มีผลเป็นรายการที่ไม่ว่างเปล่าและandแทนที่มันด้วยเชิงลบของการโทร recursive -f(x)การคำนวณ เมื่อมีองค์ประกอบน้อยเกินไปที่จะดำเนินการต่อให้x[1:]and-f(x)ประเมินเป็นรายการที่ว่างเปล่า

ในการเลือกผลลัพธ์สูงสุดเราใช้ความแตกต่างขั้นต่ำและค่าลบของการโทรซ้ำ (หรือ[]) ตั้งแต่จำนวนเต็มทุกอย่างเคร่งครัดน้อยกว่า[], ก็จะกลับมาโต้แย้งซ้ายถ้าหนึ่งที่เหมาะสมคือmin[]

ในที่สุด unary ลบลบ-เครื่องหมายของผลลัพธ์ที่คำนวณได้


นี่คือสิ่งที่สวยงามแปลก
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 อ่าขอบคุณ ตอนนี้พยายามคิดว่าฉันจะกลับ-คำสั่งโต้แย้งได้อย่างไร ... เนื่องจากฉันต้องใช้_hSและไม่สามารถใช้งานได้eS
Ven

4

PowerShell v2 +, 58 ไบต์

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

จะเข้าท่อแต่ละองค์ประกอบเข้ามาในวง$n |%{...}แต่ละซ้ำเรา Slice $nบนพื้นฐานก่อนเพิ่มขึ้น++$iไปยังจุดสิ้นสุดของอาร์เรย์การป้อนข้อมูล|sortที่และใช้เวลาสูงสุดแล้วลบองค์ประกอบปัจจุบัน[-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) แก้ไข: บันทึก 3 ไบต์ด้วย @CharlieWynn


ฉันคิดว่า (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

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 และส่งคืนจำนวนเต็ม

รหัส 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

รับอินพุตในคอลัมน์ A เริ่มต้นที่ A1 เอาต์พุตใน 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))))))

แยกรายการอินพุตที่ตำแหน่งแรกจากนั้นเป็นลำดับที่สองเป็นต้นเราจึงได้รายการที่มีลักษณะดังนี้:

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

อินพุต: อาร์เรย์สิ้นสุดด้วย null เช่น {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)))

ungolfed

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]))

และถ้าคุณรู้สึกว่าไม่ค้าขายและสูญเสียเงินเมื่อเป็นไปได้เพียงอย่างเดียวคุณสามารถลดได้ถึง 52

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

f=ไม่จำเป็น
NoOne อยู่ที่นี่

@NoOneIs การเรียกซ้ำที่นี่จะไม่ทำงานหากไม่มี ฉันสามารถใช้ Recall ได้ แต่จะหยิบจดหมายมากกว่าที่แพ้
user5957401

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