Tentang Subjek Keypads


15

Keep Talking and Nobody Explodes adalah gim multipemain lokal di mana satu pemain memiliki kendali atas "bom" virtual, dan harus dipandu oleh pemain lain, "pakar", yang memiliki akses ke manual defusal bom. Salah satu modul yang akan dilucuti dalam gim ini adalah modul keypad, yang akan kita hadapi dalam tantangan ini.

Tugas

Input akan mulai dengan satu baris karakter ASCII yang dapat dicetak kecuali spasi (0x21 hingga 0x7E). Ini mewakili tombol keypad yang terlihat oleh Anda.

Beberapa baris berikutnya akan mewakili "kunci" - hanya satu baris yang akan berisi semua karakter dari baris pertama, tidak harus berurutan. Tugas Anda adalah untuk mengeluarkan karakter keypad, sesuai urutan garis kunci yang cocok.

Misalnya, jika inputnya adalah

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

maka tombol keypad yang 5, ~, Fdan y. Hanya baris kunci ke-4 yang ~Fi(&5gyberisi semua karakter ini, jadi kami mengeluarkan karakter tombol sesuai urutan kemunculannya, yaitu ~F5y.

Aturan dan klarifikasi

  • Input harus berupa string multiline tunggal, dengan tombol keypad dan garis tombol pada garis yang terpisah.
  • Hanya akan ada satu baris kunci yang berisi semua karakter keypad.
  • Setiap garis, yaitu garis keypad awal dan garis tombol berikut, tidak akan memiliki karakter duplikat.
  • Berbeda dengan gim, Anda tidak boleh berasumsi tentang jumlah karakter papan tombol, panjang setiap garis tombol atau jumlah garis tombol. Namun, semua jalur utama dijamin memiliki panjang yang sama.
  • Output mungkin berisi satu baris tambahan opsional. Demikian pula, Anda dapat mengasumsikan cara lain tentang jalur tambahan opsional di input, tetapi harap tentukan dalam jawaban Anda jika Anda memerlukan asumsi.
  • Walaupun ini sudah menjadi praktik umum , saya akan menyatakan secara eksplisit: mengakhiri dengan kesalahan tidak masalah untuk tantangan ini, selama output STDOUT benar (jika ini adalah bentuk output yang Anda pilih). Semoga ini akan membuat input penanganan lebih mudah.

Uji kasus

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

Output: 7 . Hanya baris terakhir yang berisi 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

Output : 0b~. Baris kunci 4 sudah berisi karakter dalam urutan yang benar.

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

Output : zTuM. Baris kunci adalah baris ke-4, meskipun baris kunci ke-3 nyaris gagal.

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

Output : n1j@o<G. Baris kunci adalah baris terakhir kedua.

Mencetak gol

Ini adalah , sehingga kode dalam byte paling sedikit menang.


Apakah STDOUT satu-satunya metode output yang dapat diterima, atau apakah nilai pengembalian fungsi juga diperbolehkan?
Zgarb

@Zgarb Fungsi input dan output keduanya baik-baik saja
Sp3000

mendesah saya punya solusi yang bekerja untuk satu test case ... terlalu banyak karakter melarikan diri dalam case test lainnya. Baiklah.
Kyle Kanos

Jawaban:


11

CJam, 13 12 byte

qN/(f&{,}$W=

Uji di sini.

Penjelasan

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

Cobalah online

Penjelasan

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

eolN@Lz.z

Demonstrasi

@Lz.z: Saring semua garis untuk persimpangan dengan baris pertama.

olN: Diurutkan berdasarkan panjangnya

e: Ambil yang terpanjang.


3

Haskell, 49 byte

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

Baris pertama mendefinisikan fungsi pembantu g , yang tidak disebutkan namanya pada baris kedua adalah jawaban saya.

Penjelasan

Algoritme adalah yang paling jelas: membagi input menjadi garis, menemukan garis yang berisi semua karakter dari baris pertama, dan menyaring semua karakter lain pada baris itu.

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

Ini bisa menjadi tantangan yang bagus untuk Prolog jika bukan karena persyaratan gabungan input multiline dan karakter yang tidak terhapus 'dan "dalam input. Sebagian besar kode (p dan r) ada untuk membaca file sebagai karakter kode yang harus saya lakukan untuk mengambil input yang tidak terhapus pada beberapa baris.

Jika saja 'ada sebagai karakter yang tidak terhapus, saya bisa membaca input sebagai string.
Jika saja "ada sebagai karakter yang tidak dihilangkan, saya bisa membaca input sebagai atom.
Jika input bukan multiline, katakan dipisahkan dengan spasi sebagai gantinya, saya bisa membacanya sebagai satu baris ke kode.

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

Bagaimana fungsinya

  1. Buka file t (yang berisi semua input) untuk dibaca
  2. Baca semua baris sebagai kode karakter dan tempatkan dalam daftar daftar (1 daftar per baris)
  3. Berulang dari daftar ekor dan memeriksa apakah daftar kepala ada sebagai bagian dari daftar itu
  4. Memotong daftar yang cocok dengan kepala untuk mendapatkan karakter yang diinginkan dalam urutan yang benar
  5. Solusi cetak

Cara menjalankan
Program dijalankan dengan perintah:
p.
File yang dinamai t yang berisi input harus berada di direktori yang sama.

Sunting: Disimpan 14 byte dengan menyatukan 2 klausa q dengan 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,:)))

Ini akhirnya menjadi sepotong kode yang sangat ceroboh ...

Saat dijalankan, dialog input dibuka di mana string multi-baris dapat disisipkan ke (baris baru dikonversi ke spasi dan output akan menjadi sel dengan 1 string yang sangat panjang). Saya memilih untuk mengubah sel yang dihasilkan menjadi char yang memungkinkan untuk dipisah di spasi (hasilnya adalah array sel) dan kemudian kembali dikonversi ke char untuk mengambil bentuk yang diinginkan. MATLAB built-in ismember fungsi melakukan pekerjaan yang baik di sini di membandingkan baris pertama kita ke jalur lainnya.

Setelah itu menjadi buruk ... Saya sudah mencoba banyak cara untuk mengecualikan baris pertama dari cek 'pertandingan terbaik' saya dan berakhir dengan ini. Kami mencari garis dan kemudian menggunakan informasi ini untuk mengambil indeks (dengan mengonversikan indeks kami output ismember menjadi logis) yang kami inginkan dari karakter output kami.


2

Bahasa Wolfram 106 byte

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

Input contoh:

masukan popup

Keluaran:

hasil keluaran

Penjelasan kode: Pertama dengan InputString kita mendapatkan string input penuh, lalu kita mendapatkan set huruf pertama dengan memisahkan string dengan baris baru, dan menyimpan semua karakter yang pertama dalam variabel o. Selanjutnya, kami memilih dari sisa baris input yang memiliki karakter baris pertama (disimpan sebagai variabel o) sebagai subset. Kemudian dengan garis yang dipilih, kami mengambil anggota dari garis yang ada di set asli.

Sunting: Terima kasih kepada Martin Büttner untuk tips tentang penggunaan notasi infiks dan variabel yang tidak perlu saya


Yay, Mathematica. Beberapa petunjuk bermain golf: Sejauh yang saya tahu Anda gunakan cdan ihanya sekali, jadi tidak ada manfaatnya menugaskan mereka ke variabel. Anda mungkin dapat menyimpan beberapa byte dari tip ini . Dengan tidak memberi onama. s[[1]]adalah #&@@s(sama untuk penggunaan kedua Anda [[1]]). Anda dapat menggunakan StringSplittanpa parameter kedua (karena itu terbagi pada spasi putih secara default). SubsetQdan MemberQdapat menggunakan notasi infiks untuk menyimpan byte, misalnya #~SubsetQ~o.
Martin Ender

Saya mengubahnya beberapa, dan tidak melihat ketika saya mengubahnya bahwa saya hanya menggunakan idan csekali, terima kasih atas tipnya! Juga, saya perlu memiliki parameter kedua StringSplit, karena ada beberapa keanehan yang terjadi dengan beberapa karakter ditafsirkan sebagai spasi putih (yang tidak benar-benar spasi putih)
Ian Johnson

Menarik. Dalam hal ini, Anda masih dapat menyematkan baris literal alih-alih menulis \n, untuk menyimpan satu byte, dan menggunakan notasi infiks untuk menyimpan yang lain.
Martin Ender

Ya, tidak sepenuhnya yakin apa yang terjadi dengan StringSplit dalam kasus itu, itu mungkin sebenarnya merupakan konsekuensi dari menggunakan 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]

Contoh dijalankan: Ideone


1

Javascript (ES6), 107 104 102 byte

Demo cuplikan untuk mendukung browser.

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

Berkomentar:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.