Przypisywanie miejsc dla samolotów pasażerskich

16

Inspirowany lekcją APL z zeszłego tygodnia .

Biorąc pod uwagę wielkoformatową mapę miejsc 2D i listę klientów 1D, zwróć mapę miejsc i listę klientów, ale zmodyfikowano w następujący sposób (aby wskazać zajętych miejsc i siedzących klientów):

Dla każdej unikalnej litery na wejściowej liście pasażerów należy wpisać małe litery (lub wszystkie, jeśli nie ma ich wystarczająco dużo) na mapie miejsc, przechodząc od lewej do prawej, od góry do dołu.

Przy każdej unikalnej literze na mapie miejsc należy wpisać małe litery (lub wszystkie, jeśli nie ma ich wystarczająco dużo) na liście pasażerów, przechodząc od lewej do prawej.

  1. Mapa siedzenie wejściowy zawiera tylko spacje i wielkie litery ze zbioru { F, B, P, E}, a może być:
    1. podzielone na wiersze podziałami linii
    2. lista ciągów
    3. matryca wielkich liter
    4. w dowolnym innym porównywalnym formacie
  2. Lista klientów wejściowy zawiera tylko wielkie litery ze zbioru { F, B, P, E} i mogą być następujące:
    1. sznurek
    2. lista znaków
    3. w dowolnym innym porównywalnym formacie
  3. Mapa zwróconych miejsc musi być identyczna z mapą wejściową, z wyjątkiem tego, że zero lub więcej liter zostało złożonych na małe litery
  4. Lista zwróconych klientów musi być identyczna z listą wejściową, z tym wyjątkiem, że zero lub więcej liter zostało zagiętych na małe litery
  5. Wiodące i końcowe białe znaki są dozwolone

Przykłady (skrócone wersje samolotów United)

ERJ145

Wprowadzanie mapy miejsc:

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

P  PP
E  EE
E  EE
E  EE

Wprowadzanie listy pasażerów:

FFEEEEEEEEEEEEEEEE

Dane wyjściowe mapy miejsc:

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

P  PP
e  eE
E  EE
E  EE

Dane wyjściowe listy pasażerów:

FFeeeeeeeeeeeeeeee

CRJ700

Wprowadzanie mapy miejsc:

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

PP  PP
EE  EE
EE  EE
EE  EE

Wprowadzanie listy klientów:

FFFFFFFFPPEEEEEEEEEEEEEEEEEEEEE

Dane wyjściowe mapy miejsc:

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

PP  PP
ee  ee
ee  ee
ee  ee

Dane wyjściowe listy klientów:

ffffffFFppeeeeeeeeeeeeeeeeEEEEE

B757

Wprowadzanie mapy miejsc:

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     

Wprowadzanie listy pasażerów:

FEEEEEEEEFEEEFEEEEEEEEFEEFFEEFEFFFEE

Dane wyjściowe mapy miejsc:

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     

Dane wyjściowe listy pasażerów:

feeeeeeeefeeefeeeeeeeefeeffeefefffee

B767

Wprowadzanie mapy miejsc:

 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          

Wprowadzanie listy pasażerów:

PPFEFEEEEEEEBBEEFFPEBPEBBEEFEEEFEEEEEEFPEEEPB

Dane wyjściowe mapy miejsc:

 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          

Dane wyjściowe listy pasażerów:

ppfefeeeeeeebbeeffpebpebbeefeeefeeeeeeFpeeepb
Adám
źródło
3
Dla tych, którzy, podobnie jak ja, zastanawiają się, co oznaczają litery, oto link do odpowiedniej części czatu
JayCe

Odpowiedzi:

5

05AB1E , 22 16 15 bajtów

Zaoszczędzono 6 bajtów dzięki temu , że Nit zauważył, że mapę miejsc można traktować jako ciąg znaków.

svDyå·Fyyl.;s]»

Wypróbuj online!

Wyjaśnienie

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
źródło
1
Mapę siedzenia można wprowadzić jako pojedynczy ciąg znaków z podziałem wiersza, czy nie zaoszczędziłoby to bajtu czy dwóch?
Nit
@Nit: Ach, to naprawdę powinno mnie trochę ocalić. Dzięki :)
Emigna
5

Python 2 , 93 89 84 83 82 78 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako dwa ciągi. Drukuje dwa ciągi


Zapisano

  • -5 bajtów, dzięki Dead Possum
  • -4 bajty, dzięki Lynn
TFeld
źródło
1
s,p=[x.replace(c,c.lower(),c in s)for x in[s,p]]dla 84 bajtów
Dead Possum
1
Pełny program jest nieco krótszy: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 (clang) , 75 68 bajtów

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

Zajmuje dwa char *miejsca (miejsca i pasażerowie), których zawartość jest modyfikowana w miejscu.

Wypróbuj online!

Jestem mniej przyzwyczajony do gry w golfa w C niż w Pythonie, ale to też jest fajne!

*r+=32,*i+=32Byłbym wdzięczny, gdyby ktoś wpadł na pomysł na sztuczkę skracającą tę część. -> Dzięki @Dave za pomoc w golfie więcej bajtów!

eten
źródło
1
ponieważ iir będą takie same, możesz użyć * r = * i + = 32. Możesz także ogolić kilka dodatkowych znaków, pozbywając się i i po zwiększeniu s w wywołaniu strchr.
Dave
Dziękuję, zaktualizuję kiedy będę mógł! Myślałem o bezpośrednim użyciu s, ale z jakiegoś powodu to nie działało, wrócę do tego.
eten
59 bajtów
pułap pułapu
4

C (gcc) , 63 bajty

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

Wypróbuj online!

Ogromne uznanie dla etenu za podstawową koncepcję. Właśnie zastosował ciężką grę w golfa w swojej strategii odpowiedzi.

LambdaBeta
źródło
Zaproponuj index()zamiaststrchr()
ceilingcat
niezła poprawa. Nie dołączę go tutaj, ponieważ jest w pełni przestarzały w POSIX i według mojego doświadczenia jest mniej obsługiwany przez kompilatory. Plus to tylko zmiana 1-bajtowa. (PS: dzięki za wszystkie sugestie ostatnio :) <xkcd.com/541>)
LambdaBeta
Dzięki za kredyt! Ten rodzaj gry w golfa jest moim ulubionym sposobem uczenia się, jak lepiej grać w golfa.
etene,
Tak samo, polecam sprawdzić niektóre komentarze dodane do moich wpisów przez ceilingcat, a także inne ostatnio. Uwielbiam, kiedy wszyscy się od siebie uczymy.
LambdaBeta,
3

C (gcc) , 64 bajty

Pożyczając z odpowiedzi @ etene, usunąłem ifz ?:trzeciorzędnym operatorem i ponownie użyłem wskaźnika pasażera jako własnego indeksu.

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

Wypróbuj online!

ErikF
źródło
2

Scala , 104 bajty

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

Wypróbuj online!

Pobiera 2 sek. Znaków na wejściu i zwraca 2 sek. Znaków.

Wyjaśnienie:

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
źródło
1
Witamy w PPCG!
Giuseppe,
1

Siatkówka , 36 bajtów

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

Wypróbuj online! Zakłada, że ​​lista klientów jest ostatnim wierszem danych wejściowych. Objaśnienie: Znajduje pary pasujących wielkich liter i używa małych liter, $lunikając w ten sposób znaków pośrednich.

Neil
źródło
1

Perl 5 -pF , 48 bajtów

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

Wypróbuj online!

Pierwszy wiersz wprowadzania to lista pasażerów. Wszystkie kolejne linie to mapa miejsc. Dane wyjściowe są takie same.

Xcali
źródło