Tetapkan Kursi Pesawat

16

Terinspirasi oleh pelajaran APL minggu lalu .

Diberikan peta kursi 2D besar dan daftar pelanggan 1D, kembalikan peta kursi dan daftar pelanggan tetapi diubah sebagai berikut (untuk menunjukkan kursi yang diduduki dan pelanggan yang duduk):

Untuk setiap huruf unik dalam daftar penumpang input, huruf kecil yang banyak (atau semua, jika tidak cukup) dari surat itu di peta kursi, akan kiri-ke-kanan, atas-ke-bawah.

Untuk setiap huruf unik di peta tempat duduk, huruf kecil yang banyak (atau semua, jika tidak cukup) dari surat itu dalam daftar penumpang, ke kiri-ke-kanan.

  1. Peta kursi masukan hanya berisi spasi dan huruf besar dari set { F, B, P, E}, dan mungkin:
    1. dipisahkan menjadi baris demi baris
    2. daftar string
    3. matriks karakter huruf besar
    4. dalam format lain yang sebanding
  2. Input daftar pelanggan hanya berisi huruf besar dari set { F, B, P, E} dan mungkin:
    1. Sebuah benang
    2. daftar karakter
    3. dalam format lain yang sebanding
  3. Peta kursi yang dikembalikan harus identik dengan yang dimasukkan, kecuali nol atau lebih huruf yang dilipat menjadi huruf kecil
  4. Daftar pelanggan yang dikembalikan harus identik dengan yang dimasukkan, kecuali bahwa nol atau lebih huruf telah dilipat menjadi huruf kecil
  5. Ruang putih terkemuka dan tertinggal diizinkan

Contoh (edisi singkat dari pesawat United)

ERJ145

Input peta kursi:

P    
E    
E  PP
E  EE
E  EE
E  EE
E  EE

P  PP
E  EE
E  EE
E  EE

Input daftar penumpang:

FFEEEEEEEEEEEEEEEE

Output peta kursi:

P    
e    
e  PP
e  ee
e  ee
e  ee
e  ee

P  PP
e  eE
E  EE
E  EE

Output daftar penumpang:

FFeeeeeeeeeeeeeeee

CRJ700

Input peta kursi:

F   FF
F   FF
PP  PP
PP  PP
PP  PP
EE  EE

PP  PP
EE  EE
EE  EE
EE  EE

Input daftar pelanggan:

FFFFFFFFPPEEEEEEEEEEEEEEEEEEEEE

Output peta kursi:

f   ff
f   ff
pp  PP
PP  PP
PP  PP
ee  ee

PP  PP
ee  ee
ee  ee
ee  ee

Output daftar pelanggan:

ffffffFFppeeeeeeeeeeeeeeeeEEEEE

B757

Input peta kursi:

F F  F F
F F  F F
F F  F F

PPP     
PPP  PPP
PPP  PPP
PPP  PPP
EEE  EEE
EEE  EEE
PPP  PPP
EEE  EEE
EEE  EEE
     EEE

EEE  EEE
EEE  EEE
EEE  EEE
EEE     

Input daftar penumpang:

FEEEEEEEEFEEEFEEEEEEEEFEEFFEEFEFFFEE

Output peta kursi:

f f  f f
f f  f f
f f  F F

PPP     
PPP  PPP
PPP  PPP
PPP  PPP
eee  eee
eee  eee
PPP  PPP
eee  eee
eee  eee
     eeE

EEE  EEE
EEE  EEE
EEE  EEE
EEE     

Output daftar penumpang:

feeeeeeeefeeefeeeeeeeefeeffeefefffee

B767

Input peta kursi:

 F   F   F           
 F   F   F           
BB  B B  BB          
BB  B B  BB          
BB  B B  BB          
PP       BB          
PP                   

PP  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  EEE  PP          
EE  EEE  EE          
EE  EEE  EE          
EE  EEE  EE          
EE  EEE  EE          
EE  EEE  EE          

Input daftar penumpang:

PPFEFEEEEEEEBBEEFFPEBPEBBEEFEEEFEEEEEEFPEEEPB

Output peta kursi:

 f   f   f           
 f   f   f           
bb  b b  bb          
BB  B B  BB          
BB  B B  BB          
pp       BB          
pp                   

pp  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  PPP  PP          
PP  eee  PP          
ee  eee  ee          
ee  eee  ee          
ee  eee  ee          
ee  EEE  EE          
EE  EEE  EE          

Output daftar penumpang:

ppfefeeeeeeebbeeffpebpebbeefeeefeeeeeeFpeeepb
Adám
sumber
3
Bagi mereka, seperti saya, bertanya-tanya apa arti surat-surat itu, inilah tautan ke bagian obrolan yang
relevan

Jawaban:

5

05AB1E , 22 16 15 byte

Disimpan 6 byte berkat Nit memperhatikan bahwa peta kursi dapat diambil sebagai string.

svDyå·Fyyl.;s]»

Cobalah online!

Penjelasan

s                     # setup stack as <passengerlist>,<seatmap>,<passengerlist>
 v                    # for each passenger y
  Dyå                 # does a corresponding seat exist?
     ·F               # multiplied by 2 times do:
       yyl.;          # replace the first y with a lowercase y
            s         # and swap the seatmap and passengerlist on the stack
             ]        # end loops
              »       # join seatmap and passengerlist on newline and output
Emigna
sumber
1
Seatmap dapat dimasukkan sebagai string tunggal dengan jeda baris, bukankah itu menghemat satu atau dua byte?
Nit
@Nit: Ah, itu memang seharusnya menyelamatkan saya. Terima kasih :)
Emigna
5

Python 2 , 93 89 84 83 82 78 byte

l=input()
for c in l[1]:l=[x.replace(c,c.lower(),c in l[0])for x in l]
print l

Cobalah online!

Mengambil input sebagai dua string. Mencetak dua string


Diselamatkan

  • -5 byte, terima kasih kepada Dead Possum
  • -4 byte, terima kasih untuk Lynn
TFeld
sumber
1
s,p=[x.replace(c,c.lower(),c in s)for x in[s,p]]untuk 84 byte
Dead Possum
1
Program lengkap sedikit lebih pendek:l=input() for c in l[1]:l=[x.replace(c,c.lower(),c in l[0])for x in l] print l
Lynn
5

C (dentang) , 75 68 byte

f(char*s,char*p){char*r;while(*s){if(r=strchr(p,*s))*r=*s+=32;s++;}}

Membawa dua char *(kursi & penumpang) yang isinya dimodifikasi di tempat.

Cobalah online!

Saya kurang terbiasa bermain golf di C daripada di Python, tapi itu menyenangkan juga!

Jika ada yang punya ide untuk memperpendek *r+=32,*i+=32bagian saya akan berterima kasih. -> Terima kasih kepada @Dave untuk membantu saya bermain golf lebih banyak byte!

etene
sumber
1
karena i dan r akan sama, Anda dapat menggunakan * r = * i + = 32. Anda juga dapat mencukur beberapa karakter lagi dengan menyingkirkan saya, dan menambahkan setelahnya dalam panggilan strchr.
Dave
Terima kasih, saya akan memperbarui kapan saya bisa! Saya berpikir tentang menggunakan s secara langsung tetapi itu tidak berhasil karena suatu alasan, saya akan kembali ke sana.
etene
59 byte
ceilingcat
4

C (gcc) , 63 byte

f(x,y,z)char*x,*y,*z;{for(;*y;++y)if(z=strchr(x,*y))*z=*y+=32;}

Cobalah online!

Banyak kredit untuk etene untuk konsep dasar. Hanya menerapkan golf berat pada strategi jawabannya.

LambdaBeta
sumber
Sarankan index()alih-alihstrchr()
ceilingcat
perbaikan yang bagus. Saya tidak akan memasukkannya di sini karena sepenuhnya ditinggalkan dalam POSIX dan dalam pengalaman saya kurang didukung oleh kompiler. Ditambah hanya 1 byte perubahannya. (PS: terima kasih atas semua saran baru-baru ini :) <xkcd.com/541>)
LambdaBeta
Terima kasih atas kreditnya! Bermain golf seperti ini adalah cara favorit saya untuk belajar bermain golf dengan lebih baik.
etene
Sama, saya akan merekomendasikan memeriksa beberapa komentar yang dibuat pada posting saya dengan ceilingcat dan juga yang lainnya baru-baru ini. Saya suka ketika kita semua belajar dari satu sama lain.
LambdaBeta
3

C (gcc) , 64 byte

Meminjam dari jawaban @ etene, saya menghapusnya ifdengan ?:operator tersier dan menggunakan kembali penunjuk penumpang sebagai indeksnya sendiri.

f(s,p,j)char*s,*p,*j;{for(;*p;p++)(j=strchr(s,*p))?*j=*p|=32:0;}

Cobalah online!

ErikF
sumber
2

Jelly , 19 byte

,ṚŒlẹЀḣ"ċЀ`}Ẏʋ¦/€

Cobalah online!

Erik the Outgolfer
sumber
2

Scala , 104 byte

def f(l:Array[Char]*)=(l(0).map(? =>{val i=l(1)indexOf?;if(i>=0){l(1)(i)= ?toLower;l(1)(i)}else?}),l(1))

Cobalah online!

Mengambil 2 seq karakter dalam input dan mengembalikan 2 seq karakter.

Penjelasan:

def f(l: Array[Char]*) =          // input are varargs of Array[Char]; in our case 2 arrays. Arrays are chosen since mutable (the seatmap will be updated while the passenger list is mapped)
  (                               // we return a tuple with the 2 arrays of Chars
    l(0).map(                     // l(0) is the passenger list. We map (transform) each element of this list to lowercase or not and this is what's returned as 1st part of the tuple
      ? => {                      // ? is the current element of the passenger list being mapped (it's ? and not let's say m in order to be able to stick it next to functions)
        val i = l(1) indexOf ?   // i is the index (or -1) of the letter ? in the seat map
        if (i >= 0) {             // if index found
          l(1)(i) = ? toLower     // then we update the seatmap with the lower case version of this seat
          l(1)(i)                 // and the passenger list elmt is mapped to its lower case version (same as ?.toLower)
        }                         //
        else ?                    // if not found, the seatmap is not updated and the passenger list elmt stays in upper case
      }                           //
    ),                            // 
    l(1)                          // the updated seat map
  )
Xavier Guihot
sumber
1
Selamat datang di PPCG!
Giuseppe
1

Retina , 36 byte

+`(([A-Z])(.*¶)+.*?)(\2.*$)
$l$1$l$4

Cobalah online! Mengasumsikan daftar pelanggan adalah baris terakhir dari input. Penjelasan: Menemukan pasangan karakter huruf besar yang cocok dan $lmenurunkannya menggunakan sehingga menghindari karakter menengah.

Neil
sumber
1

Perl 5 -pF , 48 byte

$\=join'',<>;say map$\=~s/$_/lc$_/e&&lc||$_,@F}{

Cobalah online!

Input baris pertama adalah daftar penumpang. Semua baris berikutnya adalah peta tempat duduk. Outputnya sama.

Xcali
sumber