World Big Dosa

37

Usted es un joven chef talentoso que acaba de recibir el puesto de sous chef en el restaurante indio más prestigioso del mundo. Tiene poca experiencia en la preparación de la cocina india, pero está decidido, por lo que se dispuso a demostrar su valía. Decide convertirse en el principal experto en dosa . Para hacer esto, no solo debe dominar la creación de dosas, sino que debe poder escalarlas para que sean arbitrariamente grandes.

Usted encuentra una receta prometedora para la masa de dosa:

  • 1 taza de arroz
  • 1 taza de ukda chawal
  • 1/2 taza de urad dal
  • 1/4 taza de poha
  • 1/4 cucharadita de semillas de methi
  • Sal al gusto
  • Riegue según sea necesario

Esto hará un dosa de aproximadamente 1/2 metro de longitud.

Reto

Escriba un programa o función que le diga al personal del restaurante exactamente lo que se necesita para hacer un solo dosa de un múltiplo entero de la receta dada . Hay poco espacio en la cocina, por lo que desea que su código sea lo más breve posible. El código más corto gana, con lazos que van a la publicación anterior.

Las cucharas y tazas medidoras vienen en los siguientes tamaños estándar: 1/4, 1/3, 1/2, 2/3, 3/4 y 1. Para evitar enojar al personal de la cocina, las mediciones deben informarse en la unidad más grande de que el número puede escribirse como números mixtos utilizando solo tamaños estándar .

Las medidas se propagan a tamaños más grandes según la siguiente convención:

  • 3 cucharaditas == 1 cucharada
  • 4 cucharadas == 1/4 taza

Entonces, para un múltiplo de 12, 1/4 cucharadita de semillas de methi se convierte en 1 cucharada. Sin embargo, para un múltiplo de 13, se convierte en 3 1/4 cucharadita. De lo contrario, no se representaría en tamaños estándar.

Los camareros deben poder llevar el dosa a las mesas. Para asegurarse de que el dosa no se rompa en tránsito, les indica que lo lleven en equipos. Cada persona puede llevar como máximo un metro de dosa. Entonces, para una receta simple o doble, solo se necesita una persona para llevarla. Los camareros son menos efectivos si se cortan en piezas fraccionarias, por lo que siempre se requiere un número entero de camareros .

Entrada

Tome un número entero positivo a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función. Este número dicta el factor de escala para la receta y puede ser tan pequeño como 1 pero no más grande que 2 32 -1. Puede ser cualquier número entero en ese rango.

Salida

Imprima en STDOUT (o la alternativa más cercana) la lista de ingredientes escalados de acuerdo con la entrada, así como el número de camareros necesarios para llevar el dosa. Los ingredientes deben enumerarse en el orden indicado anteriormente y en el formato que figura a continuación.

Ejemplos

Entrada:

2

Salida:

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

Tenga en cuenta que "cup" cambia a "cups" cuando el valor es mayor que 1. "tsp" no cambia. "camarero", como "copa", se convierte en plural.

Entrada:

5

Salida:

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

Los valores no enteros mayores que 1 se representan como números mixtos, es decir, un número entero seguido de una fracción reducida.

Nota: El título proviene de un video relevante .

Alex A.
fuente
15
Ahora necesitamos que alguien responda al Chef :)
MickyT
11
"Los camareros son menos efectivos si se cortan en piezas fraccionarias, por lo que siempre se requiere un número entero de camareros". ... ¿Cuánto menos efectivo, exactamente?
LivingInformation
44
@LivingInformation Bueno, ¿alguna vez has visto solo un par de patas llevar comida a tu mesa?
Alex A.
77
@AlexA. No tienes
LivingInformation
77
@MickyT: Lo intenté, pero parece que me encontré con algunos errores en el intérprete de Chef de CPAN. (a) Los valores de salida están separados por espacios, excepto cuando no lo están. (b) Algo sobre mi sub-receta de Chutney de Número Mixto (¿o es el Yogurt Minted de Comparación?) está causando que el intérprete muera con un oscuro mensaje de error.
Tim Pederick el

Respuestas:

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*

Pruébelo en línea en el intérprete de CJam .

Dennis
fuente
Realmente aún no jugaba golf, pero es tarde y quería publicar la primera respuesta.
Dennis
Como no se ha publicado ninguna respuesta del Chef y la suya es la respuesta válida más corta al final del período de recompensa, usted gana la recompensa. Gracias por participar en mi primer desafío. :)
Alex A.
7

Javascript (ES6), 443 caracteres

Esto fue muy divertido para el golf, pero el resultado es considerablemente más largo de lo que esperaba.

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

Pruébalo:

Acepta valores hasta e incluso incluidos 2^32, o 4294967296. Después de eso, el 'urad dal' se desborda en números impares y se vuelve negativo.

Básicamente, calcula las cantidades correctas a medida que avanza. Afortunadamente, solo las semillas de methi necesitan medidas de cucharaditas / cucharadas / taza; de lo contrario, esto hubiera sido mucho más tiempo. (¡La línea de semillas methi sola es de 155 caracteres!)

Esto también habría tenido al menos 500 caracteres de largo en ES5. Yo ❤ ES6.

Como siempre, ¡las sugerencias son muy apreciadas!

Edición 1: Acabo de darme cuenta de que de acuerdo con las reglas, 1 tspdebe reemplazarse con 1/3 tbsp, lo mismo con 2 tspy 2/3 tbsp, así como 16 tspy 1/3 cup...

ETHproducciones
fuente
1
Math.ceil puede acortarse a -~eso, b=-~t/2 es mucho más corto, También puede excluir el paréntesis
Downgoat
@vihan Gracias por el consejo, pero esto solo funciona en números no enteros. -~1resulta en 2, que no es el resultado previsto. La mejor alternativa que pude encontrar b=-~((n-1e-9)/2)es igual de larga, así que la mantendré así por ahora.
ETHproductions
3

Lisp común, 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)))))

Ligeramente no golfista

(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 las medidas se expresan en tsp. En kfunción de la función, gdecide qué unidades usar para imprimir y llama a la función de formateo hcon los argumentos apropiados.

  • k devuelve verdadero cuando el argumento puede expresarse como un múltiplo de 1, 1/4, 1/3, 2/3, 4/3 unidades
  • gconvierte la entrada como un número de cucharadas y el número de cucharadas como un número de tazas (como se indica en la pregunta). Intentamos imprimir por unidades de tazas primero, o unidades de cucharada, o bien en tps.
  • huse directivas de formato condicional para imprimir x, x y/zo y/zseguido del formato de scon argumento m: para tazas, que ses el "cup~P"que plurializa la palabra según m.

Ejemplo (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
volcado de memoria
fuente
Esto está bien. Buen trabajo.
Alex A.
3

R, 602 603 526 bytes

Sospecho que todavía hay mucho espacio para jugar al golf, pero se me acabó el tiempo y realmente quería responder a esta pregunta.

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
fuente
Para una entrada de 5 esto tiene, 1/3 tbsp 1/4 tsp methi seedspero debe representarse en una sola unidad común. Entonces debería ser 1 1/4 tsp methi seeds(si mis cálculos mentales son correctos).
Alex A.
@AlexA. Eso también es bueno saber. Lo arreglaré pronto. Supongo que es lo mismo con tazas y cucharadas.
MickyT
Sí, la misma regla para todas las unidades. Mientras tanto, hace +1, de buena fe, que será correcto pronto. Gracias por participar en mi primer desafío. :)
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 `,`
`)

Pruébalo en línea!

Muhammad Salman
fuente