CodeGolf-厄介な開発者のバリー#2


11

これはCodeGolfのフォローアップです。 ノイズ#1を無視 してください。唯一の問題は、バリーが事態をさらに悪化させていることです。何が起きたのか見てみましょう

更新

ランダムな入力と期待される出力を作成するためのコードを追加しました。これは、自分が望むものを説明するのが苦手だからです。

説明

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

望ましい出力

あなたはこの操作の頭脳です。バリーはサーバー上でこの計算を行うべきですが、あなたが知っているはずのように彼に頼ることはできません。WAIT傾向が最適価格にSTOP向かう場合、または傾向が損失に向かう場合に出力する必要があります。

言い換えれば、と80,90,UPのように入力し、私たちは80の現在の価格と我々がする必要がありますので、上昇する傾向を持つ90の最適な価格で製品があることを知っていますWAIT。一方、840,1200,DOWNは、製品価格が下がり、最適価格が高くなることを意味するため、を出力して損失を止める必要がありSTOPます。

2つの価格が同じ場合、WAIT傾向に関係なく出力されます。

新しい行の各製品、行ごとに1つの単語:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

可能であれば、構文を見ただけではわからないため、コードが機能していることを確認する方法を提供してください。いつものように、できるだけ少ない文字を使用し、必ずしも他の言語と競合するのではなく、類似の構文を持つ言語と競合することを忘れないでください


テストデータは、予想される結果がなければ非常に役に立ちません。
チャールズではない

@NotthatCharles:投稿のDesired Outputセクションのブロックは、Inputセクションのテストデータの期待される結果であると確信しています。
アレックスA.

私は「巨大な入力サンプル」を意味しました
チャールズが

本当に役に立たなかったので、コードを更新して予想される出力を提供できるようになりました。
フアンコルテス

5
キャラクターの得点を好む理由はありますか?ここでのデフォルトはバイトです(参加者が選択した既存のエンコーディング)。文字を使用すると、Unicode文字などでエンコードしてコードを圧縮するだけです。(あなたの選択が何であれ、今この挑戦のためにそれを変えないでください、しかしあなたは将来の挑戦のためにそれを心に留めておきたいかもしれません。)
マーティン・エンダー

回答:


6

CJam、31 29 27文字

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

これは、次のコードのエンコードされたバージョンです(文字によるスコアリングを利用するため):

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

ここですべてのテストケースを実行します。

STOPとをエンコードすることでこれを短縮する方法があるかもしれませんが、WAIT私は残りに非常に満足しています。

説明

コードは、一度に1行ずつ読み取り、処理してから改行をプッシュし、次の行を読み取るループに囲まれています。ループ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 Ugh、キャラクターによる得点...ありがとう。
マーティンエンダー


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。末尾の改行は余分な改行を生成します。

4バイトの節約を支援してくれたAlex A.に感謝します!


確かに、Perlを使用してからかなりの時間が経ちましたが、そうする必要がありandますか?使用できます&か?
アレックスA.

@AlexA。理由はわかりませんが、&&奇妙な動作をします。私はそれを使ってみたところ、「比類のない<>」ものがあると言われました。
ASCIIThenANSI

ええ 奇妙な。しかたがない。いい解決策。
アレックスA.

あなたは、単一の呼び出しを行うことができますprintし、同じような何かをprint((condition)?"STOP":"WAIT")."\n"
アレックス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
>

最後の2つが「待機」を返すのはなぜですか?彼らは「停止」を与えるべきです。
Oebele

@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への助けを借りて!


これは、新しい同等のテストケースでは正しいですか?私もこのようなことを試みましたが、それらのテストケースの1つでは失敗しました。
-Oebele

@Oebeleはそれを見ませんでした...それらが私のオリジナルの後に追加されたかどうかはわかりませんが、私は=今感謝を追加しました:)
RichieAHB

待って-なぜ私自身が=可能性があるとわかっていたバイトを追加するのではなく、多くのバイトを使用して複雑な回避策を実行したのですか...修正する時間です!
-Oebele

これはケースの説明1618,1618,DOWNですか?
アンダースコア

おそらく私は愚かですが、私はこのコードを取得しません。各行の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

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に切り替えて数バイト削り取ろうとしましたが、明らかに%cはOctaveのtextscanではまだサポートされていません。

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より大きい部分で機能するようにします

条件が満たされる場合、return STOP、そうでない場合(等しい値を含む)WAIT

さらにゴルフが必要


2

Javascript(ES6)、82 80 79バイト

編集:@JuanCortés乗算法を使用した-2

編集:乗算方法を減らすためにトリックを使用して-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");
}

ゴルフ

 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、1バイトの読み取り専用ロケーションに5バイトを書き込みます。これがセグメンテーションフォールトしないシステムはありますか?
nutki

@nutki-明らかに私のWindows PCはそれで働いていました!
euanjt

@nutki参照してください?Eのシステムはセグメンテーション違反をスローしませんでした。これは未定義の動作です。一方のシステムでは機能するかもしれませんが、もう一方のシステムでは機能しません。何でも起れる。しかし、誰が気にしますか?プログラムは単に「仕事」に必要ので:)ところで、それはすべきではないこれは、コードゴルフである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)])

進行中の作業...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.