キーパッドの主題について


15

Keep Talking and Nobody Explodesは、1人のプレイヤーが仮想の「爆弾」を制御できるローカルマルチプレイヤーゲームであり、別のプレイヤー、「爆弾除去マニュアルにアクセスできる」「エキスパート」に導かれなければなりません。ゲームで武装解除するモジュールの1つはキーパッドモジュールです。これは、この課題で対処するものです。

タスク

入力は、スペース(0x21〜0x7E)を除く印刷可能なASCII文字の1行で始まります。これらは、目に見えるキーパッドボタンを表します。

次の数行は「キー」を表します。最初の行のすべての文字が含まれるのは1行だけであり、必ずしも順序どおりではありません。タスクは、キーパッドの文字を一致するキー行の順に出力することです。

たとえば、入力が

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

その後、キーパッドのボタンがあり5~Fy。4番目のキー行のみ~Fi(&5gyにこれらの文字がすべて含まれているため、キーパッド文字を表示順に出力します~F5y

規則と説明

  • 入力は、キーパッドボタンとキー行が別々の行にある単一の複数行文字列でなければなりません。
  • すべてのキーパッド文字を含むキー行が1行だけあります。
  • すべての行、つまり最初のキーパッド行とそれに続くキー行には、重複する文字はありません。
  • ゲームとは異なり、キーパッドの文字数、各キー行の長さ、またはキー行の数については何も想定できません。ただし、すべてのキー行は同じ長さであることが保証されています。
  • 出力には、単一のオプションの末尾の改行が含まれる場合があります。同様に、入力のオプションの末尾の改行についてはどちらの方法でも想定できますが、前提が必要な場合は回答で指定してください。
  • これはすでに一般的な慣行のようですが、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。キー行は最後から2番目の行です。

得点

これはであるため、最小バイトのコードが優先されます。


STDOUTのみが受け入れ可能な出力方法ですか、または関数の戻り値も許可されますか?
ズガーブ

@Zgarb関数の入力と出力は両方とも大丈夫です
SP3000

ため息私は1つのテストケースで動作する解決策を持っています...他のテストケースのエスケープ文字が多すぎます。しかたがない。
カイルカノス

回答:



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


3

Haskell、49バイト

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

最初の行はヘルパー関数を定義gし、2行目の名前のない関数は私の答えです。

説明

アルゴリズムは明らかです。入力を行に分割し、最初の行のすべての文字を含む行を見つけ、その行の他のすべての文字をフィルターで除外します。

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にとって素晴らしい挑戦でした。複数の行でエスケープされていない入力を取得するために必要なコードです。

'のみがエスケープされていない文字として
存在する場合、文字列として入力を読み取ることができます。
入力が複数行ではなく、たとえばスペースで区切られている場合、コードの1行として読み取ることができます。

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で実行します。
入力を含む名前の付いたファイルは、同じディレクトリにある必要があります。

編集: 2つのq節をORで統合して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に変換して、スペースで分割できるようにし(結果はcell配列)、再び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(の2番目の使用のために同じ[[1]])。StringSplit2番目のパラメーターなしで使用できます(デフォルトでは空白で分割されるため)。SubsetQまた、MemberQ中置記法を使用してバイトを保存できます#~SubsetQ~o
マーティンエンダー

私はそれをいくつか変更しましたが、変更したときに気づかなかったのはic一度だけ使用したことです、ヒントをありがとう!また、私は2番目のパラメータを持っている必要がStringSplitあったとして(実際には空白でないこと)文字の一部で起こっていくつかのすごみが空白として解釈取得、
イアン・ジョンソン

面白い。その場合\n、を書く代わりにリテラルの改行を埋め込み、1バイトを保存し、中置表記法を使用して別のバイトを保存できます。
マーティンエンダー

うん、完全に確認してくださいその場合にはStringSplitでなにが起こっているのか、それが実際とInputStringを使用した結果かもしれない
イアン・ジョンソン

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]

実行例:イデオン


1

ジャバスクリプト(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.