Microgestão de Mercearia

14

Você é funcionário da nova mercearia Half Foods, e é um dia antes do Natal do Dia de Ação de Graças . Como a loja estará lotada de clientes correndo para comprar seus alimentos, a loja precisa de um gerente de tráfego para enviar todos para as linhas apropriadas. Sendo preguiçoso, você gostaria de automatizar isso para poder ir até a delicatessen antes que todos tomem todo o presunto de peru . No entanto, tudo o que você tem com você é seu telefone, e codificar programas longos é uma verdadeira dor - então você precisa aprimorar suas habilidades de ninja .

Desafio

Vamos visualizar o supermercado em uma grade bidimensional. Aqui está uma amostra de grade para dissecar:

                             e
                             s
                             s
                             s
                               Y

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

A grade começa com um e, que representa uma "saída" para o restante da loja. A cada geração, todas as saídas na grade geram um comprador ( s) diretamente abaixo. Os compradores descem a cada geração até chegarem a você ( Y). Quando um comprador atinge a mesma linha que você, você deve teleportar o comprador para o início da linha com a menor quantidade de compradores. Um comprador passa imediatamente para a linha quando entraria na linha com o Y, não há geração entre eles. As linhas são representadas pelo #s - a coluna após o #s é uma linha. Os compradores descem até o final da linha (representada por uma saída x) e depois se transformam em um número aleatório entre 1e5. A cada geração, você deve diminuir o número de compradores 1- quando um cliente chega 0, eles terminam de fazer check-out e saem da loja.

Dada a entrada de uma grade como essa, produza a próxima geração da mercearia (mova todos os compradores para baixo simultaneamente, redirecione os compradores e deixe-os sair se tiverem terminado).

Amostras

Entrada:

                e

                     Y


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

Resultado:

                e
                s 
                     Y


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

Entrada:

                e
                s 
                     Y


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

Resultado

                e
                s 
                     Y


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

Entrada:

                e

                     Y


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

(Possível) Saída:

                e
                s 
                     Y


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

Entrada:

                e
                s 
                     Y


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

Resultado:

                e
                s 
                     Y


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

Entrada:

                e

                     Y


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

Resultado:

                e
                s 
                     Y


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

Isso é , então o código mais curto vence.

um spaghetto
fonte
1
Eu realmente não entendo o formato de entrada.
Fund Monica's Lawsuit
A entrada @QPaysTaxes pode ser uma sequência de linhas múltiplas ou uma matriz de seqüências de linhas únicas, conforme nossos padrões para obter várias linhas de entrada.
um Spaghetto
Não, quero dizer que realmente não recebo o desafio, realmente.
Fund Monica's Lawsuit
Em vez de confiar nos exemplos, pode valer a pena declarar explicitamente que o comprador nunca pode estar na mesma linha que Y, pois passar para a linha Y e ser teleportado para o topo da fila relevante acontece em uma única etapa.
Trichoplax
Também ajudaria a ter uma descrição de como uma fila se move, com um caso de teste como exemplo. Se houver três compradores verticalmente adjacentes em uma fila, e o menor puder descer, todos os três descerão juntos em uma única etapa ou o espaço disponível subirá uma linha por vez à medida que cada comprador entra nela?
Trichoplax

Respostas:

4

Python 2 , 477 463 453 449 423 402 397 396 393 bytes

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

Experimente online!

Ainda trabalhando nisso, mas resolve o problema por enquanto

Post Rock Garf Hunter
fonte
Você pode remover o excesso de quebras de recuo e de linha (blocos de linha única pode ir na mesma linha que o início do bloco)
Solomon Ucko
@SolomonUcko De onde você está falando?
Post Rock Garf Hunter
1. As abas são 8 espaços para python? 2. Acho que você pode remover as quebras de linha após os últimos 2 para loops.
Solomon Ucko
1
1. As guias são próprias no Python. 2. Você não pode remover essa quebra de linha.
Post Rock Garf Hunter
1. Python conta apenas o primeiro nível de indentação em um bloco como o nível de indentação desse bloco? 2. Você sabe por que não? Eu testei e não funciona.
Solomon Ucko
4

C ++, 898 896 885 841 bytes

Muito tempo para codificar ... mas está lá

-2 bytes graças a Conor O'Brien
-45 bytes graças a 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;};

Então ... alguns detalhes:

  • Você precisa passar por um std::vector<std::string>(eles serão redimensionados no mesmo comprimento que a string mais longa)

  • Todas as linhas de #início nas mesmas coordenadas y (verticais) têm o mesmo comprimento e terminam nas mesmas coordenadas y (verticais)

  • Suponha que a grade tenha pelo menos 1 #linha ou mais, tenha uma letrae (uma saída) na parte superior, uma letraY

  • Suponha que a entrada seja uma saída válida para que os compradores que aguardam o redirecionamento sejam sempre um após o outro

Edit: Acabei de ver nos comentários da resposta do Wheat Wizard que ele deve suportar múltiplas entradas, continuarei a trabalhar nisso

HatsuPointerKun
fonte
Talvez você possa fazer essa macro C #define C(e)i[j].find(e)!=string::npos?
Conor O'Brien
Minha resposta apóia múltiplas entradas como efeito colateral, sendo golfe. Quartata disse que seria necessário, mas eu não o vejo na pergunta; portanto, para mim, você é livre para apoiar apenas uma única entrada.
Post Rock Garf Hunter
@WheatWizard Bem, se eu ler a pergunta, ele diz: "A grade começa com um e, o que representa uma saída" e "todas as tomadas", de modo que sugerem que ele pode ter várias entradas
HatsuPointerKun
Você pode alterar a definição de C(e)ser #define C(e)if(i[j].find(e)!=string::npose alterar as chamadas de acordo.
Zacharý
E como length()só é aplicado a, é possível alterar Lpara ser definido como a.length(), modificando as chamadas de acordo. Além disso, você pode mover a using namespace std;parte inferior, salvando um byte removendo a nova linha
Zacharý