แก้ปัญหาแผนภาพสถานะกองซ้อน


15

ไดอะแกรมสถานะสแต็กแสดงวิธีที่ค่าบนหนึ่งสแต็กถูกเปลี่ยนเป็นอื่น ตัวอย่างเช่นนี่คือแผนภาพสถานะสแต็ก:

3 0 2 1 0

ซึ่งหมายความว่ามีสแต็กเริ่มแรกประกอบด้วย 3 ค่า ( 3ส่วน) ค่าเหล่านี้ถูกจัดทำดัชนีจาก 0 ถึง 2 โดยมี 0 ที่ด้านบน:2 1 0ที่ด้านบน: ส่วนถัดไป0 2 1 0อธิบายถึงสถานะสุดท้ายของสแต็ก: ค่าที่อยู่ด้านบนสุดของสแต็กถูกคัดลอกไปที่ด้านหลังเช่นกัน

การแปลงเหล่านี้เกิดขึ้นบนสแต็กที่สนับสนุนหลายชนิดข้อมูล:

  • ชนิด "value" ซึ่งเป็นค่าเริ่มต้นของสแต็ก นี่อาจเป็นสตริงจำนวนเต็ม ฯลฯ แต่ไม่จำเป็นต้องทราบค่าของมัน
  • ชนิด "รายการ" ซึ่งเป็นรายการที่มีค่าของชนิดข้อมูลใด ๆ

เพื่อจำลองการเปลี่ยนแปลงนี้อนุญาตการดำเนินการต่อไปนี้:

  • S: สลับค่าสองค่าที่ด้านบนสุดของสแต็ก: 2 1 02 0 1
  • D: ทำซ้ำค่าที่ด้านบนของสแต็ก: 1 01 0 0
  • R: ลบค่าสูงสุดบนสแต็ก 2 1 02 1
  • L: เปลี่ยนค่าสูงสุดเป็นรายการองค์ประกอบเดียวที่มีค่านั้น: 2 1 02 1 (0)
  • C: เชื่อมต่อสองรายการแรกสุดในสแต็ก: 2 (1) (0)2 (1 0)
  • U: วางค่าทั้งหมดจากรายการลงในสแต็ก: 2 (1 0)2 1 0

สิ่งเหล่านี้เทียบเท่ากับคำสั่งUnderload~ : ! a * ^โดยที่ไม่มีการใช้คำสั่งอื่น

S, D, RและLสามารถใช้กับค่าใด ๆ ที่ด้านบนของสแต็ค แต่CและUต้องมีรายชื่ออยู่ด้านบนของสแต็คเพื่อฟังก์ชั่น ส่งที่มีลำดับความพยายามที่จะสร้าง preform การดำเนินงานที่ไม่ถูกต้อง (เช่นDในกองว่างเปล่าหรือUในที่ไม่ใช่รายการ) คือผิดและจะต้องได้รับการลงโทษคงที่

เพื่อแก้ไขไดอะแกรมสถานะสแต็กค้นหาลำดับของคำสั่งที่จะเปลี่ยนสถานะสแต็กเริ่มต้นให้เป็นสถานะใหม่ได้อย่างถูกต้อง ตัวอย่างเช่นทางออกหนึ่ง3: 0 2 1 0คือLSLCSLCULSLCLSLDCSC USLCU:

   2 1 0
L  2 1 (0)
S  2 (0) 1
L  2 (0) (1)
C  2 (0 1)
S  (0 1) 2
L  (0 1) (2)
C  (0 1 2)
U  0 1 2
L  0 1 (2)
S  0 (2) 1
L  0 (2) (1)
C  0 (2 1)
L  0 ((2 1))
S  ((2 1)) 0
L  ((2 1)) (0)
D  ((2 1)) (0) (0)
C  ((2 1)) (0 0)
S  (0 0) ((2 1))
C  (0 0 (2 1))
U  0 0 (2 1)
S  0 (2 1) 0
L  0 (2 1) (0)
C  0 (2 1 0)
U  0 2 1 0

งานของคุณคือการเขียนโปรแกรมที่ใช้แผนภาพสถานะสแต็กและส่งออกโซลูชั่น

กรณีทดสอบ

2 1 0       ->

3 2 0       -> SR

9           -> RRRRRRRRR

2 0 1 0     -> LSLCDCUR

2 0 1 1     -> SD

6 2         -> RRSRSRSR

5 0 1 2 3 4 -> LSLCSLCSLCSLCU

4 2 0 1 3 2 -> LSLCSLSCSLCULSLSCSLSCLSLDCSCUSLCU

นี่คือดังนั้นคำตอบที่ถูกต้องสั้นที่สุด (เป็นไบต์) ชนะ


คุณมีรายการที่มีรายการได้ไหม แก้ไข: ไม่เป็นไรคุณสามารถทำได้มันอยู่ในตัวอย่าง
orlp

ไม่Cรายการความจำเป็นในตำแหน่งบนสุดและครั้งที่สองของสแต็ค? หรือองค์ประกอบในตำแหน่งที่สองสามารถเพิ่มลงในรายการด้านบน?
edc65

Cต้องการรายการทั้งสองตำแหน่ง มันไม่สมเหตุสมผลที่จะต่อค่าและรายการเข้าด้วยกัน
แยกผลไม้

คำตอบ:


9

Python 3, 84 ไบต์

lambda n,*s:"DLL"+"L".join(i*"SLSC"+"LSLSCDURLCULCULSC"for i in s[::-1])+n*"SR"+"UR"

การใช้งาน:

# Example: 4 2 0 1 3 2 -> LSLCSLSCSLCULSLSCSLSCLSLDCSCUSLCU
>>> f = lambda ...
>>> f(4, 2, 0, 1, 3, 2)
'DLLSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCLSLSCDURLCULCULSCLLSLSCDURLCULCULSCLSLSCSLSCLSLSCDURLCULCULSCSRSRSRSRUR'

คำอธิบาย:ในการเริ่มต้นเราจะทำซ้ำศูนย์และห่อในรายการ:

DL -> 3 2 1 0 (0)

นี่คือฐานของเรา ตอนนี้ผมจะอธิบายขั้นตอนวิธีการทั่วไปที่ผลัดกัน... 1 0 (x)เข้ามาสำหรับจำนวนเต็มโดยพลการ... 1 0 (i x) iฉันจะใช้เป็นตัวอย่างและเรามีรายชื่อพลบางส่วนi = 2 (x)เราเริ่มต้นด้วยการห่อรายการปัจจุบันของเรา(x)ลงในรายการอื่น:

L -> 3 2 1 0 ((x))

ตอนนี้เราทำซ้ำiครั้งต่อไปนี้:

SLSC -> 3 2 1 (0 (x))
SLSC -> 3 2 (1 0 (x))

ตอนนี้เราก็พร้อมที่จะใส่ 2 (x)ในรายการ สิ่งนี้จะเป็นดังนี้:

LSLSC -> 3 (2 (1 0 (x)))
DU -> 3 (2 (1 0 (x))) 2 (1 0 (x))
RLCU -> 3 2 (1 0 (x)) 2
LCU -> 3 2 1 0 (x) 2
LSC -> 3 2 1 0 (2 x)

โปรดทราบว่าเรายังคงผลักจำนวนเต็มใหม่ทางซ้าย ดังนั้นสิ่งแรกที่(0)เราเริ่มต้นด้วยการอยู่ทางด้านขวา

หลังจากที่เราใส่จำนวนเต็มทุกตัวแล้วเราต้องเข้าไปในรายการเราจะลบส่วนที่เหลือของสแต็กโดยการสลับและลบเวลาn ( SR) ในที่สุดเราก็แกะรายการของเราออกและลบอันแรกที่0เราแทรกเพื่อเริ่มรายการของเรา ( UR)


คุณหมายถึงพิมพ์sแทนlหรือไม่
Zacharý

@ ZacharyT โอ๊ะโอ มันทำงานในขณะที่สับสิ่งต่าง ๆ เพราะlถูกกำหนดไว้ใน REPL ของฉัน
orlp

ตัวอย่างที่แสดงไม่ทำงาน ... ( DLLSLSCSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCLSLSCDURLCULCULSCLSLSCLSLSCDURLCULCULSCLLSLSCDURLCULCULSCSRSRSRSRUR ) มันจะพยายามรันSคำสั่งเมื่อมีเพียง 1 ค่าบนสแต็ก
ผลไม้แยกแยะ

@ Challenger5 และฉันก็ลืมปรับปรุงตัวอย่าง ... ควรได้รับการแก้ไขแล้ว
orlp

อ๋อตอนนี้ดูดีแล้ว!
ผลไม้แยกแยะ

0

CJam, 54 ไบต์

เป็นเพียงการแปลจากโซลูชัน Python ของ orlp ไปเป็น CJam ไม่มีอะไรใหม่ที่นี่

"DLL"q~("SR"*\W%{"SLSC"*"LSLSCDURLCULCULSC"+}%'L*\"UR"

คำอธิบาย:

"DLL"                  e# Push string
q~                     e# Read input and evaluate
(                      e# Pop the first value
"SR"                   e# Push string
*                      e# Repeat string n times
\                      e# Swap (bring s to front)
W%                     e# Reverse
{                      e# For each:
  "SLSC"               e#   Push string
  *                    e#   Repeat i times
  "LSLSCDURLCULCULSC"+ e#   Append string to end
}%                     e# End
'L*                    e# Join with 'L'
\                      e# Swap (bring "SR"*n to front)
"UR"                   e# Push string
                       e# [Stack is implicitly output.]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.