CodeGolf - Barry pengembang berantakan # 2

11

Ini adalah tindak lanjut dari CodeGolf - Abaikan kebisingan # 1 satu-satunya masalah adalah bahwa Barry telah membuat segalanya lebih buruk bagi kita. Mari kita lihat apa yang terjadi

Memperbarui

Saya telah menambahkan kode untuk membuat input acak dan output yang diharapkan karena saya tidak pandai menjelaskan apa yang saya inginkan, dan saya kira kadang-kadang kata-kata lebih menyesatkan daripada kode (bukankah itu selalu?)

Deskripsi

Metode lain dalam API Dumb Corp memberi kami harga saat ini yang diberikan penyedia untuk suatu barang, harga optimal yang akan kami buat dengan penjualan maksimum dan kecenderungan harga itu dibandingkan dengan harga sebelumnya sebagai string UPatau DOWN. Kita perlu memutuskan apakah kita harus menghapus item dari toko atau menunggu.

Memasukkan

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

Untuk demo sampel input besar dengan output yang diharapkan, masukkan kode berikut (js) di konsol browser Anda dan harus menampilkan input acak yang valid untuk pengujian.

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

Seperti biasa kami akan memiliki variabel Gsebagai input kami, namun jika bahasa Anda membuatnya lebih mudah bagi Anda untuk hanya membaca input, itu juga baik-baik saja. Formatnya konstan, dan ikuti formatnyaint,int,string

Output yang Diinginkan

Anda adalah otak dari operasi ini, Barry harus melakukan perhitungan ini di server, tetapi kami tidak dapat mengandalkannya seperti yang seharusnya Anda ketahui. Anda perlu membuat output WAITjika kecenderungannya mengarah pada harga optimal, atau STOPjika kecenderungannya mengarah pada kerugian.

Dengan kata lain, dengan 80,90,UPinput sebagai, kita tahu bahwa ada produk dengan harga saat ini 80 dan harga optimal 90 dengan kecenderungan naik, jadi kita harus WAIT. Di sisi lain, 840,1200,DOWNberarti harga produk turun dan harga optimal kami lebih tinggi, jadi kami harus menghentikan kerugian dengan mengeluarkannya STOP.

Jika kedua harga identik, output WAITterlepas dari kecenderungannya.

Setiap produk di baris baru, satu kata per baris:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

Harap, bila mungkin, berikan cara untuk memverifikasi bahwa kode Anda berfungsi karena kita tidak bisa semua tahu hanya dengan melihat sintaksnya. Seperti biasa, gunakan sesedikit mungkin karakter dan ingat bahwa Anda tidak bersaing dengan bahasa lain, Anda bersaing dengan bahasa dengan sintaksis yang sama

Juan Cortés
sumber
Data pengujian Anda tidak terlalu berguna tanpa hasil yang diharapkan.
Bukan berarti Charles
@NotthatCharles: Saya cukup yakin blok di bagian Output yang diinginkan dari posting adalah hasil yang diharapkan dari data uji di bagian Input.
Alex A.
Maksud saya "sampel input besar"
Bukan berarti Charles
Saya menyadari sekarang bahwa itu tidak terlalu membantu, memperbarui kode untuk memberikan hasil yang diharapkan.
Juan Cortés
5
Apakah ada alasan mengapa Anda lebih suka mencetak karakter? Default di sekitar sini adalah byte (dalam ada encoding pilihan peserta). Dengan karakter, Anda membuat orang memampatkan kode mereka dengan menyandikannya dalam karakter Unicode dan hal-hal seperti itu. (Apa pun pilihan Anda, jangan mengubahnya untuk tantangan ini sekarang, tetapi Anda mungkin ingin mengingatnya untuk tantangan di masa depan.)
Martin Ender

Jawaban:

6

CJam, 31 29 27 karakter

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

Ini hanya versi kode dari kode berikut (untuk memanfaatkan pemberian skor berdasarkan karakter):

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

Jalankan semua test case di sini.

Mungkin ada cara untuk mempersingkat ini dengan penyandian STOPdan WAIT, tapi saya cukup senang dengan yang lain.

Penjelasan

Kode dikelilingi oleh loop yang membaca on line pada suatu waktu, memprosesnya, kemudian mendorong baris baru, dan membaca baris berikutnya ... Loop mengakhiri sekali rmengembalikan string kosong (yaitu setelah semua baris telah diproses). Itu sedikit ini:

r{ ... Nr}h

Sedangkan untuk memproses setiap baris, saya menggunakan fakta bahwa huruf besar adalah variabel dalam CJam, jadi saya dapat mengevaluasi beberapa input.

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

Jadi tangkapannya adalah untuk UPkita membalikkan ukuran relatif dari harga, sehingga kita dapat menutupi semua kasus dengan ketidaksetaraan tunggal pada akhirnya.

Martin Ender
sumber
Saya sudah meminta klarifikasi dari OP dan katanya kode harus bekerja untuk beberapa jalur input. Cara terpendek untuk mencapai ini adalah ini:"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~
Dennis
@ Dennis Ugh, mencetak dengan karakter ... terima kasih.
Martin Ender
7

Perl, 35

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

Ujilah aku .

nutki
sumber
4

Perl, 77 73 byte

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

Begini cara kerjanya:

  • while(<>) mem-parsing setiap baris.
  • @p=split","membaginya dengan setiap koma. Itu menggunakan operator Perl default, $_(di mana jalur disimpan.)
  • print (ternary) menentukan apa yang akan dicetak.
  • $p[0]<$p[1]and$p[2]=~/D/ menanyakan apakah harga saat ini kurang dari harga yang kita inginkan, dan itu turun (dengan memeriksa D.)
  • (condition)?(if):(else) adalah operator ternary.
  • Jika kondisi kami sebelumnya cocok, itu akan ditampilkan STOP. Kalau tidak, itu akan keluar WAIT.

Saya berasumsi tidak ada baris tambahan pada input - baris tambahan menghasilkan tambahan WAIT.

Terima kasih kepada Alex A. karena telah membantu saya menghemat 4 byte!

ASCIIThenANSI
sumber
Memang sudah cukup lama sejak saya menggunakan Perl, tetapi apakah itu harus and? Bisakah Anda menggunakan &sesuatu?
Alex A.
@AlexA. Saya tidak yakin mengapa, tetapi &&berperilaku aneh. Saya mencoba menggunakannya, dan dikatakan ada yang "tidak cocok <>".
ASCIIThenANSI
Hah. Aneh. Baiklah. Solusi yang bagus.
Alex A.
Bisakah Anda melakukan satu panggilan ke printdan hanya melakukan sesuatu seperti print((condition)?"STOP":"WAIT")."\n"?
Alex A.
@AlexA. Huh, tidak tahu kamu bisa melakukan itu. Terima kasih!
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");}

Ujilah aku .

nutki
sumber
3

R, 95 108

R dan string, tidak benar-benar teman :)

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

Input adalah vektor karakter Gkemudian mengubah setiap string menjadi ifpernyataan yang dievaluasi.

Sunting Mengacaukan interpretasi saya tentang aturan. Biaya perbaikan beberapa karakter.

> 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
>
MickyT
sumber
Mengapa dua yang terakhir kembali "menunggu"? Mereka harus memberi "berhenti".
Oebele
@ Oebele, saya salah mengerti aturan. Itu tidak jelas untuk kenaikan harga saat ini. Akan segera diperbaiki
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

Dengan bantuan dari ke bluetorange!

RichieAHB
sumber
Apakah ini benar untuk kasus uji yang sama baru? Saya juga mencoba sesuatu seperti ini, tetapi gagal untuk salah satu kasus uji.
Oebele
@ Oebele tidak melihat itu ... tidak yakin apakah mereka ditambahkan setelah orisinal saya tetapi saya telah menambahkan =terima kasih sekarang :)
RichieAHB
Tunggu - mengapa saya sendiri melakukan solusi kompleks mengambil banyak byte alih-alih menambahkan =yang saya tahu juga kemungkinan ... Saatnya memperbaiki!
Oebele
Apakah akun ini untuk kasus 1618,1618,DOWN?
nderscore
Mungkin saya bodoh, tetapi saya tidak mendapatkan kode ini. Tampak bagi saya bahwa untuk masing-masing dari 3 nilai yang dipisahkan koma dari setiap baris, ia melakukan sesuatu dengan karakter 1, 2, dan 4 dan mencetak TUNGGU atau BERHENTI? Menggunakan a.split.map{..}cetakan 3 WAITatau STOPuntuk setiap jalur input. Apakah Anda bermaksud melakukan sth. suka b,c,d=a.split(?,)? Juga, !b[3][2]lebih pendek dari b[3]=='UP', tapi saya pikir seharusnya begitu b[2]? Membandingkan string dengan >=membutuhkan perhatian, sebagaimana "9">="77"adanya benar. Pemisah jalur input default adalah \n, sehingga Anda dapat menggunakan splittanpa argumen. ?\nlebih pendek dari '\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])

Penjelasan:

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'
TheNumberOne
sumber
Mau jelaskan itu?
Juan Cortés
@ JuanCortés Menambahkan penjelasan.
TheNumberOne
1
Cantik, aku suka itu!
Juan Cortés
2

Matlab, 100 90 byte

Tidak sekecil yang saya inginkan - terutama konversi dari boolean ke string sangat panjang. Saya mencoba memangkas beberapa byte dengan beralih ke Octave, tetapi ternyata% c belum didukung untuk textcan di 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)

Secara pribadi saya pikir sangat bagus bahwa solusi ini adalah satu-satunya sejauh ini yang tidak menggunakan split :)

EDIT: awalnya memecahkan situasi yang sama terlalu rumit.

Oebele
sumber
Ini sebenarnya 92 byte - Anda melewatkan a=sedikit sebelum xorpanggilan fungsi. Meskipun demikian itu tidak benar-benar menghasilkan output yang benar.
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)

Hanya di browser kompatibel ECMAScript 6

Penjelasan

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

Itu menggunakan fakta bahwa jika kita bertanya apakah 0 benar itu akan mengembalikan false, jadi kita bisa mengatakan 1 untuk UP, -1 untuk DOWN. Kemudian kita kalikan dengan selisih harga saat ini dan harga optimal untuk membuat keduanya bekerja lebih besar dari 0 bagian

Jika kondisi terpenuhi, kembali STOP, jika tidak (termasuk nilai yang sama) kembaliWAIT

Perlu bermain golf lebih lanjut

Juan Cortés
sumber
2

Javascript ( ES6 ), 82 80 79 byte

Edit: -2 menggunakan metode multiplikasi @ JuanCortés

Sunting: -1 menggunakan trik untuk mengurangi metode perkalian

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

Berkomentar:

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

Demo cuplikan:

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>

Riwayat Revisi:

// 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'))
nderscore
sumber
Mau jelaskan logikanya? Terlihat luar biasa tetapi saya tidak tahu apa yang terjadi
Juan Cortés
@ JuanCortés Saya telah menambahkan versi yang dikomentari :)
nderscore
Bersulang! Yang saya mengerti
Juan Cortés
2

C- 91 Bytes

Karena C harus ada di suatu tempat

Sekarang terlihat sangat mirip dengan versi @nutki walaupun bekerja apakah akan menghasilkan "STOP" atau "WAIT" berbeda.

Tidak serigala-

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

Golf-

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

Yang tua

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

Saya akan terus mencoba memotongnya

euanjt
sumber
Kode ini hanya akan crash. Anda perlu char c[4]alih-alih char *c=""(yang juga lebih pendek).
nutki
@nutki, Sebenarnya, itu hanya Perilaku Tidak Terdefinisi. Kecelakaan tidak perlu terjadi.
Spikatrix
@ CoolGuy, menulis 5 byte ke lokasi hanya baca 1 byte. Apakah ada sistem di mana ini tidak akan segfault?
nutki
@nutki - jelas PC Windows saya yang berfungsi!
euanjt
@nutki, Lihat? Sistem TheE tidak melempar segfault. Itu hanya perilaku yang tidak terdefinisi. Mungkin bekerja pada satu sistem, tetapi tidak pada yang lain. Segalanya bisa terjadi. Tapi siapa peduli? Ini kode golf sehingga program hanya perlu "bekerja" :) BTW, bukankah seharusnya char c[5](1 ruang untuk \0di akhir)?
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)])

Bekerja dalam proses ...

monguin
sumber