关于键盘的主题


15

Keep Talking and Nobody Explodes是一款本地多人游戏,其中一个玩家可以控制一个虚拟的“炸弹”,并且必须由另一位可以访问炸弹清除手册的玩家“专家”指导。键盘模块是游戏中需要解除的模块之一,这是我们将在此挑战中处理的模块。

任务

输入将以一行可打印的ASCII字符开始,除了空格(0x21至0x7E)。这些代表您可以看到的键盘按钮。

接下来的几行将代表“键”-只有一行包含第一行的所有字符,而不必按顺序排列。您的任务是按照匹配的按键行的顺序输出键盘字符。

例如,如果输入是

5~Fy
HrD7K!#}
Ui%^fHnF
)Tf;y~I5
~Fi(&5gy
,'Xd#5fZ

然后键盘按钮是5~Fy。只有第4个按键行~Fi(&5gy包含所有这些字符,因此我们按出现的顺序输出键盘字符,即~F5y

规则和澄清

  • 输入必须是单个多行字符串,键盘按钮和按键行应放在单独的行上。
  • 仅有一个按键行,其中包含所有键盘字符。
  • 每行,即初始键盘行和随后的按键行,将没有重复的字符。
  • 与游戏不同,您可能不会假设键盘字符的数量,每条按键线的长度或按键线的数量。但是,保证所有关键线的长度相同。
  • 输出可能包含单个可选的尾随换行符。同样,您可以对输入中的可选尾随换行符采用任意一种方式,但是如果需要,请在答案中指定。
  • 尽管这似乎已经很普遍了,但我将明确指出:只要STDOUT输出正确(如果这是您选择的输出形式),就可以用错误终止此挑战。希望这将使输入的处理更加容易。

测试用例

7
4?j01C3"ch
KP.OG>QB)[
z#)Kn"I2&.
]#,D|sBFy5
Qzj*+~7DLP

输出: 7。只有最后一行包含7

0b~
Ob+hy{M|?;>=dtszPAR5
*8rCfsw|3O9.7Yv^x>Hq
$ip.V@n}|La:TbIt^AOF
jZ[Ec4s0|%b*$id',~J6
z*#b}-x$Ua&!O2;['T+?
NVj_X8rlhxfnS\.z}];c
bykscf.w^dnWj+}-*2g_
VP`AJH|&j5Yqmw/"9IMc

输出0b~。第4个按键行已包含正确顺序的字符。

MTuz
bIAr>1ZUK`s9c[tyO]~W
oMGIi/H&V"BeNLua%El=
j*uYbplT:~);BM|_mPZt
Q}z5TC@=6pgr<[&uJnM%
YOA(F~_nH6T{%B7[\u#5
y&t"8zQn{wo5[Idu4g:?
[0tZG"-fm!]/|nqk,_2h
dA&C.+(byo6{7,?I}D@w

输出zTuM。关键线是第四条,尽管第三条关键线很接近。

o@nj<G1
f]?-<I6h2vS*%l=:}c8>LK5rMdyeon,;sE[@m(73
ibhp+2Hq6yKzIf_Zo}EO3-[*0/e&Fvd]wQU=|%`C
;}>d'cg~CPtQG&%L\)MUl419bkTZ7@]:[*H"RyYj
L^<:zXJ#kj$EFlwN%B`Dd,Cs?]xRZ*K9-uQ.@&f+
i1v'7:90R-l}FMxj`,DTWK+(n32Z4Vs[p@%*eS!d
B|^Ti/ZG$}ufL9*wE[AVt]P7CrX-)2JpD<sYxd6O
ex.$4#KarS^j+'_!B"]H[\83:(DCXUgI*Lct?qAR
^GXQoy*KW&v}n']Em~\N9)fxP(qC=7#4sRdcD6%5
;inr[&$1j_!F~@pzo#blv]}<'|fRds6OW%tEg"G2
e;0T#gfo^+!:xHDN&4V=In?AwhEv$2Fd~ZLz_\81

输出n1j@o<G。关键行是倒数第二行。

计分

这是,因此以最少字节为单位的代码获胜。


STDOUT是唯一可接受的输出方法,还是允许函数返回值?
Zgarb 2015年

@Zgarb函数的输入和输出均正常
Sp3000 2015年

抱歉,我有一个适用于一个测试用例的解决方案...在其他测试用例中有太多转义字符。那好吧。
凯尔·坎诺斯

Answers:


11

CJam,13 12个字节

qN/(f&{,}$W=

在这里测试。

说明

q     e# Read all input.
N/    e# Split into lines.
(     e# Pull off the keypad buttons.
f&    e# Take the set intersection of each key line with the keypad, preserving the order
      e# order in the key line.
{,}$  e# Sort the results by length.
W=    e# Pick the last (longest) one.

8

珀斯10

@zhf!-zT.z

在线尝试

说明

@zhf!-zT.z         ##  z = first line of input, .z = list of rest of lines
   f    .z         ##  Filter .z as T based on
    !-zT           ##  Whether removing all the letters from z that appear in T leaves an
                   ##  Empty string or not (keep the ones that give empty strings)
  h                ##  Take the first such line (necessary indexing, shouldn't ever matter)
@z                 ##  @ is setwise intersection. Pyth implements this by iterating over
                   ##  each element of the second argument and keeping values that appear
                   ##  in the first argument, which gives the intended result

7

Pyth,9个字节

eolN@Lz.z

示范

@Lz.z:过滤所有与第一行相交的线。

olN:按长度排序

e:最长。


3

Haskell,49个字节

g(!)(a:b)=[c|d<-b,all(!d)a,c<-d,c!a]
g elem.lines

第一行定义了一个辅助函数g,第二行中的未命名函数是我的答案。

说明

该算法很明显:将输入分成几行,找到包含第一行所有字符的行,然后过滤掉该行上的所有其他字符。

g(!)(a:b)=                            -- g gets a binary function ! and list of strings a:b
          [c|                         -- and returns the string of characters c where
             d<-b,all(!d)a,           -- d is drawn from b and x!d holds for all x in a,
                           c<-d,c!a]  -- and c is drawn from d and c!a holds.
g elem.lines                          -- The input is split into lines and fed to g elem;
                                      -- then x!d means x `elem` d in the above.

3

序言,204个 190字节

如果不是兼顾多行输入和输入中未转义字符'和'的组合要求,那么这对于Prolog可能是一个不错的挑战。存在很大一部分代码(p和r)来读取文件作为字符要在多行上获取未转义的输入,我必须执行的代码。

如果仅将'作为未转义的字符存在,则我可以将输入读取为字符串。
如果仅将“存在为未转义的字符,则可以将输入读为原子。
如果输入不是多行,请说用空格隔开,我可以将其读为一行代码。

r(I,[H|T]):-read_line_to_codes(I,H),H\=end_of_file,r(I,T).
r(_,[]).
q(_,[]).
q(E,[H|T]):-subset(E,H),intersection(H,E,X),writef("%s",[X]);q(E,T).
p:-open("t",read,I),r(I,[H|T]),q(H,T),!.

它如何运作

  1. 打开文件t(包含所有输入)进行读取
  2. 读取所有行作为字符代码,并放入列表列表(每行1个列表)
  3. 遍历尾部列表并检查头列表是否作为该列表的子集存在
  4. 与头部相交的匹配列表以正确的顺序获取所需字符
  5. 打印解决方案

如何
运行通过以下命令运行程序

包含输入的已命名文件必须位于同一目录中。

编辑:通过与OR统一2个q-子句,节省了14个字节。


2

MATLAB,107字节

b=char(strsplit(char(inputdlg),' '));[~,x]=ismember(b,b(1,:));[~,f]=min(abs(1./sum(~x')-1));b(f,(~~x(f,:)))

这最终是一段很草率的代码...

运行时,将打开一个输入对话框,可在其中粘贴多行字符串(将换行符转换为空格,并且输出将是一个包含1个非常长的字符串的单元格)。我选择将结果单元格转换为char,这使得可以在空格处进行分割(结果是单元格数组),然后再次转换为char以检索所需的形状。在将我们的第一行与其他行进行比较时,MATLAB的内置ismember函数在这里起到了很好的作用。

之后,它变得令人讨厌...我尝试了多种方法从“最佳匹配”检查中排除第一行,并最终得到了结果。我们寻找该行,然后使用此信息来获取我们想要我们的输出字符使用的索引(通过将ismember输出转换为逻辑)。


2

Wolfram语言106字节

c=Characters[InputString[]~StringSplit~"\n"];o=c[[1]];t=Select;t[t[Rest@c,#~SubsetQ~o&][[1]],o~MemberQ~#&]

输入示例:

输入弹出

输出:

输出结果

代码说明:首先使用InputString获得输入的完整字符串,然后通过用换行符分割字符串并将第一个字母的所有字符保存在变量o中来获取第一组字母。接下来,我们从其余输入行中选择那些以第一行字符(保存为变量o)作为子集的行。然后,选择该行,我们将获取原始集中该行的成员。

编辑:感谢MartinBüttner提供的使用中缀符号的提示和我不必要的变量


是的,Mathematica。一些高尔夫球提示:据我可以告诉你使用c,并i只有一次,所以没有益处将其分配给变量。您可能可以从此技巧中保存一些字节。不给o名字。s[[1]]#&@@s(与您第二次使用相同[[1]])。您可以StringSplit不使用第二个参数(因为默认情况下会在空白处分割)。SubsetQ并且MemberQ可以使用中缀表示法来保存字节,例如#~SubsetQ~o
Martin Ender 2015年

我改变了它的一些,当我改变了它,我只用没注意ic一次,谢谢你的提示!另外,我需要将第二个参数设置为StringSplit,因为有些奇怪的现象使得某些字符被解释为空白(不是真正的空白)
Ian Johnson

有趣。在这种情况下,您仍然可以嵌入文字换行符,而无需编写\n来保存一个字节,并使用中缀表示法来保存另一个字节。
马丁·恩德

是的,不是完全确定在这种情况下StringSplit会发生什么,这实际上可能是使用InputString的结果
Ian Johnson

1

Python 2,112字节

import sys
i=sys.stdin.readlines()
print[''.join(c for c in l if c in i[0])for l in i[1:]if set(i[0])<set(l)][0]

运行示例:Ideone


1

使用Javascript(ES6),107个 104 102字节

支持浏览器的代码段演示。

f=x=>([a]=x.split`
`).map(y=>[...y].filter(z=>~a.indexOf(z)-x).join(x='')).find(z=>z.length==a.length)
<textarea id="i" rows="6" cols="45">o@nj<G1
f]?-<I6h2vS*%l=:}c8>LK5rMdyeon,;sE[@m(73
ibhp+2Hq6yKzIf_Zo}EO3-[*0/e&Fvd]wQU=|%`C
;}>d'cg~CPtQG&%L\)MUl419bkTZ7@]:[*H"RyYj
L^<:zXJ#kj$EFlwN%B`Dd,Cs?]xRZ*K9-uQ.@&f+
i1v'7:90R-l}FMxj`,DTWK+(n32Z4Vs[p@%*eS!d
B|^Ti/ZG$}ufL9*wE[AVt]P7CrX-)2JpD<sYxd6O
ex.$4#KarS^j+'_!B"]H[\83:(DCXUgI*Lct?qAR
^GXQoy*KW&v}n']Em~\N9)fxP(qC=7#4sRdcD6%5
;inr[&$1j_!F~@pzo#blv]}<'|fRds6OW%tEg"G2
e;0T#gfo^+!:xHDN&4V=In?AwhEv$2Fd~ZLz_\81</textarea><br /><input type="button" onclick="o.value=f(i.value)" value="Run"> Output: <input type="text" id="o" readonly />

评论:

f=x=>
([a]=x.split('\n')) // split input by newlines, assign first value to a
.map(y=> // map function to each line
    [...y].filter(z=> // filter characters
        ~a.indexOf(z)-x // a has character z and not the first item (x is still set)
    ).join(x='') // join characters with empty string, reset x flag
).find(z=>z.length==a.length) // return string with same length as a
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.