World Big Dosa

37

Você é um jovem chef talentoso que acaba de receber a posição de sous chef no restaurante indiano mais prestigiado do mundo. Você tem pouca experiência com a preparação da culinária indiana, mas está determinado, e decide provar a si mesmo. Você decide se tornar o dosa líder especialista em . Para fazer isso, você deve não apenas dominar a criação de dosas, mas também poder escalá-las para serem arbitrariamente grandes.

Você encontra uma receita promissora para a massa dosa:

  • 1 xícara de arroz
  • 1 xícara ukda chawal
  • 1/2 xícara de chá
  • 1/4 xícara de poha
  • 1/4 colher de chá de sementes de meti
  • Sal a gosto
  • Água conforme necessário

Isso fará uma dosa aproximadamente de 1/2 metro de comprimento.

Desafio

Escreva um programa ou função que informe à equipe do restaurante exatamente o que é necessário para fazer uma única dose de um múltiplo inteiro da receita fornecida .O espaço é pequeno na cozinha, então você deseja que seu código seja o mais curto possível. O código mais curto vence, com empates indo para o post anterior.

As colheres e xícaras de medição são fornecidas nos seguintes tamanhos padrão: 1/4, 1/3, 1/2, 2/3, 3/4 e 1. Para evitar irritar a equipe da cozinha, as medições devem ser relatadas na maior unidade da cujo número pode ser escrito como números mistos usando apenas tamanhos padrão .

As medidas são propagadas para tamanhos maiores de acordo com a seguinte convenção:

  • 3 colheres de chá == 1 colher de sopa
  • 4 colheres de sopa == 1/4 xícara

Assim, para um múltiplo de 12, 1/4 de colher de chá de sementes de meti se torna 1 colher de sopa. No entanto, para um múltiplo de 13, torna-se 3 1/4 de colher de chá. Caso contrário, não seria representado em tamanhos padrão.

A equipe de garçons deve ser capaz de levar o dosa para as mesas. Para garantir que a dosa não pare em trânsito, instrua-os a transportar a dosa em equipes. Cada pessoa pode transportar no máximo um metro de dose. Portanto, para uma receita única ou dupla, apenas uma pessoa é necessária para carregá-la. A equipe de espera é menos eficaz se eles são cortados em pedaços fracionários, portanto, um número inteiro de garçons é sempre necessário.

Entrada

Tome um número inteiro positivo via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função. Esse número determina o fator de escala da receita e pode ser tão pequeno quanto 1, mas não maior que 2 32 -1. Pode ser qualquer número inteiro nesse intervalo.

Saída

Imprima em STDOUT (ou alternativa mais próxima) a lista de ingredientes escalados de acordo com a entrada, bem como o número de garçons necessários para transportar a dosa. Os ingredientes devem ser listados na ordem indicada acima e no formato fornecido abaixo.

Exemplos

Entrada:

2

Saída:

2 cups rice
2 cups ukda chawal
1 cup urad dal
1/2 cup poha
1/2 tsp methi seeds
Salt to taste
Water as needed
1 waiter

Observe que "cup" muda para "cups" quando o valor é maior que 1. "tsp" não muda. "garçom", como "xícara", torna-se plural.

Entrada:

5

Saída:

5 cups rice
5 cups ukda chawal
2 1/2 cups urad dal
1 1/4 cups poha
1 1/4 tsp methi seeds
Salt to taste
Water as needed
3 waiters

Valores não inteiros maiores que 1 são representados como números mistos, isto é, um número inteiro seguido por uma fração reduzida.

Nota: O título vem de um vídeo relevante .

Alex A.
fonte
15
Agora precisamos de alguém para fazer um Chef resposta :)
MickyT
11
"A equipe de espera é menos eficaz se eles são cortados em pedaços fracionários, portanto, um número inteiro de garçons é sempre necessário". ... Quanto menos eficaz, exatamente?
LivingInformation
4
@LivingInformation Bem, você já viu apenas um par de pernas levar comida para a sua mesa?
Alex A.
7
@AlexA. Você não?
LivingInformation
7
@MickyT: Eu tentei, mas parece que encontrei alguns bugs no interpretador Chef do CPAN. (a) Os valores de saída são separados por espaços, exceto quando não estiverem. (b) Algo na minha sub-receita Chutney de Número Misto (ou é o Iogurte com Cebola Comparado?) está fazendo com que o intérprete morra com uma mensagem de erro obscura.
Tim Pederick

Respostas:

9

CJam, 214 bytes

ri[48_24C.25]{[48ZX]f{:DW$@*\md_D{_@\%}h;:M/iDM/}3/_{W=5<}#:I=[(\'/*]{S+_0e=!*}/["cup"2$2a>'s*+"tbsp"_'b-]I=S}%4/"rice
ukda chawal
urad dal
poha
methi seeds
Salt to taste
Water as needed"N/.+N*N@)2/" waiter"1$1>'s*

Experimente online no intérprete CJam .

Dennis
fonte
Ainda não joguei de verdade, mas é tarde e eu queria postar a primeira resposta.
Dennis
Como nenhuma resposta do Chef foi publicada e a sua é a resposta válida mais curta no final do período de recompensa, você ganha a recompensa. Obrigado por participar do meu primeiro desafio. :)
Alex A.
7

Javascript (ES6), 443 caracteres

Foi muito divertido jogar golfe, mas o resultado é consideravelmente mais longo do que eu esperava.

d=n=>(y=s=>n<s?' cup':' cups',z=s=>n/s|0,A=' 1/4',B=' 1/2',C=' 3/4',n+y(2)+` rice
${n+y(2)} ukda chawal
${(n%2<1?n/2:z(2)+B)+y(3)} urad dal
${((e=n%4)<1?n/4:z(4)+(e<2?A:e<3?B:C))+y(5)} poha
${(n%48<1?z(192)+((c=n/48%4)>2?C:c>1?B:c>0?A:'')+y(193):n%3<1?z(12)+((f=n/3%4)>2?C:f>1?B:f>0?A:'')+' tbsp':(z(4)+(e>2?C:e>1?B:e>0?A:''))+' tsp')} methi seeds
Salt to taste
Water as needed
${(b=Math.ceil(n/2))} waiter`+(b<2?'':'s')).replace(/\n0 /g,'\n')

Experimente:

Aceita valores de até e inclusive incluindo 2^32ou4294967296 . Depois disso, o 'urad dal' transborda em números ímpares e se torna negativo.

Basicamente, ele calcula os valores corretos à medida que avança. Felizmente, apenas as sementes methi precisam ter medidas de colher de chá / colher de sopa / xícara; caso contrário, isso teria sido muito mais longo. (A linha de sementes methi sozinha é de 155 caracteres!)

Isso também teria pelo menos 500 caracteres no ES5. Eu ES6.

Como sempre, as sugestões são muito apreciadas!

Edit 1: Acabei de perceber que de acordo com as regras, 1 tspdeve ser substituído por 1/3 tbsp, same with 2 tspe 2/3 tbsp, as well as 16 tspand 1/3 cup....

ETHproductions
fonte
11
Math.ceil pode ser encurtado para -~isso, b=-~t/2 é muito mais curto, você também pode excluir o parêntese
Downgoat
@vihan Obrigado pela dica, mas isso só funciona em não-inteiros. -~1resulta em 2, que não é o resultado pretendido. A melhor alternativa que eu pude encontrar, b=-~((n-1e-9)/2)é o mesmo tempo, por isso continuarei do jeito que está por enquanto.
ETHproductions
3

Lisp comum, 435

(lambda(n)(labels((k(y)(some(lambda(x)(integerp(* y x)))'(1 4/3 3/2 2 3 4)))(h(s m)(multiple-value-bind(q r)(floor m)(format()"~[~:;~:*~A ~]~[~:;~:*~A ~]~@? " q r s m)))(g(o &aux(h(/ o 3))(c(/ h 4)))(cond((k c)(h"cup~P"c))((k h)(h"tbsp"h))(t(h"tsp"o)))))(format t"~&~A rice
~Aukda chawal
~Aurad dal
~Apoha
~Amethi seeds
Salt to taste
Water as needed
~A waiter~:P
"(g(* n 12))(g(* n 12))(g(* n 6))(g(* n 3))(g(/ n 4))(ceiling(/ n 2)))))

Ligeiramente não-destruído

(lambda (n)
  (labels ((k (y)
             (some (lambda (x) (integerp (* y x))) '(1 4/3 3/2 2 3 4)))
           (h (s m)
             (multiple-value-bind (q r)
                 (floor m)
               (format nil "~[~:;~:*~A ~]~[~:;~:*~A ~]~@?" q r s m)))
           (g (o &aux (h (/ o 3)) (c (/ h 4)))
             (cond ((k c) (h "cup~P" c)) ((k h) (h "tbsp" h)) (t (h "tsp" o)))))
    (format t "~&~A rice
~A ukda chawal
~A urad dal
~A poha
~A methi seeds
Salt to taste
Water as needed
~A waiter~:P
"
            (g (* n 12)) (g (* n 12)) (g (* n 6)) (g (* n 3)) (g (/ n 4))
            (ceiling (/ n 2)))))

Todas as medidas estão expressas em tsp. Com base na kfunção, gdecide quais unidades usar para impressão e chama a função de formatação hcom os argumentos apropriados.

  • k retorna true quando o argumento pode ser expresso como um múltiplo de 1, 1/4, 1/3, 2/3, 4/3 unidades
  • gconverte a entrada como um número de colheres de sopa e o número de colheres de sopa como um número de xícaras (conforme indicado na pergunta). Tentamos imprimir primeiro por unidades de xícaras, por unidades de colheres de sopa ou por tps.
  • huse diretivas de formatação condicionais para imprimir x, x y/zou y/zseguidas da formatação de swith argument m: for cups, sé o "cup~P"que plurializa a palavra de acordo com m.

Exemplo (n = 17)

17 cups rice
17 cups ukda chawal
8 1/2 cups urad dal
4 1/4 cups poha
4 1/4 tsp methi seeds
Salt to taste
Water as needed
9 waiters
coredump
fonte
Isso é legal. Bom trabalho.
123515 Alex A.
3

R, 602 603 526 bytes

Ainda tenho muito espaço para jogar golfe, suspeito, mas o tempo acabou e eu realmente queria dar uma resposta para essa pergunta.

function(i){S=gsub
M=i/c(1,5,60)
A=list(c(2,1),c(4,3),c(64,48))[[I<-max(which(M>=1))]]
B=c(4,12,192)[I]
V=c(' tsp',' tbsp',' cup')[I]
C=i%/%B
C=C+max((i%%B)%/%A*c(.3,.25))
cat(S('([ ]*)0 ','\\1',S('\\.3',' 1/3',S('\\.6',' 2/3',S('\\.5',' 1/2',S('\\.25',' 1/4',S('\\.75',' 3/4',paste0(i,' cup',if(i>1)'s',' rice
',i,' cup',if(i>1)'s',' ukda chawal
',i*.5,' cup',if(i>2)'s',' urad dal
',i*.25,' cup',if(i>4)'s',' poha
',C,V,if(C>1&I>2)'s',' methi seeds
Salt to taste
Water as needed
',ceiling(i*.5),' waiter',if(i>2)'s'))))))))}
MickyT
fonte
Para uma entrada de 5, isso tem, 1/3 tbsp 1/4 tsp methi seedsmas deve ser representado em uma única unidade comum. Assim deveria ser 1 1/4 tsp methi seeds(se minha matemática mental estiver correta).
Alex A.
@AlexA. Isso também é bom saber. Vou consertar isso logo. Suponho que seja o mesmo com xícaras e colheres de sopa.
MickyT
Sim, mesma regra para todas as unidades. Entretanto, +1 entretanto, de boa fé, estará correto em breve. Obrigado por participar do meu primeiro desafio. :)
Alex A.
1

JavaScript (Node.js) , 419 bytes

a=>(y=g=>a<g?" cup":" cups",z=g=>a/g|0,a+y(2)+` rice
${a+y(2)} ukda chawal
${(1>a%2?a/2:z(2)+(B=" 1/2"))+y(3)} urad dal
${(1>(e=a%4)?a/4:z(4)+(2>e?A=" 1/4":3>e?B:C=" 3/4"))+y(5)} poha
${1>a%48?z(192)+(2<(c=a/48%4)?C:1<c?B:0<c?A:"")+y(193):1>a%3?z(12)+(2<(f=a/3)?C:1<f?B:0<f?A:"")+" tbsp":z(4)+(2<e?C:1<e?B:0<e?A:"")+" tsp"} methi seeds
Salt to taste
Water as needed
${b=-~a/2|0} waiter`+(2>b?"":"s")).replace(`
0 `,`
`)

Experimente online!

Muhammad Salman
fonte