CodeGolf - Барі безладний розробник №2


11

Це подання CodeGolf - ігноруйте шум №1, єдина проблема в тому, що Баррі зробив для нас все ще гірше. Давайте подивимося, що сталося

Оновлення

Я додав код, щоб створити випадковий вхід і очікуваний вихід, тому що я не так добре в поясненні того, що я хочу, і я здогадуюсь, що іноді слова є більш оманливими, ніж код (чи не завжди це?)

Опис

Інший метод в API Dumb Corp дає нам поточну ціну, яку постачальник дає нам за товар, оптимальну ціну, з якою ми могли б отримати максимальний продаж, і тенденцію цієї ціни порівняно з попередніми цінами у вигляді рядка 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вкладенням as, ми знаємо, що існує продукт з поточною ціною 80 і оптимальною ціною 90 з тенденцією до зростання, тому ми повинні WAIT. З іншого боку, 840,1200,DOWNозначає, що ціна товару знижується, а наша оптимальна ціна вища, тому ми повинні зупинити втрати, випускаючи продукти STOP.

Якщо дві ціни однакові, випускайте WAITнезалежно від тенденції.

Кожен продукт у новому рядку, по одному слову на рядок:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

Коли можливо, введіть спосіб підтвердження того, що працює ваш код, оскільки ми не можемо все знати, просто переглянувши синтаксис. Як завжди, використовуйте якомога менше символів і пам’ятайте, що ви не конкуруєте з іншими мовами обов’язково, а змагаєтесь з мовами з подібним синтаксисом


Ваші дані тесту не дуже корисні без очікуваних результатів.
Не те, що Чарльз

@NotthatCharles: Я майже впевнений, що блок в розділі «Бажаний вихід» повідомлення - це очікуваний результат тестових даних у розділі Введення.
Олексій А.

Я мав на увазі "величезний вхідний зразок"
Не те, що Чарльз

Я реалізую зараз, що це було не дуже корисно, оновив код, щоб забезпечити очікуваний вихід.
Хуан Кортес

5
Чи є якась причина, чому ви віддаєте перевагу забивати символи? Тут за замовчуванням є байти (у існуючому кодуванні за вибором учасника). За допомогою символів ви просто змушуєте людей стискати свій код, кодуючи його у символи Unicode та подібні речі. (Який би не був ваш вибір, не змінюйте це рішення для цього виклику зараз, але, можливо, ви захочете мати це на увазі для майбутніх викликів.)
Мартін Ендер,

Відповіді:


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ми обертаємо відносні розміри цін, щоб ми могли покрити всі випадки єдиною нерівністю наприкінці.


Я попросив роз'яснення в ОП, і він сказав, що код повинен працювати для декількох рядків введення. Найкоротший спосіб досягти цього повинен бути таким:"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"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 байти!


Зрозуміло, минуло досить багато часу, коли я користувався Perl, але чи має бути and? Ви можете використовувати &чи щось?
Олексій А.

@AlexA. Не знаю чому, але &&поводиться дивно. Я спробував використовувати його, і він сказав, що є "неперевершений <>".
ASCIIThenANSI

Ага. Дивно. Що ж, добре. Приємне рішення.
Олексій А.

Чи можете ви зробити один дзвінок printі просто зробити щось подібне print((condition)?"STOP":"WAIT")."\n"?
Олексій А.

@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твердження, яке оцінюється.

Редагувати Messed до моєї інтерпретації правил. Виправлення коштує кілька символів.

> 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

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


Чи правильно це для нових рівних тестових випадків? Я також спробував щось подібне, але це не вдалося для одного з цих тестових випадків.
Oebele

@Oebele цього не бачив ... не впевнений, чи були вони додані після мого оригіналу, але я додав =тепер дякую :)
RichieAHB

Зачекайте - чому я сам зробив складне рішення, беручи багато байтів, а не додавати, =які я знав, це також можливість ... Час виправити!
Oebele

Це враховує випадок 1618,1618,DOWN?
nderscore

Можливо, я дурний, але цього коду я не отримую. Мені здається, що для кожного з 3-х значень, розділених комою кожного рядка, він робить щось із символом 1-го, 2-го та 4-го та надрукує WAIT або STOP? Використовуючи a.split.map{..}відбитки 3 WAITабо STOPдля кожного рядка введення. Ви мали на увазі зробити що-небудь. як 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

Матлаб, 100 90 байт

Не настільки маленькі, як хотілося б - особливо перетворення від булевих до рядків дуже довге. Я спробував поголити кілька байт, перейшовши на Octave, але, очевидно,% c ще не підтримується текстами в 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)

Особисто я думаю, що приємно, що це рішення є єдиним на даний момент, яке не використовує спліт :)

EDIT: спочатку вирішено ситуацію рівних ситуацій занадто складно.


Це фактично 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 правда, він поверне помилкове значення, тому ми можемо сказати 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és Я додав коментовану версію :)
nderscore

Ура! Що я розумію
Хуан Кортес

2

С- 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 - явно мій ПК з Windows, як він працював на цьому!
euanjt

@nutki, Бачиш? Система TheE не кинула сегмента за замовчуванням. Це просто невизначена поведінка. Можна працювати в одній системі, але не в іншій. Все може статися. Але кого це хвилює? Це кодовий гольф, тому програмі просто потрібно "працювати" :) BTW, чи не має бути char c[5](1 пробіл \0в кінці)?
Spikatrix

1

Пітон 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)])

В роботі...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.