CodeGolf-Barry凌乱的开发人员#2


11

这是CodeGolf的后续 内容-忽略噪音#1 唯一的问题是Barry使我们变得更糟。让我们来看看发生了什么

更新资料

我添加了代码以创建随机输入和期望的输出,因为我不太擅长解释我想要的内容,而且我猜有时候单词比代码更具误导性(不是总是这样吗?)

描述

Dumb Corp API中的另一种方法可以使我们提供程序为项目提供的当前价格,可以实现最大销售的最优价格以及该价格与字符串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作为输入,我们知道当前价格为80且最优价格为90的产品具有上升的趋势,因此我们应该这样做WAIT。另一方面,这840,1200,DOWN意味着产品价格正在下降,而我们的最优价格更高,因此我们应该通过输出来止损STOP

如果两个价格相同,则WAIT不管趋势如何都可以输出。

每个产品换行,每行一个字:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

请尽可能提供一种验证您的代码是否正常工作的方法,因为我们不能仅通过查看语法就知道全部。像往常一样,使用尽可能少的字符,并记住您并不一定要与其他语言竞争,而要与语法相似的语言竞争


没有预期的结果,您的测试数据并不是非常有用。
不是查尔斯(Charles)

@NotthatCharles:我很确定帖子的Desired Output部分中的块是Input部分中测试数据的预期结果。
Alex A.

我的意思是“巨大的输入样本”
不是查尔斯(Charles)

现在我意识到它并没有真正的帮助,因此更新了代码以提供预期的输出。
胡安·科尔特斯(JuanCortés)

5
有什么理由让您更喜欢按字符计分?此处的默认值是字节(采用参与者选择的现有编码)。使用字符,您可以使人们通过用Unicode字符等编码来压缩代码。(无论您选择哪种方式,现在都不要为迎接挑战而改变它,但您可能想在以后的挑战中牢记这一点。)
马丁·恩德

Answers:


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,按角色得分...谢谢。
马丁·恩德

7

Perl,35岁

#!perl -pl
/,/;$_=$`-$'&&$`>$'^/D/?STOP:WAIT

测试


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/ 询问当前价格是否低于我们想要的价格,并且正在下降(通过检查D。)
  • (condition)?(if):(else) 是三元运算符。
  • 如果我们的条件较早匹配,它将输出STOP。否则,将输出WAIT

我假设输入中没有尾随换行符-尾随换行符会产生额外的字符WAIT

感谢Alex A.帮助我节省了4个字节!


当然,自从我使用Perl已经有一段时间了,但是一定and吗?你可以用&什么吗?
Alex A.

@AlexA。我不知道为什么,但是&&表现很奇怪。我尝试使用它,并说有一个“无法比拟的<>”。
ASCIIThenANSI 2015年

嗯 奇怪的。那好吧。不错的解决方案。
Alex A.

您可以打一个电话print来做类似的事情print((condition)?"STOP":"WAIT")."\n"吗?
Alex A.

@AlexA。,不知道你能做到。谢谢!
ASCIIThenANSI 2015年

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

测试


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
>

为什么最后两个返回“ wait”?他们应该给“停止”。
Oebele 2015年

@Oebele我误解了规则。目前尚不清楚当前较高的价格下降。将修复很快
MickyT

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!


这对于新的相等测试用例是否正确?我也尝试过类似的方法,但是在其中一个测试用例中失败了。
Oebele

@Oebele没看到...不确定是否在我的原始照片之后添加了它们,但我添加了=现在的感谢:)
RichieAHB 2015年

等等-为什么我本人要花很多字节而不是添加=一个我知道也是可能的复杂方法来解决这个问题呢……该修复了!
Oebele

这说明情况1618,1618,DOWN吗?
nderscore 2015年

也许我很愚蠢,但是我没有得到这段代码。在我看来,对于每行的3个逗号分隔值中的每个值,它使用第一个,第二个和第四个字符执行某些操作,并显示WAIT或STOP?使用a.split.map{..}打印3 WAITSTOP每个输入行。你的意思是做某事。喜欢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'

关心解释吗?
胡安·科尔特斯

@JuanCortés添加了解释。
TheNumberOne

1
美丽,我喜欢它!
胡安·科尔特斯

2

Matlab,100 90字节

不像我想要的那么小-特别是从布尔值到字符串的转换非常长。我试图通过切换到八度来节省一些字节,但是显然Octave中的textscan还不支持%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)

我个人认为此解决方案是迄今为止唯一不使用split的解决方案是很不错的:)

编辑:本来解决平等情况的方式太复杂了。


实际上是92个字节-您错过a=xor函数调用之前的位。即使那样,它实际上仍无法产生正确的输出。
汤姆·卡彭特

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是否为真,它将返回false,因此我们可以说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'))

关心解释逻辑吗?看起来很棒,但我不知道发生了什么
JuanCortés2015年

@JuanCortés我添加了评论版本:)
nderscore

干杯! 那我明白
胡安·科尔特斯

2

C- 91字节

因为C必须在某个地方

现在看起来与@nutki版本非常相似,尽管确定输出“ STOP”还是“ WAIT”有所不同。

不打高尔夫球

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

打高尔夫球

 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字节的只读位置。是否存在不会出现段错误的系统?
nutki

@nutki-显然我的Windows PC可以正常工作!
euanjt

@nutki,看到了吗?TheE的系统没有抛出段错误。这只是未定义的行为。可以在一个系统上工作,但不能在另一个系统上工作。什么都可能发生。但谁在乎?这是代码高尔夫,所以程序只需要“工作”即可:)顺便说一句,不是吗(末尾有char c[5]1个空格\0)?
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)])

工作正在进行中...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.