कोडगॉल्फ - गन्दा डेवलपर # 2 बैरी


11

यह कोडगॉल्फ का अनुवर्ती है - शोर # 1 को अनदेखा करें केवल समस्या है कि बैरी ने हमारे लिए चीजों को और भी बदतर बना दिया है। देखते है क्या हुआ

अपडेट करें

मैंने यादृच्छिक इनपुट और अपेक्षित आउटपुट बनाने के लिए कोड जोड़ा है क्योंकि मैं जो चाहता हूं उसे समझाने में उतना अच्छा नहीं हूं, और मुझे लगता है कि कभी-कभी शब्द कोड की तुलना में अधिक भ्रामक होते हैं (क्या यह हमेशा नहीं है?)

विवरण

डंब कॉर्प की एपीआई में एक अन्य विधि हमें वर्तमान मूल्य प्रदान करती है जो एक प्रदाता हमें एक आइटम के लिए दे रहा है, हम जिस इष्टतम मूल्य के साथ अधिकतम बिक्री कर रहे हैं और उस मूल्य की प्रवृत्ति एक स्ट्रिंग के रूप में 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

वांछित उत्पादन

आप इस ऑपरेशन के दिमाग हैं, बैरी को सर्वर पर यह गणना करनी चाहिए, लेकिन हम उस पर भरोसा नहीं कर सकते हैं जैसा कि आपको पता होना चाहिए। WAITयदि आउटपुट का झुकाव इष्टतम मूल्य की ओर है, या STOPयदि झुकाव लूज़ की ओर है , तो आपको आउटपुट करने की आवश्यकता है ।

दूसरे शब्दों में, 80,90,UPइनपुट के रूप में, हम जानते हैं कि 80 की मौजूदा कीमत के साथ एक उत्पाद है और 90 की इष्टतम कीमत है, जो उठने की प्रवृत्ति के साथ है, इसलिए हमें चाहिए WAIT। दूसरी ओर, 840,1200,DOWNइसका मतलब है कि उत्पाद की कीमत कम हो रही है और हमारी इष्टतम कीमत अधिक है, इसलिए हमें आउटपुट देकर नुकसान को रोकना चाहिए STOP

यदि दो मूल्य समान हैं, WAITतो प्रवृत्ति की परवाह किए बिना आउटपुट ।

प्रत्येक उत्पाद एक नई पंक्ति में, प्रति पंक्ति एक शब्द:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

कृपया, जब संभव हो, यह सत्यापित करने का एक तरीका प्रदान करें कि आपका कोड काम कर रहा है क्योंकि हम सभी सिंटैक्स को देखकर नहीं जान सकते। हमेशा की तरह, संभव के रूप में कुछ वर्णों का उपयोग करें और याद रखें कि आप आवश्यक रूप से अन्य भाषाओं के खिलाफ प्रतिस्पर्धा नहीं कर रहे हैं, आपकी भाषा समान सिंटैक्स के साथ प्रतिस्पर्धा कर रही है


आपका परीक्षण डेटा अपेक्षित परिणामों के बिना बहुत उपयोगी नहीं है।
नहीं कि चार्ल्स

@ नोटचार्ल्स: मुझे पूरा यकीन है कि पोस्ट के वांछित आउटपुट खंड में ब्लॉक इनपुट अनुभाग में परीक्षण डेटा का अपेक्षित परिणाम है।
एलेक्स ए

मेरा मतलब था "विशाल इनपुट नमूना"
न कि चार्ल्स

मुझे अब एहसास हुआ कि यह वास्तव में उपयोगी नहीं था, अपेक्षित आउटपुट प्रदान करने के लिए कोड को अपडेट किया।
जुआन कोर्टेस

5
क्या कोई कारण है कि आप पात्रों में स्कोरिंग पसंद करते हैं? यहाँ डिफ़ॉल्ट डिफ़ॉल्ट बाइट्स है ( प्रतिभागी की पसंद के मौजूदा एन्कोडिंग में)। पात्रों के साथ आप बस लोगों को यूनिकोड के पात्रों और इस तरह की चीजों में कूट-कूट कर अपना कोड प्राप्त कर सकते हैं। (आपकी पसंद जो भी हो, अब इस चुनौती के लिए इसे न बदलें, लेकिन आप इसे भविष्य की चुनौतियों के लिए ध्यान में रखना चाह सकते हैं।)
मार्टिन एंडर

जवाबों:


6

सीजाम, 31 29 27 वर्ण

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

यह निम्नलिखित कोड का सिर्फ एक एन्कोडेड संस्करण है (वर्णों द्वारा स्कोरिंग का उपयोग करने के लिए):

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

सभी परीक्षण मामलों को यहां चलाएं।

एन्कोडिंग द्वारा इसे छोटा करने का एक तरीका हो सकता है STOPऔर WAIT, लेकिन मैं बाकी के साथ काफी खुश हूं।

व्याख्या

कोड एक लूप से घिरा होता है जो एक बार में लाइन पर पढ़ता है, इसे प्रोसेस करता है, फिर एक नई लाइन को धकेलता है, और अगली लाइन को पढ़ता है ... लूप एक बार rखाली स्ट्रिंग लौटाता है (यानी सभी लाइनों के संसाधित होने के बाद)। यह बिट है:

r{ ... Nr}h

प्रत्येक पंक्ति को संसाधित करने के लिए, मैं इस तथ्य का उपयोग कर रहा हूं कि ऊपरी मामले पत्र सीजेएम में चर हैं, इसलिए मैं कुछ इनपुट को निकाल सकता हूं।

',/:~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हम कीमतों के सापेक्ष आकारों को उलट दें, ताकि हम अंत में एक असमानता के साथ सभी मामलों को कवर कर सकें।


मैंने ओपी से स्पष्टीकरण का अनुरोध किया है और उन्होंने कहा कि कोड को इनपुट की कई लाइनों के लिए काम करना चाहिए। इसे प्राप्त करने का सबसे छोटा तरीका यह होना चाहिए:"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~
डेनिस

@ डेनिस उघ, पात्रों द्वारा स्कोरिंग ... धन्यवाद।
मार्टिन एंडर


4

पर्ल, 77 73 बाइट्स

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

यहां देखिए यह कैसे काम करता है:

  • while(<>) हर लाइन परसिंग करता है।
  • @p=split","हर अल्पविराम द्वारा इसे विभाजित करता है। यह डिफ़ॉल्ट पर्ल ऑपरेटर का उपयोग कर रहा है, $_(जो कि जहां लाइन संग्रहीत है।)
  • print (ternary) क्या प्रिंट करने के लिए निर्धारित करता है।
  • $p[0]<$p[1]and$p[2]=~/D/ यह पूछे जाने पर कि क्या वर्तमान मूल्य हम चाहते हैं की कीमत से कम है, और यह नीचे जा रहा है (डी के लिए जाँच करके)
  • (condition)?(if):(else) टेनेरी ऑपरेटर है।
  • यदि हमारी स्थिति पहले से मेल खाती है, तो यह आउटपुट देगा STOP। अन्यथा, यह उत्पादन होगा WAIT

मुझे लगता है कि इनपुट पर कोई अनुगामी न्यूलाइन नहीं है - एक अनुगामी न्यूलाइन एक अतिरिक्त पैदा करता है WAIT

4 बाइट बचाने में मेरी मदद करने के लिए एलेक्स ए का धन्यवाद!


मुझे लगता है कि मुझे पर्ल का उपयोग करते हुए काफी समय हो गया है, लेकिन क्या ऐसा होना चाहिए and? आप उपयोग कर सकते हैं &या कुछ और?
एलेक्स ए।

@AlexA। मुझे यकीन नहीं है कि क्यों, लेकिन &&अजीब व्यवहार करता है। मैंने इसका उपयोग करने की कोशिश की, और यह कहा कि एक "बेजोड़ <>" था।
ASCIIThenANSI

हुह। अजीब। ओह अच्छा। अच्छा समाधान है।
एलेक्स ए

क्या आप printकेवल एक कॉल कर सकते हैं और कुछ ऐसा कर सकते हैं print((condition)?"STOP":"WAIT")."\n"?
एलेक्स ए

@AlexA। हुह, नहीं पता था कि आप ऐसा कर सकते हैं। धन्यवाद!
ASCIIThenANSI


3

आर, ९ ५ १० 95

आर और तार, वास्तव में दोस्त नहीं :)

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 मैंने नियमों को गलत समझा। यह उच्च मौजूदा कीमतों के उतरने के लिए स्पष्ट नहीं था। जल्द ठीक हो जाएगा
मिकी

3

रूबी - 89 चार्ट

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 से मदद के साथ!


क्या यह नए समान परीक्षण मामलों के लिए सही है? मैंने भी ऐसा कुछ करने की कोशिश की, लेकिन उन में से एक परीक्षण के मामले में असफल रहा।
ओबेले

@ ओबेले ने यह नहीं देखा ... निश्चित नहीं कि वे मेरे मूल के बाद जोड़े गए थे, लेकिन मैंने =अब धन्यवाद जोड़ दिया है :)
रिचीअह

रुको - मैंने खुद को जोड़ने के बजाय कई बाइट्स लेने के लिए एक जटिल वर्कअराउंड क्यों किया, =जो मुझे पता था कि एक संभावना भी थी ... ठीक करने का समय!
ओबेले

इस मामले के लिए खाता है 1618,1618,DOWN?
nderscore

शायद मैं बेवकूफ हूं, लेकिन मुझे यह कोड नहीं मिला। यह मुझे लगता है कि प्रत्येक पंक्ति के 3 अल्पविराम से अलग मूल्यों के लिए, यह 1, 2 और 4 के चरित्र के साथ कुछ करता है और WAIT या STOP प्रिंट करता है? a.split.map{..}प्रिंट 3 WAITया STOPप्रत्येक इनपुट लाइन के लिए उपयोग करना । क्या आपका मतलब sth करना था? पसंद है b,c,d=a.split(?,)? इसके अलावा, !b[3][2]की तुलना में कम है b[3]=='UP', लेकिन मुझे लगता है कि यह होना चाहिए b[2]? तार की तुलना पर >=ध्यान देने की आवश्यकता है, जैसा "9">="77"कि सच है। डिफ़ॉल्ट इनपुट लाइन विभाजक है \n, इसलिए आप splitबिना तर्क के उपयोग कर सकते हैं । ?\nसे छोटा है '\n'
ब्लुटोरेंज

3

पायथन 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'

इसे समझाने के लिए देखभाल?
जुआन कोर्टेस

@ JuanCortés जोड़ा स्पष्टीकरण।
TheNumberOne

1
सुंदर, मैं इसे प्यार करता हूँ!
जुआन कोर्टेस

2

मतलाब, 100 90 बाइट्स

जितना छोटा मैं चाहूंगा उतना छोटा नहीं है - विशेष रूप से बूलियन से स्ट्रिंग्स में रूपांतरण बहुत लंबा है। मैंने कुछ बाइट्स को ऑक्टेव पर स्विच करके शेव करने की कोशिश की, लेकिन स्पष्ट रूप से ऑक्टेव में अभी तक टेक्स्टस्कैन के लिए% c का समर्थन नहीं किया गया है।

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

व्यक्तिगत रूप से मुझे लगता है कि यह अच्छा है कि यह समाधान केवल एक ही है जो विभाजन का उपयोग नहीं करता है :)

EDIT: मूल रूप से हल की स्थिति समान रूप से जटिल है।


यह वास्तव में 92 बाइट्स है - आप फ़ंक्शन कॉल a=से पहले थोड़ा याद किया xor। हालांकि तब भी यह वास्तव में सही उत्पादन नहीं करता है।
टॉम कारपेंटर

2

जावास्क्रिप्ट ईसीएमएस्क्रिप्ट 6, 112 बी

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

जावास्क्रिप्ट ( ईएस 6 ), 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'))

तर्क को समझाने के लिए देखभाल? भयानक लग रहा है, लेकिन मुझे पता नहीं है कि क्या चल रहा है
जुआन कोर्टेस

@ JuanCortés मैं एक टिप्पणी की संस्करण :) जोड़ दिया है
nderscore

चीयर्स! यह मुझे समझ में आता है
जुआन कोर्टेस

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=""(जो छोटा भी है) चाहिए।
नटकी

@ कुटकी, वास्तव में, इसका सिर्फ अपरिभाषित व्यवहार है। दुर्घटना की जरूरत नहीं है।
स्पाइकाट्रिक्स

@CoolGuy, 1 बाइट के केवल पढ़ने के लिए 5 बाइट्स लिख रहा है। क्या कोई ऐसी प्रणाली है जिसमें यह सेगफॉल्ट नहीं होगा?
नटकी

@ कुटकी - जाहिर है मेरे विंडोज पीसी के रूप में यह उस पर काम किया!
euanjt

@ कुटकी, देखिये? ईई के सिस्टम ने सेगफॉल्ट को नहीं फेंका। यह सिर्फ अपरिभाषित व्यवहार है। एक प्रणाली पर काम कर सकते हैं, लेकिन दूसरे पर नहीं होगा। कुछ भी हो सकता है। लेकिन कौन परवाह करता है? यह कोड गोल्फ है इसलिए कार्यक्रम को "काम" करने की आवश्यकता है :) बीटीडब्ल्यू, क्या यह नहीं होना चाहिए char c[5]( \0अंत में 1 स्थान )?
स्पाइकाट्रिक्स

1

पायथन 3 - 108 106 102 97 बी

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

कार्य प्रगति पर है...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.