Về chủ đề bàn phím


15

Keep Talking and Nobody Explodes là một trò chơi nhiều người chơi địa phương nơi một người chơi có quyền điều khiển một "quả bom" ảo, và phải được hướng dẫn bởi một người chơi khác, "chuyên gia", người có quyền truy cập vào sổ tay chống bom. Một trong những mô-đun được giải giáp trong trò chơi là mô-đun bàn phím, đây là điều chúng tôi sẽ giải quyết trong thử thách này.

Nhiệm vụ

Đầu vào sẽ bắt đầu bằng một dòng ký tự ASCII có thể in được, ngoại trừ khoảng trắng (0x21 đến 0x7E). Chúng đại diện cho các nút bàn phím hiển thị cho bạn.

Một vài dòng tiếp theo sẽ đại diện cho "khóa" - chỉ một dòng sẽ chứa tất cả các ký tự của dòng đầu tiên, không nhất thiết phải theo thứ tự. Nhiệm vụ của bạn là xuất các ký tự bàn phím, theo thứ tự của dòng khóa phù hợp.

Ví dụ: nếu đầu vào là

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

sau đó các nút bàn phím là 5, ~, Fy. Chỉ dòng khóa thứ 4 ~Fi(&5gychứa tất cả các ký tự này, vì vậy chúng tôi xuất các ký tự bàn phím theo thứ tự xuất hiện, nghĩa là ~F5y.

Quy tắc và làm rõ

  • Đầu vào phải là một chuỗi nhiều dòng đơn, với các nút bàn phím và các dòng phím trên các dòng riêng biệt.
  • Sẽ có chính xác một dòng khóa chứa tất cả các ký tự bàn phím.
  • Mỗi dòng, tức là dòng bàn phím ban đầu và các dòng chính sau, sẽ không có ký tự trùng lặp.
  • Không giống như trò chơi, bạn không được thừa nhận bất cứ điều gì về số lượng ký tự bàn phím, độ dài của mỗi dòng phím hoặc số dòng phím. Tuy nhiên, tất cả các dòng chính được đảm bảo có cùng độ dài.
  • Đầu ra có thể chứa một dòng mới tùy chọn duy nhất. Tương tự như vậy, bạn có thể giả sử một trong hai cách về một dòng mới tùy chọn trong đầu vào, nhưng vui lòng chỉ định trong câu trả lời của bạn nếu bạn cần giả định.
  • Mặc dù điều này dường như đã trở thành thông lệ , nhưng tôi sẽ nói rõ: chấm dứt một lỗi là ổn đối với thử thách này, miễn là đầu ra STDOUT là chính xác (nếu đây là hình thức đầu ra bạn chọn). Hy vọng điều này sẽ làm cho việc xử lý đầu vào dễ dàng hơn.

Các trường hợp thử nghiệm

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

Đầu ra : 7 . Chỉ dòng cuối cùng chứa a 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

Đầu ra : 0b~. Dòng khóa thứ 4 đã chứa các ký tự theo đúng thứ tự.

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

Đầu ra : zTuM. Dòng khóa là cái thứ 4, mặc dù dòng khóa thứ 3 là một lỗi gần.

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

Đầu ra : n1j@o<G. Dòng chính là dòng cuối cùng thứ hai.

Chấm điểm

Đây là , vì vậy mã trong ít byte nhất sẽ thắng.


STDOUT là phương thức đầu ra duy nhất được chấp nhận hay giá trị trả về của hàm cũng được cho phép?
Zgarb

@Zgarb Chức năng đầu vào và đầu ra đều ổn
Sp3000

thở dài Tôi có một giải pháp hoạt động cho một trường hợp thử nghiệm ... quá nhiều ký tự thoát trong các trường hợp thử nghiệm khác. Ồ tốt
Kyle Kanos

Câu trả lời:


11

CJam, 13 12 byte

qN/(f&{,}$W=

Kiểm tra nó ở đây.

Giải trình

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

Bình thường, 10

@zhf!-zT.z

Dùng thử trực tuyến

Giải trình

@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

Bình thường, 9 byte

eolN@Lz.z

Trình diễn

@Lz.z: Lọc tất cả các dòng cho giao điểm với dòng đầu tiên.

olN: Sắp xếp theo chiều dài

e: Đi lâu nhất.


3

Haskell, 49 byte

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

Dòng đầu tiên xác định hàm trợ giúp g , hàm không tên trên dòng thứ hai là câu trả lời của tôi.

Giải trình

Thuật toán là một thuật toán rõ ràng: chia đầu vào thành các dòng, tìm dòng chứa tất cả các ký tự của dòng đầu tiên và lọc ra tất cả các ký tự khác trên dòng đó.

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

Prolog, 204 190 byte

Đây có thể là một thử thách thú vị cho Prolog nếu nó không dành cho các yêu cầu kết hợp của đầu vào đa dòng và các ký tự không được giải mã 'và "trong đầu vào. Một đoạn mã lớn (p và r) tồn tại để đọc tệp dưới dạng ký tự mã đó là những gì tôi phải làm để lấy đầu vào không được giải mã trên một số dòng.

Nếu chỉ tồn tại dưới dạng một ký tự không được giải mã, tôi có thể đọc đầu vào dưới dạng một chuỗi.
Nếu chỉ "tồn tại dưới dạng một ký tự không thoát, tôi có thể đọc đầu vào dưới dạng nguyên tử.
Nếu đầu vào không phải là đa dòng, thay vào đó, được phân tách bằng dấu cách, tôi có thể đọc nó dưới dạng một dòng thành mã.

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),!.

Nó hoạt động như thế nào

  1. Mở tệp t (chứa tất cả đầu vào) để đọc
  2. Đọc tất cả các dòng dưới dạng mã ký tự và đặt vào danh sách các danh sách (1 danh sách mỗi hàng)
  3. Truy xuất danh sách đuôi và kiểm tra xem danh sách đầu có tồn tại dưới dạng tập hợp con của danh sách đó không
  4. Giao lộ danh sách trùng khớp với đầu để có được các ký tự mong muốn theo đúng thứ tự
  5. Giải pháp in

Cách chạy
Chương trình được chạy bằng lệnh:
p.
Tập tin được đặt tên t chứa đầu vào phải nằm trong cùng một thư mục.

Chỉnh sửa: Đã lưu 14 byte bằng cách hợp nhất 2 mệnh đề q với OR.


2

MATLAB, 107 byte

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

Điều này cuối cùng đã trở thành một đoạn mã rất cẩu thả ...

Khi được chạy, một hộp thoại đầu vào được mở trong đó có thể dán chuỗi nhiều dòng (dòng mới được chuyển đổi thành khoảng trắng và đầu ra sẽ là một ô có 1 chuỗi rất dài). Tôi đã chọn chuyển đổi ô kết quả thành một char để có thể phân tách tại các khoảng trắng (kết quả là một mảng ô) và sau đó lại chuyển đổi thành char để lấy hình dạng dự định. Tích hợp sẵn của MATLABHàm ismember tích thực hiện công việc tốt ở đây khi so sánh dòng đầu tiên của chúng tôi với các dòng khác.

Sau đó, điều đó thật khó chịu ... Tôi đã thử rất nhiều cách để loại trừ dòng đầu tiên khỏi kiểm tra 'trận đấu hay nhất' của tôi và kết thúc bằng việc này. Chúng tôi tìm kiếm dòng và sau đó sử dụng thông tin này để lấy các chỉ số (bằng cách chuyển đổi đầu ra ismember của chúng tôi thành logic ) mà chúng tôi muốn các ký tự đầu ra của chúng tôi từ đó.


2

Ngôn ngữ Wolfram 106 byte

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

Ví dụ đầu vào:

cửa sổ bật lên đầu vào

Đầu ra:

kết quả đầu ra

Giải thích về mã: Đầu tiên với InputString, chúng tôi nhận được chuỗi đầu vào đầy đủ, sau đó chúng tôi nhận được bộ chữ cái đầu tiên bằng cách chia chuỗi theo dòng mới và lưu tất cả các ký tự của ký tự đầu tiên trong biến o. Tiếp theo, chúng tôi chọn từ phần còn lại của các dòng đầu vào những dòng có ký tự của dòng đầu tiên (được lưu dưới dạng biến o) làm tập hợp con. Sau đó, với dòng được chọn, chúng tôi lấy các thành viên của dòng đó trong bộ ban đầu.

Chỉnh sửa: Cảm ơn Martin Büttner về các mẹo sử dụng ký hiệu infix và các biến không cần thiết của tôi


Yay, Mathicala. Một số gợi ý chơi gôn: Theo như tôi có thể nói với bạn sử dụng cichỉ một lần, vì vậy không có lợi ích gì trong việc gán chúng cho các biến. Bạn có thể có thể lưu một số byte từ mẹo này . Bằng cách không ođặt tên. s[[1]]#&@@s(tương tự cho lần sử dụng thứ hai của bạn [[1]]). Bạn có thể sử dụng StringSplitmà không cần tham số thứ hai (vì nó phân tách trên khoảng trắng theo mặc định). SubsetQMemberQcó thể sử dụng ký hiệu infix để lưu một byte, vd #~SubsetQ~o.
Martin Ender

Tôi đã thay đổi một số và không để ý khi tôi thay đổi nó mà tôi chỉ sử dụng icmột lần, cảm ơn vì tiền boa! Ngoài ra, tôi cần phải có tham số thứ hai StringSplit, vì có một số điều kỳ lạ xảy ra với một số nhân vật được hiểu là khoảng trắng (không thực sự là khoảng trắng)
Ian Johnson

Hấp dẫn. Trong trường hợp đó, bạn vẫn có thể nhúng một dòng mới thay vì viết \n, để lưu một byte và sử dụng ký hiệu infix để lưu một dòng khác.
Martin Ender

Vâng, không hoàn toàn chắc chắn những gì đang xảy ra với StringSplit trong trường hợp đó, nó thực sự có thể là hậu quả của việc sử dụng InputString
Ian Johnson

1

Python 2, 112 byte

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]

Chạy ví dụ: Ideone


1

Javascript (ES6), 107 104 102 byte

Đoạn giới thiệu cho các trình duyệt hỗ trợ.

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

Đã bình luận:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.