Manajemen Kelontong Toko Kelontong

14

Anda adalah karyawan di toko kelontong baru, Half Foods, dan ini adalah hari sebelum Paskah Thanksgiving Natal . Karena toko akan penuh dengan pelanggan yang terburu-buru untuk mendapatkan bahan makanan mereka, toko membutuhkan manajer lalu lintas untuk mengirim semua orang ke jalur yang sesuai. Menjadi malas, Anda ingin mengotomatisasi ini sehingga Anda dapat pergi ke toko sebelum semua orang mengambil semua kalkun ham apa pun. Namun, yang Anda miliki hanyalah ponsel Anda, dan mengkodekan program-program panjang itu sungguh menyusahkan - jadi Anda harus menghilangkan keterampilan ninja .

Tantangan

Mari kita visualisasikan toko kelontong di grid dua dimensi. Berikut contoh kisi untuk dibedah:

                             e
                             s
                             s
                             s
                               Y

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

Kotak dimulai dengan e, yang mewakili "outlet" ke seluruh toko. Setiap generasi, semua outlet di grid menelurkan pembelanja ( s) langsung di bawah. Pembeli bergerak ke bawah setiap generasi sampai mereka mencapai Anda ( Y). Ketika seorang pembelanja mencapai barisan yang sama dengan Anda, Anda harus memindahkan pembelanja ke bagian awal garis dengan jumlah pembeli yang paling sedikit di dalamnya. Seorang pembelanja segera pindah ke garis ketika mereka akan pindah ke barisan dengan Y, tidak ada generasi di antara keduanya. Garis diwakili oleh #s - kolom setelah #s adalah garis. Pembeli pergi ke ujung garis (diwakili oleh jalan keluar x), dan kemudian berubah menjadi angka acak antara 1dan5. Setiap generasi, Anda harus mengurangi pembelanja bernomor oleh 1- ketika pembelanja akan mencapai 0, mereka selesai memeriksa dan mereka meninggalkan toko.

Diberikan masukan dari kisi-kisi seperti ini, output generasi berikutnya dari toko kelontong (pindahkan semua pembeli ke bawah secara bersamaan, redirect pembeli, dan minta mereka pergi jika sudah selesai).

Sampel

Memasukkan:

                e

                     Y


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

Keluaran:

                e
                s 
                     Y


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

Memasukkan:

                e
                s 
                     Y


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

Keluaran

                e
                s 
                     Y


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

Memasukkan:

                e

                     Y


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

(Kemungkinan) Output:

                e
                s 
                     Y


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

Memasukkan:

                e
                s 
                     Y


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

Keluaran:

                e
                s 
                     Y


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

Memasukkan:

                e

                     Y


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

Keluaran:

                e
                s 
                     Y


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

Ini , jadi kode terpendek menang.

sebuah spaghetto
sumber
1
Saya benar-benar tidak mendapatkan format input.
Dana Gugatan Monica
@QPaysTaxes Input dapat berupa string multi-baris atau larik string baris tunggal sesuai standar kami untuk mengambil beberapa baris input.
spaghetto
Tidak, maksudku aku hanya tidak mendapat tantangan, sungguh.
Dana Gugatan Monica
Daripada mengandalkan contoh-contoh, mungkin layak menyatakan secara eksplisit bahwa pembelanja tidak akan pernah berada pada baris yang sama dengan Y, karena bergerak turun ke baris Y dan dipindahkan ke bagian atas antrian yang relevan terjadi dalam satu langkah.
trichoplax
Ini juga akan membantu untuk memiliki deskripsi tentang bagaimana antrian bergerak, dengan contoh kasus sebagai contoh. Jika ada 3 pembeli yang berdekatan secara vertikal dalam antrian, dan yang terendah dapat bergerak ke bawah, apakah semua 3 bergerak turun bersama dalam satu langkah atau apakah ruang yang tersedia naik satu baris pada satu waktu ketika setiap pembelanja pindah ke dalamnya?
trichoplax

Jawaban:

4

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

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

Cobalah online!

Masih bekerja untuk bermain golf ini tetapi ini memecahkan masalah untuk saat ini

Posting Rock Garf Hunter
sumber
Anda dapat menghapus lekukan berlebih dan jeda baris (blok garis tunggal dapat berjalan pada baris yang sama dengan awal blok)
Solomon Ucko
@SolomonUcko Di mana Anda berbicara tentang?
Posting Rock Garf Hunter
1. Apakah tab 8 spasi ke python? 2. Saya pikir Anda dapat menghapus jeda baris setelah 2 terakhir untuk loop.
Solomon Ucko
1
1. Tab adalah hal mereka sendiri dalam Python. 2. Anda tidak dapat menghapus jeda baris itu.
Post Rock Garf Hunter
1. Apakah python hanya menghitung level indentasi pertama dalam sebuah blok sebagai level indentasi untuk blok itu? 2. Apakah Anda tahu mengapa tidak? Saya mengujinya dan tidak berhasil.
Solomon Ucko
4

C ++, 898 896 885 841 byte

Sangat panjang untuk dikodekan ... tetapi ada di sana

-2 byte terima kasih kepada Conor O'Brien
-45 byte terima kasih kepada 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;};

Jadi ... beberapa detail:

  • Anda harus melewati std::vector<std::string>(mereka akan diubah ukurannya pada panjang yang sama dengan string terpanjang)

  • Semua garis #dimulai pada koordinat y (vertikal) yang sama, memiliki panjang yang sama, dan berakhir pada koordinat y (vertikal) yang sama

  • Asumsikan bahwa grid memiliki setidaknya 1 #baris atau lebih, punya satu huruf e(satu outlet) di bagian atas, satu hurufY

  • Asumsikan bahwa input adalah output yang valid sehingga pembeli yang menunggu untuk dialihkan akan selalu satu per satu

Sunting: Baru saja melihat di komentar jawaban Wheat Wizard bahwa itu harus mendukung beberapa pintu masuk, saya akan terus bekerja pada itu

HatsuPointerKun
sumber
Mungkin Anda bisa membuat makro C menjadi #define C(e)i[j].find(e)!=string::npos?
Conor O'Brien
Jawaban saya mendukung beberapa pintu masuk sebagai efek samping, karena bersifat golf. Quartata mengatakan akan diperlukan, tetapi saya tidak melihatnya dalam pertanyaan, sejauh yang saya ketahui Anda bebas hanya mendukung satu pintu masuk.
Post Rock Garf Hunter
@WheatWizard Nah, jika saya membaca pertanyaan, dikatakan: "Kotak dimulai dengan e, yang mewakili outlet" dan "semua outlet", sehingga menyarankannya dapat memiliki beberapa pintu masuk
HatsuPointerKun
Anda dapat mengubah definisi C(e)menjadi #define C(e)if(i[j].find(e)!=string::nposdan mengubah panggilan yang sesuai.
Zacharý
Dan sejak itu length() hanya diterapkan pada a, Anda dapat mengubah Luntuk didefinisikan sebagai a.length(), memodifikasi panggilan yang sesuai. Selain itu, Anda dapat memindahkan using namespace std;ke bawah, menghemat satu byte dengan menghapus baris baru
Zacharý