Cozinhando com código

24

Você é um chef e adora cozinhar com seus temperos, mas recentemente gostou de organizar seus temperos com base na frequência com que os usa. Mas você não tem tempo para escrever quando usou seu tempero pela última vez. Simplesmente, você troca e move especiarias, e isso parece funcionar.

Mas é claro que você é um chef e isso significa que você tem alguns cozinheiros com você. Você decide dizer a eles as regras simples de engajamento com suas especiarias.

  1. Se você usou recentemente um tempero, mova-o para cima um no rack de temperos

  2. Se você não usou nenhum tempero, por exemplo [], lista de movimentos vazia, a lista de temperos não é afetada.

  3. Você pode colocar qualquer tempero no meu porta temperos, mas se você usá-lo, certifique-se de movê-lo.

  4. A lista pode conter qualquer coisa. Mas, por serem especiarias com as quais estamos trabalhando. É preferível que você use nomes de especiarias.

  5. Especiarias devem ser únicas. Muitas das mesmas especiarias estragam o caldo ... ou, no entanto, esse ditado

Aplicam-se regras normais de código-golfe.

Exemplo de orégano sendo usado repetidamente.

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

Tarefa

Insira uma lista de especiarias e uma lista de quais especiarias foram usadas e depois produza a lista final.

Exemplo

Entrada

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

Saída

[salt, pepper, paprika, cumin, oregano]

Como isso parece

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]

Saída

[salt, pepper, paprika, oregano, cumin]
tisaconundrum
fonte
Os itens da lista de especiarias são únicos?
tsh
Sim, eles serão únicos
tisaconundrum 31/08
31
Cheguei muito longe fazendo isso no Chef, mas eventualmente ficou muito cansativo! Dou 50 recompensas a alguém, se puderem fazê-lo.
precisa saber é
5
Aqui está uma idéia de colocar a entrada nas tigelas. O resto será muito difícil, mas factível para a pessoa certa!
precisa saber é o seguinte
11
@geokavel Desafio aceito
NieDzejkob

Respostas:

4

Casca , 15 14 bytes

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

Entradas são listas de strings (também funcionam em outros tipos de listas). Experimente online!

-1 byte graças a H.PWiz

Explicação

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"]

Eu tenho que repetir xinfinitamente, pois, caso contrário, a lista perderia seu último elemento quando usarmos o tempero mais alto. Seria o suficiente adicionar um 1 à direita, mas a repetição leva menos bytes. Uma maneira melhor seria girar a lista em vez de largar o primeiro elemento, mas a Husk não tem built-in para isso.

Zgarb
fonte
Σmé para um byte.
precisa saber é o seguinte
8

Haskell , 48 bytes

foldl(?)é uma função anônima que recebe dois argumentos da lista e retorna uma lista, com todos os elementos do mesmo Eqtipo ( -comparável).

Use 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

Experimente online!

  • foldl(?) s mcomeça com a lista (suporte para especiarias) se a combina com cada elemento (tempero) de mordem, usando o operador ?.
  • s?nusa o tempero ndo rack de temperos se retorna o rack de temperos resultante.
    • Se stiver pelo menos dois elementos, ?verifica se o segundo é igual e n, se houver, alterna os dois primeiros. Se não for igual, ?mantém o primeiro elemento fixo e se repete no restante.
    • Se stiver no máximo um elemento, ?ele retornará inalterado.
Ørjan Johansen
fonte
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 graças a Jonathan Allan , removendo theonde eu não acho que funcionará.

Chef não tem tipos de string, portanto os ingredientes são números inteiros positivos. 0 é usado para separar a lista inicial dos ingredientes usados ​​e finalizar a lista de ingredientes usados. Veja o link do TIO para um exemplo.

Explicação do 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())

Experimente online!

NieDzejkob
fonte
Impressionante! Esse idioma sempre esteve no TIO?
geokavel
Ao remover algumas palavras redundantes você pode salvar 32 bytes
Jonathan Allan
@geokavel foi adicionado ontem.
Jonathan Allan
11
@geokavel Você derramou o conteúdo da tigela na assadeira antes de servir?
NieDzejkob 8/09
11
@NieDzejkob Did you pour the contents of the mixing bowl into the baking dish before serving?que soa completamente como um comentário que iria sobre a SE cozinhar e não aqui: P lol (também uma pergunta muito estranha para cozinhar se você me perguntar: 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)
  • lista dois são matriz de cadeia

Saída:

  • list_of_spices é modificado no local.

tsh
fonte
5

Python 2 , 72 71 69 bytes

Nova resposta, no espírito da minha tentativa original.

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

Experimente online!

Outra solução:

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

Experimente online!

TFeld
fonte
print(r)-> print r?
tsh
11
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

Experimente online!

Chas Brown
fonte
11
Algumas economias: use as guias para recuar o bloco interno e atribua a r[i-1:i+1].
Ørjan Johansen
Substituir returnpor printpode salvar outro 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 duas entradas como ArrayList<String>e modifica a primeira lista em vez de retornar uma nova para salvar bytes.

-10 bytes graças a @Nevay .

Explicação:

Experimente aqui.

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
fonte
11
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 está se vingando de todas as pessoas que tiraram sarro dele.
precisa saber é
2

05AB1E , 20 18 bytes

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

Experimente online!

Explicação

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
fonte
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;}}};

Experimente no .NET Fiddle

jogou 36 bytes graças a raznagul

Ceshion
fonte
A resposta é 117 bytes, da qual você está faltando o espaço para nome Array.IndexOf. Mas existem várias maneiras de tornar a resposta mais curta: 1. Use um foreachloop em vez do forloop. 2. Se cé um em List<string>vez de string[]você pode usar diretamente c.IndexOf. 3. Conforme cé modificado no local, você não precisa devolvê-lo.
raznagul
1

Mathematica, 52 bytes

mas é o meu primeiro post aqui, por favor, seja gentil se contado incorretamente :)

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

E um exemplo:

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

{sal, pimenta, páprica, cominho, orégano}

Kuba
fonte
Não sou especialista em Mathematica, mas você provavelmente pode remover alguns espaços para economizar alguns bytes.
Pajonk
@pajonk já contava sem eles, mas eu deveria ter removido eles aqui também, obrigado.
Kuba