CodeGolf - Barry dağınık geliştirici # 2


11

Bu CodeGolf bir takibi - gürültü # görmezden gelmek tek sorun Barry bizim için işleri daha da kötü yaptı olmasıdır. Ne olduğunu görelim

Güncelleme

Rastgele girdi ve beklenen çıktı oluşturmak için kod ekledim, çünkü ne istediğimi açıklamakta iyi değilim ve bazen kelimelerin koddan daha yanıltıcı olduğunu tahmin ediyorum (bu her zaman değil mi?)

Açıklama

Başka bir yöntem Dumb Corp 'ın API, biz maksimum satış yapmaya olacağını optimum fiyat ve fiyatın eğilimi bir dize olarak önceki fiyatlara göre bize bir sağlayıcı bir öğe için bize veriyor şimdiki fiyatı veren UPya DOWN. Öğeyi dükkandan kaldırmamız mı yoksa beklememiz mi gerektiğine karar vermeliyiz.

Giriş

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

Beklenen çıktıya sahip büyük bir giriş örneği demosu için, tarayıcı konsolunuza aşağıdaki kodu (js) koyun ve test için geçerli rasgele girdi çıkması gerekir.

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

Her zaman Golduğu gibi, girdimiz olarak bir değişkenimiz olacaktır , ancak diliniz girdiyi basitçe okumanızı kolaylaştırırsa, bu da iyidir. Biçim sabittir ve biçimi izleyinint,int,string

Istenilen çıktı

Bu operasyonun beyni sensin, Barry bu hesaplamayı sunucuda yapıyor olmalı, ama bildiğin gibi ona güvenemeyiz. WAITEğilim en uygun fiyata doğru ise veya STOPeğilim kaybediyorsa çıktı almanız gerekir .

Başka bir deyişle, 80,90,UPgirdi olarak, mevcut fiyat 80 ve optimal fiyat 90 olan bir ürün olduğunu biliyoruz, bu yüzden yükselmeliyiz WAIT. Öte yandan, 840,1200,DOWNürün fiyatının düştüğü ve optimal fiyatımızın daha yüksek olduğu anlamına gelir, bu nedenle çıktıları vererek kayıpları durdurmalıyız STOP.

İki fiyat aynı WAITise, eğilime bakılmaksızın çıktı .

Yeni bir satırdaki her ürün, satır başına tek bir kelime:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

Mümkün olduğunda, yalnızca söz dizimine bakarak hepimiz bilemeyeceğimiz için kodunuzun çalıştığını doğrulamanın bir yolunu belirtin. Her zaman olduğu gibi, mümkün olduğunca az karakter kullanın ve zorunlu olarak diğer dillerle rekabet etmediğinizi, benzer sözdizimine sahip dillerle rekabet ettiğinizi unutmayın


Test verileriniz beklenen sonuçlar olmadan çok kullanışlı değil.
Charles

@ NotthatCharles: Gönderinin İstenen Çıktı bölümündeki bloğun Giriş bölümündeki test verilerinin beklenen sonucu olduğundan eminim.
Alex A.

Ben "büyük girdi örneği" demek istedim
Charles

Şimdi gerçekten yararlı değildi, beklenen çıktı sağlamak için kodu güncelledi.
Juan Cortés

5
Karakterlerde gol atmayı tercih etmenizin bir nedeni var mı? Buradaki varsayılan değer bayttır ( katılımcının seçiminin mevcut bir kodlamasında). Karakterlerle, insanların kodlarını Unicode karakterlerinde ve bunun gibi şeylerde kodlayarak sıkıştırmasını sağlarsınız. (Seçiminiz ne olursa olsun, şimdi bu meydan okuma için değiştirmeyin, ancak gelecekteki meydan okumalar için bunu aklınızda tutmak isteyebilirsiniz.)
Martin Ender

Yanıtlar:


6

CJam, 31 29 27 karakter

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

Bu sadece aşağıdaki kodun kodlanmış bir versiyonudur (karakterlere göre puanlamayı kullanmak için):

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

Tüm test senaryolarını burada çalıştırın.

Kodlayarak bunu kısaltmanın bir yolu olabilir STOPve WAITama geri kalanından oldukça memnunum.

açıklama

Kod, her seferinde satırda okuyan, işleyen, sonra yeni satır basan ve sonraki satırı okuyan bir döngü ile çevrilidir ... Döngü bir kez rboş bir dize döndürür (yani tüm satırlar işlendikten sonra). Bu bit:

r{ ... Nr}h

Her satırı işlemeye gelince, büyük harflerin CJam'de değişkenler olduğu gerçeğinden faydalanıyorum, bu yüzden bazı girdileri değerlendirebilirim.

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

Yakalama şu ki UP, fiyatların göreceli boyutlarını tersine çeviriyoruz, böylece sonunda tek bir eşitsizliğe sahip tüm vakaları kapsayabiliriz.


Ben OP açıklama istedi ve kod giriş birkaç satır için çalışması gerektiğini söyledi. Bunu başarmanın en kısa yolu "㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~
Dennis

@Dennis Ugh, karakterlere göre puanlama ... teşekkürler.
Martin Ender


4

Perl, 77 73 bayt

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

Şöyle çalışır:

  • while(<>) her satırı ayrıştırır.
  • @p=split","her virgül tarafından böler. Varsayılan Perl operatörünü kullanıyor $_(hattın depolandığı yer).
  • print (ternary) ne yazdıracağını belirler.
  • $p[0]<$p[1]and$p[2]=~/D/ mevcut fiyatın istediğimiz fiyattan daha düşük olup olmadığını sorar ve aşağı iner (bir D'yi kontrol ederek)
  • (condition)?(if):(else) üçlü operatördür.
  • Durumumuz daha önce eşleşirse, çıktı alır STOP. Aksi takdirde çıktı alır WAIT.

Girdi üzerinde sondaki yeni satır olmadığını varsayalım - sondaki yeni satır fazladan üretiyor WAIT.

4 bayt kurtarmama yardım ettiği için Alex A.'ye teşekkürler!


Perl kullandığımdan beri oldukça uzun bir süre geçti, ancak olması gerekiyor andmu? Kullanabilir misin &falan?
Alex A.

@AlexA. Neden olduğundan emin değilim, ama &&garip davranıyor. Kullanmayı denedim ve "eşsiz <>" olduğunu söyledi .
ASCIIThenANSI

Huh. Tuhaf. Oh iyi. Güzel çözüm.
Alex A.

Tek bir telefon görüşmesi printyapabilir ve sadece benzeri bir şey yapabilir misiniz print((condition)?"STOP":"WAIT")."\n"?
Alex A.

@AlexA. Ha, bunu yapabileceğini bilmiyordum. Teşekkürler!
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");}

Test et beni .


3

R 95 108

R ve stringler, gerçekten arkadaş değil :)

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

Girdi karakter vektörüdür ve Gdaha sonra her dizeyi ifdeğerlendirilen bir ifadeye dönüştürür .

Düzenle Kuralları yorumladım berbat. Düzeltme birkaç karakter maliyeti.

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

Son iki dönüş neden "bekliyor"? Onlar "dur" vermeli.
Oebele

@Oebele Kuralları yanlış anladım. Cari fiyatların yükselmesi net değildi. Yakında düzeltilecek
MickyT

3

Yakut - 89 Karakter

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

Yardımı ile bluetorange!


Bu yeni eşit test senaryoları için doğru mu? Ayrıca böyle bir şey denedim, ancak bu test durumlarından biri için başarısız oldu.
Oebele

@Oebele görmedim ... orijinalimden sonra eklenmiş olup olmadıklarından emin değilim ama =şimdi teşekkürler ekledim :)
RichieAHB

Bekle - neden kendim =de bir olasılık olduğunu bildiğimi eklemek yerine birçok bayt alarak karmaşık bir çözüm yaptım ... Düzeltme zamanı!
Oebele

Bu davanın hesabını veriyor 1618,1618,DOWNmu?
nderscore

Belki de aptalım, ama bu kodu alamıyorum. Bana öyle geliyor ki, her satırın virgülle ayrılmış 3 değerinin her biri için, 1., 2. ve 4. karakterle bir şeyler yapar ve WAIT veya STOP yazdırır? a.split.map{..}3 WAITveya STOPher giriş satırı için baskıları kullanma . Bunu yapmak istedin mi sth. gibi b,c,d=a.split(?,)mi? Ayrıca, !b[3][2]daha kısadır b[3]=='UP', ama bence öyle olmalı b[2]? Dizeleri karşılaştırmak doğru >=olduğu gibi dikkat gerektirir "9">="77". Varsayılan giriş satırı ayırıcısıdır \n, bu nedenle splitbağımsız değişkenler olmadan kullanabilirsiniz . ?\ndaha kısadır '\n'.
blutorange

3

Python 3, 89 84 82 bayt

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

Açıklama:

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'

Açıklamak ister misiniz?
Juan Cortés

@ JuanCortés Açıklama eklendi.
TheNumberOne

1
Güzel, bayıldım!
Juan Cortés

2

Matlab, 100 90 bayt

İstediğim kadar küçük değil - özellikle boolean'dan dizelere dönüşüm çok uzun. Octave'a geçerek birkaç bayt tıraş etmeye çalıştım, ancak görünüşe göre% c henüz Octave'deki textscan için desteklenmiyor.

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

Şahsen ben bu çözüm bölünmüş kullanmayan tek çözüm olması güzel olduğunu düşünüyorum :)

EDIT: başlangıçta eşit durum çok karmaşık çözüldü.


Bu aslında 92 bayt - fonksiyon çağrısından a=önce biraz kaçırdınız xor. O zaman bile aslında doğru çıktı üretmiyor.
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)

Yalnızca ECMAScript 6 uyumlu tarayıcılarda

açıklama

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

0'ın doğru olup olmadığını sorarsak yanlış döndürür, bu nedenle 1 için UP-1, için 1 diyebiliriz DOWN. Ardından, her ikisini de 0'dan daha büyük bir parça için çalıştırabilmek için mevcut fiyat ve optimum fiyat farkı ile çarpıyoruz.

Koşul karşılanırsa, döndür STOP, aksi takdirde (eşit değerler dahil) döndürWAIT

Daha fazla golf ihtiyacı var


2

Javascript ( ES6 ), 82 80 79 bayt

Düzenleme: -2 @ JuanCortés çarpma yöntemini kullanarak

Düzenleme: -1 çarpma yöntemini azaltmak için bir hile kullanarak

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

Yorumlananlar:

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

Snippet Demosu:

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>

Revizyon Geçmiş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'))

Mantığı açıklamak ister misiniz? Harika görünüyor ama neler olduğuna dair hiçbir fikrim yok
Juan Cortés

@ JuanCortés Yorum yaptığım bir yorum ekledim :)
nderscore

Şerefe! Anladığım
Juan Cortés

2

C- 91 Bayt

Çünkü C bir yerde olmalı

Şimdi "STOP" ya da "WAIT" çıkışının farklı olup olmadığına rağmen, @nutki sürümüne çok benziyor.

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

Eski olan

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

Onu kesmeye çalışacağım


Bu kod çökecek. Bunun char c[4]yerine ihtiyacınız var char *c=""(ki bu da daha kısadır).
nutki

@nutki, Aslında, sadece Tanımsız Davranışı. Bir çarpışma olmaz.
Spikatrix

@CoolGuy, 1 baytlık salt okunur bir konuma 5 bayt yazma. Bunun segfault olmayacağı bir sistem var mı?
nutki

@nutki - açıkça Windows PC'im üzerinde çalıştığı gibi!
euanjt

@nutki, Gördün mü? E'nin sistemi bir segfault atmadı. Bu sadece tanımlanmamış bir davranıştır. Bir sistem üzerinde çalışabilir, diğerinde çalışmaz. Her şey olabilir. Ama kim umursar? Bu kod golf yani program sadece "çalışmak" gerekir :) BTW, olmamalı char c[5]( \0sonunda 1 boşluk )?
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)])

Yapılmakta olan çalışmalar ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.