CodeGolf - Barry nhà phát triển lộn xộn # 2


11

Đây là phần tiếp theo của CodeGolf - Bỏ qua tiếng ồn # 1 , vấn đề duy nhất là Barry đã khiến mọi thứ trở nên tồi tệ hơn đối với chúng tôi. Hãy xem những gì đã xảy ra

Cập nhật

Tôi đã thêm mã để tạo đầu vào ngẫu nhiên và đầu ra dự kiến ​​vì tôi không giỏi trong việc giải thích những gì tôi muốn và tôi đoán rằng đôi khi các từ dễ gây hiểu lầm hơn mã (không phải lúc nào cũng vậy?)

Sự miêu tả

Một phương pháp khác trong API của Dumb Corp cung cấp cho chúng tôi mức giá hiện tại mà nhà cung cấp đang cung cấp cho chúng tôi cho một mặt hàng, mức giá tối ưu mà chúng tôi sẽ bán tối đa và xu hướng của giá đó so với giá trước đó là một chuỗi UPhoặc DOWN. Chúng tôi cần phải quyết định xem chúng tôi nên loại bỏ các mặt hàng từ các cửa hàng hoặc chờ đợi.

Đầu vào

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

Đối với bản demo mẫu đầu vào lớn với đầu ra dự kiến, hãy đặt mã sau (js) trong bảng điều khiển trình duyệt của bạn và nó sẽ xuất đầu vào ngẫu nhiên hợp lệ để thử nghiệm.

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

Như mọi khi, chúng tôi sẽ có một biến Glà đầu vào của chúng tôi, tuy nhiên nếu ngôn ngữ của bạn giúp bạn dễ dàng đọc đầu vào hơn, điều đó cũng tốt. Định dạng không đổi và tuân theo định dạngint,int,string

Sản phẩm chất lượng

Bạn là bộ não của hoạt động này, Barry nên thực hiện phép tính này trên máy chủ, nhưng chúng tôi không thể tin tưởng anh ta như bạn nên biết. Bạn cần đầu ra WAITnếu xu hướng hướng tới mức giá tối ưu, hoặc STOPnếu xu hướng hướng tới mất.

Nói cách khác, với 80,90,UPđầu vào là, chúng ta biết rằng có một sản phẩm có giá hiện tại là 80 và giá tối ưu là 90 với xu hướng tăng lên, vì vậy chúng ta nên WAIT. Mặt khác, 840,1200,DOWNcó nghĩa là giá sản phẩm đang đi xuống và giá tối ưu của chúng tôi cao hơn, vì vậy chúng tôi nên dừng lỗ bằng cách xuất ra STOP.

Nếu hai giá là giống nhau, sản lượng WAITbất kể xu hướng.

Mỗi sản phẩm trong một dòng mới, một từ trên mỗi dòng:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

Xin vui lòng, khi có thể, cung cấp một cách để xác minh rằng mã của bạn đang hoạt động vì tất cả chúng ta không thể biết chỉ bằng cách nhìn vào cú pháp. Như mọi khi, hãy sử dụng càng ít ký tự càng tốt và hãy nhớ rằng bạn không nhất thiết phải cạnh tranh với các ngôn ngữ khác, việc bạn cạnh tranh với các ngôn ngữ có cú pháp tương tự


Dữ liệu thử nghiệm của bạn không hữu ích lắm mà không có kết quả như mong đợi.
Không phải Charles

@NotthatCharles: Tôi khá chắc chắn rằng khối trong phần Đầu ra mong muốn của bài đăng là kết quả mong đợi của dữ liệu thử nghiệm trong phần Đầu vào.
Alex A.

Ý tôi là "mẫu đầu vào khổng lồ"
Không phải Charles

Tôi nhận ra rằng nó không thực sự hữu ích, đã cập nhật mã để cung cấp đầu ra dự kiến.
Juan Cortés

5
Có bất kỳ lý do tại sao bạn thích ghi điểm trong các nhân vật? Mặc định ở đây là byte (trong một mã hóa hiện có của sự lựa chọn của người tham gia). Với các ký tự, bạn chỉ cần mọi người nén mã của họ bằng cách mã hóa nó bằng các ký tự Unicode và những thứ tương tự. (Dù lựa chọn của bạn là gì, đừng thay đổi nó cho thử thách này ngay bây giờ, nhưng bạn có thể muốn ghi nhớ nó cho những thách thức trong tương lai.)
Martin Ender

Câu trả lời:


6

CJam, 31 29 27 ký tự

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

Đây chỉ là phiên bản được mã hóa của đoạn mã sau (để sử dụng tính điểm theo ký tự):

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

Chạy tất cả các trường hợp thử nghiệm ở đây.

Có thể có một cách để rút ngắn điều này bằng cách mã hóa STOPWAIT, nhưng tôi khá hài lòng với phần còn lại.

Giải trình

Mã được bao quanh bởi một vòng lặp đọc trên dòng tại một thời điểm, xử lý nó, sau đó đẩy một dòng mới và đọc dòng tiếp theo ... Vòng lặp chấm dứt một khi rtrả về một chuỗi trống (tức là sau khi tất cả các dòng đã được xử lý). Đó là bit này:

r{ ... Nr}h

Đối với việc xử lý từng dòng, tôi đang sử dụng thực tế là các chữ cái in hoa là biến trong CJam, vì vậy tôi có thể đánh giá một số đầu vào.

',/:~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.

Vì vậy, điều hấp dẫn là đối với UPchúng tôi đảo ngược các kích thước tương đối của giá cả, để chúng tôi có thể bao gồm tất cả các trường hợp với một bất đẳng thức duy nhất ở cuối.


Tôi đã yêu cầu làm rõ từ OP và anh ấy nói mã nên hoạt động cho một số dòng đầu vào. Cách ngắn nhất để đạt được điều này nên là:"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~
Dennis

@Dennis Ugh, ghi điểm bởi các nhân vật ... cảm ơn.
Martin Ender


4

Perl, 77 73 byte

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

Đây là cách nó hoạt động:

  • while(<>) phân tích từng dòng.
  • @p=split","chia nó bằng mỗi dấu phẩy. Đó là sử dụng toán tử Perl mặc định, $_(nơi lưu trữ dòng.)
  • print (ternary) xác định những gì để in.
  • $p[0]<$p[1]and$p[2]=~/D/ hỏi xem giá hiện tại có thấp hơn giá chúng tôi muốn không và nó có giảm không (bằng cách kiểm tra D.)
  • (condition)?(if):(else) là toán tử ternary.
  • Nếu điều kiện của chúng tôi trước đó phù hợp, nó sẽ xuất ra STOP. Nếu không, nó sẽ xuất ra WAIT.

Tôi cho rằng không có dòng mới nào ở đầu vào - một dòng mới ở cuối tạo ra một phụ WAIT.

Cảm ơn Alex A. đã giúp tôi tiết kiệm 4 byte!


Được cho là đã khá lâu kể từ khi tôi sử dụng Perl, nhưng nó có phải andvậy không? Bạn có thể sử dụng &hoặc một cái gì đó?
Alex A.

@AlexA. Tôi không chắc tại sao, nhưng &&cư xử kỳ lạ. Tôi đã thử sử dụng nó, và nó nói rằng có một "không thể so sánh được <>".
ASCIIThenANSI

Huh. Kỳ dị. Ồ tốt Giải pháp tốt đẹp.
Alex A.

Bạn có thể thực hiện một cuộc gọi đến printvà chỉ cần làm một cái gì đó như thế print((condition)?"STOP":"WAIT")."\n"nào?
Alex A.

@AlexA. Huh, không biết bạn có thể làm điều đó. Cảm ơn!
ASCIIThenANSI

4

C, 85

c;main(i,j){for(;scanf("%d,%d,%c%*s",&i,&j,&c)>0;)puts(i-j&&i>j^c<70?"STOP":"WAIT");}

Kiểm tra tôi .


3

R, 95 108

R và chuỗi, không thực sự là bạn bè :)

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

Đầu vào là vectơ ký tự Gsau đó thay đổi từng chuỗi thành một ifcâu lệnh được ước tính.

Chỉnh sửa Làm rối lên sự giải thích của tôi về các quy tắc. Sửa chi phí một vài ký tự.

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

Tại sao hai người cuối cùng trở lại "chờ"? Họ nên cho "dừng lại".
Oebele

@Oebele Mình hiểu nhầm quy luật. Nó không rõ ràng cho giá hiện tại cao hơn giảm dần. Sẽ khắc phục sớm
MickyT

3

Ruby - 89 ký tự

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

Với sự giúp đỡ từ đến bluetorange!


Điều này có đúng cho các trường hợp thử nghiệm bằng nhau mới không? Tôi cũng đã thử một cái gì đó như thế này, nhưng điều đó đã thất bại đối với một trong những trường hợp thử nghiệm đó.
Oebele

@Oebele không thấy rằng ... không chắc họ có được thêm vào sau bản gốc của tôi không nhưng tôi đã thêm =lời cảm ơn bây giờ :)
RichieAHB

Đợi đã - tại sao bản thân tôi lại làm một cách giải quyết phức tạp khi lấy nhiều byte thay vì thêm =mà tôi biết cũng là một khả năng ... Thời gian để sửa chữa!
Oebele

Có tài khoản này cho trường hợp 1618,1618,DOWN?
nderscore

Có lẽ tôi ngu ngốc, nhưng tôi không nhận được mã này. Dường như với tôi, đối với mỗi trong số 3 giá trị được phân tách bằng dấu phẩy của mỗi dòng, nó sẽ làm gì đó với ký tự 1, 2 và 4 và in WAIT hoặc STOP? Sử dụng a.split.map{..}in 3 WAIThoặc STOPcho mỗi dòng đầu vào. Ý bạn là làm sth. như thế b,c,d=a.split(?,)nào Ngoài ra, !b[3][2]là ngắn hơn b[3]=='UP', nhưng tôi nghĩ rằng nó nên được b[2]? So sánh các chuỗi với >=sự chú ý, như "9">="77"là đúng. Dấu tách dòng đầu vào mặc định là \n, vì vậy bạn có thể sử dụng splitmà không cần đối số. ?\nngắn hơn '\n'.
blutorange

3

Python 3, 89 84 82 byte

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

Giải trình:

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'

Quan tâm để giải thích nó?
Juan Cortés

@ JuanCortés Đã thêm lời giải thích.
TheNumberOne

1
Đẹp, tôi yêu nó!
Juan Cortés

2

Matlab, 100 90 byte

Không nhỏ như tôi muốn - đặc biệt là việc chuyển đổi từ boolean sang chuỗi rất dài. Tôi đã cố gắng loại bỏ một vài byte bằng cách chuyển sang Octave, nhưng rõ ràng% c chưa được hỗ trợ cho textcan chưa có trong 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)

Cá nhân tôi nghĩ rằng thật tuyệt khi giải pháp này là giải pháp duy nhất cho đến nay không sử dụng split :)

EDIT: ban đầu giải quyết tình huống bằng cách quá phức tạp.


Đây thực sự là 92 byte - bạn đã bỏ lỡ a=bit trước khi xorgọi hàm. Mặc dù sau đó nó không thực sự tạo ra đầu ra chính xác.
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)

Chỉ trên các trình duyệt tương thích ECMAScript 6

Giải trình

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

Nó sử dụng thực tế là nếu chúng ta hỏi nếu 0 là đúng thì nó sẽ trả về false, vì vậy chúng ta có thể nói 1 cho UP, -1 cho DOWN. Sau đó chúng ta nhân đó bởi sự khác biệt của giá hiện hành và giá cả tối ưu để làm cho cả hai trong số họ làm việc cho lớn hơn 0 phần

Nếu điều kiện được đáp ứng, trả về STOP, nếu không (bao gồm các giá trị bằng nhau) trả vềWAIT

Cần chơi gôn thêm


2

Javascript ( ES6 ), 82 80 79 byte

Chỉnh sửa: -2 bằng phương pháp nhân @ JuanCortés

Chỉnh sửa: -1 bằng cách sử dụng thủ thuật để giảm phương thức nhân

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

Đã bình luận:

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

Đoạn giới thiệu:

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>

Lịch sử sửa đổi:

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

Quan tâm để giải thích logic? Trông thật tuyệt nhưng tôi không biết chuyện gì đang xảy ra
Juan Cortés

@ JuanCortés Tôi đã thêm một phiên bản nhận xét :)
nderscore

Chúc mừng! Điều đó tôi hiểu
Juan Cortés

2

C- 91 byte

Vì C phải ở đâu đó

Bây giờ trông rất giống với phiên bản @nutki mặc dù việc tìm hiểu xem đầu ra "STOP" hay "WAIT" là khác nhau.

Ung dung

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

Chơi gôn

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

Cái cũ

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

Tôi sẽ tiếp tục cố gắng cắt nó xuống


Mã này sẽ chỉ sụp đổ. Bạn cần char c[4]thay vì char *c=""(cũng ngắn hơn).
nutki

@nutki, Thật ra, nó chỉ là Hành vi không xác định. Một vụ tai nạn không cần phải xảy ra.
Spikatrix

@CoolGuy, ghi 5 byte vào vị trí chỉ đọc 1 byte. Có một hệ thống trong đó điều này sẽ không segfault?
nutki

@nutki - rõ ràng là PC Windows của tôi vì nó hoạt động trên đó!
euanjt

@nutki, thấy chưa? Hệ thống của TheE đã không ném một segfault. Nó chỉ là hành vi không xác định. Có thể làm việc trên một hệ thống, nhưng sẽ không làm việc trên hệ thống khác. Chuyện gì cũng có thể xảy ra. Nhưng ai quan tâm chứ? Đây là mã golf, vì vậy chương trình chỉ cần "hoạt động" :) BTW, không nên char c[5](1 không gian cho \0cuối)?
Spikatrix

1

Trăn 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)])

Công việc đang tiến triển ...

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.