Призначте сидіння літаків


16

Натхненний уроком APL минулого тижня .

З урахуванням великої великої 2D карти сидінь та 1D-списку клієнтів поверніть карту сидінь та список клієнтів, але змінені так:

Для кожної унікальної літери в списку пасажирів введіть малі літери, що багато (або всі, якщо їх не вистачає) цієї букви на карті місця, переходячи зліва направо, зверху вниз.

Для кожної унікальної літери на карті сидіння введіть малі літери, що багато (або всі, якщо їх не вистачає) цього листа в списку пасажирів, переходячи зліва направо.

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

Приклади (скорочені видання літаків United)

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

1
Карту місць можна вводити як одну рядок з розривами рядків, чи не врятує це байт чи два?
Ніт

@Nit: Ах, це дійсно повинно мене врятувати. Дякую :)
Емінья

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 байт, завдяки Dead Possum
  • -4 байти, завдяки Лінні

1
s,p=[x.replace(c,c.lower(),c in s)for x in[s,p]]для 84 байт
Dead Possum

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 *(місця та пасажири), зміст яких змінено на місці.

Спробуйте в Інтернеті!

Я менш звик до гольфу в С, ніж у Python, але це теж весело!

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


1
оскільки i і r будуть однаковими, ви можете використовувати * r = * i + = 32. Ви також можете поголити ще декілька символів, позбувшись i, і післязбільшуючи s у виклику strchr.
Дейв

Дякую, я оновлю, коли зможу! Я думав про використання s безпосередньо, але це чомусь не вийшло, я повернуся до цього.
етен


4

C (gcc) , 63 байти

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

Спробуйте в Інтернеті!

Багато кредитів в етене для основної концепції. Просто застосував важкий гольф до стратегії своєї відповіді.


Запропонувати index()замістьstrchr()
roofcat

приємне поліпшення. Я не включатиму його сюди, оскільки він повністю застарілий у 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;}

Спробуйте в Інтернеті!



2

Скала , 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 seq знаків у вхідних даних і повертає 2 seq символів.

Пояснення:

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таким чином, уникаючи проміжних символів.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.