Готовить с кодом

24

Вы шеф-повар, и вы любите готовить со своими специями, но недавно вы привыкли организовывать свои специи, основываясь на том, как часто вы их используете. Но у вас нет времени, чтобы записывать, когда вы использовали свою специю в последний раз. Просто вы меняете местами специи и перемещаете их, и это, кажется, делает свое дело.

Но, конечно, вы повар, а это значит, что у вас есть несколько поваров с вами. Вы решаете рассказать им простые правила взаимодействия со своими специями.

  1. Если вы недавно использовали специю, переместите ее вверх в стойку для специй

  2. Если вы вообще не использовали никаких специй, например, []пустой список движения, то список специй не затрагивается.

  3. Вы можете положить любую специю в мою подставку для специй, но если вы используете ее, обязательно переместите ее.

  4. Список может содержать что угодно. Но потому что это специи, с которыми мы работаем. Желательно, чтобы вы использовали названия специй.

  5. Специи должны быть уникальными. Слишком много одинаковых специй портят бульон ... или как говорится

Применяются нормальные правила игры в гольф.

Пример использования душицы снова и снова.

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

задача

Введите список специй и список используемых специй, затем выведите окончательный список.

пример

вход

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

Выход

[salt, pepper, paprika, cumin, oregano]

Как это выглядит

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

вход

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

Выход

[salt, pepper, paprika, oregano, cumin]
tisaconundrum
источник
Являются ли элементы в списке специй уникальными?
TSH
Да, они будут уникальными
17
31
Я довольно далеко проделал это в Chef, но со временем это стало слишком утомительным! Я дам кому-то 50 наград, если они смогут это сделать.
геокавель
5
Вот суть получения информации о чашах для смешивания. Остальное будет очень сложно, но выполнимо для правильного человека!
геокавель
1
@geokavel Вызов принят
NieDzejkob

Ответы:

4

Шелуха , 15 14 байт

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

Входные данные - это списки строк (это также работает с другими видами списков). Попробуйте онлайн!

-1 байт благодаря H.PWiz

объяснение

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

Я должен повторять xбесконечно, так как иначе список потерял бы свой последний элемент, когда мы использовали самую верхнюю специю. Этого было бы достаточно, чтобы добавить конечный 1, но повторение занимает меньше байтов. Лучшим способом было бы вращать список, а не отбрасывать его первый элемент, но Husk не имеет встроенного для этого.

Zgarb
источник
Σmэто для одного байта.
H.PWiz
8

Haskell , 48 байтов

foldl(?)является анонимной функцией, которая принимает два аргумента списка и возвращает список со всеми элементами одного и того же ( Eq-comparable) типа.

Использовать как 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

Попробуйте онлайн!

  • foldl(?) s mначинается со списка (стойки для специй) sи объединяет его с каждым элементом (специей) mпо порядку, используя оператор ?.
  • s?nиспользует специю nиз стойки для специй sи возвращает получившуюся корзину для специй.
    • Если sимеет хотя бы два элемента, ?проверяет, равен ли второй элемент, nи если да, переключает первые два элемента. Если не равен, ?сохраняет первый элемент фиксированным и рекурсивно для остальных.
    • Если sимеет не более одного элемента, ?возвращает его без изменений.
Орджан Йохансен
источник
7

Chef , 875 843 байта

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 байта благодаря Джонатану Аллану , удалив, theгде я не думаю, что это будет работать.

У шеф-повара нет строковых типов, поэтому ингредиенты являются натуральными числами. 0 используется, чтобы отделить начальный список от использованных ингредиентов и завершить список использованных ингредиентов. См. Ссылку TIO для примера.

Объяснение псевдокода:

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

Попробуйте онлайн!

NieDzejkob
источник
Потрясающе! Этот язык был на TIO все время?
геокавель
Удалив несколько лишних слов, вы можете сохранить 32 байта
Джонатан Аллан
@geokavel это было добавлено вчера.
Джонатан Аллан
1
@geokavel Перед подачей вы вылили содержимое миски в форму для выпечки?
NieDzejkob
1
@NieDzejkob, Did you pour the contents of the mixing bowl into the baking dish before serving?который звучит как комментарий к кулинарной SE, а не здесь: P lol (также очень странный вопрос для кулинарии, если вы спросите меня: P)
HyperNeutrino
6

JavaScript, 61 байт

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

Формат ввода:

  • F (list_of_spices) (list_of_what_spices_got_used)
  • два списка являются массивом строк

Выход:

  • list_of_spices изменяется на месте.

ТТГ
источник
4

Java 8, 87 86 76 байт

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

Принимает два ввода как ArrayList<String>и изменяет первый список вместо того, чтобы возвращать новый для сохранения байтов.

-10 байт благодаря @Nevay .

Объяснение:

Попробуй это здесь.

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)
Кевин Круйссен
источник
1
77 байтов:a->b->b.forEach(x->{int i=a.indexOf(x);a.set(i,a.set(i>0?i-1:i,a.get(i)));});
Невай
Ява мстит всем, кто смеялся над этим.
геокавель
2

05AB1E , 20 18 байт

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

Попробуйте онлайн!

объяснение

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
источник
2

C #, 125 117 81 79 байтов

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

Попробуйте это на .NET Fiddle

забил на 36 байтов благодаря разнагул

Ceshion
источник
Ответ в том виде, как он есть, будет 117 байтов, так как вам не хватает пространства имен для Array.IndexOf. Но есть несколько способов сделать ответ короче: 1. Используйте foreach-loop вместо for-loop. 2. Если cэто List<string>вместо string[]вы можете напрямую использовать c.IndexOf. 3. Как cизменено на месте, вам не нужно возвращать его.
Разнагул
1

Mathematica, 52 байта

но это мой первый пост, поэтому, пожалуйста, будьте добры, если считать неправильно :)

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

И пример:

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

{соль, перец, паприка, тмин, орегано}

Kuba
источник
Я не эксперт по Mathematica, но вы могли бы удалить пробелы, чтобы сэкономить байты.
pajonk
@pajonk уже считается без них, но я должен был удалить их и здесь, спасибо.
Куба