Kodla Yemek Yapmak


24

Sen bir aşçısın ve baharatlarınla ​​yemek yapmayı seviyorsun, ama son zamanlarda baharatlarını ne sıklıkla kullandığına göre organize etmeyi seviyorsun. Ama baharatını en son kullandığın zaman yazacak vaktin yok. Basitçe, baharatları değiş tokuş edip dolaşıyorsunuz ve bu hile yapıyor gibi görünüyor.

Ama elbette şefsin ve bu da seninle birlikte biraz aşçıya sahip olduğun anlamına geliyor. Onlara baharatlarınızla etkileşime geçmenin basit kurallarını söylemeye karar veriyorsunuz.

  1. Yakın zamanda bir baharat kullandıysanız, baharat rafına bir tane daha koyun

  2. Hiç baharat kullanmadıysanız, örneğin []boş hareket listesi, baharat listesi etkilenmez.

  3. Baharat tutacağıma herhangi bir baharat koyabilirsiniz, ancak kullanırsanız taşıdığınızdan emin olun.

  4. Liste bir şey içerebilir. Fakat bunlar bizim birlikte çalıştığımız baharatlar. Baharat isimleri kullanmanız tercih edilir.

  5. Baharatlar benzersiz olmalı. Aynı baharatların çok fazlası suyu bozuyor ... ya da söyleniyor ki

Normal kod-golf kuralları geçerlidir.

Kekik örneği tekrar tekrar kullanılıyor.

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

Görev

Bir baharat listesi ve hangi baharatların kullanıldığına dair bir liste girin, ardından nihai listeyi çıktılayın.

Örnek

Giriş

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

Çıktı

[salt, pepper, paprika, cumin, oregano]

Bu nasıl görünüyor

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

Giriş

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

Çıktı

[salt, pepper, paprika, oregano, cumin]

Baharat listesindeki ürünler benzersiz midir?
tsh

Evet, benzersiz olacaklar
tisaconundrum

31
Şef bunu yaparken oldukça uzağa gittim ama sonunda çok yorucu oldu! Eğer yapabilirlerse birisine 50 ödül vereceğim.
geokavel

5
İşte bu özü karıştırma kase içine girdi almanın. Gerisi çok zor olacak, ama doğru kişi için yapılabilir!
geokavel

Yanıtlar:


4

Kabuğu , 15 14 bayt

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

Girişler, dizelerin listeleridir (diğer listelerde de çalışır). Çevrimiçi deneyin!

H.PWiz sayesinde -1 bayt

açıklama

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

xSonsuza kadar tekrarlamak zorundayım , aksi halde liste en üst baharatı kullandığımız zaman son elementini kaybeder. Sondaki 1'i eklemek yeterli olacaktır, ancak tekrarlama daha az bayt alır. Daha iyi bir yol, ilk öğesini bırakmak yerine listeyi döndürmek olacaktır, ancak Husk'un bunun için yerleşik bir yeri yoktur.


Σmolan bir byte için.
H.PWiz

8

Haskell , 48 bayt

foldl(?)İki liste argümanını alan ve aynı (karşılaştırılabilir Eq) türdeki tüm unsurları içeren bir liste döndüren adsız bir işlevdir .

Olarak kullanın 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

Çevrimiçi deneyin!

  • foldl(?) s m(baharat rafı) listesiyle başlar ve operatörü kullanarak sher bir elemanla (baharat) msırayla birleştirir ?.
  • s?nbaharat kullandığı nbaharat raftan sve elde edilen baharat rafı döndürür.
    • sEn az iki element varsa , ?ikincisinin eşit olup olmadığını kontrol eder nve öyleyse ilk iki elementi değiştirir. Eşit değilse ?, ilk elemanı sabit tutar ve geri kalanına tekrar basar.
    • sEn fazla bir eleman varsa , ?değişmeden döndürür.

7

Şef , 875 843 bayt

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 sayesinde bayt Jonathan Allan kaldırarak thebunu çalışacağını düşünüyorum olmayacağı yerlerde.

Şefin tel türü yoktur, bu nedenle içerik maddeleri tamsayılardır. 0 başlangıç ​​listesini kullanılmış içerik maddelerinden ayırmak ve kullanılmış içerik malzemeleri listesini sona erdirmek için kullanılır. Örnek için TIO bağlantısına bakınız.

Sözde kod açıklaması:

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

Çevrimiçi deneyin!


Müthiş! Bu dil baştan beri TIO'da mıydı?
geokavel

Gereksiz bazı kelimeleri kaldırarak 32 byte tasarruf
Jonathan Allan

@geokavel dün eklendi.
Jonathan Allan

1
@geokavel Karıştırma kabının içeriğini servis yapmadan önce fırın kabına mı döktünüz?
NieDzejkob

1
@TieDzejkob Did you pour the contents of the mixing bowl into the baking dish before serving?, yemek pişirme SE'sine gider ve burada olmaz gibi bir yorum gibi ses çıkarır: P lol (ayrıca bana sorarsanız, yemek pişirmek için çok garip bir soru: P)
HyperNeutrino

6

JavaScript, 61 bayt

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

Giriş formatı:

  • f (list_of_spices) (list_of_what_spices_got_used)
  • iki liste dizgedir

Çıktı:

  • list_of_spices yerinde değiştirildi.




4

Java 8, 87 86 76 bayt

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

İki girişi alır ArrayList<String>ve baytları kurtarmak için yeni bir tane almak yerine ilk listeyi değiştirir.

@Nevay sayesinde -10 bayt .

Açıklama:

Burada dene.

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 byte: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, bununla dalga geçen herkes için intikam alıyor.
geokavel

2

05AB1E , 20 18 bayt

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

Çevrimiçi deneyin!

açıklama

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


2

C #, 125 117 81 79 bayt

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

.NET Fiddle'da deneyin

raznagul sayesinde 36 byte golf oynadı


Yanıt, ad alanını kaybettiğiniz için 117 bayt olacaktır Array.IndexOf. Ancak cevabı kısaltmanın birkaç yolu vardır: 1. foreach-loop yerine bir -loop kullanın for. 2. Eğer cbir List<string>yerine string[]doğrudan kullanabilirsiniz c.IndexOf. 3. cYerinde değişiklik yapıldığı için iade etmeniz gerekmez.
raznagul


1

Mathematica, 52 bayt

ama burası benim ilk gönderim, bu yüzden yanlış sayılırsa nazik olun :)

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

Ve bir örnek:

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

{tuz, karabiber, kırmızı biber, kimyon, kekik}


Ben bir Mathematica uzmanı değilim, ancak bazı baytları kurtarmak için bazı alanları kaldırabilirsiniz.
pajonk

@pajonk zaten onlarsız sayıldı ama onları da burada çıkarmalıydım, teşekkürler.
Kuba

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.