Market Mikro Yönetimi


14

Kalça yeni bakkal Half Foods'da bir çalışansınız ve Şükran Günü Noel Paskalya'sından bir gün önce . Mağaza, yiyeceklerini almak için acele eden müşterilerle dolu olacağından, mağazanın herkesi uygun hatlara göndermek için bir trafik yöneticisine ihtiyacı var. Tembel olmak, bunu otomatikleştirmek istersiniz, böylece herkes hindi jambonunu almadan önce şarküteri vurabilirsiniz . Bununla birlikte, sizinle birlikte olan tek şey telefonunuz ve uzun programları kodlamak gerçek bir acıdır - bu yüzden ninja becerilerinizi bozmanız gerekir .

Meydan okuma

Bakkal iki boyutlu bir ızgara üzerinde görselleştirelim. İşte incelemek için bir örnek ızgara:

                             e
                             s
                             s
                             s
                               Y

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

Izgara e, mağazanın geri kalanına bir "çıkışı" temsil eden bir ile başlar . Her nesil, şebekedeki tüm satış noktaları sdoğrudan aşağıda bir alışverişçi ( ) oluşturur. Alışveriş yapanlar size ulaşana kadar her nesilde aşağı doğru hareket ederler ( Y). Bir müşteri sizinle aynı satıra ulaştığında, müşteriyi içinde en az alışveriş yapan kullanıcıyla satırın başına ışınlamanız gerekir. Bir alışverişçi, ile sıraya girecekleri zaman hemen çizgiye hareket eder Y, arasında bir nesil yoktur. Çizgiler #s ile temsil edilir - s'den sonraki sütun #bir çizgidir. Alışveriş (bir çıkış ile temsil edilen hattın sonuna inmek x) ve ardından bir rastgele sayı dönüşmesi arasında 1ve5. Her nesil, numaralandırılmış alışveriş yapanları azaltmanız gerekir 1- bir alışveriş yapan kişiye ulaştığında 0, check-out yapılır ve mağazadan ayrılırlar.

Böyle bir ızgara girdisi verildiğinde, bakkalın yeni neslini çıktılayın (tüm müşterileri aynı anda aşağı taşıyın, alışveriş yapanları yönlendirin ve yapıldıysa onları terk ettirin).

Numuneler

Giriş:

                e

                     Y


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

Çıktı:

                e
                s 
                     Y


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

Giriş:

                e
                s 
                     Y


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

Çıktı

                e
                s 
                     Y


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

Giriş:

                e

                     Y


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

(Mümkün) Çıktı:

                e
                s 
                     Y


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

Giriş:

                e
                s 
                     Y


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

Çıktı:

                e
                s 
                     Y


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

Giriş:

                e

                     Y


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

Çıktı:

                e
                s 
                     Y


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

Bu , bu yüzden en kısa kod kazanır.


1
Giriş formatını gerçekten alamıyorum.
Monica'nın Davası

@ QPaysTaxes Giriş, birden çok girdi satırı almak için varsayılanlarımıza göre çok satırlı bir dize veya tek satırlık bir dizi olabilir.
a spaghetto

Hayır, demek istediğim, gerçekten zorlanamıyorum.
Monica'nın Davası

Örneklere güvenmek yerine, alışveriş yapan kişinin Y ile aynı satırda olamayacağını açıkça belirtmek gerekir, çünkü Y satırına inmek ve ilgili kuyruğun üstüne ışınlanmak tek bir adımda gerçekleşir.
trichoplax

Örnek olarak bir test senaryosu ile bir kuyruğun nasıl hareket ettiğine dair bir açıklama yapmak da yardımcı olacaktır. Bir kuyruğa dikey olarak bitişik 3 müşteri varsa ve en düşük olanı aşağıya hareket edebiliyorsa, her 3 müşteri de tek bir adımda birlikte aşağıya mı hareket ediyor veya her müşteriye hareket ettikçe kullanılabilir alan bir seferde bir satır yukarı mı hareket ediyor?
trichoplax

Yanıtlar:


4

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

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

Çevrimiçi deneyin!

Hala golf oynamak için çalışıyoruz ama şimdilik problemi çözüyor


Fazla girintiyi ve satır sonlarını kaldırabilirsiniz (tek satır blokları blok başlangıcıyla aynı satıra geçebilir)
Solomon Ucko

@SolomonUcko Neden bahsediyorsun?
Rock Garf Hunter Post

1. Sekmeler python için 8 boşluk mu? 2. Döngüler için son 2'den sonra satır sonlarını kaldırabileceğinizi düşünüyorum.
Solomon Ucko

1
1. Sekmeler Python'da kendi şeyleridir. 2. Bu satır sonunu kaldıramazsınız.
Rock Garf Hunter Post

1. Python sadece bir bloktaki ilk girinti seviyesini o blokun girinti seviyesi olarak mı sayıyor? 2. Neden olmadığını biliyor musun ? Test ettim ve işe yaramıyor.
Solomon Ucko

4

C ++, 898 896 885 841 bayt

Kodlamak için çok uzun ... ama orada

Conor O'Brien sayesinde -2 bayt
-Zacharý sayesinde -45 bayt

#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;};

Yani ... bazı detaylar:

  • Bir geçmek zorunda std::vector<std::string>(onlar en uzun dizedir aynı enine boyuna yeniden boyutlandırılır)

  • #Aynı y (dikey) koordinatlarındaki tüm başlangıç çizgileri aynı uzunluktadır ve aynı y (dikey) koordinatlarında biter

  • Izgaranın en az 1 #satır veya daha fazla olduğunu, eüstte bir harf (bir çıkış), bir harf olduğunu varsayalımY

  • Girdinin geçerli bir çıktı olduğunu varsayalım, böylece yönlendirilmeyi bekleyen müşteriler her zaman birbiri ardına olacak

Düzenleme: Sadece Buğday Sihirbazı'nın birden fazla girişi desteklemesi gerektiği cevabının yorumlarında gördüm, bu konuda çalışmaya devam edeceğim


Belki bu C makrosunu yapabilirsin #define C(e)i[j].find(e)!=string::npos?
Conor O'Brien

Cevabım, golfçülüğün bir yan etkisi olarak birden fazla girişi destekliyor. Quartata gerekli olacağını söyledi, ancak soruda görmüyorum, bu yüzden endişelendiğim kadarıyla sadece tek bir girişi desteklemede özgürsünüz.
Post Rock Garf Hunter

@WheatWizard Eğer soruyu okursam, şöyle diyor: "Izgara bir çıkış temsil eden bir e ile başlar" ve "tüm çıkışları", böylece birkaç giriş olabilir öneririz
HatsuPointerKun

C(e)Olmak istediğiniz tanımı #define C(e)if(i[j].find(e)!=string::nposdeğiştirebilir ve çağrıları buna göre değiştirebilirsiniz.
Zacharý

Ve length()yalnızca uygulandığı için a, çağrıları buna göre değiştirerek Ltanımlanacak şekilde a.length()değiştirebilirsiniz. Buna ek olarak, using namespace std;alt
satırını taşıyabilir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.