Tuş Takımları Konusunda


15

Keep Talking and Nobody Explodes , bir oyuncunun sanal bir "bomba" üzerinde kontrolü olduğu ve bomba kullanım kılavuzuna erişimi olan başka bir oyuncu olan "uzman" tarafından yönlendirilmesi gereken yerel bir çok oyunculu oyundur. Oyunda silahsızlandırılacak modüllerden biri de tuş takımı modülü, bu da bu mücadelede ele alacağımız şey.

Görev

Giriş, boşluk (0x21 - 0x7E) dışında yazdırılabilir ASCII karakterlerinin tek bir satırıyla başlayacaktır. Bunlar, size görünür olan tuş takımı düğmelerini temsil eder.

Sonraki birkaç satır "anahtarları" temsil edecektir - yalnızca bir satır ilk satırın tüm karakterlerini içerecektir, sıraya göre değil. Göreviniz, tuş takımı karakterlerini, eşleşen tuş sırasına göre çıkarmaktır.

Örneğin, giriş

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

Daha sonra tuş takımı düğmeleri vardır 5, ~, Fvey . Yalnızca 4. anahtar satırı ~Fi(&5gytüm bu karakterleri içerir, bu nedenle tuş takımı karakterlerini göründükleri sırayla çıkarırız, yani ~F5y.

Kurallar ve açıklamalar

  • Giriş, tuş takımı düğmeleri ve tuş çizgileri ayrı satırlarda olacak şekilde çok satırlı tek bir dize olmalıdır.
  • Tüm tuş takımı karakterlerini içeren tam olarak bir tuş satırı olacaktır.
  • Her satırın, yani ilk tuş takımı satırının ve sonraki anahtar satırların yinelenen karakterleri olmayacaktır.
  • Oyunun aksine, tuş takımı karakter sayısı, her tuş satırının uzunluğu veya tuş satırı sayısı hakkında hiçbir şey varsaymayabilirsiniz. Ancak, tüm kilit hatların aynı uzunlukta olması garanti edilir.
  • Çıktı, isteğe bağlı tek bir satırsonu satırı içerebilir. Benzer şekilde, girdideki isteğe bağlı bir son satır hakkında her iki şekilde de varsayabilirsiniz, ancak varsayım gerekiyorsa lütfen yanıtınızda belirtin.
  • Bu zaten yaygın bir uygulama gibi görünse de , açıkça belirteceğim: STDOUT çıktısı doğru olduğu sürece (bu, seçtiğiniz çıktı biçiminizse) bir hata ile sonlandırmak bu meydan okuma için uygundur. İnşallah bu girişin kullanımını kolaylaştırır.

Test senaryoları

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

Çıktı: 7 . Yalnızca son satırda bir 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

Çıktı : 0b~. 4. anahtar satır zaten doğru sırada karakterler içeriyor.

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

Çıktı : zTuM. Anahtar hat 4. olanıdır, ancak 3. anahtar hat bir özledim.

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

Çıktı : n1j@o<G. Anahtar satır son ikinci satırdır.

puanlama

Bu , bu yüzden en az bayt kod kazanır.


STDOUT kabul edilebilir tek çıkış yöntemidir veya fonksiyon dönüş değerine de izin verilir mi?
Zgarb

@Zgarb Fonksiyon girişi ve çıkışı iyi
Sp3000 20

sigh Bir test senaryosu için çalışan bir çözümüm var ... diğer test senaryolarında çok fazla kaçış karakteri var. Oh iyi.
Kyle Kanos

Yanıtlar:


11

CJam, 13 12 bayt

qN/(f&{,}$W=

Burada test edin.

açıklama

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

Çevrimiçi deneyin

açıklama

@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 bayt

eolN@Lz.z

gösteri

@Lz.z: Kavşak için tüm satırları ilk satırla filtreleyin.

olN: Boyuna göre sırala

e: En uzun süreyi al.


3

Haskell, 49 bayt

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

İlk satır bir yardımcı fonksiyon tanımlar g, ikinci satırdaki isimsiz fonksiyon benim cevabımdır.

açıklama

Algoritma barizdir: girişi satırlara ayırın, ilk satırın tüm karakterlerini içeren satırı bulun ve o satırdaki diğer tüm karakterleri filtreleyin.

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, 204190 bayt

Prolog için çok satırlı giriş ve çıkış karaktersiz karakterlerin ve "girişteki birleşik gereksinimler olmasaydı bu hoş bir zorluk olabilir. Bir dosyayı karakter olarak okumak için büyük bir kod (p ve r) var birkaç satırda kaçışsız girdi almak için yapmam gereken kodlar.Yalnızca

'kaçışsız karakter olarak var olsaydı, girdiyi dize
olarak okuyabiliyordum.
Giriş çok satırlı değilse, boşlukla ayrılmış diyelim, kodlara bir satır olarak okuyabiliyordum.

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

Nasıl çalışır?

  1. Okumak için t (tüm girdiyi içeren) dosyasını açar
  2. Tüm satırları karakter kodu olarak okuyun ve bir liste listesine yerleştirin (satır başına 1 liste)
  3. Kuyruk listelerinde tekrarlamalar ve baş listenin bu listenin bir alt kümesi olarak var olup olmadığını kontrol eder
  4. İstenen karakterleri doğru sırada almak için eşleşen listeyi kafa ile keser
  5. Baskı çözümü

Nasıl çalıştırılır
Program şu komutla çalıştırılır:
s.
Giriş içeren t adlı dosya aynı dizinde olmalıdır.

Düzenleme: OR ile 2 q cümlesini birleştirerek 14 bayt kaydedildi.


2

MATLAB, 107 bayt

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

Bu çok özensiz bir kod parçası oldu ...

Çalıştırılırken, çok satırlı bir dizenin yapıştırılabileceği bir giriş iletişim kutusu açılır (yeni satırlar boşluklara dönüştürülür ve çıktı, 1 çok uzun dize içeren bir hücre olur). Elde edilen hücreyi boşluklara bölmeyi mümkün kılan bir char'a dönüştürmeyi seçtim (sonuç bir hücre dizisidir) ve daha sonra istenen şekli almak için char'a dönüştürmeyi seçtim. MATLAB'ın yerleşik üyesi işlevi, ilk diğer satırlarla karşılaştırmada iyi bir iş çıkarıyor.

Ondan sonra kötü olur ... İlk satırı 'en iyi maç' kontrolümden hariç tutmanın birçok yolunu denedim ve bununla bitirdim. Satırı ararız ve daha sonra bu bilgileri çıkış karakterlerimizden istediğimiz endeksleri ( ismember çıktımızı mantıksallara dönüştürerek) kapmak için kullanırız .


2

Wolfram Dili 106 bayt

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

Örnek girdi:

giriş pop-up'ı

Çıktı:

çıktı sonucu

Kodun açıklaması: Önce InputString ile tam girdi dizesini alırız, sonra dizeyi yeni satıra bölerek ve ilk harfin tüm karakterlerini o değişkenine kaydederek ilk harf setini alırız. Daha sonra, giriş satırlarının geri kalanından, alt satır olarak ilk satırın karakterlerine (o değişkeni olarak kaydedilmiş) sahip satırları seçeriz. Sonra o satır seçiliyken, o satırın orijinal kümesindeki üyelerini alırız.

Düzenleme: Infix gösterimi ve gereksiz değişkenlerimi kullanma ipuçları için Martin Büttner'a teşekkürler


Yay, Mathematica. Bazı golf ipuçları: Bildiğim kadarıyla kullanmak söyleyebilirim cve iyalnızca bir kez, bu yüzden hiçbir yararı değişkenlere atayarak içinde var. Muhtemelen bu uçtan bazı baytlar kaydedebilirsiniz . Vermeyerek obir isim. s[[1]]olduğu #&@@s(sizin ikinci kullanımı için aynı [[1]]). StringSplitİkinci parametre olmadan kullanabilirsiniz (varsayılan olarak boşlukta ayrıldığı için). SubsetQve MemberQbayt kaydetmek için infix gösterimini kullanabilir, örn #~SubsetQ~o.
Martin Ender

Biraz değiştirdim ve değiştirdiğim gibi fark etmedim ve sadece kullandığım ive bir ckez, bahşiş için teşekkürler! Ayrıca, StringSplitbazı karakterlerin boşluk olarak yorumlanmasına neden olan bazı tuhaflıklar olduğu için ikinci parametreye ihtiyacım var (bu gerçekten boşluk değil)
Ian Johnson

İlginç. Bu durumda \n, bir bayt kaydetmek için yazmak yerine gerçek bir satırsonu gömebilir ve başka bir tane kaydetmek için infix gösterimini kullanabilirsiniz.
Martin Ender

Evet, bu durumda StringSplit ile neler olup bittiğinden tam olarak emin değilim, aslında InputString'i kullanmanın bir sonucu olabilir
Ian Johnson

1

Python 2, 112 bayt

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]

Örnek çalışma: Ideone


1

JavaScript (ES6), 107 104 102 bayt

Tarayıcıları desteklemek için snippet demosu.

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

Yorumlananlar:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.