ในเรื่องของ Keypads


15

Keep Talking and Nobody Explodesเป็นเกมแบบเล่นพร้อมกันหลายคนในท้องถิ่นที่ผู้เล่นคนหนึ่งสามารถควบคุม "ระเบิด" เสมือนจริงและต้องได้รับคำแนะนำจากผู้เล่นอีกคนหนึ่งว่า "ผู้เชี่ยวชาญ" ซึ่งสามารถเข้าถึงคู่มือการกำจัดระเบิดได้ หนึ่งในโมดูลที่ต้องปลดอาวุธในเกมคือโมดูลแผงปุ่มกดซึ่งเป็นสิ่งที่เราจะจัดการกับความท้าทายนี้

งาน

อินพุตจะเริ่มต้นด้วยอักขระ ASCII ที่พิมพ์ได้บรรทัดเดียวยกเว้นเว้นวรรค (0x21 ถึง 0x7E) ปุ่มเหล่านี้แสดงถึงปุ่มกดที่คุณเห็น

สองสามบรรทัดถัดไปจะแทน "คีย์" - เพียงหนึ่งบรรทัดเท่านั้นที่มีอักขระทั้งหมดของบรรทัดแรกไม่จำเป็นต้องเรียงตามลำดับ งานของคุณคือการส่งออกตัวอักษรปุ่มกดตามลำดับของสายคีย์ที่ตรงกัน

ตัวอย่างเช่นถ้าอินพุตเป็น

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

แล้วปุ่มกดปุ่ม5, ~, และF yเฉพาะสายสำคัญที่ 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. กุญแจสำคัญคือกุญแจดอกที่ 4 ถึงแม้ว่ากุญแจดอกที่ 3 จะพลาดไป

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

@Zgarb ฟังก์ชั่นอินพุทและเอาท์พุทใช้ได้ทั้งคู่
Sp3000

ถอนหายใจฉันมีวิธีแก้ปัญหาที่เหมาะกับกรณีทดสอบหนึ่งกรณี ... ตัวอักขระการหลบหลีกมากเกินไปในกรณีทดสอบอื่น โอ้ดี
Kyle Kanos

คำตอบ:


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

Pyth, 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 ถ้ามันไม่ได้เป็นข้อกำหนดที่รวมกันของอินพุตหลายบรรทัดและอักขระที่ไม่ใช้ค่า Escape 'และ "ในอินพุตอินพุตมีโค้ดขนาดใหญ่ (p และ r) อยู่เพื่ออ่านไฟล์เป็นอักขระ รหัสซึ่งเป็นสิ่งที่ฉันต้องทำเพื่อรับอินพุตที่ไม่ใช้ค่า Escape ในหลายบรรทัด

หากมีเพียง 'เป็นอักขระที่ไม่ใช้ค่า Escape ฉันสามารถอ่านอินพุตเป็นสตริงได้
หาก "มีอยู่เป็นอักขระที่ไม่ใช้ Escape เท่านั้นฉันสามารถอ่านอินพุตเป็นอะตอมได้
หากอินพุตไม่ใช่หลายบรรทัดให้พูดโดยคั่นด้วยช่องว่างแทนฉันสามารถอ่านมันเป็นหนึ่งบรรทัดไปยังโค้ด

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. พิมพ์โซลูชัน

วิธีเรียกใช้
โปรแกรมเรียกใช้ด้วยคำสั่ง:
p
ไฟล์ที่ใส่ชื่อที่มีอินพุตจะต้องอยู่ในไดเรกทอรีเดียวกัน

แก้ไข:บันทึก 14 ไบต์โดยการรวม 2 คำสั่งย่อยด้วย OR


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 สตริงยาวมาก) ฉันเลือกที่จะแปลงเซลล์ผลลัพธ์เป็นถ่านซึ่งทำให้สามารถแยกที่ช่องว่างได้ (ผลลัพธ์คือเซลล์อาร์เรย์) จากนั้นแปลงเป็นถ่านอีกครั้งเพื่อดึงรูปร่างที่ต้องการ ฟังก์ชั่นismemberในตัวของ MATLAB ทำได้ดีในการเปรียบเทียบบรรทัดแรกกับบรรทัดอื่น

หลังจากนั้นมันก็น่ารังเกียจ ... ฉันได้ลองหลายวิธีในการแยกบรรทัดแรกออกจาก 'การจับคู่ที่ดีที่สุด' ของฉันและจบลงด้วยสิ่งนี้ เราค้นหาบรรทัดแล้วใช้ข้อมูลนี้เพื่อจับดัชนี (โดยการแปลงเอาต์พุต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) เป็นเซ็ตย่อย จากนั้นเมื่อเลือกบรรทัดนั้นเราจะคว้าสมาชิกของบรรทัดนั้นที่อยู่ในชุดเดิม

แก้ไข: ขอบคุณ Martin Büttnerสำหรับคำแนะนำในการใช้สัญลักษณ์ infix และตัวแปรที่ไม่จำเป็นของฉัน


Yay, Mathematica คำแนะนำการเล่นกอล์ฟ: เท่าที่ฉันสามารถบอกคุณใช้cและiเพียงครั้งเดียวดังนั้นจึงไม่มีประโยชน์ในการกำหนดให้กับตัวแปร คุณอาจบันทึกจำนวนไบต์จากเคล็ดลับนี้ได้ โดยไม่ให้oชื่อ s[[1]]คือ#&@@s(เหมือนกับการใช้ครั้งที่สองของคุณ[[1]]) คุณสามารถใช้StringSplitโดยไม่มีพารามิเตอร์ที่สอง (เพราะมันแยกในพื้นที่ว่างตามค่าเริ่มต้น) SubsetQและสามารถใช้สัญกรณ์มัดเพื่อประหยัดไบต์เช่นMemberQ #~SubsetQ~o
Martin Ender

ผมเปลี่ยนมันบางส่วนและไม่ได้สังเกตเห็นการเปลี่ยนแปลงเป็นฉันว่าฉันเท่านั้นที่ใช้iและcครั้งเดียวขอบคุณสำหรับเคล็ดลับ! นอกจากนี้ผมจำเป็นต้องมีพารามิเตอร์ที่สองจะStringSplitเป็นมีความแปลกประหลาดบางอย่างที่เกิดขึ้นกับบางส่วนของตัวละครได้รับการตีความว่าเป็นช่องว่าง (ที่มีช่องว่างไม่ได้จริงๆ)
เอียนจอห์นสัน

น่าสนใจ ในกรณีนี้คุณยังสามารถฝังบรรทัดใหม่ตามตัวอักษรแทนการเขียน\nบันทึกหนึ่งไบต์และใช้สัญลักษณ์มัดเพื่อบันทึกอีก
Martin Ender

ใช่ไม่แน่ใจทั้งหมดว่าเกิดอะไรขึ้นกับ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.