Sumário
Código de golfe é bom. Torta é boa . Quando você junta os dois, apenas coisas boas podem acontecer.
Especificações
Neste desafio, você gerenciará uma loja de tortas. O usuário será capaz de entrada de cinco diferentes comandos: list
, count
, buy
, sell
, e exit
. Aqui estão as especificações para cada um:
list
Imprima uma lista de todas as tortas de propriedade e quantas. Separe com
|
e junte com um espaço de cada lado.|
s devem estar alinhados. O valor da torta pode ser negativo (isso significa que você deve torta a alguém:(
). Por exemplo:| apple | 500 | | blueberry | 2 | | cherry | -30 |
count [type]
Imprima quantas
{{type}}
tortas existem. Imprimir "Não há{{type}}
torta!" se não houver.{{type}}
sempre corresponderá à regex\w+
(ou seja, sempre será uma única palavra). Por exemplo, se eu tivesse a quantidade de tortas mostrada na lista de exemplos acima, então> count apple 500 > count peach There is no peach pie!
buy [n] [type]
Adicione
{{n}}
à contagem de{{type}}
torta e imprima-a. Crie{{type}}
torta se não existir.{{n}}
sempre corresponderá à regex[0-9]+
(ou seja, sempre será um número). Aqui está outro exemplo (com o mesmo inventário de torta que os exemplos anteriores):> count blueberry 2 > buy 8 blueberry 10
sell [n] [type]
Subtraia
{{n}}
da contagem de{{type}}
torta e imprima-a. Crie{{type}}
torta se não existir. Torta pode ser negativa (oh não, isso significaria que você deve torta a alguém!).> sell 15 blueberry -5 > buy 5 blueberry 0
exit
Imprimir "A loja de tortas fechou!" e saia do programa.
> exit The pie store has closed!
Esclarecimentos adicionais
- Se uma função não existente for chamada (a primeira palavra), imprima "Isso não é um comando válido".
- Se uma função existente é chamada com argumentos inválidos (as palavras após a primeira palavra), o comportamento do seu programa não importa. "Argumentos inválidos" inclui muitos argumentos, muito poucos argumentos,
{{n}}
não sendo um número etc. - Torta é boa.
- Sua entrada deve ser diferenciada da sua saída. Se você estiver executando o programa na linha de comando / terminal / shell / outra coisa baseada em texto, deverá prefixar a entrada com "
> "
(um sinal" maior que "e um espaço) ou alguma outra coisa com prefixo de entrada da shell. - Torta é boa.
Se todos esses esclarecimentos não forem bons o suficiente, aqui está um exemplo de saída:
> 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!
Se você comprar torta / venda ea contagem líquida torna-se
0
, você pode quer mantê-lo nolist
ou não, e você pode quer voltar0
ouThere is no {{type}} pie!
quandocount
ele.- Isso é código-golfe ; o código mais curto vence.
- Eu mencionei que a torta é boa?
buy 1 apple
esell 1 apple
. E seria então válidocount apple
retornar em0
vez deThere is no apple pie!
?Respostas:
Rubi,
335330Alguns truques aqui:
A ideia da maçaneta da porta de usar um formatador é um passo além, literalmente. Primeiro, a string mais longa no hash entre todas as chaves e valores é formatada usando
" %%%ds |"
para produzir uma string como" %6s |"
. Sim, sem encolher cada coluna separadamente. Nunca houve a exigência de. Um tamanho serve para todos. Em seguida, essa sequência é duplicada e usada como uma sequência de formatação para a matriz de dois elementos que contém a linha atual. Por fim, o+
começo do começo recebe sua palavra e precede um único tubo principal. Ah, eputs
tem um bom manuseio de matrizes.Ruby tem interpolação em literais regex. É uma defesa apertada, mas economiza um pouco.
Ruby requer ponto e vírgula após a
when
expressão, mas não antes da palavra-chave. Isso leva a um artefato de renderização estranho quando o ponto-e-vírgula é substituído por uma nova linha.E, é claro, perlismo conhecido como globals mágicos e correspondência automática de literais regex contra eles.
Além disso, a maioria das instruções incluindo
case
são expressões.fonte
Hash.new(0)
vez de{}
?nil
(o que não é permitir a adição) os usos literais.nil
como o valor padrão.h=Hash.new(0)
=>h=Hash.new 0
,print"> "
=>$><<'> '
, e acho que[*h]
pode serh
. Tentei montar uma versão sem a instrução switch, pois todo esse texto padrão realmente se soma: gist.github.com/chron/6315218 . Eu estava tentando fazer alguma coisa funcionar comruby -ap
mas a exigência para as marcas rápidas difícil: <$><<
imprimia uma nova linha. Quanto à última sugestão ... infelizmente, os hashes não têm um método "achatado".Ruby,
427384 caracteresGraças a Jan Dvorak, pela enorme melhoria de 427 para 384 (!)
fonte
loop{...}
vez dewhile 1do...end
.split
sem seu argumento. Por padrão, ela se divide por espaços em branco (ou$;
se isso for definido)p.keys.group_by(&:size).max[0]
- você está procurandop.keys.map(&:size).max
oup.map{|x,_|x.size}.max
? Aqui:[(t=p.values).max.to_s.size,t.min.to_s.size].max
você está procurandop.map{|_,x|x.to_s.size}.max
? Eu vou levar a sua ideia e abuse do formatador, embora :-)p[t]=p[t]+m
é equivalente ap[t]+=m
(excetop[t]
é avaliado duas vezes em vez de uma vez) e mais. Use o último.+=
operador; por isso não o usei. Talvez seja só por isso++
. Editarei minha postagem em breve.PitãoPie -thon 437Tenho certeza de que há alguma folga na segunda última linha, mas o requisito de alinhar as barras para o tipo e o número da torta é um pouco confuso.
De acordo com o comentário de Igby Largeman as regras não são claras sobre o que fazer se não era uma torta de um tipo específico, mas existem
0
agora. Então, eu interpretei a meu favor.Saída de amostra:
fonte
> count potato
produz emThat's not a valid command.
vez de #There is no potato pie!
pie.py
:: PC # -
571 568559Trazendo a retaguarda, como de costume, com o C # irremediavelmente detalhado.
Tomei alguma liberdade com a regra sobre a saída da lista. Para salvar alguns caracteres, eu codifiquei a largura da coluna de contagem para a largura máxima de um valor inteiro. (As regras não diziam que espaços extras não eram permitidos.)
Formatado:
fonte
Python 3, 310
fonte
Java -
772751739713666619Eu sei que não está ganhando o concurso, mas apenas por diversão!
Com quebras de linha e guias:
fonte
if/else
mais barato, mas devido ao fato de que eu precisaria fazers[0]=s[0].intern()
para comparar==
, ele sempre acaba sendo mais . Eu sei, muito contra-intuitivo.