Продуктовый магазин Микроуправление

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 Ввод может быть либо многострочной строкой, либо массивом однострочных строк в соответствии с нашими значениями по умолчанию для ввода нескольких строк ввода.
спагетто
Нет, я имею в виду, что я просто не понимаю, правда.
Фонд Моника иск
Вместо того, чтобы полагаться на примеры, возможно, стоит явно указать, что покупатель никогда не может находиться в той же строке, что и Y, поскольку перемещение вниз к строке Y и телепортирование в верхнюю часть соответствующей очереди происходит за один шаг.
trichoplax
Также было бы полезно иметь описание того, как движется очередь, с примером теста. Если в очереди находятся 3 покупателя, расположенных рядом друг с другом, и самый низкий из них может двигаться вниз, все три перемещаются вместе вниз за один шаг или доступное пространство перемещается вверх на одну строку за раз, когда каждый покупатель входит в нее?
Трихоплакс

Ответы:

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 Где ты говоришь?
Пост Рок Гарф Хантер
1. Являются ли вкладки 8 пробелами для Python? 2. Я думаю, что вы можете удалить разрывы строк после двух последних циклов.
Соломон Уцко
1
1. Вкладки - это свое дело в Python. 2. Вы не можете удалить этот разрыв строки.
Пост Рок Гарф Хантер
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;};

Итак ... некоторые детали:

  • Вы должны передать std::vector<std::string>(они будут изменены с той же длиной, что и самая длинная строка)

  • Все линии #начинаются с одинаковых y (вертикальных) координат, имеют одинаковую длину и заканчиваются с одинаковыми y (вертикальными) координатами

  • Предположим, что сетка имеет по крайней мере 1 #строку или более, имеет одну букву e(один вывод) вверху, одну буквуY

  • Предположим, что ввод является действительным выводом, поэтому покупатели, ожидающие перенаправления, всегда будут один за другим

Изменить: Только что увидел в комментариях ответа мастера пшеницы, что он должен поддерживать несколько входов, я буду продолжать работать над этим

HatsuPointerKun
источник
Может быть, вы могли бы сделать этот макрос C быть #define C(e)i[j].find(e)!=string::npos?
Конор О'Брайен,
Мой ответ поддерживает несколько входов как побочный эффект, так как это гольф. Квартата сказал, что это будет необходимо, но я не вижу этого в этом вопросе, поэтому, насколько я понимаю, вы можете поддерживать только один вход.
Пост Рок Гарф Хантер
@WheatWizard Хорошо, если я читаю вопрос, он говорит: «Сетка начинается с e, который представляет собой выход» и «все выходы», так что можно предположить, что он может иметь несколько входов
HatsuPointerKun
Вы можете изменить определение C(e)быть #define C(e)if(i[j].find(e)!=string::nposи изменить вызовы соответственно.
Захари
А так length()как применяется только a, вы можете изменить, Lчтобы быть определенным как a.length(), соответственно изменяя вызовы. Кроме того, вы можете переместить using namespace std;
курсор