Yanmış Krep Sorunu


23

Bu zorluk Saygısız Krep ile ilgilidir .

Bir krep yığınının spatulayı yığının içine sokarak ve tüm kreplerin, spatülün üzerindeki krepleri plaka üzerinde en küçük ve en büyük sıralamaya gelinceye kadar çevirerek boyutuna göre sıralandığı krep sıralamalarını duymuş olabilirsiniz . Yanmış krep sorunu biraz farklıdır. Artık tüm kreplerin yanmış bir tarafı var ve her krepin yanmış tarafı, sıralama tamamlandıktan sonra plakayla yüzleşmelidir.

Örneğin, aşağıdaki yığın göz önüne alındığında (soldaki gözleme büyüklüğü. 0Yan aşağı 1yan ve sağ yan yan anlamına gelir):

1 0
3 1
2 1

Tüm yığını çevirmek için çevirebilir, elde etmek için 20 30 11ilk ikisini 31 21 11çevirebilir ve yeniden elde etmek için bütün yığını çevirebilirsiniz 10 20 30. Bu hamle dizisi, 3 çevir, 2 çevir, 3 çevir, olarak gösterilebilir 3 2 3.

Meydan okuma

  • Bir dizi krep ebadı (her biri eşsiz olmamak kaydıyla) ve oryantasyonları göz önüne alındığında, herhangi bir geçerli yanık krep sıralama dizisini, yani, krep yığınının en küçükten en büyüğe, yanık tarafları aşağı doğru sıralanmasına yol açan bir dizi sıranın çıktısını alın.
  • Giriş ve çıkış, ayırıcı içeren herhangi bir mantıklı format olabilir, ancak lütfen hangi formatları kullandığınızı ve giriş formatınızın hangi ucunun yığının en üstünde olduğunu belirtin (TOS).
  • Sıfır krep saygısız izin verilir.
  • Giriş / çıkışta karıştırıcı ayırıcılara izin verilir.

Test durumları

Aşağıdaki test durumlarının tümü için girdi bir listedir ve çıktı boşlukla ayrılmış bir dizedir ve TOS soldadır.

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

Her zaman olduğu gibi, herhangi bir şey net değilse veya yanlışsa, lütfen yorumlarda bana bildirin. İyi şanslar ve iyi golf!

Yanıtlar:


7

Python 2, 83

Girişin, yığının en üstünde olduğu (boyut, yönlendirme) başlıklarının listesi olması beklenir. Çıktı, çeşitli beyaz boşluklarla ayrılmış çevirilecek boyutların bir listesidir.

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
Görünüşe göre ben bir aptalım.
Sızdıran Rahibe,

0çıktı listesinde izin verdi?
Sızdıran Rahibe

19
@ LeakyNun 0 krep saygısızlık kesinlikle mümkündür. Aslında, şimdi yapıyorum.
feersum

@ daniero Yığının üstü sağ tarafta.
Sızdıran Rahibe,

@LeakyNun oh üzgünüm, benim kötü
daniero 20

3

CJam (37 bayt)

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

Giriş, stdin'deki CJam formatında bir dizidir; çıktı, stdout'taki yeni bir satır ayrılmış çevirme uzunlukları listesidir. Yığının üstünde indeks var 0; 0yanmış tarafı 1gösterir ve yanmış tarafı gösterir.

Çevrimiçi demo

teşrih

Çıktı her zaman 3nuzun döner n, kreplerin sayısı nerede . Önce kalan en büyük krepi tepeye çeviririz; o zaman yan tarafı yanmışsa o krepi çeviririz; ve sonra aşağıya doğru çeviririz ve pankek yığını daha kısa olmuş gibi tekrar ederiz.

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 bayt

Çok golf gibi değil, sadece bir bogo türevi yapmak istedim. Bu, bir dizi diziyi alan ve krepler sıralanıncaya kadar rastgele çevirmeleri stdout'a basan anonim bir işlevdir.

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

Örneğin bunu atayabilir fve söyleyebilirsiniz.f.call [[1, 0], [3, 1], [2, 1]]

rassoc
@ Sherlock9'dan -2 byte'ın mükemmel kullanımıyla @ Jordan'dan -5 byte


1
Sen değiştirerek birkaç byte kaydedebilirsiniz a.all?{...}ile !a.rassoc(1).
Ürdün

@Jordan Wow, bu gerçekten harika! Daha önce ( r) kullanmayı düşündüğümü sanmıyorum assoc, ama onu düşünürsek , bu sitedeki birçok sorun için muhtemelen faydalıdır - Ruby golf ipucu yazısına girmesi gerektiğini düşünüyorum. Her neyse, teşekkürler :) Ben de DeMorgans kanunun uygulama ve değiştirme olsa başka byte öldürmek başardı untilile while.
daniero


Çünkü bsadece hiç 0veya hiç 1, 1-baynı zamanda çalışacak ve iki bayt kazandıracak.
Sherlock9
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.