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.


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


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


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ý
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.