Назначить места авиалайнера

16

Вдохновленный уроком APL на прошлой неделе .

С учетом двухмерной карты мест в верхнем регистре и списка клиентов 1D верните карту мест и список клиентов, но измените их следующим образом (чтобы указать занятые места и клиентов, сидящих):

Для каждой уникальной буквы во входном списке пассажиров строчные буквы (или все, если их недостаточно) этой буквы на карте сидений идут слева направо, сверху вниз.

Для каждой уникальной буквы на карте мест строчные буквы (или все, если их недостаточно) этой буквы в списке пассажиров (слева направо).

  1. Карта ввода сиденье содержит только пробелы и прописные буквы из множества { F, B, P, E}, и может быть:
    1. разделены на строки переносом строк
    2. список строк
    3. матрица заглавных букв
    4. в любом другом сопоставимом формате
  2. Список клиентов входа содержит только заглавные буквы из множества { F, B, P, E} и может быть:
    1. строка
    2. список персонажей
    3. в любом другом сопоставимом формате
  3. Возвращенная карта мест должна быть идентична входной, за исключением того, что ноль или более букв были согнуты в нижний регистр
  4. Возвращенный список клиентов должен быть идентичен входному, за исключением того, что ноль или более букв были согнуты в нижний регистр
  5. Лидирующие и конечные пробелы разрешены

Примеры (укороченные издания самолетов Юнайтед)

ERJ145

Ввод карты мест:

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

P  PP
E  EE
E  EE
E  EE

Ввод списка пассажиров:

FFEEEEEEEEEEEEEEEE

Выходная карта:

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

P  PP
e  eE
E  EE
E  EE

Вывод списка пассажиров:

FFeeeeeeeeeeeeeeee

CRJ700

Ввод карты мест:

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

PP  PP
EE  EE
EE  EE
EE  EE

Ввод списка клиентов:

FFFFFFFFPPEEEEEEEEEEEEEEEEEEEEE

Выходная карта:

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

PP  PP
ee  ee
ee  ee
ee  ee

Вывод списка клиентов:

ffffffFFppeeeeeeeeeeeeeeeeEEEEE

B757

Ввод карты мест:

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     

Ввод списка пассажиров:

FEEEEEEEEFEEEFEEEEEEEEFEEFFEEFEFFFEE

Выходная карта:

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     

Вывод списка пассажиров:

feeeeeeeefeeefeeeeeeeefeeffeefefffee

B767

Ввод карты мест:

 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          

Ввод списка пассажиров:

PPFEFEEEEEEEBBEEFFPEBPEBBEEFEEEFEEEEEEFPEEEPB

Выходная карта:

 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          

Вывод списка пассажиров:

ppfefeeeeeeebbeeffpebpebbeefeeefeeeeeeFpeeepb
Адам
источник
3
Для тех, кто, как и я, задается вопросом, что означают буквы, вот ссылка на соответствующую часть чата
JayCe

Ответы:

5

05AB1E , 22 16 15 байт

Сохранено 6 байтов благодаря Nit, который заметил, что карту мест можно считать строкой.

svDyå·Fyyl.;s]»

Попробуйте онлайн!

объяснение

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
источник
1
Карта мест может быть введена как одна строка с разрывами строк, разве это не сэкономит вам байт или два?
Ночь
@Nit: Ах, это действительно должно спасти меня. Спасибо :)
Emigna
5

Python 2 , 93 89 84 83 82 78 байт

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

Попробуйте онлайн!

Принимает ввод в виде двух строк. Печатает две строки


Сохраненный

  • -5 байт, благодаря мертвому опоссуму
  • -4 байта, благодаря Линн
TFeld
источник
1
s,p=[x.replace(c,c.lower(),c in s)for x in[s,p]]для 84 байтов
Мертвый Опоссум
1
Полная программа немного короче:l=input() for c in l[1]:l=[x.replace(c,c.lower(),c in l[0])for x in l] print l
Линн
5

C (лязг) , 75 68 байт

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

Занимает два char *(места и пассажиры), чье содержимое изменяется на месте.

Попробуйте онлайн!

Я менее привык играть в гольф на C, чем на Python, но это тоже весело!

Если у кого-нибудь есть идея, как укоротить *r+=32,*i+=32часть, я был бы благодарен. -> Спасибо @Dave за помощь в игре еще в байтах!

etene
источник
1
Поскольку i и r будут одинаковыми, вы можете использовать * r = * i + = 32. Вы также можете сбрить еще несколько символов, избавившись от i и после увеличения s в вызове strchr.
Дейв,
Спасибо, я обновлю, когда смогу! Я думал об использовании s напрямую, но по какой-то причине это не сработало, я к этому вернусь.
февраля
59 байт
потолочная кошка
4

C (gcc) , 63 байта

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

Попробуйте онлайн!

Большое спасибо Etene за основную концепцию. Просто применил тяжелый гольф к стратегии своего ответа.

LambdaBeta
источник
Предлагаю index()вместоstrchr()
ceilingcat
приятное улучшение. Я не буду включать это здесь, потому что это полностью устарело в POSIX и по моему опыту менее поддерживается компиляторами. Плюс только 1 изменение байта. (PS: спасибо за все предложения недавно :) <xkcd.com/541>)
LambdaBeta
Спасибо за кредит! Этот вид игры в гольф - мой любимый способ научиться играть в гольф лучше.
сентября
То же самое, я бы порекомендовал проверить некоторые комментарии, сделанные на мои посты потолком, а также другие в последнее время. Я люблю, когда мы все учимся друг у друга.
LambdaBeta
3

C (gcc) , 64 байта

Заимствуя ответ @ etene, я удалил ifс ?:третичным оператором и повторно указатель пассажирского как свой собственным индекс.

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

Попробуйте онлайн!

ErikF
источник
2

Scala , 104 байта

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

Попробуйте онлайн!

Принимает 2 последовательности символов на входе и возвращает 2 последовательности символов.

Объяснение:

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
  )
Ксавье Гихот
источник
1
Добро пожаловать в PPCG!
Джузеппе
1

Сетчатка , 36 байт

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

Попробуйте онлайн! Предполагается, что список клиентов является последней строкой ввода. Объяснение: Находит пары совпадающих заглавных символов и использует их в нижнем регистре, $lизбегая тем самым промежуточных символов.

Нил
источник
1

Perl 5 -pF , 48 байт

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

Попробуйте онлайн!

Первая строка ввода - это список пассажиров. Все последующие строки являются картой мест. Выход такой же.

Xcali
источник