식료품 점 미세 관리


14

당신은 새로운 식료품 점 Half Foods의 직원이며 추수 감사절 크리스마스 부활절 전날 입니다. 가게는 식료품을 얻기 위해 서두르는 고객들로 포장 될 것이므로, 가게는 모든 사람들을 적절한 라인으로 보내려면 교통 관리자가 필요합니다. 게으 르기 때문에 모든 사람이 칠면조 햄을 먹기 전에 델리에 갈 수 있도록 이것을 자동화하고 싶습니다 . 그러나 휴대 전화 만 있으면 긴 프로그램을 코딩하는 데 어려움이 있으므로 닌자 기술을 연마해야합니다.

도전

식료품 점을 2 차원 격자로 시각화 해 봅시다. 다음은 해부 할 샘플 그리드입니다.

                             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 ) 한 후 임의의 숫자로 설정 사이 15. 각 세대마다, 당신은 쇼핑객에 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 입력은 여러 줄의 입력을 받기위한 기본값에 따라 여러 줄 문자열 또는 한 줄 문자열 배열 일 수 있습니다.
스파게티

아니, 난 그냥 도전을하지 않는 것을 의미합니다.
기금 모니카의 소송

예제에 의존하는 대신, Y 행으로 이동하여 관련 큐의 맨 위로 순간 이동하는 것이 단일 단계로 진행되므로 구매자는 절대 Y와 같은 행에있을 수 없다고 명시 적으로 언급 할 필요가 있습니다.
trichoplax

또한 테스트 사례를 예로 들어 대기열 이동 방법을 설명하는 데 도움이됩니다. 대기열에 세로로 인접한 3 명의 쇼핑객이 있고 가장 낮은 쇼핑객이 아래로 이동할 수있는 경우, 3 명의 쇼핑객이 한 단계 씩 함께 아래로 이동합니까? 또는 각 쇼핑객이 이동할 때 사용 가능한 공간이 한 번에 한 행씩 위로 이동합니까?
trichoplax

답변:


4

파이썬 (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))

온라인으로 사용해보십시오!

아직도 골프를 치고 있지만 지금은 문제를 해결합니다.


들여 쓰기와 줄 바꿈을 제거 할 수 있습니다 (단일 줄 블록은 시작 부분과 같은 줄에있을 수 있습니다)
Solomon Ucko

@SolomonUcko 당신은 어디에 대해 이야기하고 있습니까?
Post Rock Garf Hunter

1. 탭은 공백으로 8 칸입니까? 2. 마지막 2 개의 for 루프 이후 줄 바꿈을 제거 할 수 있다고 생각합니다.
Solomon Ucko

1
1. 탭은 파이썬에서 고유 한 것입니다. 2. 해당 줄 바꿈을 제거 할 수 없습니다.
Post Rock Garf Hunter

1. 파이썬은 블록의 첫 번째 들여 쓰기 수준을 해당 블록의 들여 쓰기 수준으로 계산합니까? 2. 왜 그런지 아십니까 ? 테스트했는데 작동하지 않습니다.
솔로몬 유코

4

C ++, 898 896 885 841 바이트

코딩하기에는 너무 길지만 ...

Conor O'Brien 덕분에 -2 바이트
Zacharý 덕분에 -45 바이트

#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 (수직) 좌표에서 끝납니다.

  • 그리드에 최소한 한 #줄 이상이 e있고 상단에 하나의 문자 (하나의 콘센트), 하나의 문자 가 있다고 가정하십시오.Y

  • 입력이 유효한 출력이라고 가정하여 경로 재 지정을 기다리는 구매자는 항상 차례로

편집 : 밀 마법사의 답변에서 여러 입구를 지원해야한다는 의견을 보았습니다.


어쩌면 C 매크로를 만들 수 #define C(e)i[j].find(e)!=string::npos있습니까?
코너 오브라이언

내 답변은 여러 입구를 부작용으로 지원합니다. Quartata는 그것이 필요하다고 말했지만, 질문에서 그것을 보지 못했습니다. 관심이있는 한, 당신은 자유롭게 하나의 입구를 지원할 수 있습니다.
포스트 락 가프 헌터

@WheatWizard 글쎄, 질문을 읽으면 "그리드는 콘센트를 나타내는 e로 시작합니다"와 "모든 콘센트"로 시작하므로 여러 개의 입구가있을 수 있습니다.
HatsuPointerKun

의 정의를 변경하고 그에 따라 통화 C(e)를 변경할 수 있습니다 #define C(e)if(i[j].find(e)!=string::npos.
재커리

또한에 length()적용 되기 때문에 에 따라 통화를 수정 하여로 정의되도록 a변경할 L수 있습니다 a.length(). 또한 using namespace std;줄 바꿈을 제거하여 바이트를 절약하면서-를 맨 아래 로 이동할 수 있습니다.
Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.