食料品店のマイクロ管理


14

あなたはヒップな新しい食料品店Half Foodsの従業員であり、感謝祭の クリスマスイースターの前日です。食料品を手に入れるために急いでいる顧客で店がいっぱいになるので、店は皆を適切な行に送るために交通マネージャーを必要とします。怠zyなので、これを自動化して、すべての七面鳥の ハムを食べる前にデリにぶつかることができます。ただし、携帯電話だけを持っているので、長いプログラムをコーディングするのは非常に苦痛です。そのため、忍者スキルを打ち破る必要があります。

チャレンジ

食料品店を2次元のグリッドで視覚化します。分析するサンプルグリッドを次に示します。

                             e
                             s
                             s
                             s
                               Y

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

グリッドはから始まりe、ストアの残りの部分への「アウトレット」を表します。世代ごとに、グリッド内のすべてのアウトレットは、s真下に買い物客()を生成します。買い物客はあなたに届くまで世代ごとに下降します(Y)。買い物客があなたと同じ列に到達したら、買い物客が最も少ない行の先頭に買い物客をテレポートする必要があります。買い物客は、で行に移動するとすぐに行に移動し、Y間に世代はありません。行は#sで表されます。sの後の列#は行です。買い物客は、(出口で表される行の最後まで行くx)、その後間の乱数に変わる15。世代ごとに、番号の付いた買い物客を減らす必要があります1-買い物客が到着すると0、彼らはチェックアウトを済ませ、店を出ます。

このようなグリッドの入力が与えられたら、次世代の食料品店を出力します(すべての買い物客を同時に下に移動し、買い物客をリダイレクトし、終わったら退場させます)。

サンプル

入力:

                e

                     Y


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

出力:

                e
                s 
                     Y


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

入力:

                e
                s 
                     Y


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

出力

                e
                s 
                     Y


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

入力:

                e

                     Y


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

(可能)出力:

                e
                s 
                     Y


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

入力:

                e
                s 
                     Y


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

出力:

                e
                s 
                     Y


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

入力:

                e

                     Y


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

出力:

                e
                s 
                     Y


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

これはなので、最短のコードが優先されます。


1
入力形式が本当にわかりません。
ファンドモニカの訴訟

@QPaysTaxes入力は、複数行の入力を取得するためのデフォルトに従って、複数行の文字列または単一行の文字列の配列のいずれかです。
spaghetto

いいえ、私は本当に挑戦を受けられないということです。
基金モニカの訴訟

例に頼るのではなく、買い物客がYと同じ列にいることは決してないことを明示的に述べる価値があるかもしれません.Y列に下がって関連するキューの最上部にテレポートされるのは1ステップで行われるからです。
-trichoplax

また、テストケースを例に、キューの移動方法を説明しておくと役立ちます。キュー内に3人の買い物客が垂直に隣接していて、一番下の買い物客が下に移動できる場合、3人全員が1ステップで一緒に下に移動しますか?
-trichoplax

回答:


4

パイソン2477 463 453 449 423 402の 397 396 393バイト

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

オンラインでお試しください!

まだこれをゴルフに取り組んでいますが、今のところ問題を解決します


余分なインデントと改行を削除できます(単一行ブロックは、ブロックの開始と同じ行に移動できます)
ソロモンUcko

@SolomonUckoどこで話しているの?
ポストロックガーフハンター

1.タブ8はPythonにスペースですか?2.最後の2つのforループの後の改行を削除できると思います。
ソロモンウッコ

1
1. Pythonではタブは独自のものです。2.その改行を削除することはできません。
ポストロックガーフハンター

1. Pythonは、ブロック内の最初のインデントレベルをそのブロックのインデントレベルとしてカウントしますか?2. なぜそうなのか知っいますか?私はそれをテストしましたが、動作しません。
ソロモンウッコ

4

C ++、898の 896 885 841バイト

コーディングに非常に長い...しかしそれはそこにある

Conor O'Brienのおかげで-2バイト
-Zacharýのおかげで-45バイト

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

だから...いくつかの詳細:

  • を渡すstd::vector<std::string>必要があります(最長の文字列と同じ長さにサイズ変更されます)

  • のすべての行は#同じy(垂直)座標で始まり、同じ長さで、同じy(垂直)座標で終わります

  • グリッドには少なくとも1 #行以上、e上部に1 つの文字(1つのアウトレット)、1つの文字があると仮定しますY

  • 入力は有効な出力であるため、リダイレクトされるのを待っている買い物客は常に次々といると仮定します

編集:小麦ウィザードの回答のコメントで、複数の入り口をサポートする必要があると見ただけで、私はその作業を続けます


たぶんあなたはそのCマクロを作ることができます#define C(e)i[j].find(e)!=string::nposか?
コナーオブライエン

私の答えは、ゴルフのような副作用として、複数の入り口をサポートしています。Quartataはそれが必要だと言ったが、質問にはそれが表示されていないので、私が懸念している限り、あなたは1つの入り口のみを自由にサポートできます。
ポストロックガーフハンター

@WheatWizardさて、質問を読むと、「グリッドはアウトレットを表すeで始まります」と「すべてのアウトレット」であるため、複数の入り口を持つことができることを示唆しています
-HatsuPointerKun

あなたは、の定義は変更することができC(e)なければ#define C(e)if(i[j].find(e)!=string::npos、それに応じて通話を変更します。
ザカリー

以来とlength()のみに適用されa、あなたが変更できるLように定義されるようにa.length()それに応じて呼び出しを修正します、。また、あなたが移動することができusing namespace std;、改行を削除することでバイトを保存し、下へ
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.