Resumen
El código de golf es bueno. El pastel está bien . Cuando juntas los dos, solo pueden pasar cosas buenas.
Especificaciones
En este desafío, administrará una pastelería. El usuario será capaz de introducir cinco comandos diferentes: list
, count
, buy
, sell
, y exit
. Aquí están las especificaciones para cada uno:
list
Imprima una lista de todos los pasteles que posee y cuántos. Separa con una
|
almohadilla con un espacio a cada lado.|
s debe estar alineado. La cantidad del pastel puede ser negativa (eso significa que le debe pastel a alguien:(
). Por ejemplo:| apple | 500 | | blueberry | 2 | | cherry | -30 |
count [type]
Imprime cuántas
{{type}}
tartas hay. Imprimir "¡No hay{{type}}
pastel!" si no hay ninguno{{type}}
siempre coincidirá con la expresión regular\w+
(es decir, siempre será una sola palabra). Por ejemplo, si tuviera la cantidad de pasteles que se muestra en la lista de ejemplos anterior, entonces> count apple 500 > count peach There is no peach pie!
buy [n] [type]
Agregue
{{n}}
al recuento de{{type}}
pastel e imprímalo. Crea un{{type}}
pastel si no existe.{{n}}
siempre coincidirá con la expresión regular[0-9]+
(es decir, siempre será un número). Aquí hay otro ejemplo (con el mismo inventario circular que los ejemplos anteriores):> count blueberry 2 > buy 8 blueberry 10
sell [n] [type]
Reste
{{n}}
del recuento de{{type}}
pastel e imprímalo. Crea un{{type}}
pastel si no existe. El pastel puede ser negativo (¡oh no, eso significaría que le debes pastel a alguien!).> sell 15 blueberry -5 > buy 5 blueberry 0
exit
Imprimir "¡La tarta ha cerrado!" y salga del programa.
> exit The pie store has closed!
Aclaraciones adicionales
- Si se llama a una función no existente (la primera palabra), imprima "Ese no es un comando válido".
- Si se llama a una función existente con argumentos no válidos (las palabras después de la primera palabra), no importa cómo se comporta su programa. Los "argumentos inválidos" incluyen demasiados argumentos, muy pocos argumentos,
{{n}}
no ser un número, etc. - El pastel está bien.
- Su entrada debe distinguirse de su salida. Si está ejecutando el programa en la línea de comando / terminal / shell / otra cosa basada en texto, debe prefijar la entrada con "
> "
(un signo" mayor que "y un espacio) o alguna otra cosa de prefijo de entrada de shell. - El pastel está bien.
Si todas estas aclaraciones no son lo suficientemente buenas, aquí hay algunos resultados de muestra:
> list > buy 10 apple 10 > sell 10 blueberry -10 > list | apple | 10 | | blueberry | -10 | > count apple 10 > count peach There is no peach pie! > exit The pie store has closed!
Si compra pastel / venta y el recuento neta se convierte
0
, puede o bien mantenerlo en ellist
o no, y puede o bien volver0
oThere is no {{type}} pie!
cuandocount
la misma.- Este es el código de golf ; el código más corto gana.
- ¿Mencioné que el pastel es bueno?
buy 1 apple
ysell 1 apple
. ¿Y entonces sería válidocount apple
regresar en0
lugar deThere is no apple pie!
?Respuestas:
Rubí,
335330Algunos trucos aquí:
La idea de Doorknob de usar un formateador se da un paso más allá, literalmente. Primero, la cadena más larga en el hash entre todas las claves y valores se formatea usando
" %%%ds |"
para producir una cadena como" %6s |"
. Sí, no encoge cada columna por separado. Nunca hubo el requisito de hacerlo. Talla única para todos. Luego, esta cadena se duplica y se usa como una cadena de formato para la matriz de dos elementos que contiene la fila actual. Finalmente,+
cerca del inicio recibe su palabra y antepone una sola tubería principal. Ah, yputs
tiene un buen manejo de matrices.Ruby tiene interpolación en literales regex. Es una salvación apretada, pero ahorra un poco.
Ruby requiere punto y coma después de la
when
expresión, pero no antes de la palabra clave. Esto conduce a un extraño artefacto de representación cuando el punto y coma se reemplaza con una nueva línea.Y, por supuesto, el perlismo conocido como globals mágicos y la coincidencia automática de literales regex contra ellos.
Además, la mayoría de las declaraciones incluidas
case
son expresiones.fuente
Hash.new(0)
lugar de{}
?nil
(que no permitir la adición). El literal utilizanil
como valor predeterminado.h=Hash.new(0)
=>h=Hash.new 0
,print"> "
=>$><<'> '
, y creo que[*h]
puede serh
. Intenté armar una versión sin la declaración de cambio ya que todo ese texto repetitivo realmente se suma: gist.github.com/chron/6315218 . Estaba tratando de hacer que algo funcionara,ruby -ap
pero el requisito para el aviso lo dificulta: <$><<
imprimí una nueva línea. En cuanto a la última sugerencia ... desafortunadamente, los hashes no tienen un método de "aplanamiento".Rubí,
427384caracteresGracias a Jan Dvorak de gran mejora de 427 a 384 (!)
fuente
loop{...}
lugar dewhile 1do...end
.split
sin su argumento. Por defecto, se divide por espacios en blanco (o$;
si está configurado)p.keys.group_by(&:size).max[0]
- ¿Estás buscandop.keys.map(&:size).max
op.map{|x,_|x.size}.max
? Aquí:[(t=p.values).max.to_s.size,t.min.to_s.size].max
¿estás buscandop.map{|_,x|x.to_s.size}.max
? Sin embargo, tomaré tu idea y abusaré del formateador :-)p[t]=p[t]+m
es equivalente ap[t]+=m
(excepto quep[t]
se evalúa dos veces en lugar de una vez) y más largo. Usa el último.+=
operador; Por eso no lo usé. Tal vez eso es solo para++
. Editaré mi publicación en brevePitónPie -thon 437Estoy seguro de que hay un poco de holgura en la segunda última línea, pero el requisito de alinear las barras tanto para el tipo de tarta como para el número es muy confuso.
De acuerdo con el comentario de Igby Largeman las reglas no están claras en torno a qué hacer si no era un pastel de un tipo específico, pero hay
0
ahora. Entonces lo he interpretado a mi favor.Salida de muestra:
fuente
> count potato
produce enThat's not a valid command.
lugar deThere is no potato pie!
pie.py
:: PC # -
571 568559Levantando la parte trasera como de costumbre con el irremediablemente detallado C #.
Me tomé un poco de libertad con la regla sobre la salida de la lista. Para guardar algunos caracteres, codifiqué el ancho de la columna de conteo al ancho máximo de un valor entero. (Las reglas no decían que no se permitían espacios adicionales).
Formateado:
fuente
Pitón 3, 310
fuente
Java -
772751739713666619Sé que no está ganando el concurso, ¡sino solo por diversión!
Con saltos de línea y pestañas:
fuente
if/else
a ser menos costoso, pero debido al hecho de que tendría que hacers[0]=s[0].intern()
para comparar==
, siempre termina siendo más . Lo sé, muy contradictorio.