Cuisiner avec du code

24

Vous êtes un chef et vous aimez cuisiner avec vos épices, mais récemment vous avez pris le goût d'organiser vos épices en fonction de la fréquence à laquelle vous les utilisez. Mais vous n'avez pas le temps d'écrire quand vous avez utilisé votre épice pour la dernière fois. Simplement, vous échangez et déplacez les épices, et cela semble faire l'affaire.

Mais bien sûr, vous êtes un chef et cela signifie que vous avez des cuisiniers avec vous. Vous décidez de leur dire les règles simples d'engagement avec vos épices.

  1. Si vous avez récemment utilisé une épice, déplacez-la vers le haut dans le support à épices

  2. Si vous n'avez utilisé aucune épice, par exemple []une liste de mouvements vide, la liste d'épices n'est pas affectée.

  3. Vous pouvez mettre n'importe quelle épice dans mon porte-épices, mais si vous l'utilisez, assurez-vous de la déplacer.

  4. La liste peut contenir n'importe quoi. Mais parce que ce sont des épices avec lesquelles nous travaillons. Il est préférable d'utiliser des noms d'épices.

  5. Les épices doivent être uniques. Trop des mêmes épices gâchent le bouillon ... ou cependant ce dicton va

Les règles normales du code-golf s'appliquent.

Exemple d'origan utilisé encore et encore.

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

Tâche

Saisissez une liste d'épices et une liste des épices utilisées, puis affichez la liste finale.

Exemple

Contribution

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

Sortie

[salt, pepper, paprika, cumin, oregano]

À quoi cela ressemble

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

Contribution

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

Sortie

[salt, pepper, paprika, oregano, cumin]
tisaconundrum
la source
Les articles de la liste d'épices sont-ils uniques?
tsh
Oui, ils seront uniques
tisaconundrum
31
Je suis allé assez loin en faisant ça dans Chef mais finalement c'est devenu trop fatiguant! Je donnerai à quelqu'un 50 primes s'il peut le faire.
geokavel
5
Voici l' essentiel d'obtenir l'entrée dans les bols de mélange. Le reste sera très difficile, mais réalisable pour la bonne personne!
geokavel
1
@geokavel Challenge accepté
NieDzejkob

Réponses:

4

Coque , 15 14 octets

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

Les entrées sont des listes de chaînes (cela fonctionne également sur d'autres types de listes). Essayez-le en ligne!

-1 octet grâce à H.PWiz

Explication

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

Je dois répéter à l' xinfini, car sinon la liste perdrait son dernier élément lorsque nous utilisons l'épice la plus haute. Il suffirait d'ajouter un 1 de fin, mais la répétition prend moins d'octets. Une meilleure façon serait de faire pivoter la liste au lieu de supprimer son premier élément, mais Husk n'a pas de fonction intégrée pour cela.

Zgarb
la source
Σmest pour un octet.
H.PWiz
8

Haskell , 48 octets

foldl(?)est une fonction anonyme prenant deux arguments de liste et renvoyant une liste, avec tous les éléments du même type ( Eq-comparable).

Utiliser comme 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

Essayez-le en ligne!

  • foldl(?) s mcommence par la liste (étagère à épices) set la combine avec chaque élément (épice) mdans l'ordre, à l'aide de l'opérateur ?.
  • s?nutilise l'épice ndu support à épices set renvoie le support à épices résultant.
    • Si sa au moins deux éléments, ?vérifie si le second est égal à n, et si c'est le cas, change les deux premiers éléments. S'il n'est pas égal, ?garde le premier élément fixe et revient sur le reste.
    • Si sa au plus un élément, le ?renvoie inchangé.
Ørjan Johansen
la source
7

Chef , 875 843 octets

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 octets grâce à Jonathan Allan en supprimant theoù je ne pense pas que cela fonctionnera.

Le chef n'a aucun type de chaîne, donc les ingrédients sont des entiers positifs. 0 est utilisé pour séparer la liste de départ des ingrédients utilisés et pour terminer la liste des ingrédients utilisés. Voir le lien TIO pour un exemple.

Explication du pseudocode:

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

Essayez-le en ligne!

NieDzejkob
la source
Impressionnant! Cette langue a-t-elle toujours été sur TIO?
geokavel
En supprimant certains mots redondants, vous pouvez économiser 32 octets
Jonathan Allan
@geokavel, il a été ajouté hier.
Jonathan Allan
1
@geokavel Avez-vous versé le contenu du bol à mélanger dans le plat de cuisson avant de servir?
NieDzejkob du
1
@NieDzejkob Did you pour the contents of the mixing bowl into the baking dish before serving?qui ressemble complètement à un commentaire qui irait sur la cuisine SE et non ici: P lol (aussi une question très étrange pour la cuisine si vous me demandez: P)
HyperNeutrino
6

JavaScript, 61 octets

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

Format d'entrée:

  • f (list_of_spices) (list_of_what_spices_got_used)
  • deux listes sont un tableau de chaînes

Sortie:

  • list_of_spices est modifié sur place.

tsh
la source
5

Python 2 , 72 71 69 octets

Nouvelle réponse, dans l'esprit de ma tentative initiale.

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

Essayez-le en ligne!

Autre solution:

Python 2 , 69 octets

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

Essayez-le en ligne!

TFeld
la source
print(r)-> print r?
tsh
1
69 octets
Halvard Hummel
4

Python 2 , 80 octets

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

Essayez-le en ligne!

Chas Brown
la source
1
Quelques économies: utilisez des onglets pour mettre en retrait le bloc interne et attribuer à r[i-1:i+1].
Ørjan Johansen
Le remplacement returnpar printpeut enregistrer un autre octet .
Jonathan Frech
4

Java 8, 87 86 76 octets

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

Prend deux entrées ArrayList<String>et modifie la première liste au lieu d'en renvoyer une nouvelle pour enregistrer les octets.

-10 octets grâce à @Nevay .

Explication:

Essayez-le ici.

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
la source
1
77 octets: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 venge de tous ceux qui s'en sont moqués.
geokavel
2

05AB1E , 20 18 octets

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

Essayez-le en ligne!

Explication

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
la source
2

C #, 125 117 81 79 octets

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

Essayez-le sur .NET Fiddle

joué au golf 36 octets grâce à raznagul

Ceshion
la source
La réponse telle qu'elle est serait de 117 octets car il manque l'espace de noms pour Array.IndexOf. Mais il existe plusieurs façons de raccourcir la réponse: 1. Utilisez un foreach-loop au lieu du for-loop. 2. Si cest un List<string>au lieu de string[]vous pouvez utiliser directement c.IndexOf. 3. Comme il cest modifié sur place, vous n'avez pas besoin de le retourner.
raznagul
1

Mathematica, 52 octets

mais c'est mon premier post ici, alors soyez gentil s'il est mal compté :)

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

Et un exemple:

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

{sel, poivre, paprika, cumin, origan}

Kuba
la source
Je ne suis pas un expert de Mathematica, mais vous pourriez probablement supprimer certains espaces pour économiser des octets.
pajonk
@pajonk a déjà compté sans eux mais j'aurais dû les supprimer ici aussi, merci.
Kuba