CodeGolf - Barry นักพัฒนาที่ยุ่งเหยิง # 2


11

นี่คือการติดตามของ CodeGolf - ละเว้นเสียง # 1 ปัญหาเดียวที่ Barry ทำสิ่งเลวร้ายยิ่งสำหรับเรา ให้ดูว่าเกิดอะไรขึ้น

ปรับปรุง

ฉันได้เพิ่มโค้ดเพื่อสร้างอินพุตแบบสุ่มและเอาต์พุตที่คาดไว้เพราะฉันอธิบายความต้องการของฉันไม่ดีและฉันเดาว่าบางครั้งคำอาจทำให้เข้าใจผิดมากกว่ารหัส (ไม่ใช่หรือเปล่า?)

ลักษณะ

วิธีการในอีกใบ้คอร์ป API 's ช่วยให้เราราคาปัจจุบันผู้ให้บริการจะให้เราสำหรับรายการราคาที่ดีที่สุดที่เราจะทำยอดขายสูงสุดและมีแนวโน้มของราคาที่เมื่อเทียบกับราคาก่อนหน้านี้เป็นสตริงหรือUP DOWNเราจำเป็นต้องตัดสินใจว่าควรลบรายการออกจากร้านค้าหรือรอ

อินพุต

80,90,UP
150,100,DOWN
65,65,UP
1618,1618,DOWN
840,1200,DOWN
54,12,UP
30,1,UP

สำหรับการสาธิตตัวอย่างอินพุตขนาดใหญ่ที่มีเอาต์พุตที่คาดหวังให้ใส่โค้ดต่อไปนี้ (js) ในคอนโซลเบราว์เซอร์ของคุณและควรเอาต์พุตอินพุตสุ่มที่ถูกต้องสำหรับการทดสอบ

var output = "";
var result = "";

for(i=10;i--;){
  var currentPrice = Math.floor(Math.random() * 10000) + 1;
  var optimalPrice = Math.floor(Math.random() * 10000) + 1;
  var tendency = Math.round(Math.random())?"UP":"DOWN";
  var tresult = "WAIT\n";

  if((currentPrice > optimalPrice && tendency == "UP") ||
     (currentPrice < optimalPrice && tendency == "DOWN")){
       tresult = "STOP\n";
     }

  output +=currentPrice+","+optimalPrice+","+tendency+"\n";
  result +=tresult;
}
console.log(output);
console.log(result);

และเช่นเคยเราจะมีตัวแปรGเป็นอินพุตของเราอย่างไรก็ตามหากภาษาของคุณทำให้ง่ายขึ้นสำหรับคุณที่จะอ่านอินพุตก็ง่ายเช่นกัน รูปแบบคงที่และทำตามรูปแบบint,int,string

ผลลัพธ์ที่ต้องการ

คุณเป็นสมองของการดำเนินการนี้ Barry ควรทำการคำนวณนี้บนเซิร์ฟเวอร์ แต่เราไม่สามารถไว้ใจเขาได้อย่างที่คุณควรรู้ คุณจำเป็นต้องเอาท์พุทWAITหากแนวโน้มเป็นไปในราคาที่เหมาะสมหรือSTOPหากแนวโน้มมีแนวโน้มลดลง

ในคำอื่น ๆ ที่มีความ80,90,UPเป็น input เรารู้ว่ามีผลิตภัณฑ์ที่มีราคาปัจจุบันของ 80 และราคาที่ดีที่สุดของ 90 WAITมีแนวโน้มที่จะเพิ่มขึ้นดังนั้นเราจึงควร ในทางกลับกัน840,1200,DOWNหมายถึงราคาผลิตภัณฑ์กำลังลดลงและราคาที่เหมาะสมของเราสูงกว่าดังนั้นเราควรหยุดการขาดทุนโดยการส่งSTOPออก

หากราคาทั้งสองเท่ากันให้ผลลัพธ์WAITโดยไม่คำนึงถึงแนวโน้ม

แต่ละผลิตภัณฑ์ในบรรทัดใหม่คำเดียวต่อบรรทัด:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

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


ข้อมูลการทดสอบของคุณไม่มีประโยชน์มากหากไม่มีผลลัพธ์ที่คาดหวัง
ไม่ใช่ว่า Charles

@ NotthatCharles: ฉันค่อนข้างแน่ใจว่าบล็อกในส่วนผลลัพธ์ที่ต้องการของโพสต์นั้นเป็นผลลัพธ์ที่คาดหวังจากข้อมูลการทดสอบในส่วนอินพุต
Alex A.

ฉันหมายถึง "ตัวอย่างอินพุตขนาดใหญ่"
ไม่ใช่ว่า Charles

ฉันรู้แล้วว่ามันไม่เป็นประโยชน์จริง ๆ ปรับปรุงรหัสเพื่อให้ผลลัพธ์ที่คาดหวัง
Juan Cortés

5
มีเหตุผลใดบ้างที่คุณต้องการให้คะแนนตัวละคร? ค่าเริ่มต้นแถวนี้คือไบต์ (ในการเข้ารหัสที่มีอยู่ในตัวเลือกของผู้เข้าร่วม) ด้วยตัวละครที่คุณเพิ่งได้รับคนบีบอัดรหัสของพวกเขาโดยการเข้ารหัสในตัวอักษร Unicode และสิ่งต่าง ๆ เช่นนั้น (ไม่ว่าคุณจะเลือกแบบไหนอย่าเปลี่ยนมันสำหรับความท้าทายในตอนนี้ แต่คุณอาจต้องคำนึงถึงความท้าทายในอนาคต)
Martin Ender

คำตอบ:


6

CJam, 31 29 27 ตัวละคร

"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~

นี่เป็นเพียงรุ่นที่เข้ารหัสของรหัสต่อไปนี้ (เพื่อใช้ประโยชน์จากการให้คะแนนโดยตัวละคร):

r{',/:~3<)(f*~<"STOP""WAIT"?Nr}h

เรียกใช้กรณีทดสอบทั้งหมดที่นี่

อาจมีวิธีการย่อให้สั้นลงโดยการเข้ารหัสSTOPและWAITแต่ฉันมีความสุขมากกับส่วนที่เหลือ

คำอธิบาย

รหัสถูกล้อมรอบด้วยการวนรอบที่อ่านบนบรรทัดในเวลาประมวลผลจากนั้นกดขึ้นบรรทัดใหม่และอ่านบรรทัดถัดไป ... การวนรอบสิ้นสุดลงเมื่อrส่งกลับสตริงว่างเปล่า (เช่นหลังจากบรรทัดทั้งหมดได้รับการประมวลผล) นั่นคือบิตนี้:

r{ ... Nr}h

สำหรับการประมวลผลแต่ละบรรทัดฉันใช้ประโยชน์จากความจริงที่ว่าตัวอักษรตัวพิมพ์ใหญ่เป็นตัวแปรใน CJam ดังนั้นฉันจึงสามารถวิเคราะห์อินพุตบางส่วนได้

',/:~3<)(f*~<"STOP""WAIT"?
',/                        e# Split the input on commas.
   :~                      e# Eval each of the three resulting strings. The first two
                           e# will yield the prices, the third will dump a bunch of
                           e# values corresponding to the variables DNOPUW in the array.
     3<                    e# Truncate to three elements, so we only get the prices and
                           e# the values corresponding to U (0) and D (13).
       )(                  e# Slices off that variable value and decrement it, to get
                           e# something negative for UP and positive for DOWN.
         f*                e# Multiply both numbers by that value. So if we had UP then
                           e# both numbers will be negative now, otherwise they'll just
                           e# be scaled without affecting their relative size.
           ~<              e# Unwrap the array and check which element is larger.
             "STOP""WAIT"? e# Select the desired output string based on this boolean.

ดังนั้นสิ่งที่จับได้คือUPเรากลับด้านขนาดสัมพัทธ์ของราคาเพื่อให้เราสามารถครอบคลุมทุกกรณีด้วยความไม่เท่าเทียมกันครั้งเดียวในตอนท้าย


ฉันขอชี้แจงจาก OP และเขากล่าวว่ารหัสควรทำงานกับอินพุตหลายบรรทัด วิธีที่สั้นที่สุดในการบรรลุเป้าหมายควรเป็นเช่นนี้:"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~
Dennis

@Dennis Ugh ให้คะแนนตัวละคร ... ขอบคุณ
Martin Ender


4

Perl, 77 73 ไบต์

while(<>){@p=split",";print($p[0]<$p[1]and$p[2]=~/D/?"STOP":"WAIT")."\n"}

นี่คือวิธีการทำงาน:

  • while(<>) แยกวิเคราะห์ทุกบรรทัด
  • @p=split","แยกมันด้วยเครื่องหมายจุลภาคทุกตัว มันใช้ตัวดำเนินการเริ่มต้น Perl $_(ซึ่งเป็นที่เก็บสาย)
  • print (ternary) กำหนดสิ่งที่จะพิมพ์
  • $p[0]<$p[1]and$p[2]=~/D/ ถามว่าราคาปัจจุบันต่ำกว่าราคาที่เราต้องการหรือไม่และมันจะลง (โดยตรวจสอบ a)
  • (condition)?(if):(else) เป็นผู้ประกอบการที่สาม
  • หากเงื่อนไขของเราตรงกับก่อนหน้านี้มันจะออกSTOPมา WAITมิฉะนั้นก็จะเอาท์พุท

ฉันสมมติว่าไม่มีการขึ้นบรรทัดใหม่ในการป้อนข้อมูล - WAITอักขระขึ้นบรรทัดใหม่ผลิตพิเศษ

ขอบคุณ Alex A. ที่ช่วยฉันประหยัด 4 ไบต์!


ได้รับมันค่อนข้างนานแล้วตั้งแต่ฉันใช้ Perl แต่มันจะต้องเป็นandอย่างไร คุณสามารถใช้&หรืออะไรก็ได้
Alex A.

@AlexA ฉันไม่แน่ใจว่าทำไม แต่&&มีพฤติกรรมแปลก ๆ ฉันลองใช้มันและมันบอกว่ามี "ไม่ตรงกัน<>"
ASCIIThenANSI

ฮะ. แปลก. โอ้ดี ทางออกที่ดี
Alex A.

คุณสามารถโทรครั้งเดียวprintและทำอะไรได้print((condition)?"STOP":"WAIT")."\n"บ้าง
Alex A.

@AlexA หืมไม่รู้ว่าคุณทำได้ ขอบคุณ!
ASCIIThenANSI


3

R, 95 108

R และสตริงไม่ใช่เพื่อนจริงๆ :)

eval(parse(t=sub("U","<",sub("D",">",gsub("(.*),(.*),(.).*","cat(if(\\1\\3=\\2)'WAIT\n'else'STOP\n')",G)))))

อินพุตคือเวกเตอร์อักขระGจากนั้นเปลี่ยนแต่ละสตริงเป็นifคำสั่งที่ถูกประเมิน

แก้ไขทำให้การตีความกฎของฉันสับสน แก้ไขค่าใช้จ่ายไม่กี่ตัวอักษร

> G=c(
+     '80,90,UP',
+     '150,100,DOWN',
+     '65,65,UP',
+     '1618,1618,DOWN',
+     '840,1200,DOWN',
+     '54,12,UP',
+     '30,1,UP'
+ )
> eval(parse(t=sub("U","<",sub("D",">",gsub("(.*),(.*),(.).*","cat(if(\\1\\3=\\2)'WAIT\n'else'STOP\n')",G)))))
WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP
>

ทำไมสองครั้งสุดท้ายจึงกลับมา "รอ" พวกเขาควรจะให้ "หยุด"
Oebele

@Oebele ฉันเข้าใจผิดกฎ มันไม่ชัดเจนสำหรับราคาในปัจจุบันที่ลดลง จะแก้ไขในไม่ช้า
MickyT

3

Ruby - 89 Chars

G.split.map{|a|b,c,d=a.split(?,);puts (b.to_i>=c.to_i)^(e=d[2])&&(b!=c||e)?'STOP':'WAIT'}

RubyFiddle

ด้วยความช่วยเหลือจากไปยัง bluetorange!


สิ่งนี้ถูกต้องสำหรับกรณีทดสอบใหม่ที่เท่ากันหรือไม่? ฉันยังลองแบบนี้ แต่ก็ล้มเหลวสำหรับกรณีทดสอบอย่างใดอย่างหนึ่ง
Oebele

@Oebele ไม่เห็นว่า ... ไม่แน่ใจว่าพวกเขาจะถูกเพิ่มเข้ามาหลังจากที่เดิมของฉัน แต่ฉันได้เพิ่ม=ตอนนี้ขอบคุณ :)
RichieAHB

เดี๋ยวก่อน - ทำไมตัวฉันถึงใช้วิธีแก้ปัญหาที่ซับซ้อนโดยใช้จำนวนไบต์มากกว่าการเพิ่ม=ซึ่งฉันรู้ว่าเป็นไปได้ด้วย ... ถึงเวลาแก้ไข!
Oebele

บัญชีนี้เป็นกรณี ๆ1618,1618,DOWNหรือไม่?
nderscore

บางทีฉันโง่ แต่ฉันไม่ได้รับรหัสนี้ ดูเหมือนว่าสำหรับแต่ละค่าที่คั่นด้วยเครื่องหมายจุลภาค 3 ของแต่ละบรรทัดมันทำอะไรกับอักขระที่ 1, 2 และ 4 และพิมพ์ WAIT หรือ STOP? การใช้งานa.split.map{..}พิมพ์ 3 WAITหรือSTOPสำหรับแต่ละบรรทัดอินพุต คุณตั้งใจจะทำ ชอบb,c,d=a.split(?,)ไหม นอกจากนี้!b[3][2]จะสั้นกว่าb[3]=='UP'แต่ฉันคิดว่าควรจะเป็นb[2]อย่างไร การเปรียบเทียบสตริงด้วย>=ต้องการความสนใจเหมือน"9">="77"จริง ตัวคั่นบรรทัดอินพุตเริ่มต้นคือ\nดังนั้นคุณสามารถใช้splitโดยไม่มีอาร์กิวเมนต์ จะสั้นกว่า?\n '\n'
blutorange

3

Python 3, 89 84 82 ไบต์

for l in G:a,b,c=l.split(',');print('WSATIOTP'[a==b or(int(a)<int(b))^(c<'U')::2])

คำอธิบาย:

for l in G:                                   #For every line in G:
           a,b,c=l.split(',');                #Split the line into three strings.
                              print()         #Print the contained expression.

'WSATIOTP'                                    #'WAIT' and 'STOP' interleaved.
          [                              ::2] #Select every other character.
                or                            #If either expression is true, pick 'WAIT'
           a==b
                  (             )^(     )     #Select 'WAIT' if exactly one is true.
                   int(a)<int(b)              #If first number < second number.
                                   c<'U'      #If c is 'DOWN'

สนใจที่จะอธิบายหรือไม่
Juan Cortés

@ JuanCortésเพิ่มคำอธิบาย
TheNumberOne

1
สวยฉันรักมัน!
Juan Cortés

2

Matlab, 100 90 ไบต์

ไม่เล็กอย่างที่ฉันต้องการ - โดยเฉพาะการแปลงจากบูลีนเป็นสตริงนั้นยาวมาก ฉันพยายามโกนหนวดออกไปสองสามไบต์โดยเปลี่ยนเป็นอ็อกเทฟ แต่เห็นได้ชัดว่า% c ยังไม่รองรับ textcan ใน Octave

B=textscan(G,'%f,%f,%c%s\n');xor(B{1}>=B{2},B{3}==85);C(a)={'STOP'};C(~a)={'WAIT'};char(C)

โดยส่วนตัวแล้วฉันคิดว่ามันดีที่โซลูชันนี้เป็นโซลูชันเดียวที่ไม่ได้แยก :)

แก้ไข: เดิมแก้ไขสถานการณ์เท่ากับวิธีซับซ้อนเกินไป


นี่เป็นจริง 92 ไบต์ - คุณพลาดa=บิตก่อนการxorเรียกฟังก์ชัน แม้ว่ามันจะไม่ได้ผลลัพธ์ที่ถูกต้องจริงๆ
Tom Carpenter

2

Javascript ECMAScript 6, 112b

var O="";for(let E of G.split("\n"))[A,B,C]=E.split(","),O+=("U"<C||-1)*(A-B)>0?"STOP\n":"WAIT\n";console.log(O)

เฉพาะเบราว์เซอร์ที่ใช้งานร่วมกับ ECMAScript 6 เท่านั้น

คำอธิบาย

("U"<C||-1)*(A-B)>0?"STOP\n":"WAIT\n"

มันทำให้การใช้ความจริงที่ว่าถ้าเราถามว่า 0 เป็นจริงมันจะกลับเท็จดังนั้นเราจึงสามารถพูดได้ 1 UP, -1 DOWNสำหรับ จากนั้นเราก็คูณมันด้วยความแตกต่างของราคาปัจจุบันและราคาที่เหมาะสมที่สุดเพื่อให้ทั้งคู่ทำงานได้มากกว่า 0ส่วน

หากเป็นไปตามเงื่อนไขให้ส่งคืนSTOPมิฉะนั้น (รวมถึงค่าเท่ากัน) จะส่งคืนWAIT

ต้องการเล่นกอล์ฟต่อไป


2

Javascript ( ES6 ), 82 80 79 ไบต์

แก้ไข: -2 โดยใช้วิธีการคูณ @ JuanCortés

แก้ไข: -1 ใช้เคล็ดลับเพื่อลดวิธีการคูณ

alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>(c-o)*~{P:-2}[t]>0?'STOP':'WAIT'))

แสดงความคิดเห็น:

alert(                           // alert final output after replacement
    G.replace(/(.+),(.+),(.)+/g, // capture group for sections of each line
                                 // (.)+ captures only the last character
                                 // . doesn't match newlines, so this runs for each line
        (x,c,o,t)=>              // use a function to calculate each replacement string
            (c - o)              // calculate difference, negative for o>c
            *                    // multiply by
            ~{ P: -2 }[t]        // { P: -2 }[t] returns -2 for UP ('P') -2, else undefined
                                 // ~-2 => 1, ~undefined => -1
            > 0                  // if result > 0 (muplication of negatives or positives)
            ? 'STOP' : 'WAIT'    // return corresponding replacement string
    )
)

ตัวอย่างการสาธิต:

function run(){
    G = input.value;
    /* start solution */
    alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>(c-o)*~{P:-2}[t]>0?'STOP':'WAIT'))
    /* end solution */
}
<textarea id="input" cols="25" rows="7">80,90,UP
150,100,DOWN
65,65,UP
1618,1618,DOWN
840,1200,DOWN
54,12,UP
30,1,UP</textarea><br />
<button id="run" onclick="run();">Run</button>

ประวัติการแก้ไข:

// 80
alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>(c-o)*(t>'N'||-1)>0?'STOP':'WAIT'))

// 82
alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>+c>o&t>'N'|+c<o&t<'P'?'STOP':'WAIT'))

สนใจที่จะอธิบายตรรกะ? ดูดี แต่ฉันไม่รู้ว่าเกิดอะไรขึ้น
Juan Cortés

@ JuanCortésฉันได้เพิ่มความเห็นแล้ว :)
nderscore

ไชโย! ที่ฉันเข้าใจ
Juan Cortés

2

C- 91 ไบต์

เพราะ C จะต้องอยู่ที่นั่นที่ไหนซักแห่ง

ตอนนี้ดูคล้ายกับรุ่น @nutki มาก แต่ถึงจะออกว่า "STOP" หรือ "WAIT" จะต่างกัน

Ungolfed-

main(i,j)
{
    char c[5];
    while(scanf("%i,%i,%s",&i,&j,c)+1)
        puts((j-i)*(*c-70)<0?"STOP":"WAIT");
}

Golfed-

 main(i,j){char c[5];while(scanf("%i,%i,%s",&i,&j,c)+1)puts((j-i)*(*c-70)<0?"STOP":"WAIT");}

อันเก่า ๆ

Ungolfed-

int main()
{
    int i,j;
    char *c="";
    while(scanf("%i,%i,%s",&i,&j,c)+1)
    {
        if(i<j)
        {
            if(*c-68)
                printf("WAIT\n");
            else
                printf("STOP\n");
        }
        if(i>j)
        {
            if(*c-68)
                printf("STOP\n");
            else
                printf("WAIT\n");
        }
        if(i==j)
            printf("WAIT\n");
    }
    return 0;
}

Golfed

#define W printf("WAIT\n");
#define S printf("STOP\n");
int main(){int i,j;char *c="";while(scanf("%i,%i,%s",&i,&j,c)+1){if(i<j){if(*c-68)W else S}if(i>j){if(*c-68)S else W}if(i==j)W}return 0;}

ฉันจะพยายามลดมันต่อไป


รหัสนี้จะผิดพลาด คุณต้องการchar c[4]แทนchar *c=""(ซึ่งสั้นกว่าเช่นกัน)
nutki

@ nutki ที่จริงแล้วมันเป็นพฤติกรรมที่ไม่ได้กำหนด ความผิดพลาดไม่จำเป็นต้องเกิดขึ้น
Spikatrix

@CoolGuy เขียน 5 ไบต์ไปยังตำแหน่งแบบอ่านอย่างเดียว 1 ไบต์ มีระบบที่จะไม่ใช้ segfault หรือไม่?
nutki

@ nutki - เห็นได้ชัดว่า Windows PC ของฉันทำงานได้ดี!
euanjt

@ nutki เห็นไหม? ระบบของ TheE ไม่ได้ส่งสัญญาณ Segfault มันเป็นพฤติกรรมที่ไม่ได้กำหนด อาจทำงานบนระบบใดระบบหนึ่ง แต่จะไม่ทำงานในอีกระบบหนึ่ง สิ่งที่สามารถเกิดขึ้นได้ แต่ใครจะสนล่ะ? นี่คือรหัสกอล์ฟดังนั้นโปรแกรมเพียงต้องการ "ทำงาน" :) BTW ไม่ควรจะเป็นchar c[5]( \0ตอนท้าย1 ช่องว่าง)?
Spikatrix

1

Python 3 - 108 106 102 97B

for l in G:a,b,c=l.split(',');s=int(a)-int(b);d=c<'E';print(['WAIT','STOP'][(s<0)*d+(s>0)*(1-d)])

กำลังดำเนินการ ...

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