Dalam versi gim arcade, Pac-Man makan pac-dots. Namun, dalam tantangan ini, dia haus akan karakter alfanumerik dan tanda baca dalam sebuah string.
Tugas Anda adalah membuat fungsi yang memberi makan Pac-Man sebuah string, mengevaluasi apakah dia bisa memakannya atau tidak, dan mengembalikan string dengan lokasi Pac-Man di dalamnya.
Pac-Man ( <
) makan karakter dari kiri ke kanan, meninggalkan garis bawah atau spasi untuk setiap karakter saat ia berjalan, dan tujuannya adalah untuk mendapatkan dari posisi pertama-1 ke posisi terakhir +1:
1. <Pac
2. _<ac
3. __<c
4. ___<
Namun, musuh alami Pac-Man, hantu, akan menghentikannya jika ia menemukan salah satu huruf dalam kata "GHOST" (tidak peka huruf besar kecil). Fungsi Anda harus mengembalikan string dengan lokasi Pac-Man saat ia menemukan ghost
karakter:
1. <No!
2. _<o!
Satu-satunya hal yang dapat mengalahkan hantu adalah pelet kekuatan. Jika Pac-Man mencapai huruf dalam kata "PELLET" (juga tidak peka huruf besar-kecil) sebelum datang ke hantu, ia akan memakan hantu itu dan terus bergerak, dan pelet itu akan habis. Pelet listrik dapat ditumpuk (yaitu, di ppgg
kedua hantu akan dimakan). The T karakter ada sebagai baik sebagai hantu dan pelet, sehingga dapat diabaikan (diperlakukan sebagai surat lainnya, seperti a
).
1. <Pop
2. _<op
3. __<p
4. ___<
Untuk lebih memperjelas, dalam string "Pac-Man kehilangan di sini", operasi berikut terjadi:
P <P, +1 Pellet (1 pellet)
a <a
c <c
- <-
M <M
a <a
n <n
<[space]
l <l, +1 Pellet (2 pellets)
o <o, -1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
e <e, +1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
<[space]
h <h, ghost wins, returns
e
r
e
Contohnya
Input: Pacman wins!
Output: ____________<
Input: Pacman loses wah-wah :(
Output: _______________<h-wah :(
Input: PELLET PELLET GHOST
Output: ___________________<
Input: Hello World!
Output: <Hello World!
Input: <_!@12<_<_<
Output: ___________<
Ini adalah kode-golf - skor terendah dalam byte yang menang.
sumber
<
simbol ...Jawaban:
Jelly,
3433 byteCobalah online!
Saya pikir saya akhirnya mulai mengerti Jelly. Terasa agak menakutkan.
sumber
Retina ,
5538 byteCobalah online! (Baris pertama hanya memungkinkan menjalankan beberapa test case sekaligus.)
Penjelasan
Masalahnya adalah pada dasarnya untuk menemukan awalan terpanjang yang tidak memiliki kurung tutup yang tidak cocok. Kecuali bahwa kita dapat menggunakan salah
e
,l
ataup
di tempat(
dan baikg
,h
,o
ataus
di tempat)
.Oleh karena itu, solusi ini hampir merupakan contoh buku teks dari kelompok penyeimbang. Saya tidak akan membahas terlalu banyak tentang cara kerjanya, karena kode ini pada dasarnya sama dengan contoh standar yang dapat Anda baca di dalam jawaban SO saya tentang menyeimbangkan kelompok .
Oleh karena itu seluruh program merupakan pengganti satu regex. The
i
mengaktifkan kasus-ketidakpekaan. Kemudian kami mencocokkan pelet dengan[elp]
dan menambah penghitung kedalaman (dalam bentuk tumpukan tangkapan kelompok2
), atau kami mencocokkan sesuatu yang bukan hantu dengan[ghos]
atau kami mencocokkan hantu dengan.
dan mengurangi penghitung kedalaman dengan muncul dari tumpukan2
. Tentu saja, pada prinsipnya ini memungkinkan pencocokan pelet dengan[^ghos]
bagian atau non-hantu dengan.
bagian, tetapi berkat pencocokan serakah dan cara regex mundur, kemungkinan ini tidak pernah dicoba oleh mesin regex.Substitusi kemudian menggunakan dua fitur khusus Retina:
$*
mengulang karakter ke kanan sebanyak yang ditentukan oleh token di sebelah kirinya. Token itu$.&
adalah panjang dari seluruh pertandingan. Ini hanya berarti bahwa kami mengganti setiap karakter dalam pertandingan dengan a_
. Dan kemudian kami juga menambahkan<
ke garis bawah itu. Bagian dari input yang tidak dimakan tetap tidak terpengaruh oleh substitusi.sumber
Python 2,
114113108 bytesumber
None
, bukan jawabannya. Dan bagaimana Anda menghitung 107? Saya menghitung 110.Python 2, 89 byte
Terkadang tekad saya yang keras kepala untuk menjadikan Python sebagai bahasa fungsional memiliki manfaatnya.
(Sedikit) tidak berbulu:
Membangun string hasil menggunakan rekursi. Pembaruan ke
l
(untuk "live") menambahkan 1 untuk pelet (True - False == 1
), kurangi 1 untuk hantu (False - True == -1
), dan tambahkan 0 untuk karakter lainnya. Ini juga menambahkan 0 kapans
string kosong, terima kasih untuk mengiris Python dan fakta bahwa'' in any_str == True
, sehingga pelet dan hantu membatalkan.Penggunaan pernyataan kembali
test and b or a
di tempata if test else b
untuk menyimpan satu byte. Kasus dasar rekursi terjadi ketika string berakhir atau Pac-Man kehabisan pelet, secara ringkas direpresentasikan sebagais*p
, yang sama dengan''
(dan karenanya bernilai false) ketika salah satus == ''
ataup == 0
.sumber
C #,
269256232212211 BytesPosting pertama di sini, jadi ini mungkin jauh lebih lama daripada yang seharusnya (dan mungkin karena itu dalam C #). Setiap tips di mana saya bisa mempersingkat itu akan menjadi luar biasa!
Terima kasih kepada semua orang di komentar yang membantu saya!
Versi golf
Versi tidak disatukan
sumber
else
menyimpan 5 karakter lagi. Dan dengan memulai loop padai = 1
Anda harus dapat menghapus yang terakhir jika sebagai kode dapat dieksekusi setiap saat.s[i]
akses untuk 5 karakter.P="PELpel"
danG="GHOSghos"
? Anda hanya menggunakannya sekali masing-masing. Apakah saya kehilangan sesuatu, atau hanya 4 karakter tambahan? Juga, apakah Anda memerlukannyaelse
?"PELpel".Contains(c)
dan"GHOSghos".Contains(c)
harus saling eksklusif.Pyth,
534844 byte4 byte terima kasih kepada @ Pietu1998 untuk trik
!!@
->}
(yang hanya orang yang tahu Pyth bisa mengerti)Suite uji.
sumber
!!@
hanya sebuah trigraph}
, kan? : pMATL ,
373635 byteCobalah online!
Penjelasan
sumber
JavaScript (ES6), 98 byte
Penjelasan:
p
mempertahankan jumlah pelet saat ini. Jika sudah negatif, kita cukup mengembalikan karakter dan melanjutkan, sehingga sisa string tidak tersentuh. Jika tidak, kami memeriksa karakter saat ini, dan jika itup
menjadi negatif, kami menyisipkan<
karakter, jika tidak kami ganti dengan karakter saat ini_
. Akhirnya, jikap
tidak pernah menjadi negatif, kita sufiks a<
ke string.sumber
Pyth,
474644 byteCobalah online. Suite uji.
Pendekatan yang sangat berbeda dari Leaky Nun, dan saya cukup yakin ini bisa bermain golf lebih lanjut.
sumber
Z
sebagai gantiG
dan ubahf!
kef!h
t
di"ghost"
harus dihapusLua,
198190184185163 BytesOk, saya akui, ini panjang. Sangat panjang. Lua memiliki beberapa alat untuk bermain-main dengan string, tetapi terbatas, hal yang sama berlaku untuk persyaratan yang membutuhkan banyak ruang.
Sunting: terima kasih @LeakyNun karena telah menyelamatkan saya 9 byte :) Kehilangan beberapa byte untuk memperbaiki bug
Sunting 2: 163 Bytes solusi ditemukan oleh @LeakyNun
185 tahun
Tidak disatukan
sumber
d=c:lower()
dan cari karakter huruf besar jugaand 1or s and 1or s
s and s
print(('').rep('_',i)..','..z:sub(i+1))
i
bisanil
Python 3,
176157150149134133124 byteTentukan fungsi bernama
f
yang mengambil string sebagai argumenMungkin bisa bermain golf lebih banyak
Terima kasih kepada semua orang yang berkomentar: D
sumber
x=c.upper()
dan cari kecocokan huruf kecil;
alih - alih memiliki masing-masing pada baris sendiri. Anda juga dapat menggunakan Python 2 yang memungkinkan Anda untuk menggunakan spasi sebagai tingkat niat pertama dan tab sebagai yang kedua.n=i=0
, tidakn=0
dani=0
.t[i]="_"
bukannyat[i] = "_"
, sama untukt[i] = "<"
.return''.join(t)
, hapus ruang itu."GgHhOoSs"
dan"PpEeLl"
.Python 3,
114110 byteGolf kode pertama saya.
Terima kasih kepada Dr Green Eggs dan Iron Man untuk menghemat 4 byte.
Memanfaatkan evaluasi booleans ke satu dan nol untuk menyingkat logika DAN ke perkalian. (0 * 0 = 0, 1 * 0 = 0, 1 * 1 = 1). Saya harap ini adalah percobaan pertama yang baik.
sumber
while s[x:]*l
untuk melepas 4 byte.Powershell, 185
Tidak Disatukan:
sumber
Python3,
211184 byteArgumen 'adalah' string
Saya akan menghargai tips golf karena ini adalah upaya golf kode pertama saya
Terima kasih telah berkomentar :)
sumber
return "_"*c + "<" + s[c:]
hanya denganbreak
kode yang akan dieksekusi setelah for loop anyways.Haskell,
119113 BytesTerima kasih kepada Daniel Wagner untuk 6 byte lebih sedikit.
Sebut saja sebagai
p "Hello World!"
.Ini
1then
adalah kasus tepi yang ditafsirkan dengan benar di GHC saya (7,10), tetapi itu melemparkan sebagian besar penyorot sintaks. Jadi itu mungkin ditafsirkan berbeda di kompiler Anda juga.Tidak Disatukan:
sumber
n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah
.C, 237 byte
sumber
C ++,
315373327 Bytes(Catatan: masih bermain golf)
sumber
if()
, dan menghapus ruang di sekitar!=
,||
,=
,-
, dan<=
. Juga, tidakcin>>input
berhasil bukangetline
? Anda juga bisa mengembun di sekitar;
.Ruby, (119 byte)
Mungkin ada beberapa hal yang saya lewatkan karena saya baru dalam hal ini ...
Ruby adalah temanku :)
sumber
Perl, 54 (52 + 2) byte
Harus
-p
ditentukan dalam opsi baris perintah.Penjelasan:
The
-p
pilihan menyebabkan pernyataan untuk dibungkus dalam sebuah loop read-memodifikasi-print, di mana selama setiap iterasi loop,$_
berisi garis masukan, termasuk pembatas jalur.Regex sebagian besar ide yang sama seperti pada jawaban Retina.
Panggil pola pencarian
([pel](?1)*[ghos]|[^ghos ])*
"dapat diterima". Kemudian dapat didefinisikan secara rekursif sebagai:Sebuah string "dapat diterima" jika:
PELLET
kecuali untukT
, diikuti oleh string yang dapat diterima, diikuti oleh karakter dalamGHOST
kecuali untukT
.GHOST
kecuali untukT
yang bukan karakter baris baru.Definisi ini memungkinkan lebih banyak pelet daripada hantu:
PEL
karakter dapat dicocokkan sebagai karakter pelet, atau karakter non-hantu.String kosong dianggap dapat diterima, oleh karena itu regex dijamin akan cocok pada posisi 0, di mana substring yang paling lama diterima akan dicocokkan.
Substring yang paling lama diterima ini kemudian dicocokkan dengan garis bawah dengan panjang yang sama, diikuti oleh
<
.sumber
-p
sudah digunakan-
, misalnyaperl -e
->perl -pe
, maka-
itu gratis. Tapi saya pikirperl -e
versinya lebih panjang karena mengutip, jadi saya pikir saya tidak bisa menggunakannya di sini.