번트 팬케이크 문제


23

이 도전은 팬케이크 뒤집기 와 관련이 있습니다.

팬케이크 정렬에 대해 들어 보았을 것 입니다. 팬케이크 스택은 팬케이크가 접시에서 가장 작은 것까지 정렬 될 때까지 주걱을 스택에 넣고 주걱 위의 모든 팬케이크를 뒤집어 크기별로 정렬합니다. 탄 팬케이크 문제는 약간 다릅니다. 모든 팬케이크에는 이제 구운 한쪽면이 있으며, 분류가 완료되면 각 팬케이크의 탄 쪽이 플레이트를 향해야합니다.

예를 들어, 다음 스택 (왼쪽의 팬케이크 크기 , 오른쪽의 번 사이드 01오른쪽의 번크 사이드를 의미 )이 주어진 경우 :

1 0
3 1
2 1

당신은 전체 스택을 뒤집을 수 있고 20 30 11, 상단 2 개를 31 21 11뒤집어서 전체 스택을 다시 뒤집어서 얻을 수 10 20 30있습니다. 플립 3, 플립 2, 플립 3의 일련의 움직임은로 표현 될 수있다 3 2 3.

도전

  • 팬케이크 크기 (고유 할 필요는 없음)와 그 방향이 주어지면 유효한 번 팬 팬케이크 정렬 순서, 즉 번 크면이 아래로 향하여 팬케이크의 스택이 가장 작은 것에서 가장 큰 것으로 정렬되는 플립 시퀀스가 ​​출력됩니다.
  • 입력 및 출력은 구분 기호가있는 임의 형식 일 수 있지만 사용하는 형식을 지정하고 입력 형식의 끝이 스택 상단 (TOS)인지 지정하십시오.
  • 팬케이크 제로 뒤집기가 허용됩니다.
  • 입 / 출력에서 ​​혼합 분리기가 허용됩니다.

테스트 사례

다음 테스트 케이스 모두에서 입력은 목록이고 출력은 공백으로 구분 된 문자열이며 TOS는 왼쪽에 있습니다.

[[1, 0], [3, 1], [2, 1]]
"3 2 3"

[[5, 1], [3, 0], [4, 1], [2, 1], [1, 0]]
"5 3 4 1 3 2 1"

[[5, 1], [3, 0], [3, 0], [1, 1]]
"4 3 2 3"

언제나 그렇듯이 명확하지 않거나 잘못된 것이 있으면 의견에 알려주십시오. 행운과 좋은 골프!

답변:


7

파이썬 2, 83

입력은 스택 상단이 끝에있는 (크기, 방향) 튜플의 목록이어야합니다. 출력은 다양한 종류의 공백으로 구분하여 뒤집을 크기 목록입니다.

a=input()
while a:i=a.index(max(a));print len(a)-i,a[i][1],len(a),i;a=a[i+1:]+a[:i]

2
분명히 나는 ​​바보입니다.
Leaky Nun

0출력 목록에서 허용?
Leaky Nun

19
@LeakyNun Flipping 0 팬케이크가 눈에 띄게 가능합니다. 사실, 지금하고 있습니다.
feersum

@daniero 스택 상단은 오른쪽에 있습니다.
Leaky Nun

@LeakyNun 아 죄송합니다, 나쁜
daniero

3

CJam (37 바이트)

q~{__$W>#)_p/(W%\M*2,f.^+(1=p_,)pW%}h

입력은 stdin에서 CJam 형식의 배열입니다. 출력은 줄 바꿈으로 구분 된 stdout의 플립 길이 목록입니다. 스택의 상단은 색인에 있습니다 0. 0은 탄면이 위를, 1탄면이 아래를 나타냅니다.

온라인 데모

해부

출력은 항상 3n어디 긴 플립 n팬케이크의 수입니다. 먼저 남은 가장 큰 팬케이크를 맨 위로 뒤집습니다. 그다음엔 불에 탄 상태에서 팬케이크 하나를 뒤집습니다. 팬케이크 더미가 짧아 진 것처럼 반복해서 바닥으로 뒤집습니다.

q~         e# Parse input into array
{          e# Loop...
  __$W>#)  e#   Find 1-based index of largest element in array
  _p       e#   Dup and print
  /(       e#   Split into chunks that long, and pull off the first
  W%       e#   Reverse the first chunk. Note that we don't flip the burnt/unburnt bit
  \M*      e#   Merge the remaining chunks into a single array
  2,f.^    e#   Flip *their* burnt/unburnt bits
  +        e#   Concatenate, prepending the first chunk
  (1=p     e#   Pull off the first (largest) element and print its burnt/unburnt bit
  _,)p     e#   Print the number of remaining elements plus 1 (to account for the largest)
  W%       e#   Reverse. Note that the first chunk has now been flipped twice, which is
           e#   why we have left its burnt/unburnt bit alone
}h         e# ... until we get down to an empty array

3

루비, 101 95 93 바이트

그다지 골프 색이 아닌, 나는 단지보고 정렬 변형을 만들고 싶었다. 팬케이크가 정렬 될 때까지 배열 배열을 가져 와서 무작위 플립을 표준 출력으로 인쇄하는 익명 함수입니다.

->a{(p r=-~rand(a.size)
a[0,r]=a[0,r].reverse.map{|x,b|[x,1-b]})while a!=a.sort||a.rassoc(1)}

예를 들어 그것을 할당 f하고 말할 수 있습니다.f.call [[1, 0], [3, 1], [2, 1]]

rassoc
@ Sherlock9에서 -2 바이트를 훌륭하게 사용하여 @Jordan에서 -5 바이트


1
당신은 대체하여 몇 바이트를 저장할 수 있습니다 a.all?{...}!a.rassoc(1).
Jordan

@ 조던 와우, 정말 훌륭합니다! 이전에 ( r) 를 사용한다고 생각한 적이 assoc없지만 그것에 대해 생각하면이 사이트의 많은 문제에 유용 할 것입니다. 루비 골프 팁 게시물에 가야한다고 생각합니다. 어쨌든, 고마워 :) 또한 deMorgans 법칙을 적용하고로 대체 until하여 다른 바이트를 죽일 수있었습니다 while.
daniero


이후 b오직하다 0거나 1, 1-b또한 일 것이고, 2 바이트를 저장합니다.
Sherlock9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.