分配客机座位


16

受到上周APL课程的启发。

给定一个大写的2D座位图和一维客户列表,返回座位图和客户列表,但进行如下修改(以指示已占用的座位和就座的客户):

对于输入的乘客列表中的每个唯一字母,将其在座位图中的所有字母(或全部,如果没有足够的话)都小写,从左到右,从上到下。

对于座位图中的每个唯一字母,将乘客列表中该字母中的许多(或全部,如果没有足够的话)小写,从左到右。

  1. 输入座位图只包含空格和大写字母集合{ FBPE},并且可以是:
    1. 通过换行符分成几行
    2. 字符串列表
    3. 大写字母矩阵
    4. 任何其他可比较的格式
  2. 输入客户名单只包含从一组大写字母{ FBPE },可以是:
    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

Answers:


5

05AB1E22 16 15字节

由于Nit注意到座位图可以当作字符串,因此节省了6个字节。

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

@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字节,多亏了Possum
  • -4个字节,感谢Lynn

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
Lynn

5

C(clang)75 68字节

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

char *容纳两个(座位和乘客),其内容就地进行修改。

在线尝试!

与使用Python相比,我不习惯C语言打高尔夫球,但这也很有趣!

如果有人*r+=32,*i+=32想办法缩短零件,我将不胜感激。 ->感谢@Dave帮助我高尔夫了一些字节!


1
由于i和r相同,因此可以使用* r = * i + = 32。您也可以通过删除i和在strchr调用中后递增s来减少一些字符。
戴夫

谢谢,我会在可以的时候更新!我曾考虑过直接使用s,但是由于某些原因而无法使用,我将继续讨论。
etene


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()
ceilingcat '18年

很好的改善。我不会在这里包括它,因为它在POSIX中已被完全弃用,并且根据我的经验,编译器对此的支持较少。加上它只有1个字节的变化。(PS:感谢您最近提出的所有建议:) <xkcd.com/541>)
LambdaBeta

感谢您的功劳!这种外出打高尔夫球是我最喜欢的学习如何更好地打高尔夫球的方式。
etene

一样,我建议您检查一下ceilingcat在我的帖子中以及最近发表的评论。我爱我们彼此学习。
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

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 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将它们小写,从而避免使用中间字符。



1

Perl 5,48 -pF个字节

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

在线尝试!

输入的第一行是乘客列表。所有后续行都是座位图。输出是相同的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.