코드로 요리 최근에는 향신료를 얼마나 자주

당신은 요리사이고 향신료로 요리하는 것을 좋아하지만 최근에는 향신료를 얼마나 자주 사용하는지에 따라 향신료를 정리하는 것을 좋아했습니다. 그러나 향신료를 마지막으로 사용했을 때 기록 할 시간이 없습니다. 간단히, 향신료를 바꾸고 움직여서 트릭을 수행하는 것처럼 보입니다.

그러나 물론 당신은 요리사이고 그것은 당신과 함께 요리사를 가지고 있다는 것을 의미합니다. 당신은 그들에게 당신의 향신료와의 간단한 교전 규칙을 말하기로 결정합니다.

  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]



답변

껍질 , 15 14 바이트

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

입력은 문자열 목록입니다 (다른 종류의 목록에서도 작동).
온라인으로 사용해보십시오!

H.PWiz 덕분에 -1 바이트

설명

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에는 기본 제공 요소가 없습니다.


답변

하스켈 , 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?nn스파이스 랙 의 스파이스 를 사용하고 s결과 스파이스 랙을 반환합니다.
    • s요소가 두 개 이상인 경우 두 번째 요소 ?가 같은지 확인하고, 두 번째 요소 가 같은 n경우 첫 두 요소를 전환합니다. 같지 않으면 ?첫 번째 요소는 고정 된 상태로 유지하고 나머지 요소는 되풀이됩니다.
    • 경우 s최대 하나 개의 요소가, ?이 변경되지 반환합니다.

답변

요리사 , 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.

작동하지 않을 곳 을 제거 하여 Jonathan Allan 에게 -32 바이트 감사합니다 the.

Chef에는 문자열 유형이 없으므로 성분은 양의 정수입니다. 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())

온라인으로 사용해보십시오!


답변

자바 스크립트, 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가 현재 위치에서 수정되었습니다.


답변

파이썬 2 , 72 71 69 바이트

내 원래 시도의 정신에 새로운 답변.

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

온라인으로 사용해보십시오!

다른 해결책 :

파이썬 2 , 69 바이트

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

온라인으로 사용해보십시오!


답변

파이썬 2 , 80 바이트

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

온라인으로 사용해보십시오!


답변

자바 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>바이트를 저장하기 위해 새 입력 을 리턴하는 대신 두 개의 입력을 사용 하고 첫 번째 List를 수정합니다.

@Nevay 덕분에 -10 바이트 .

설명:

여기에서 시도하십시오.

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)