Lebensmittelgeschäft Micromanagement

14

Sie sind Angestellter im angesagten neuen Lebensmittelgeschäft Half Foods, und es ist der Tag vor Thanksgiving, Weihnachten, Ostern. Da der Laden mit Kunden gefüllt sein wird, die schnell nach Lebensmitteln suchen, benötigt der Laden einen Verkehrsmanager, der alle an die entsprechenden Leitungen weiterleitet. Faulenzen, möchten Sie diese so automatisieren , dass Sie die deli treffen gehen kann , bevor alle die ganze nimmt Truthahn Schinken was auch immer. Sie haben jedoch nur Ihr Telefon dabei, und das Codieren langer Programme ist ein echtes Problem - Sie müssen also Ihre Ninja- Fähigkeiten unter Beweis stellen.

Herausforderung

Stellen wir uns das Lebensmittelgeschäft in einem zweidimensionalen Raster vor. Hier ist ein Mustergitter zum Zerlegen:

                             e
                             s
                             s
                             s
                               Y

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

Das Raster beginnt mit einem e, das eine "Steckdose" für den Rest des Geschäfts darstellt. Jede Generation, alle Verkaufsstellen im Raster, bringt einen Käufer ( s) direkt darunter hervor. Die Käufer bewegen sich jede Generation nach unten, bis sie Sie erreichen ( Y). Wenn ein Käufer dieselbe Reihe wie Sie erreicht, müssen Sie den Käufer an den Anfang der Zeile mit der geringsten Anzahl von Käufern teleportieren. Ein Käufer bewegt sich sofort zu der Linie, wenn er mit in die Reihe ziehen würde Y, es gibt keine Generation dazwischen. Die Zeilen werden durch das #s dargestellt - die Spalte nach dem #s ist eine Zeile. Die Käufer gehen bis zum Ende der Linie (dargestellt durch einen Ausgang x) und verwandeln sich dann in eine Zufallszahl zwischen 1und5. In jeder Generation müssen Sie die Anzahl der Käufer verringern 1- wenn ein Käufer sie erreicht 0, sind sie mit dem Auschecken fertig und verlassen den Laden.

Wenn Sie ein solches Raster eingegeben haben, geben Sie die nächste Generation des Lebensmittelladens aus (bewegen Sie alle Käufer gleichzeitig nach unten, leiten Sie die Käufer weiter und lassen Sie sie gehen, wenn sie fertig sind).

Proben

Eingang:

                e

                     Y


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

Ausgabe:

                e
                s 
                     Y


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

Eingang:

                e
                s 
                     Y


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

Ausgabe

                e
                s 
                     Y


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

Eingang:

                e

                     Y


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

(Mögliche) Ausgabe:

                e
                s 
                     Y


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

Eingang:

                e
                s 
                     Y


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

Ausgabe:

                e
                s 
                     Y


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

Eingang:

                e

                     Y


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

Ausgabe:

                e
                s 
                     Y


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

Das ist , also gewinnt der kürzeste Code.

ein Spaghetto
quelle
1
Ich verstehe das Eingabeformat wirklich nicht.
Fund Monica Klage
@QPaysTaxes Input kann entweder eine mehrzeilige Zeichenfolge oder ein Array von einzeiligen Zeichenfolgen sein, wie in unseren Standardeinstellungen für die Erfassung mehrerer Eingabezeilen festgelegt.
ein Spaghetto
Nein, ich meine, ich verstehe die Herausforderung einfach nicht wirklich.
Fund Monica Klage
Anstatt sich auf die Beispiele zu verlassen, kann es sinnvoll sein, ausdrücklich darauf hinzuweisen, dass sich der Käufer niemals in derselben Zeile wie Y befinden kann, da das Abwärtsbewegen in die Y-Zeile und das Teleportieren an die Spitze der entsprechenden Warteschlange in einem einzigen Schritt erfolgen.
Trichoplax
Es wäre auch hilfreich, eine Beschreibung der Bewegung einer Warteschlange am Beispiel eines Testfalls zu haben. Befinden sich in einer Warteschlange 3 Käufer, die vertikal nebeneinander stehen, und der niedrigste kann sich nach unten bewegen, bewegen sich alle 3 gleichzeitig in einem Schritt nach unten oder bewegt sich der verfügbare Platz nacheinander um eine Reihe nach oben, wenn sich jeder Käufer in die Warteschlange begibt?
Trichoplax

Antworten:

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

Probieren Sie es online!

Ich arbeite immer noch am Golfen, aber es löst das Problem im Moment

Post Rock Garf Hunter
quelle
Sie können überschüssige Einrückungen und Zeilenumbrüche entfernen (einzelne Zeilenblöcke können in derselben Zeile wie der Blockanfang stehen)
Solomon Ucko
@SolomonUcko Worüber sprichst du?
Post Rock Garf Hunter
1. Sind Tabs 8 Leerzeichen für Python? 2. Ich denke, Sie können die Zeilenumbrüche nach den letzten 2 for-Schleifen entfernen.
Solomon Ucko
1
1. Tabs sind in Python ihre eigene Sache. 2. Sie können diesen Zeilenumbruch nicht entfernen.
Post Rock Garf Hunter
1. Zählt Python nur die erste Einrückungsstufe in einem Block als Einrückungsstufe für diesen Block? 2. Weißt du warum nicht? Ich habe es getestet und es funktioniert nicht.
Solomon Ucko
4

C ++, 898 896 885 841 Bytes

Sehr lange zu codieren ... aber es ist da

-2 Bytes dank Conor O'Brien
-45 Bytes dank 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;};

Also ... einige Details:

  • Sie müssen ein übergeben std::vector<std::string>(die Größe wird auf die gleiche Länge wie die längste Zeichenfolge geändert).

  • Alle #Startlinien an denselben y-Koordinaten (vertikal) haben dieselbe Länge und enden an denselben y-Koordinaten (vertikal)

  • Angenommen, das Gitter besteht aus mindestens einer #Zeile, einem Buchstaben e(einer Steckdose) oben und einem BuchstabenY

  • Angenommen, die Eingabe ist eine gültige Ausgabe, sodass die Käufer, die auf eine Umleitung warten, immer eine nach der anderen sein werden

Bearbeiten: Gerade in den Kommentaren von Wheat Wizard's Antwort gesehen, dass es mehrere Eingänge unterstützen sollte, werde ich weiter daran arbeiten

HatsuPointerKun
quelle
Vielleicht könntest du das C-Makro machen #define C(e)i[j].find(e)!=string::npos?
Conor O'Brien
Meine Antwort unterstützt mehrere Zugänge als Nebeneffekt, da sie golfen. Quartata sagte, es wäre erforderlich, aber ich sehe es nicht in der Frage, so weit es mich betrifft, steht es Ihnen frei, nur einen einzigen Eingang zu unterstützen.
Post Rock Garf Hunter
@ WheatWizard Nun, wenn ich die Frage lese, heißt es: "Das Raster beginnt mit einem e, das eine Steckdose darstellt" und "alle Steckdosen", so dass es mehrere Eingänge haben kann
HatsuPointerKun
Sie können die Definition von C(e)sein #define C(e)if(i[j].find(e)!=string::nposändern und die Aufrufe entsprechend ändern.
Zacharý
Und da dies length()nur angewendet wird a, können Sie Ldie Definition ändern und a.length()Anrufe entsprechend ändern . Darüber hinaus können Sie die using namespace std;nach unten verschieben, um ein Byte zu sparen, indem Sie die neue Zeile
Zacharý