CodeGolf - Barry el desarrollador desordenado # 2

11

Este es un seguimiento de CodeGolf: ignore el ruido n. ° 1, el único problema es que Barry nos ha empeorado las cosas. Vamos a ver que pasó

Actualizar

Agregué código para crear entradas aleatorias y salidas esperadas porque no soy tan bueno para explicar lo que quiero, y supongo que a veces las palabras son más engañosas que el código (¿no es así siempre?)

Descripción

Otro método en la API de Dumb Corp nos da el precio actual que un proveedor nos está dando por un artículo, el precio óptimo con el que estaríamos haciendo ventas máximas y la tendencia de ese precio en comparación con los precios anteriores como una cadena UPo DOWN. Necesitamos decidir si debemos eliminar el artículo de la tienda o esperar.

Entrada

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

Para una demostración de muestra de gran entrada con salida esperada, coloque el siguiente código (js) en la consola de su navegador y debería generar una entrada aleatoria válida para la prueba.

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

Como siempre tendremos una variable Gcomo nuestra entrada, sin embargo, si su idioma le facilita la lectura de la entrada, también está bien. El formato es constante y sigue el formato.int,int,string

Salida deseada

Eres el cerebro de esta operación, Barry debería estar haciendo este cálculo en el servidor, pero no podemos contar con él como debes saber. Debe generar WAITsi la tendencia es hacia el precio óptimo, o STOPsi la tendencia es hacia la pérdida.

En otras palabras, con la 80,90,UPentrada como, sabemos que hay un producto con un precio actual de 80 y un precio óptimo de 90 con una tendencia a subir, por lo que deberíamos WAIT. Por otro lado, 840,1200,DOWNsignifica que el precio del producto está bajando y nuestro precio óptimo es más alto, por lo que deberíamos detener las pérdidas produciendo STOP.

Si los dos precios son idénticos, la producción WAITindependientemente de la tendencia.

Cada producto en una nueva línea, una sola palabra por línea:

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

Por favor, cuando sea posible, proporcione una forma de verificar que su código esté funcionando, ya que no todos podemos saberlo simplemente mirando la sintaxis. Como siempre, use la menor cantidad de caracteres posible y recuerde que no está compitiendo necesariamente con otros idiomas, compite con idiomas con una sintaxis similar.

Juan Cortés
fuente
Sus datos de prueba no son terriblemente útiles sin los resultados esperados.
No es que Charles
@NotthatCharles: estoy bastante seguro de que el bloque en la sección Salida deseada de la publicación es el resultado esperado de los datos de prueba en la sección Entrada.
Alex A.
Me refería a la "muestra de entrada enorme"
No es que Charles
Ahora me doy cuenta de que no fue realmente útil, actualicé el código para proporcionar la salida esperada.
Juan Cortés
55
¿Hay alguna razón por la que prefieras puntuar en los personajes? El valor predeterminado aquí es bytes (en una codificación existente a elección del participante). Con los caracteres, solo obtienes personas que comprimen su código codificándolo en caracteres Unicode y cosas así. (Cualquiera sea su elección, no lo cambie para este desafío ahora, pero es posible que desee tenerlo en cuenta para futuros desafíos).
Martin Ender

Respuestas:

6

CJam, 31 29 27 caracteres

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

Esta es solo una versión codificada del siguiente código (para hacer uso de la puntuación por caracteres):

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

Ejecute todos los casos de prueba aquí.

Puede haber una forma de acortar esto mediante la codificación STOPy WAIT, pero estoy bastante contento con el resto.

Explicación

El código está rodeado por un bucle que se lee en línea a la vez, lo procesa, luego empuja una nueva línea y lee la siguiente línea ... El bucle termina una vez que rdevuelve una cadena vacía (es decir, después de que se hayan procesado todas las líneas). Esa es esta parte:

r{ ... Nr}h

En cuanto al procesamiento de cada línea, estoy haciendo uso del hecho de que las letras mayúsculas son variables en CJam, por lo que puedo evaluar algunas de las entradas.

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

Entonces, el problema es que UPinvertimos los tamaños relativos de los precios, para que podamos cubrir todos los casos con una desigualdad única al final.

Martin Ender
fuente
Solicité una aclaración al OP y dijo que el código debería funcionar para varias líneas de entrada. La forma más corta de lograr esto debería ser esta:"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~
Dennis
@ Dennis Ugh, puntuación por personajes ... gracias.
Martin Ender
7

Perl, 35

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

Ponme a prueba .

nutki
fuente
4

Perl, 77 73 bytes

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

Así es como funciona:

  • while(<>) analiza cada línea.
  • @p=split","lo divide por cada coma. Está utilizando el operador Perl predeterminado $_(que es donde se almacena la línea).
  • print (ternary) determina qué imprimir.
  • $p[0]<$p[1]and$p[2]=~/D/ pregunta si el precio actual es menor que el precio que queremos y está bajando (marcando una D.)
  • (condition)?(if):(else) es el operador ternario.
  • Si nuestra condición coincidía anteriormente, saldrá STOP. De lo contrario, saldrá WAIT.

Supongo que no hay una nueva línea final en la entrada; una nueva línea final produce un extra WAIT.

¡Gracias a Alex A. por ayudarme a ahorrar 4 bytes!

ASCIIThenANSI
fuente
Es cierto que ha pasado bastante tiempo desde que usé Perl, pero ¿tiene que ser así and? ¿Puedes usar &o algo?
Alex A.
@AlexA. No estoy seguro de por qué, pero se &&comporta de manera extraña. Intenté usarlo y dijo que había un "incomparable <>".
ASCIIThenANSI
Huh Extraño. Oh bien. Buena solución
Alex A.
¿Puedes hacer una sola llamada printy hacer algo como print((condition)?"STOP":"WAIT")."\n"?
Alex A.
@AlexA. Huh, no sabía que podías hacer eso. ¡Gracias!
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");}

Ponme a prueba .

nutki
fuente
3

R, 95 108

R y cadenas, no realmente amigos :)

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

La entrada es el vector de caracteres y Gluego cambia cada cadena en una ifdeclaración que se evalúa.

Editar en mal estado mi interpretación de las reglas. Fix costó unos pocos personajes.

> 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
fuente
¿Por qué los dos últimos devuelven "esperar"? Deberían dar "alto".
Oebele
@Oebele, entendí mal las reglas. No estaba claro que los precios actuales más altos descendieran. Se solucionará pronto
MickyT
3

Ruby - 89 caracteres

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

Con ayuda de a bluetorange!

RichieAHB
fuente
¿Es esto correcto para los nuevos casos de prueba igual? También probé algo como esto, pero eso falló en uno de esos casos de prueba.
Oebele
@Oebele no vio eso ... no estoy seguro de si se agregaron después de mi original pero agregué el =ahora gracias :)
RichieAHB
Espera, ¿por qué yo mismo hice una solución compleja tomando muchos bytes en lugar de agregar =lo que sabía que también era una posibilidad ... Hora de arreglarlo!
Oebele
¿Esto tiene en cuenta el caso 1618,1618,DOWN?
nderscore
Quizás soy estúpido, pero no obtengo este código. Me parece que para cada uno de los 3 valores separados por comas de cada línea, hace algo con el primer, segundo y cuarto carácter e imprime WAIT o STOP? Usando a.split.map{..}impresiones 3 WAITo STOPpara cada línea de entrada. ¿Querías hacer algo? como b,c,d=a.split(?,)? Además, !b[3][2]es más corto que b[3]=='UP', pero creo que debería ser b[2]? Comparar cadenas con >=requiere atención, como "9">="77"es cierto. El separador de línea de entrada predeterminado es \n, por lo que podría usarlo splitsin argumentos. ?\nes más corto que '\n'.
blutorange
3

Python 3, 89 84 82 bytes

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

Explicación:

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'
El numero uno
fuente
¿Te importaría explicarlo?
Juan Cortés
@ JuanCortés Explicación agregada.
TheNumberOne
1
¡Hermosa me encanta!
Juan Cortés
2

Matlab, 100 90 bytes

No es tan pequeño como me gustaría, especialmente la conversión de booleano a cadenas es muy larga. Intenté reducir algunos bytes al cambiar a Octave, pero aparentemente% c aún no es compatible con textcan en 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)

Personalmente, creo que es bueno que esta solución sea la única hasta ahora que no use división :)

EDITAR: originalmente resolvió la situación de igualdad de manera demasiado compleja.

Oebele
fuente
Esto es en realidad 92 bytes: se perdió el a=bit antes de la xorllamada a la función. Aunque incluso entonces en realidad no produce la salida correcta.
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)

Solo en navegadores compatibles con ECMAScript 6

Explicación

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

Utiliza el hecho de que si preguntamos si 0 es verdadero, devolverá falso, por lo que podemos decir 1 para UP, -1 para DOWN. Luego lo multiplicamos por la diferencia del precio actual y el precio óptimo para que ambos funcionen por más de 0 partes.

Si se cumple la condición, regrese STOP, de lo contrario (incluyendo valores iguales) regreseWAIT

Necesita más golf

Juan Cortés
fuente
2

Javascript ( ES6 ), 82 80 79 bytes

Editar: -2 usando el método de multiplicación @ JuanCortés

Editar: -1 usando un truco para reducir el método de multiplicación

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

Comentado:

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

Fragmento de demostración:

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>

Revisión histórica:

// 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
fuente
¿Te importaría explicar la lógica? Se ve increíble pero no tengo idea de lo que está pasando
Juan Cortés
@ JuanCortés He agregado una versión comentada :)
nderscore
¡Salud! Eso sí lo entiendo
Juan Cortés
2

C- 91 bytes

Porque C tiene que estar allí en alguna parte

Ahora se ve muy similar a la versión @nutki, aunque determinar si la salida "STOP" o "WAIT" es diferente.

Sin golfos

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

Golfizado

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

El viejo

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

Continuaré intentando cortarlo

euanjt
fuente
Este código simplemente se bloqueará. Necesita en char c[4]lugar de char *c=""(que también es más corto).
nutki
@nutki, en realidad, es solo un comportamiento indefinido. Un choque no necesita suceder.
Spikatrix
@CoolGuy, escribiendo 5 bytes en una ubicación de solo lectura de 1 byte. ¿Hay un sistema en el que esto no se segfault?
nutki
@nutki - ¡obviamente mi PC con Windows ya que funcionó en eso!
euanjt
@nutki, ¿ves? El sistema de TheE no arrojó un defecto de seguridad. Es solo un comportamiento indefinido. Podría funcionar en un sistema, pero no en el otro. Cualquier cosa puede suceder. ¿Pero a quién le importa? Este es el código de golf, por lo que el programa solo necesita "funcionar" :) Por cierto, ¿no debería ser char c[5](1 espacio para \0el final)?
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)])

Trabajo en progreso...

monguin
fuente