Cocinar con código

24

Eres chef y te encanta cocinar con tus especias, pero recientemente te ha gustado organizar tus especias en función de la frecuencia con que las usas. Pero no tiene tiempo para escribir cuando usó su especia por última vez. Simplemente, intercambias y mueves especias, y esto parece hacer el truco.

Pero, por supuesto, eres chef y eso significa que tienes algunos cocineros contigo. Decides decirles las simples reglas de compromiso con tus especias.

  1. Si recientemente usó una especia, muévala hacia arriba una en el estante de especias

  2. Si no usó ninguna []especie , por ejemplo , la lista de movimientos vacía, entonces la lista de especias no se ve afectada.

  3. Puede poner cualquier especia en mi porta especias, pero si la usa, asegúrese de moverla.

  4. La lista puede contener cualquier cosa. Pero debido a que estas son especias con las que estamos trabajando. Se prefiere que use nombres de especias.

  5. Las especias deben ser únicas. Demasiadas de las mismas especias estropean el caldo ... o como dice ese dicho

Se aplican las reglas normales de código de golf.

Ejemplo de uso de orégano una y otra vez.

pepper  pepper  pepper  pepper  oregano
paprika paprika paprika oregano pepper
salt    salt    oregano paprika paprika
cumin   oregano salt    salt    salt
oregano cumin   cumin   cumin   cumin

Tarea

Ingrese una lista de especias y una lista de las especias que se usaron, luego envíe la lista final.

Ejemplo

Entrada

[pepper, paprika, salt, cumin, oregano], [oregano, cumin, cumin, salt, salt, salt]

Salida

[salt, pepper, paprika, cumin, oregano]

Cómo se ve esto

pepper  pepper  pepper  pepper  pepper  pepper  salt
paprika paprika paprika paprika paprika salt    pepper
salt    salt    salt    cumin   salt    paprika paprika
cumin   oregano cumin   salt    cumin   cumin   cumin
oregano cumin   oregano oregano oregano oregano oregano

Entrada

[pepper, paprika, salt, cumin, oregano], [salt, salt, salt, salt, salt, salt, salt, salt, salt, salt, salt, salt, oregano]

Salida

[salt, pepper, paprika, oregano, cumin]
tisaconundrum
fuente
¿Los artículos en la lista de especias son únicos?
tsh
Sí, serán únicos
tisaconundrum
31
Llegué bastante lejos haciendo esto en Chef, ¡ pero finalmente me cansé demasiado! Le daré a alguien 50 recompensas si pueden hacerlo.
geokavel
55
Aquí hay una idea de cómo ingresar los tazones. ¡El resto será muy difícil, pero factible para la persona adecuada!
geokavel
1
@geokavel Challenge aceptado
NieDzejkob

Respuestas:

4

Casco , 15 14 bytes

Fλṁ↔`C⁰tMo→=¢⁰

Las entradas son listas de cadenas (también funciona en otros tipos de listas). Pruébalo en línea!

-1 byte gracias a H.PWiz

Explicación

Fλṁ↔`C⁰tMo→=¢⁰  Implicit inputs (two lists).
F               Fold second input using the first as initial value
 λ              with this anonymous function:
                 Arguments x (list of spices) and s (used spice).
                 For example, x=["a","b","c","d"] and s="c".
            ¢⁰   Repeat x infinitely: ["a","b","c","d","a","b","c","d"..
        M        For each item,
           =     test equality to s: [0,0,1,0,0,0,1,0..
         o→      and increment: [1,1,2,1,1,1,2,1..
       t         Drop first element: [1,2,1,1,1,2,1..
    `C⁰          Cut x to these lengths: [["a"],["b","c"],["d"]]
  ṁ↔             Reverse each slice and concatenate: ["a","c","b","d"]

Tengo que repetir xinfinitamente, ya que de lo contrario la lista perdería su último elemento cuando usemos la especia más alta. Sería suficiente agregar un 1 al final, pero la repetición toma menos bytes. Una mejor manera sería rotar la lista en lugar de soltar su primer elemento, pero Husk no tiene nada incorporado para eso.

Zgarb
fuente
Σmes por un byte.
H.PWiz
8

Haskell , 48 bytes

foldl(?)es una función anónima que toma dos argumentos de lista y devuelve una lista, con todos los elementos del mismo tipo ( Eq-comparable).

Usar como foldl(?)["pepper", "paprika", "salt", "cumin", "oregano"]["oregano", "cumin", "cumin", "salt", "salt", "salt"].

foldl(?)
(x:y:r)?n|y==n=y:x:r|s<-y:r=x:s?n
s?n=s

Pruébalo en línea!

  • foldl(?) s mcomienza con la lista (estante de especias) sy la combina con cada elemento (especia) men orden, utilizando el operador ?.
  • s?nusa la especia ndel estante sy devuelve el estante resultante.
    • Si stiene al menos dos elementos, ?verifica si el segundo es igual a n, y si es así, cambia los dos primeros elementos. Si no es igual, ?mantiene el primer elemento fijo y recurre al resto.
    • Si stiene como máximo un elemento, lo ?devuelve sin cambios.
Ørjan Johansen
fuente
7

Chef , 875 843 bytes

S.

Ingredients.
1 g T
0 g Z
J
I

Method.
Put Z into mixing bowl.Take I from refrigerator.B I.Put I into mixing bowl.Take I from refrigerator.B until bed.Take I from refrigerator.V I.Put Z into 2nd mixing bowl.N T.Fold J into mixing bowl.Put J into mixing bowl.Remove I.Fold T into mixing bowl.Put J into 2nd mixing bowl.N until ned.Fold T into mixing bowl.Put T into mixing bowl.Fold J into 2nd mixing bowl.Put J into mixing bowl.C T.Stir for 1 minute.Put Z into mixing bowl.Fold T into mixing bowl.C until ced.Fold T into 2nd mixing bowl.G T.Put T into mixing bowl.Fold T into 2nd mixing bowl.G until ged.Put I into mixing bowl.Fold T into mixing bowl.Take I from refrigerator.V until ved.Fold T into mixing bowl.L T.Put T into 2nd mixing bowl.Fold T into mixing bowl.L until led.Pour contents of 2nd mixing bowl into baking dish.

Serves 1.

-32 bytes gracias a Jonathan Allan al eliminar thedonde no creo que funcione.

Chef no tiene tipos de cadena, por lo que los ingredientes son enteros positivos. 0 se utiliza para separar la lista de inicio de los ingredientes utilizados y para finalizar la lista de ingredientes utilizados. Vea el enlace TIO para ver un ejemplo.

Explicación del pseudocódigo:

A, B: stack
T, J, IN: int
T = 1
A.push(0) // used as the marker for the bottom of the stack
IN = input() // input the first list
while(IN):
    A.push(IN)
    IN = input()
IN = input() // for each used ingredient
while(IN):
    B.push(0)
    while(T): // move all ingredients up to and including the one we are moving right now to the second stack
        T = A.peek() - IN
        B.push(A.pop())
    A.push(B.pop())
    if(A.peekUnderTop() != 0):
        A.swapTopTwoItems()
    T = B.pop() // move the ingredients from the second stack back to the first
    while(T):
        A.push(T)
        T = B.pop()
    T = IN // to make it non-zero for next iteration
    IN = input(0
print(A.inverted())

Pruébalo en línea!

NieDzejkob
fuente
¡Increíble! ¿Este lenguaje ha estado en TIO todo el tiempo?
geokavel
Al eliminar algunas palabras redundantes, puede guardar 32 bytes
Jonathan Allan
@geokavel se agregó ayer.
Jonathan Allan
1
@geokavel ¿Vertiste el contenido del tazón en la fuente de horno antes de servir?
NieDzejkob
1
@NieDzejkob Did you pour the contents of the mixing bowl into the baking dish before serving?que suena completamente como un comentario que iría a la cocina SE y no aquí: P lol (también una pregunta muy extraña para cocinar si me preguntas: P)
HyperNeutrino
6

JavaScript, 61 bytes

a=>b=>b.map(v=>(p=a.indexOf(v))&&a.splice(p-1,2,a[p],a[p-1]))

Formato de entrada:

  • f (list_of_spices) (list_of_what_spices_got_used)
  • dos lista son matriz de cadena

Salida:

  • list_of_spices se modifica en el lugar.

tsh
fuente
5

Python 2 , 72 71 69 bytes

Nueva respuesta, en el espíritu de mi intento original.

r,u=input()
for x in u:i=r.index(x);r.insert(i/~i+i,r.pop(i))
print r

Pruébalo en línea!

Otra solución:

Python 2 , 69 bytes

r,u=input()
for x in u:i=r.index(x)-1;r[i:i+2]=r[i:i+2][::-1]
print r

Pruébalo en línea!

TFeld
fuente
print(r)-> print r?
tsh
1
69 bytes
Halvard Hummel
4

Python 2 , 80 bytes

def g(r,q):
 for s in q:
  i=r.index(s)
  if i:r[i-1],r[i]=r[i],r[i-1]
 return r

Pruébalo en línea!

Chas Brown
fuente
1
Algunos ahorros: use pestañas para sangrar el bloque interno y asignar a r[i-1:i+1].
Ørjan Johansen
Reemplazar returnpor printpuede guardar otro byte .
Jonathan Frech
4

Java 8, 87 86 76 bytes

a->b->b.forEach(x->{int i=a.indexOf(x);a.set(i,a.set(i>0?i-1:i,a.get(i)));})

Toma dos entradas como ArrayList<String>y modifica la primera Lista en lugar de devolver una nueva para guardar bytes.

-10 bytes gracias a @Nevay .

Explicación:

Pruébalo aquí

a->b->{                  // Method with two ArrayList<String> parameters and no return-type
  b.forEach(x->{         //  Loop over the second input-List
    int i=a.indexOf(x);  //   Get the index of the current item in the first input-List
    a.set(i,a.set(       //    Swap items:
      i>0?               //     If the current item is not the top item yet:
       i-1               //      Use the item above it
      :                  //     Else:
       i,                //      Use itself
         a.get(i)));     //     And swap it with the current item
  })                     //  End of loop
                         // End of method (implicit / single-line body)
Kevin Cruijssen
fuente
1
77 bytes:a->b->b.forEach(x->{int i=a.indexOf(x);a.set(i,a.set(i>0?i-1:i,a.get(i)));});
Nevay
Java se está vengando de todas las personas que se burlaron de él.
geokavel
2

05AB1E , 20 18 bytes

vDyk>Ig‚£`U`2(@)X«

Pruébalo en línea!

Explicación

v                    # for each used spice
 D                   # duplicate current spice order
  yk                 # get the index of the current spice
    >                # increment
     Ig‚             # pair with the number of unique spices
        £            # split the spice list into pieces of these sizes
         `           # split as 2 separate lists to stack
          U          # store the list of spices below the current one in X
           `         # push the current spice and all above separately to stack
            2(@      # swap the second item to the top of the stack
               )     # wrap in a list
                X«   # append the rest of the spices
Emigna
fuente
2

C #, 125 117 81 79 bytes

(c,n)=>{foreach(var i in n){var j=c.IndexOf(i);if(j!=0){c[j]=c[--j];c[j]=i;}}};

Pruébalo en .NET Fiddle

golfed 36 bytes gracias a raznagul

Ceshion
fuente
La respuesta tal como es sería de 117 bytes, ya que le falta el espacio de nombres Array.IndexOf. Pero hay varias formas de acortar la respuesta: 1. Use un foreachbucle en lugar del forbucle. 2. Si ces un en List<string>lugar de string[]usted puede usar directamente c.IndexOf. 3. Como cestá modificado en su lugar, no necesita devolverlo.
raznagul
1

Mathematica, 52 bytes

pero es mi primera publicación aquí, así que sé amable si se cuenta incorrectamente :)

Keys@Sort@Merge[{PositionIndex@#,-Counts@#2},Total]&

Y un ejemplo:

Keys@Sort@Merge[{PositionIndex@#, -Counts@#2}, Total] &[
    {pepper, paprika, salt, cumin, oregano}
  , {oregano, cumin, cumin, salt, salt, salt}
]

{sal, pimienta, pimentón, comino, orégano}

Kuba
fuente
No soy un experto en Mathematica, pero probablemente podría eliminar algunos espacios para guardar algunos bytes.
pajonk
@pajonk ya contó sin ellos, pero también debería haberlos eliminado aquí, gracias.
Kuba