Micromanagement ร้านขายของชำ


14

คุณเป็นพนักงานที่ร้านขายของชำใหม่สุดฮิปฟู้ดฟู้ดส์และเป็นวันก่อนวันขอบคุณพระเจ้า คริสต์มาสอีสเตอร์ เนื่องจากร้านค้าจะเต็มไปด้วยลูกค้าที่เร่งรีบเพื่อซื้ออาหารร้านค้าจึงต้องการผู้จัดการจราจรเพื่อส่งทุกคนไปยังสายที่เหมาะสม เป็นคนขี้เกียจคุณอยากจะทำสิ่งนี้โดยอัตโนมัติเพื่อที่คุณจะได้ไปตีเดลี่ก่อนที่ทุกคนจะเอาไก่งวง แฮมไปทำอะไรก็ได้ อย่างไรก็ตามสิ่งที่คุณมีกับคุณคือโทรศัพท์ของคุณและการเขียนโปรแกรมยาว ๆ เป็นความเจ็บปวดที่แท้จริง - ดังนั้นคุณจำเป็นต้องฝึกฝนทักษะการของนินจา

ท้าทาย

ลองนึกภาพร้านขายของชำบนตารางสองมิติ นี่คือตารางตัวอย่างที่จะผ่า:

                             e
                             s
                             s
                             s
                               Y

#           #                #s           #
#s          #                #s           #
#s          #                #s           #
#s          #s               #s           #
#3          #1               #4           #
 x           x                x            x

กริดเริ่มต้นด้วยe, ซึ่งหมายถึง "ทางออก" ไปยังส่วนที่เหลือของร้านค้า ทุกรุ่นร้านค้าทั้งหมดในตารางวางไข่ผู้ซื้อ ( s) ด้านล่างโดยตรง ผู้ซื้อเลื่อนลงแต่ละรุ่นจนกว่าพวกเขาจะไปถึงคุณ ( Y) เมื่อนักช้อปมาถึงแถวเดียวกันกับคุณคุณจะต้องส่งนักช็อปปิ้งไปยังจุดเริ่มต้นของบรรทัดด้วยจำนวนผู้ซื้อน้อยที่สุดในนั้น นักช้อปจะย้ายไปที่บรรทัดทันทีเมื่อพวกเขาจะย้ายเข้าแถวพร้อมกับYไม่มีรุ่นในระหว่าง เส้นถูกแสดงโดย#s - คอลัมน์หลังจาก#s คือบรรทัด ผู้ซื้อลงไปที่ท้ายบรรทัด (แทนด้วยทางออกx) จากนั้นเปลี่ยนเป็นตัวเลขสุ่มระหว่าง1และ5. แต่ละรุ่นคุณต้องลดจำนวนผู้ซื้อโดย1- เมื่อนักช้อปไปถึง0พวกเขาจะเสร็จสิ้นการตรวจสอบและพวกเขาออกจากร้าน

ให้อินพุตของกริดแบบนี้เอาท์พุทรุ่นต่อไปของร้านขายของชำ (ย้ายผู้ซื้อทั้งหมดลงพร้อมกันเปลี่ยนเส้นทางผู้ซื้อและปล่อยให้พวกเขาออกหากทำเสร็จ)

ตัวอย่าง

การป้อนข้อมูล:

                e

                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
 x           x                x            x

เอาท์พุท:

                e
                s 
                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
 x           x                x            x

การป้อนข้อมูล:

                e
                s 
                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
 x           x                x            x

เอาท์พุต

                e
                s 
                     Y


#s          #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
 x           x                x            x

การป้อนข้อมูล:

                e

                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#s          #                #            #
#           #                #            #
 x           x                x            x

(เป็นไปได้) เอาท์พุท:

                e
                s 
                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#3          #                #            #
 x           x                x            x

การป้อนข้อมูล:

                e
                s 
                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#3          #                #            #
 x           x                x            x

เอาท์พุท:

                e
                s 
                     Y


#           #s               #            #
#           #                #            #
#           #                #            #
#           #                #            #
#2          #                #            #
 x           x                x            x

การป้อนข้อมูล:

                e

                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#1          #                #            #
 x           x                x            x

เอาท์พุท:

                e
                s 
                     Y


#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
#           #                #            #
 x           x                x            x

นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ


1
ฉันไม่ได้รับรูปแบบอินพุตจริงๆ
คดีของกองทุนโมนิกา

@QPaysTaxes Input สามารถเป็นสตริงแบบหลายบรรทัดหรืออาร์เรย์ของสตริงบรรทัดเดียวตามค่าเริ่มต้นของเราสำหรับการรับอินพุตหลายบรรทัด
สปาเก็ตตี้

ไม่ฉันหมายความว่าฉันไม่ได้รับการท้าทายจริงๆ
คดีฟ้องร้องกองทุนโมนิก้า

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

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

คำตอบ:


4

Python 2 , 477 463 453 449 423 402 397 396 393 ไบต์

t=input()
e=enumerate
q,r=" s"
for i,L in list(e(t))[:0:-1]:
 for j,c in e(L):
	a=t[i-1][j]
	if"0"<c<"6":L[j]="0 1234"[int(c)]
	if(r==a)*q==L[j]:t[i-1][j],L[j]=q+r
	if"e"==a:L[j]=r
	if r==L[j]and"x"==t[i+1][j]:L[j]="5"
 if"Y"in L:x=L.count(r);t[i]=[p.replace(r,q)for p in L]
for i,l in list(e(t))[::-1]:
 for j,c in e(l):
	if"#"==c and(q==l[j+1])*x:x-=1;l[j+1]=r
print"\n".join(map("".join,t))

ลองออนไลน์!

ยังคงทำงานเกี่ยวกับการเล่นกอล์ฟ แต่ก็แก้ปัญหาได้ในตอนนี้


คุณสามารถลบการเยื้องส่วนเกินและตัวแบ่งบรรทัด (บล็อกบรรทัดเดียวสามารถอยู่ในบรรทัดเดียวกันกับจุดเริ่มต้นของบล็อก)
โซโลมอน Ucko

@SolomonUcko คุณกำลังพูดถึงที่ไหน
โพสต์ Rock Garf Hunter

1. แท็บ 8 ช่องว่างเป็นไพ ธ อนหรือไม่ 2. ฉันคิดว่าคุณสามารถลบตัวแบ่งบรรทัดหลังจาก 2 ครั้งล่าสุดสำหรับลูป
โซโลมอน Ucko

1
1. แท็บเป็นของตนเองใน Python 2. คุณไม่สามารถลบตัวแบ่งบรรทัดนั้นได้
โพสต์ร็อค Garf Hunter

1. หลามเพิ่งนับระดับการเยื้องแรกในบล็อกเป็นระดับการเยื้องสำหรับบล็อกนั้นหรือไม่? 2. คุณรู้หรือไม่ว่าทำไม ฉันทดสอบแล้วใช้งานไม่ได้
โซโลมอน Ucko

4

C ++, 898 896 885 841 ไบต์

รหัสยาวมาก ... แต่มันอยู่ที่นั่น

-2 ไบต์ขอบคุณ Conor O'Brien
-45 ไบต์ขอบคุณZacharý

#include<vector>
#include<string>
#include<algorithm>
#include<ctime>
#define B begin()
#define L length()
#define C(e)if(i[j].find(e)!=string::npos&&!
#define S's'
#define T size()
#define U i[x][a]
using namespace std;auto g=[](auto&i){int e=i[0].find('e'),n=0,y=0,h=0,o,j,c,x,t=0;for(auto&a:i)t=a.L>t?a.L:t;for_each(i.B,i.end(),[&i,t](string&s){s.resize(t);});srand(time(0));vector<int>s,l;for(j=0;j<i.T;++j){C(S)y)++n;C(89)0)y=j;C(35)h){h=j;for(int d=0;d<i[j].T;++d)if(i[j][d]==35)l.push_back(d+1);s.resize(l.T);}if(h)for(c=0;c<l.T;c++)if(i[j][l[c]]!=32)++s[c];C('x')0)x=j;}--x;for_each(l.B,l.end(),[&i,&x,h](int&a){if(U!=32)--U;if(U==10)U=32;for(int b=x;b>h;--b){if(i[b][a]==32&&i[b-1][a]==S){i[b][a]=S;i[b-1][a]=32;}}if(U==S)U=49+rand()%5;});if(i[y-1][e]==S)i[h][l[min_element(s.B,s.end())-s.B]]=S;for(j=1;j<n+2;++j)if(j<y)i[j][e]=S;};

ดังนั้น ... รายละเอียดบางอย่าง:

  • คุณต้องผ่านstd::vector<std::string>(พวกเขาจะถูกปรับขนาดที่ความยาวเดียวกันกับสตริงที่ยาวที่สุด)

  • เส้น#เริ่มต้นทั้งหมดที่พิกัด y (แนวตั้ง) เดียวกันมีความยาวเท่ากันและสิ้นสุดที่พิกัด y (แนวตั้ง) เดียวกัน

  • สมมติว่ากริดมีอย่างน้อย 1 #บรรทัดหรือมากกว่ามีตัวอักษรหนึ่งตัวe(หนึ่งเต้ารับ) ที่ด้านบนสุดหนึ่งตัวอักษรY

  • สมมติว่าอินพุตเป็นเอาต์พุตที่ถูกต้องดังนั้นผู้ซื้อที่รอการเปลี่ยนเส้นทางจะเป็นอีกหนึ่งรายการต่อไป

แก้ไข: เพิ่งเห็นในความคิดเห็นของคำตอบของ Wheat Wizard ว่าควรสนับสนุนทางเข้าหลายทางฉันจะทำงานต่อไป


บางทีคุณอาจทำให้แมโคร C นั้นเป็น#define C(e)i[j].find(e)!=string::nposอย่างไร
Conor O'Brien

คำตอบของฉันรองรับหลายทางเป็นผลข้างเคียงของมันเป็นกอล์ฟ Quartata กล่าวว่าจะต้องใช้ แต่ฉันไม่เห็นในคำถามดังนั้นตราบใดที่ฉันกังวลว่าคุณมีอิสระที่จะสนับสนุนทางเข้าเพียงทางเดียว
โพสต์ Rock Garf Hunter

@WeatWizard ดีถ้าฉันอ่านคำถามก็บอกว่า: "กริดเริ่มต้นด้วย e ซึ่งหมายถึงทางออก" และ "ร้านทั้งหมด" ดังนั้นที่แนะนำให้มันมีทางเข้าหลายแห่ง
HatsuPointerKun

คุณสามารถเปลี่ยนคำจำกัดความของC(e)การเป็น#define C(e)if(i[j].find(e)!=string::nposและเปลี่ยนการโทรได้
Zacharý

และเนื่องจากlength()มีการใช้งานเฉพาะในaคุณสามารถเปลี่ยนLเป็นกำหนดการa.length()ปรับเปลี่ยนการโทรได้ นอกจากนี้คุณสามารถย้ายusing namespace std;ไปด้านล่างประหยัด byte โดยการลบบรรทัดใหม่
Zacharý
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.