O Problema da Panqueca Queimada


23

Esse desafio está relacionado ao lançamento de panquecas .

Você já deve ter ouvido falar da seleção de panquecas , onde uma pilha de panquecas é classificada por tamanho, inserindo uma espátula na pilha e lançando todas as panquecas acima da espátula, até que as panquecas sejam classificadas da menor para a maior no prato. O problema da panqueca queimada é um pouco diferente. Todas as panquecas agora têm um lado queimado e o lado queimado de cada panqueca deve ficar de frente para o prato depois que a triagem for concluída.

Por exemplo, dada a seguinte pilha (tamanho da panqueca à esquerda. 0Significando lado queimado para baixo e 1significando lado queimado para cima à direita):

1 0
3 1
2 1

Você pode virar a pilha inteira para pegar 20 30 11, virar as duas primeiras para pegar 31 21 11e virar a pilha inteira novamente para pegar 10 20 30uma pilha classificada de panquecas queimadas. Esta sequência de movimentos, flip 3, flip 2, flip 3, pode ser representada como 3 2 3.

O desafio

  • Dada uma variedade de tamanhos de panquecas (não necessariamente exclusivos) e suas orientações, produza qualquer sequência válida de classificação de panquecas queimadas, ou seja, uma sequência de inversões que leva à pilha de panquecas sendo classificadas do menor para o maior com os lados queimados para baixo.
  • A entrada e a saída podem ter qualquer formato são com separadores, mas especifique quais formatos você usa e indique qual extremidade do seu formato de entrada é a parte superior da pilha (TOS).
  • É permitido virar zero panquecas.
  • É permitida a mistura de separadores na entrada / saída.

Casos de teste

Para todos os casos de teste a seguir, a entrada é uma lista e a saída é uma sequência separada por espaço e o TOS está à esquerda.

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

Como sempre, se algo não estiver claro ou incorreto, informe-me nos comentários. Boa sorte e bom golfe!

Respostas:


7

Python 2, 83

Espera-se que a entrada seja a lista de tuplas (tamanho, orientação) com a parte superior da pilha no final. A saída é uma lista de tamanhos a serem separados por vários tipos de espaço em branco.

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
Aparentemente eu sou um idiota.
Leaky Nun

É 0permitido na lista de saída?
Leaky Nun

19
@LeakyNun Lançando 0 panquecas é eminentemente possível. Na verdade, estou fazendo isso agora.
feersum

@daniero O topo da pilha está no lado direito.
Freira vazada

@LeakyNun oh desculpe, meu mau
daniero

3

CJam (37 bytes)

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

Input é uma matriz no formato CJam em stdin; output é uma lista separada por nova linha de comprimentos de flip no stdout. O topo da pilha está no índice 0; 0indica lado queimado para cima e 1indica lado queimado para baixo.

Demonstração online

Dissecação

A saída é sempre 3ninvertida, onde nestá o número de panquecas. Primeiro, colocamos a maior panqueca restante no topo; se estiver queimado, viramos a panqueca; e depois a colocamos no fundo e repetimos como se a pilha de panquecas fosse uma mais curta.

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

Ruby, 101 95 93 bytes

Não muito golfista, eu só queria fazer uma variante do tipo bogo. É uma função anônima que pega uma matriz de matrizes e imprime movimentos aleatórios para stdout até que as panquecas sejam classificadas.

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

Você pode, por exemplo, atribuir fe dizerf.call [[1, 0], [3, 1], [2, 1]]

-5 bytes de @Jordan com o uso brilhante de rassoc
-2 bytes de @ Sherlock9


1
Você pode salvar alguns bytes substituindo a.all?{...}por !a.rassoc(1).
Jordânia

@ Jordan Wow, isso é realmente brilhante! Acho que nunca pensei em usar ( r) assocantes, mas, pensando bem, provavelmente é útil em muitos problemas neste site - acho que ele deve aparecer no post de dicas de golfe do Ruby. De qualquer forma, obrigado :) Eu também fui capaz de matar outro byte através da aplicação da lei deMorgans e substituindo untilpor while.
Daniero 28/08/16


Desde bsó é sempre0 ou 1, 1-btambém funcionaria e salvaria dois bytes.
Sherlock9
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.