Attribuer des sièges d'avion

16

Inspiré par la leçon APL de la semaine dernière .

Étant donné une carte de siège 2D majuscule et une liste de clients 1D, renvoyez la carte de siège et la liste de clients, mais modifiée comme suit (pour indiquer les sièges occupés et les clients assis):

Pour chaque lettre unique dans la liste des passagers en entrée, mettez en minuscule autant (ou tous, s'il n'y en a pas assez) de cette lettre dans la carte des sièges, en allant de gauche à droite, de haut en bas.

Pour chaque lettre unique sur la carte des sièges, mettez en minuscule autant (ou tous, s'il n'y en a pas assez) de cette lettre dans la liste des passagers, en allant de gauche à droite.

  1. La carte du siège d'entrée ne contient que des espaces et des lettres majuscules de l'ensemble { F, B, P, E}, et peut - être:
    1. séparés en lignes par des sauts de ligne
    2. une liste de chaînes
    3. une matrice de caractères majuscules
    4. dans tout autre format comparable
  2. La liste des clients d'entrée ne contient que des lettres majuscules de l'ensemble { F, B, P, E} et peut être:
    1. un string
    2. une liste de personnages
    3. dans tout autre format comparable
  3. Le plan du siège retourné doit être identique à celui entré, sauf que zéro ou plusieurs lettres ont été pliées en minuscules
  4. La liste de clients retournée doit être identique à celle entrée, sauf que zéro ou plusieurs lettres ont été pliées en minuscules
  5. Les espaces de début et de fin sont autorisés

Exemples (éditions abrégées des avions United)

ERJ145

Saisie de la carte des sièges:

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

P  PP
E  EE
E  EE
E  EE

Saisie de la liste des passagers:

FFEEEEEEEEEEEEEEEE

Sortie de la carte des sièges:

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

P  PP
e  eE
E  EE
E  EE

Sortie de la liste des passagers:

FFeeeeeeeeeeeeeeee

CRJ700

Saisie de la carte des sièges:

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

PP  PP
EE  EE
EE  EE
EE  EE

Saisie de la liste des clients:

FFFFFFFFPPEEEEEEEEEEEEEEEEEEEEE

Sortie de la carte des sièges:

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

PP  PP
ee  ee
ee  ee
ee  ee

Sortie de la liste des clients:

ffffffFFppeeeeeeeeeeeeeeeeEEEEE

B757

Saisie de la carte des sièges:

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     

Saisie de la liste des passagers:

FEEEEEEEEFEEEFEEEEEEEEFEEFFEEFEFFFEE

Sortie de la carte des sièges:

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     

Sortie de la liste des passagers:

feeeeeeeefeeefeeeeeeeefeeffeefefffee

B767

Saisie de la carte des sièges:

 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          

Saisie de la liste des passagers:

PPFEFEEEEEEEBBEEFFPEBPEBBEEFEEEFEEEEEEFPEEEPB

Sortie de la carte des sièges:

 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          

Sortie de la liste des passagers:

ppfefeeeeeeebbeeffpebpebbeefeeefeeeeeeFpeeepb
Adam
la source
3
Pour ceux qui, comme moi, se demandent ce que les lettres signifient, voici un lien vers la partie pertinente du chat
JayCe

Réponses:

5

05AB1E , 22 16 15 octets

6 octets enregistrés grâce à Nit qui a remarqué que la carte des sièges pouvait être considérée comme une chaîne.

svDyå·Fyyl.;s]»

Essayez-le en ligne!

Explication

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
la source
1
Le plan du siège peut être entré comme une seule chaîne avec des sauts de ligne, cela ne vous épargnerait-il pas un octet ou deux?
Nit
@Nit: Ah, cela devrait en effet m'en sauver. Merci :)
Emigna
5

Python 2 , 93 89 84 83 82 78 octets

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

Essayez-le en ligne!

Prend l'entrée en deux chaînes. Imprime deux chaînes


Enregistré

  • -5 octets, grâce à Dead Possum
  • -4 octets, merci à Lynn
TFeld
la source
1
s,p=[x.replace(c,c.lower(),c in s)for x in[s,p]]pour 84 octets
Dead Possum
1
Un programme complet est un peu plus court: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 octets

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

Prend deux char *(sièges et passagers) dont le contenu est modifié sur place.

Essayez-le en ligne!

Je suis moins habitué au golf en C qu'en Python, mais c'est amusant aussi!

Si quelqu'un a une idée d'une astuce pour raccourcir la *r+=32,*i+=32partie, je serais reconnaissant. -> Merci à @Dave de m'avoir aidé à jouer au golf encore plus d'octets!

étène
la source
1
comme i et r seront identiques, vous pouvez utiliser * r = * i + = 32. Vous pouvez également raser quelques caractères supplémentaires en supprimant i et en post-incrémentant s dans l'appel strchr.
Dave
Merci, je mettrai à jour quand je pourrai! J'ai pensé à utiliser s directement mais cela n'a pas fonctionné pour une raison quelconque, je vais y revenir.
etene
59 octets
Plafond
4

C (gcc) , 63 octets

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

Essayez-le en ligne!

Beaucoup de crédit à l'étène pour le concept de base. Je viens d'appliquer le golf lourd à la stratégie de sa réponse.

LambdaBeta
la source
Suggérer à la index()place destrchr()
plafondcat
belle amélioration. Je ne l'inclurai pas ici car il est totalement obsolète dans POSIX et d'après mon expérience, il est moins pris en charge par les compilateurs. De plus, ce n'est qu'un changement de 1 octet. (PS: merci pour toutes les suggestions récemment :) <xkcd.com/541>)
LambdaBeta
Merci pour le crédit! Ce genre de golf à l'extérieur est ma façon préférée d'apprendre à mieux jouer au golf.
etene
De même, je vous recommande de vérifier certains des commentaires faits sur mes messages par plafondcat ainsi que d'autres récemment. J'aime quand nous apprenons tous les uns des autres.
LambdaBeta
3

C (gcc) , 64 octets

Empruntant à la réponse de @ etene, j'ai supprimé le ifavec l' ?:opérateur tertiaire et réutilisé le pointeur passager comme son propre index.

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

Essayez-le en ligne!

ErikF
la source
2

Scala , 104 octets

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

Essayez-le en ligne!

Prend 2 séquences de caractères en entrée et retourne 2 séquences de caractères.

Explication:

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
la source
1
Bienvenue chez PPCG!
Giuseppe
1

Rétine , 36 octets

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

Essayez-le en ligne! Suppose que la liste des clients est la dernière ligne de l'entrée. Explication: Recherche des paires de caractères majuscules correspondants et les minuscules en $lévitant ainsi les caractères intermédiaires.

Neil
la source
1

Perl 5 -pF , 48 octets

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

Essayez-le en ligne!

La première ligne d'entrée est la liste des passagers. Toutes les lignes suivantes sont la carte des sièges. La sortie est la même.

Xcali
la source