Gotowanie z kodem

24

Jesteś szefem kuchni i uwielbiasz gotować z przyprawami, ale ostatnio lubisz porządkować przyprawy na podstawie częstotliwości ich używania. Ale nie masz czasu na zapisywanie, kiedy ostatnio używałeś swojej przyprawy. Po prostu zamieniasz i przenosisz przyprawy, a to wydaje się załatwić sprawę.

Ale oczywiście jesteś szefem kuchni, a to oznacza, że ​​masz ze sobą kucharzy. Postanawiasz powiedzieć im proste zasady zaangażowania w swoje przyprawy.

  1. Jeśli ostatnio używałeś przyprawy, przesuń ją w górę w stojaku na przyprawy

  2. Jeśli w ogóle nie użyłeś żadnych przypraw, np. []Pustej listy ruchów, nie wpłynie to na listę przypraw.

  3. Możesz włożyć dowolną przyprawę do mojego uchwytu na przyprawy, ale jeśli ją wykorzystasz, koniecznie ją przenieś.

  4. Lista może zawierać wszystko. Ale ponieważ to przyprawy, nad którymi pracujemy. Preferowane jest stosowanie nazw przypraw.

  5. Przyprawy powinny być unikalne. Zbyt wiele takich samych przypraw psuje bulion ... lub jak to się mówi

Obowiązują normalne zasady gry w golfa.

Przykład wielokrotnego użycia Oregano.

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

Zadanie

Wprowadź listę przypraw i listę użytych przypraw, a następnie wyślij ostateczną listę.

Przykład

Wkład

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

Wydajność

[salt, pepper, paprika, cumin, oregano]

Jak to wygląda

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

Wkład

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

Wydajność

[salt, pepper, paprika, oregano, cumin]
tisaconundrum
źródło
Czy przedmioty na liście przypraw są wyjątkowe?
tsh
Tak, będą wyjątkowe
tisaconundrum
31
Zaszedłem dość daleko, robiąc to w Chef, ale w końcu stało się to zbyt męczące! Dam komuś 50 nagród, jeśli będą w stanie to zrobić.
geokavel
5
Oto sedno wprowadzania danych do misek miksujących. Reszta będzie bardzo trudna, ale wykonalna dla właściwej osoby!
geokavel
1
@geokavel Wyzwanie przyjęte
NieDzejkob,

Odpowiedzi:

4

Łuska , 15 14 bajtów

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

Dane wejściowe to listy ciągów (działa również na innych rodzajach list). Wypróbuj online!

-1 bajt dzięki H.PWiz

Wyjaśnienie

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

Muszę powtarzać w xnieskończoność, ponieważ w przeciwnym razie lista straci swój ostatni element, gdy użyjemy najwyższej przyprawy. Wystarczy dodać końcową wartość 1, ale powtórzenie zajmuje mniej bajtów. Lepszym sposobem byłoby obrócenie listy zamiast upuszczania jej pierwszego elementu, ale Husk nie ma do tego wbudowanej funkcji.

Zgarb
źródło
Σmjest na jeden bajt.
H.PWiz
8

Haskell , 48 bajtów

foldl(?)jest anonimową funkcją pobierającą dwa argumenty listy i zwracającą listę ze wszystkimi elementami tego samego ( Eq-porównywalnego) typu.

Użyj jako 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

Wypróbuj online!

  • foldl(?) s mzaczyna się od listy (stojak na przyprawy) si łączy go z każdym elementem (przyprawą) mw kolejności za pomocą operatora ?.
  • s?nużywa przyprawy nz stojaka na przyprawy si zwraca wynikowy stojak na przyprawy.
    • Jeśli sma co najmniej dwa elementy, ?sprawdza, czy drugi jest równy n, a jeśli tak, przełącza pierwsze dwa elementy. Jeśli nie jest równy, ?pierwszy element pozostaje stały, a reszta powtarza się.
    • Jeśli sma co najwyżej jeden element, ?zwraca go bez zmian.
Ørjan Johansen
źródło
7

Szef kuchni , 875 843 bajtów

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 bajty dzięki Jonathanowi Allanowi , usuwając thetam, gdzie nie sądzę, że to zadziała.

Szef kuchni nie ma typów sznurków, więc składniki są dodatnimi liczbami całkowitymi. 0 służy do oddzielenia listy początkowej od używanych składników i zakończenia listy używanych składników. Zobacz link do TIO na przykład.

Objaśnienie pseudokodu:

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

Wypróbuj online!

NieDzejkob
źródło
Niesamowite! Czy ten język był na TIO przez cały czas?
geokavel
Usuwając zbędne słowa możesz zaoszczędzić 32 bajty
Jonathan Allan,
@geokavel został dodany wczoraj.
Jonathan Allan,
1
@geokavel Czy przed podaniem wlałeś zawartość naczynia miksującego do naczynia do pieczenia?
NieDzejkob
1
@NieDzejkob, Did you pour the contents of the mixing bowl into the baking dish before serving?który całkowicie brzmi jak komentarz, który przejdzie do gotowania SE, a nie tutaj: P lol (również bardzo dziwne pytanie dotyczące gotowania, jeśli zapytasz mnie: P)
HyperNeutrino
6

JavaScript, 61 bajtów

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

Format wejściowy:

  • f (list_sp_spices) (list_of_what_spices_got_used)
  • dwie listy to tablica ciągów znaków

Wydajność:

  • lista_spice jest modyfikowana na miejscu.

tsh
źródło
5

Python 2 , 72 71 69 bajtów

Nowa odpowiedź w duchu mojej pierwotnej próby.

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

Wypróbuj online!

Inne rozwiązanie:

Python 2 , 69 bajtów

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

Wypróbuj online!

TFeld
źródło
print(r)-> print r?
tsh
1
69 bajtów
Halvard Hummel
4

Python 2 , 80 bajtów

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

Wypróbuj online!

Chas Brown
źródło
1
Niektóre oszczędności: użyj tabulatorów, aby wciąć wewnętrzny blok i przypisać do r[i-1:i+1].
Ørjan Johansen
Zastąpienie returnprzez printmoże zapisać kolejny bajt .
Jonathan Frech,
4

Java 8, 87 86 76 bajtów

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

Pobiera dwa dane wejściowe ArrayList<String>i modyfikuje pierwszą listę zamiast zwracać nową, aby zapisać bajty.

-10 bajtów dzięki @Nevay .

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło
1
77 bajtów: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 mści się na ludziach, którzy się z niej wyśmiewali.
geokavel
2

05AB1E , 20 18 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
źródło
2

C #, 125 117 81 79 bajtów

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

Wypróbuj na .NET Fiddle

grał w golfa z 36 bajtów dzięki raznagul

Ceshion
źródło
Obecna odpowiedź to 117 bajtów, ponieważ brakuje przestrzeni nazw Array.IndexOf. Istnieje jednak kilka sposobów na skrócenie odpowiedzi: 1. Użyj foreachpętli zamiast forpętli. 2. Jeśli cto List<string>zamiast string[]można korzystać bezpośrednio c.IndexOf. 3. Po cmodyfikacji w miejscu nie trzeba go zwracać.
raznagul
1

Mathematica, 52 bajty

ale to jest mój pierwszy post tutaj, więc proszę bądź uprzejmy, jeśli został nieprawidłowo policzony :)

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

I przykład:

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

{sól, pieprz, papryka, kminek, oregano}

Kuba
źródło
Nie jestem ekspertem od matematyki, ale prawdopodobnie mógłbyś usunąć niektóre spacje, aby zaoszczędzić trochę bajtów.
pajonk
@pajonk już się bez nich liczył, ale ja też powinienem je tutaj usunąć, dzięki.
Kuba