ปัญหาการเผาแพนเค้ก


23

ความท้าทายนี้จะเกี่ยวข้องกับพลิกแพนเค้ก

คุณอาจเคยได้ยินเรื่องการเรียงแพนเค้กที่กองแพนเค้กเรียงตามขนาดโดยสอดไม้พายเข้าไปในกองแล้วพลิกแพนเค้กทั้งหมดเหนือไม้พายจนกระทั่งแพนเค้กเรียงตัวเล็กที่สุดไปหามากที่สุดบนจาน ปัญหาการเผาแพนเค้กแตกต่างกันเล็กน้อย ตอนนี้แพนเค้กทั้งหมดมีด้านหนึ่งที่ถูกเผาและด้านที่ถูกเผาของแต่ละแพนเค้กจะต้องเผชิญกับจานเมื่อการเรียงเสร็จสมบูรณ์

ตัวอย่างเช่นให้สแต็กต่อไปนี้ (ขนาดของแพนเค้กทางด้านซ้าย0หมายถึงด้านที่1ถูกเผาไหม้และความหมายด้านที่ถูกเผาด้านขวา):

1 0
3 1
2 1

คุณอาจพลิกทั้งกองเพื่อให้ได้20 30 11พลิกด้านบนสุดเพื่อรับ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

Python 2, 83

ข้อมูลที่คาดว่าจะเป็นรายการของขนาด (การวางแนว) tuples กับด้านบนของสแต็คที่สิ้นสุด ผลลัพธ์คือรายการขนาดที่จะพลิกแยกด้วยช่องว่างประเภทต่างๆ

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
เห็นได้ชัดว่าฉันเป็นคนงี่เง่า
Leun Nun

คือ0ในรายการที่ส่งออกได้รับอนุญาต?
Leun Nun

19
@LeakyNun พลิก 0 แพนเค้กได้อย่างชัดเจน อันที่จริงฉันกำลังทำอยู่ตอนนี้
feersum

@daniero ด้านบนของสแต็คอยู่ทางด้านขวา
Leun Nun

@LeakyNun โอ้ขอโทษไม่ดีของฉัน
daniero

3

CJam (37 ไบต์)

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

อินพุตเป็นอาร์เรย์ในรูปแบบ CJam บน stdin; เอาต์พุตเป็นรายการความยาวการพลิกที่คั่นด้วยบรรทัดใหม่บน 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

Ruby, 101 95 93 ไบต์

ไม่ค่อยเล่นกอล์ฟฉันแค่อยากจะสร้างตัวแปร bogo มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อซึ่งใช้อาเรย์ของอาร์เรย์และพิมพ์ flips สุ่มไปยัง stdout จนกว่าแพนเค้กจะถูกจัดเรียง

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

-5 ไบต์จาก @Jordan ด้วยการใช้ที่ยอดเยี่ยมของrassoc
-2 ไบต์จาก @ Sherlock9


1
คุณสามารถบันทึกไม่กี่ไบต์โดยการแทนที่ด้วยa.all?{...} !a.rassoc(1)
จอร์แดน

@ จอร์แดนว้าวมันยอดเยี่ยมจริงๆ! ฉันไม่คิดว่าฉันเคยคิดที่จะใช้ ( r) assocมาก่อน แต่คิดว่ามันอาจมีประโยชน์ในหลาย ๆ ปัญหาบนเว็บไซต์นี้ - ฉันรู้สึกว่าควรไปที่โพสต์เคล็ดลับการเล่นกอล์ฟทับทิม ทั้งนี้ขอขอบคุณ :) ฉันก็ยังสามารถที่จะฆ่าไบต์อีกว่าการใช้กฎหมาย deMorgans และแทนที่ด้วยuntil while
daniero

1
ความคิดที่ดี: codegolf.stackexchange.com/questions/363/…
Jordan

เนื่องจากbเป็นเพียงที่เคย0หรือ1, 1-bนอกจากนี้ยังจะทำงานและจะประหยัดไบต์ที่สอง
Sherlock9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.