杂货店微管理


14

您是一家时尚的新杂货店Half Foods的员工,这是感恩节 圣诞节复活节的前一天。由于商店将挤满顾客争抢食物,因此商店需要交通管理人员将每个人都送到适当的生产线。懒惰,您想使它自动化,以便您可以在所有人都吃掉所有火鸡 火腿之前就去熟食店。但是,随身携带的只是手机,在手机上编写长程序确实是一件很痛苦的事-因此您需要淘汰忍者技能。

挑战

让我们在二维网格上可视化杂货店。这是要剖析的示例网格:

                             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之后的列#是一行。购物者下到行尾(由exit表示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
我真的没有得到输入格式。
Fund Monica的诉讼

@QPaysTaxes输入可以是多行字符串,也可以是单行字符串数组,这是我们接受多行输入的默认设置。
意大利面条

不,我的意思是说我真的没有受到挑战。
Fund Monica的诉讼

与其依赖示例,不如明确声明购物者永远不能与Y排在同一行,因为向下移动到Y行并将其传送到相关队列的顶部仅一步之遥。
trichoplax

以测试用例为例,对队列的移动方式进行描述也将有所帮助。如果队列中有3个垂直相邻的购物者,并且最低的购物者可以向下移动,那么这3个购物者是一起向下移动吗?还是每个购物者进入时,可用空间一次向上移动一排?
trichoplax

Answers:


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

在线尝试!

仍在打高尔夫球,但现在可以解决问题


您可以删除多余的缩进和换行符(单行块可以与块的开头
处在

@SolomonUcko您在哪里谈论?
发布Rock Garf Hunter

1.制表符是python的8个空格吗?2.我认为您可以删除最后两个for循环之后的换行符。
所罗门·乌科

1
1.制表符在Python中是他们自己的东西。2.您无法删除该换行符。
发布Rock Garf Hunter

1. python是否仅将块中的第一个缩进级别计算为该块的缩进级别?2.你知道为什么不吗?我测试了它,但是不起作用。
所罗门·乌科

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

所以...一些细节:

  • 您必须传递a std::vector<std::string>(它们将以最长字符串的相同长度调整大小)

  • 所有#以相同的y(垂直)坐标开始,长度相同,以相同的y(垂直)坐标结束的行

  • 假设网格至少有1 #行或更多,e顶部有一个字母(一个出口),一个字母Y

  • 假设输入是有效输出,那么等待重定向的购物者将总是一个接一个

编辑:刚刚在小麦向导的答案的评论中看到它应该支持多个入口,我将继续致力于


也许您可以使C宏成为#define C(e)i[j].find(e)!=string::npos
科纳·奥布莱恩

我的回答支持多个入口,这是高尔夫球的副作用。Quartata说这是必需的,但我在问题中没有看到它,因此就我而言,您可以自由地只支持一个入口。
发布岩石Garf Hunter

@WheatWizard好吧,如果我读了这个问题,它会说:“网格以e开头,代表一个出口”和“所有出口”,因此建议它可以有多个入口
HatsuPointerKun

您可以更改C(e)be 的定义,#define C(e)if(i[j].find(e)!=string::npos并相应地更改调用。
扎卡里

由于length()仅应用于a,因此您可以L将其更改为a.length(),从而相应地修改调用。此外,你可以移动using namespace std;通过去除换行至底部,节省了字节
扎卡里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.