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входных данных мы знаем, что существует продукт с текущей ценой 80 и оптимальной ценой 90 с тенденцией к росту, поэтому мы должны это сделать WAIT. С другой стороны, 840,1200,DOWNозначает, что цена продукта снижается, а наша оптимальная цена выше, поэтому мы должны остановить потери, выпуская STOP.

Если две цены идентичны, выведите WAITнезависимо от тенденции.

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

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

Пожалуйста, по возможности, предоставьте способ проверки того, что ваш код работает, так как мы не можем все знать, просто посмотрев на синтаксис. Как всегда, используйте как можно меньше символов и помните, что вы не обязательно конкурируете с другими языками, вы конкурируете с языками с похожим синтаксисом


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

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

Я имел в виду «огромный входной образец»
не то, что Чарльз

Теперь я понимаю, что это не очень полезно, обновив код, чтобы обеспечить ожидаемый результат.
Хуан Кортес

5
Есть ли причина, по которой вы предпочитаете забивать персонажей? По умолчанию здесь используются байты (в существующей кодировке по выбору участника). С помощью символов вы просто заставляете людей сжимать свой код, кодируя его в символах Юникода и тому подобное. (Каким бы ни был ваш выбор, не меняйте его для этого испытания сейчас, но, возможно, вы захотите запомнить его для будущих испытаний.)
Мартин Эндер

Ответы:


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~
Денис

@ Денис Тьфу, забив по персонажам ... спасибо.
Мартин Эндер


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

Да. Weird. Ну что ж. Хорошее решение.
Алекс А.

Можете ли вы сделать один звонок 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оператор, который оценивается.

Редактировать Перепутал мою интерпретацию правил. Исправлена ​​стоимость нескольких персонажей.

> 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 Я неправильно понял правила. Это не было ясно для более высоких текущих цен по убыванию. Скоро исправлю
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

Подождите - почему я сам сделал сложный обходной путь, занимая много байтов вместо того, чтобы добавить, =что, как я знал, тоже было возможно ... Время исправить!
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

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

Лично я думаю, что приятно, что это пока единственное решение, которое не использует сплит :)

РЕДАКТИРОВАТЬ: первоначально решил ситуацию равных слишком сложным.


На самом деле это 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

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

Golfed-

 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 байта. Есть ли система, в которой это не будет segfault?
орехи

@nutki - очевидно, мой ПК с Windows, как он работал на этом!
euanjt

@nutki, понимаешь? Система TheE не выбрасывала ошибки. Это просто неопределенное поведение. Может работать в одной системе, но не в другой. Все может случиться. Но кого это волнует? Это код гольф, поэтому программа просто должна «работать» :) Кстати, не так ли 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.