Microgestión de tienda de abarrotes

14

Eres un empleado de la nueva tienda de comestibles Half Foods, y es el día antes del Día de Acción de Gracias Navidad Pascua. Dado que la tienda estará repleta de clientes que se apresuran a conseguir sus alimentos, la tienda necesita un administrador de tráfico para enviar a todos a las líneas apropiadas. Siendo perezoso, te gustaría automatizar esto para que puedas ir a la tienda de delicatessen antes de que todos tomen todo el jamón de pavo . Sin embargo, todo lo que tiene con usted es su teléfono, y codificar programas largos en él es un verdadero dolor, por lo que debe desarrollar sus habilidades de ninja .

Desafío

Visualicemos el supermercado en una cuadrícula bidimensional. Aquí hay una cuadrícula de muestra para diseccionar:

                             e
                             s
                             s
                             s
                               Y

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

La cuadrícula comienza con un e, que representa una "salida" para el resto de la tienda. Cada generación, todos los puntos de venta en la red generan un comprador ( s) directamente debajo. Los compradores se mueven hacia abajo cada generación hasta que te alcanzan ( Y). Cuando un comprador llega a la misma fila que usted, debe teletransportarse al comienzo de la línea con la menor cantidad de compradores. Un comprador se mueve inmediatamente a la línea cuando se movería a la fila con el Y, no hay generación intermedia. Las líneas están representadas por la #s: la columna después de la #s es una línea. Los compradores bajan hasta el final de la línea (representado por una salida x), y luego se convierten en un número aleatorio entre 1y5. Cada generación, debe disminuir los compradores numerados por 1: cuando un comprador llega 0, terminan de pagar y salen de la tienda.

Dada una entrada de una cuadrícula como esta, envíe la próxima generación de la tienda de comestibles (mueva a todos los compradores hacia abajo simultáneamente, redirija a los compradores y haga que se vayan si ya han terminado).

Muestras

Entrada:

                e

                     Y


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

Salida:

                e
                s 
                     Y


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

Entrada:

                e
                s 
                     Y


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

Salida

                e
                s 
                     Y


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

Entrada:

                e

                     Y


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

(Posible) Salida:

                e
                s 
                     Y


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

Entrada:

                e
                s 
                     Y


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

Salida:

                e
                s 
                     Y


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

Entrada:

                e

                     Y


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

Salida:

                e
                s 
                     Y


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

Este es el , por lo que gana el código más corto.

un espagueti
fuente
1
Realmente no entiendo el formato de entrada.
Fondo de la demanda de Mónica
@QPaysTaxes La entrada puede ser una cadena de varias líneas o una matriz de cadenas de una sola línea según nuestros valores predeterminados para tomar múltiples líneas de entrada.
un spaghetto
No, quiero decir que realmente no entiendo el desafío.
Financia la demanda de Mónica el
En lugar de confiar en los ejemplos, podría valer la pena declarar explícitamente que el comprador nunca puede estar en la misma fila que Y, ya que moverse hacia abajo a la fila Y y ser teletransportado a la parte superior de la cola relevante ocurre en un solo paso.
trichoplax
También sería útil tener una descripción de cómo se mueve una cola, con un caso de prueba como ejemplo. Si hay 3 compradores adyacentes verticalmente en una cola, y el más bajo puede moverse hacia abajo, ¿los 3 se mueven juntos hacia abajo en un solo paso o el espacio disponible se mueve hacia arriba una fila a la vez a medida que cada comprador entra en él?
trichoplax

Respuestas:

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

Pruébalo en línea!

Todavía estoy trabajando en jugar golf pero resuelve el problema por ahora

Post Rock Garf Hunter
fuente
Puede eliminar el exceso de sangría y los saltos de línea (los bloques de una sola línea pueden ir en la misma línea que el inicio del bloque)
Solomon Ucko
@SolomonUcko ¿De dónde estás hablando?
Post Rock Garf Hunter
1. ¿Son las pestañas 8 espacios para python? 2. Creo que puedes eliminar los saltos de línea después de los 2 últimos bucles.
Solomon Ucko
1
1. Las pestañas son lo suyo en Python. 2. No puede eliminar ese salto de línea.
Post Rock Garf Hunter
1. ¿Python solo cuenta el primer nivel de sangría en un bloque como el nivel de sangría para ese bloque? 2. ¿Sabes por qué no? Lo probé y no funciona.
Solomon Ucko
4

C ++, 898 896 885 841 bytes

Muy largo para codificar ... pero está ahí

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

Entonces ... algunos detalles:

  • Debe pasar un std::vector<std::string>(se redimensionará a la misma longitud que la cadena más larga)

  • Todas las líneas de #inicio en las mismas coordenadas y (vertical), tienen la misma longitud y terminan en las mismas coordenadas y (vertical)

  • Suponga que la cuadrícula tiene al menos 1 #línea o más, tiene una letra e(una salida) en la parte superior, una letraY

  • Suponga que la entrada es una salida válida, por lo que los compradores que esperan ser redirigidos siempre serán uno tras otro.

Editar: Acabo de ver en los comentarios de la respuesta del Asistente de trigo que debe admitir múltiples entradas, continuaré trabajando en eso

HatsuPointerKun
fuente
¿Tal vez podrías hacer que esa macro C sea #define C(e)i[j].find(e)!=string::npos?
Conor O'Brien
Mi respuesta admite múltiples entradas como un efecto secundario, de ser de golf. Quartata dijo que sería necesario, pero no lo veo en la pregunta, por lo que a mí respecta, usted es libre de admitir solo una entrada.
Post Rock Garf Hunter
@WheatWizard Bueno, si leo la pregunta, dice: "La cuadrícula comienza con una e, que representa una salida" y "todas las salidas", por lo que sugiere que puede tener varias entradas
HatsuPointerKun
Puede cambiar la definición de C(e)ser #define C(e)if(i[j].find(e)!=string::nposy cambiar las llamadas en consecuencia.
Zacharý
Y dado length()que solo se aplica a, puede cambiar Lpara que se defina como a.length(), modificando las llamadas en consecuencia. Además, puede mover using namespace std;hacia abajo, ahorrando un byte eliminando la nueva línea
Zacharý