Bisakah Pac-Man Memakan Senar Ini?

46

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 ghostkarakter:

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 ppggkedua 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.

ahli atlasologi
sumber
29
Jadi pelet tidak memiliki tanggal kedaluwarsa?
Rɪᴋᴇʀ
Apakah tabulasi tambahan diterima di output?
Katenkyo
7
Memberi +1 untuk fakta bahwa "di sini" adalah tempat pacman kehilangan. Kasing uji cerdas.
Olivier Dulac
5
> Dalam tantangan ini, dia haus akan karakter alfanumerik dan tanda baca dalam sebuah string. ... Yacc- man?
Kaz
9
Sekarang saya melihat pacman abu-abu yang disamarkan dengan bibir hitam setiap kali saya melihat <simbol ...
QBrute

Jawaban:

16

Jelly, 34 33 byte

Œl“ʋʋ“ṁḍ»ċ€Ð€IF+\‘0ṭi0ð’”_×;”<;ṫ@

Cobalah online!

Saya pikir saya akhirnya mulai mengerti Jelly. Terasa agak menakutkan.

PurkkaKoodari
sumber
5
Saya akan mulai khawatir ketika Anda bisa membacanya dengan lancar :)
quetzalcoatl
30

Retina , 55 38 byte

i`^(([elp])|[^ghos]|(?<-2>.))*
$.&$*_<

Cobalah 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, latau pdi tempat (dan baik g, h, oatau sdi 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 imengaktifkan kasus-ketidakpekaan. Kemudian kami mencocokkan pelet dengan [elp]dan menambah penghitung kedalaman (dalam bentuk tumpukan tangkapan kelompok 2), atau kami mencocokkan sesuatu yang bukan hantu dengan [ghos]atau kami mencocokkan hantu dengan .dan mengurangi penghitung kedalaman dengan muncul dari tumpukan 2. 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.

Martin Ender
sumber
Penyalahgunaan bagus menangkap grup!
Leaky Nun
11
@LeakyNun Abuse? Untuk itulah kelompok penyeimbang dibuat. : D
Martin Ender
1
Hai, lihat, jawaban Retina yang terlihat seperti regex yang saya gunakan
cat
10

Python 2, 114 113 108 byte

s=raw_input()
p=i=0
for c in s:
 p+=(c in'plePLE')-(c in'ghosGHOS')
 if p<0:break
 i+=1
print'_'*i+'<'+s[i:]
Arfie
sumber
Fungsi Anda kembali None, bukan jawabannya. Dan bagaimana Anda menghitung 107? Saya menghitung 110.
Stefan Pochmann
@StefanPochmann, double-spasi adalah tab dan diizinkan untuk mencetak jawaban alih-alih mengembalikannya
Biru
@muddyfish Ah, terima kasih. Mereka tampaknya tidak tab di sini, meskipun, bahkan ketika saya pergi ke "edit". Dan masalahnya jelas menyatakan "kembali" ... apakah ada aturan di seluruh situs yang menolaknya? (Saya cukup baru di sini dan tidak tahu)
Stefan Pochmann 3-16
Tab @StefanPochmann dimakan oleh SE (biasanya dikonversi menjadi 4 spasi). Kecuali jika pencetakan yang dinyatakan secara eksplisit dalam suatu fungsi diizinkan. OP mungkin tidak bermaksud mengesampingkan ini
Biru
Saya pikir masuk akal untuk mengatakan bahwa ia harus selalu kembali jika berfungsi atau dibaca dari stdin dan cetak. Saya akan berubah menjadi membaca dari stdin, yang seharusnya lebih pendek.
Arfie
8

Python 2, 89 byte

Terkadang tekad saya yang keras kepala untuk menjadikan Python sebagai bahasa fungsional memiliki manfaatnya.

def f(s,l=1):l+=(s[:1]in'plePLE')-(s[:1]in'ghosGHOS');return s*l and'_'+f(s[1:],l)or'<'+s

(Sedikit) tidak berbulu:

def f(s, l=1):
    l += (s[:1] in 'plePLE') - (s[:1] in 'ghosGHOS')
    return (s * l) and ('_' + f(s[1:], l)) or ('<' + s)

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 kapan sstring 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 adi tempat a if test else buntuk menyimpan satu byte. Kasus dasar rekursi terjadi ketika string berakhir atau Pac-Man kehabisan pelet, secara ringkas direpresentasikan sebagai s*p, yang sama dengan ''(dan karenanya bernilai false) ketika salah satu s == ''atau p == 0.

beiju
sumber
8

C #, 269 256 232 212 211 Bytes

Posting 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

static void p(string x){int p=0,i=0;string t='<'+x;var s=t.ToCharArray();for(;++i<s.Length;){if("PELpel".Contains(s[i]))p++;if("GHOSghos".Contains(s[i])&&--p<0)break;s[i]='<';if(i>0)s[i-1]='_';}Console.Write(s);}

Versi tidak disatukan

static void p(string x) {
 int p = 0, i = 0;
 string t = '<' + x;
 var s = t.ToCharArray();
 for (; ++i < s.Length;) {
  if ("PELpel".Contains(s[i])) p++;
  if ("GHOSghos".Contains(s[i]) && --p < 0) break;
  s[i] = '<';
  if (i > 0) s[i - 1] = '_';
 }
 Console.Write(s);
}
Andrew
sumber
1
Anda dapat mengganti tipe dalam variabilitaspercayaan menggunakan kata kunci var. mis. var temp = '' + input; Untuk loop dapat ditulis ulang untuk menyimpan 4 karakter: untuk (var i = 0; i ++ <s.Length;)
CSharpie
1
Anda dapat menggunakan koma untuk deklarasi "int i = 0, p = 0; string P =" PELpel ", G =" GHOSghos ", t = '' + x;" dan perubahan dari @CSharpie, membuat loop "for (; i ++ <s.Length;)". Selain itu, Anda dapat "Console.Write (s);" langsung dengan total 235 byte.
Nickson
1
Saya pikir itu juga harus bekerja tanpa elsemenyimpan 5 karakter lagi. Dan dengan memulai loop pada i = 1Anda harus dapat menghapus yang terakhir jika sebagai kode dapat dieksekusi setiap saat.
Frozn
1
Anda dapat menyingkirkan c deklarasi Anda dan cukup sebaris s[i]akses untuk 5 karakter.
JustinM
1
Apakah itu layak ditugaskan P="PELpel"dan G="GHOSghos"? Anda hanya menggunakannya sekali masing-masing. Apakah saya kehilangan sesuatu, atau hanya 4 karakter tambahan? Juga, apakah Anda memerlukannya else? "PELpel".Contains(c)dan "GHOSghos".Contains(c)harus saling eksklusif.
jpmc26
7

Pyth, 53 48 44 byte

4 byte terima kasih kepada @ Pietu1998 untuk trik !!@-> }(yang hanya orang yang tahu Pyth bisa mengerti)

++ * Jf <@ + sM._m - !! @ d "PELpel" !! @ d "GHOSghos" Q_1T00 \ _ \ <> QJ 
++ * Jf <@ + sM._m - !! @ d "PEL" !! @ d "GHOS" rQ1_1T00 \ _ \ <> QJ
++ * Jf <@ + sM._m-} d "PEL"} d "GHOS" rz1_1T00 \ _ \ <> zJ

Suite uji.

Biarawati Bocor
sumber
17
yang hanya orang yang tahu Pyth yang bisa mengerti. Nah, seperti sisa kode lainnya, tentu saja
Luis Mendo
4
@LuisMendo Agar adil bagi orang yang tidak mengenal Pyth, saya cukup yakin sebagian besar dari mereka dapat memahami bahwa persimpangan set antara satu set singleton dan set lainnya yang memiliki anggota sama dengan anggota set singleton menjadi anggota set yang lebih besar: P
FryAmTheEggman
1
@FryAmTheEggman sangat jelas !!@hanya sebuah trigraph }, kan? : p
CAD97
7

MATL , 37 36 35 byte

tkt'ghos'mw'pel'm-Ys1=Y>&)g95*60bhh

Cobalah online!

Penjelasan

tkt      % Input string implicitly. Duplicate, convert to lower case, duplicate
'ghos'm  % True for "ghost" characters
w'pel'm  % Swap to bring lowercase copy to top. True for "pellet" characters
-Ys      % Subtract, cumulative sum. Pac-Man can reach until the first "1"
1=       % True for entries that equal 1
Y>       % Cumulative maximum. This gives false until the first true is found, and
         % true from there on
&)       % Split original string in two parts, given by the zeros and ones respectively
g95*     % Convert the first part into ones and multiply by 95. This gives a numerical
         % array containing number 95 (ASCII for '_')
60       % Push 60 (ASCII for '<')
b        % Bubble up second part of original string
hh       % Concatenate the three strings/arrays, automatically converting to char
Luis Mendo
sumber
7

JavaScript (ES6), 98 byte

s=>s.replace(/./g,c=>p<0?c:(p+=/[elp]/i.test(c)-/[ghos]/i.test(c))<0?"<"+c:"_",p=0)+"<".slice(p<0)

Penjelasan: pmempertahankan 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 itu pmenjadi negatif, kami menyisipkan <karakter, jika tidak kami ganti dengan karakter saat ini _. Akhirnya, jika ptidak pernah menjadi negatif, kita sufiks a <ke string.

Neil
sumber
4

Pyth, 47 46 44 byte

++*\_Kh+f!h=+Z-}Jr@zT0"pel"}J"ghos"Uzlz\<>zK

Cobalah online. Suite uji.

Pendekatan yang sangat berbeda dari Leaky Nun, dan saya cukup yakin ini bisa bermain golf lebih lanjut.

PurkkaKoodari
sumber
Gunakan Zsebagai ganti Gdan ubah f!kef!h
Leaky Nun
@ LeakyNun Baru tahu itu di tab lain juga. Terima kasih.
PurkkaKoodari
2
Saya pikir tdi "ghost"harus dihapus
Leaky Nun
Jika kita terus bermain golf solusi kita, apa perbedaan yang menentukan antara solusi kita?
Leaky Nun
@ LeakyNun Saya tidak yakin yang mana yang lebih dekat, tetapi upaya pertama saya membuat saya 43 byte , dan saya rasa saya tidak perlu menambahkan jawaban ketiga. Mungkin kita harus bekerja sama di chatroom Pyth?
FryAmTheEggman
4

Lua, 198 190 184 185 163 Bytes

Ok, 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

i=0p=0n=...for c in n:gmatch"."do
p=p+(c:find"[ghosGHOS]"and-1or c:find"[pelPEL]"and 1or 0)if p<0then
break else i=i+1 end end print(('_'):rep(i)..'<'..n:sub(i+1))

185 tahun

p=0z=(...):gsub(".",function(c)p=p+(c:find"[ghosGHOS]"and-1or
c:find"[pelPEL]"and 1or 0)s=p<0 and 1or s
return s and c or'_'end)_,i,s=z:find"(_+)"print((s or'')..'<'..z:sub(1+(i or 0)))

Tidak disatukan

i=0                        -- number of characters eaten
p=0                        -- pellet counter
n=...                      -- shorthand for the argument
for c in n:gmatch"."       -- iterate over each characters in the input
do
  p=p+(c:find"[ghosGHOS]"  -- if the current char is a GHOST
        and-1              -- decrement the pellet counter
      or c:find"[pelPEL]"  -- if it's a PELLET
        and 1              -- increment it
      or 0)                -- else, leave it alone
  if p<0                   -- if we try to eat a ghost without pellet
  then 
    break                  -- stop iterating
  else
    i=i+1                  -- else, increment our score
  end
end

print(('_'):rep(i)         -- print i*'_'
  ..'<'                    -- appended with Pacman
  ..n:sub(i+1))            -- appended with the remaining characters if we died
Katenkyo
sumber
Hapus d=c:lower()dan cari karakter huruf besar juga
Leaky Nun
and 1or s and 1or s s and s
Leaky Nun
@ LeakyNun tidak melihat bahwa akan lebih pendek untuk hanya menulis semua huruf ... Terima kasih. Juga, komentar kedua menyebutkan sesuatu yang saya ubah, tetapi hanya di ungolfed> _ <
Katenkyo
print(('').rep('_',i)..','..z:sub(i+1))
Leaky Nun
@ LeakyNun Saya sedang mengerjakan solusi yang serupa, tetapi masalahnya berasal dari fakta yang ibisanil
Katenkyo
3

Python 3, 176 157 150 149 134 133 124 byte

Tentukan fungsi bernama fyang mengambil string sebagai argumen

def f(s):
 n=i=0
 for c in s:
  if c in"GgHhOoSs":
   if n:n-=1
   else:break
  n+=c in"PpEeLl";i+=1
 return"_"*i+"<"+s[i:]

Mungkin bisa bermain golf lebih banyak

Terima kasih kepada semua orang yang berkomentar: D

TuxCrafting
sumber
1
﹐ Hapus x=c.upper()dan cari kecocokan huruf kecil
Leaky Nun
Anda dapat menyimpan beberapa dengan menulis beberapa ekspresi pada baris yang sama dipisahkan oleh ;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.
Denker
n=i=0, tidak n=0dan i=0. t[i]="_"bukannya t[i] = "_", sama untuk t[i] = "<". return''.join(t), hapus ruang itu.
Erik the Outgolfer
@ LeakyNun Ada huruf besar di dalam testcases.
TuxCrafting
@ TùxCräftîñg Tidak, maksud mereka "GgHhOoSs"dan "PpEeLl".
Erik the Outgolfer
2

Python 3, 114 110 byte

Golf kode pertama saya.

Terima kasih kepada Dr Green Eggs dan Iron Man untuk menghemat 4 byte.

l,x=1,0
f,y,s="ghosGHOS","pelPEL",input()
while s[x:]*l:l+=(s[x]in y)-(s[x]in f);x+=l>0
print("_"*x+"<"+s[x:])

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.

Lemon dirusak
sumber
Jawaban yang bagus, dan selamat datang di situs! Versi python mana yang Anda gunakan? Anda mungkin ingin menentukan itu. Juga, saya belum mengujinya, tetapi Anda mungkin dapat melakukannya while s[x:]*luntuk melepas 4 byte.
DJMcMayhem
1

Powershell, 185

{$l=1;$o="";for($i=0;($i -lt $_.Length) -or (($o+="<") -and 0); $i++){if ($_[$i] -match '[pel]'){$l++}if($_[$i] -match '[ghos]'){$l--}if(!$l){$o+="<"+$_.substring($i);break}$o+="_"}$o}

Tidak Disatukan:

("Pacman wins!",
"Pacman loses wah-wah :(",
"PELLET PELLET GHOST",
"Hello World!"
) | 
% {
    $l=1;$o="";
    for($i = 0; ($i -lt $_.Length) -or (($o+="<") -and 0); $i++) {
        if ($_[$i] -match '[pel]') { $l++ }
        if ($_[$i] -match '[ghos]') { $l--}
        if (!$l) { $o+="<"+$_.substring($i); break }        
        $o += "_"
    }
    $o
}
Eris
sumber
1

Python3, 211 184 byte

Argumen 'adalah' string

def f(s):
    p=c=0
    for i in s:
        if i in "gGhHoOsS":
            if p<1:break
            else:p-=1
        if i in "pPeElL":p+=1
        c+=1
    return"_"*c + "<" + s[c:]

Saya akan menghargai tips golf karena ini adalah upaya golf kode pertama saya

Terima kasih telah berkomentar :)

Isaac Greene
sumber
2
Selamat Datang di Programming Puzzles & Code Golf! Beberapa tips: Ada banyak ruang putih yang tidak perlu di antara operator. Menghapusnya akan menghemat banyak byte. Anda juga dapat menggunakan Python 2, yang memungkinkan Anda untuk menggunakan spasi sebagai level intendasi pertama dan tab untuk yang lainnya.
Denker
1
Anda dapat mengganti yang pertama return "_"*c + "<" + s[c:]hanya dengan breakkode yang akan dieksekusi setelah for loop anyways.
Arfie
Cobalah online! Saya mendapat 183 byte. Apakah ada baris baru yang Anda hitung?
Pavel
1

Haskell, 119 113 Bytes

Terima kasih kepada Daniel Wagner untuk 6 byte lebih sedikit.

p=(0!)
n!(c:s)|elem c"ghosGHOS"=if n<1then '<':c:s else(n-1)&s|elem c"elpELP"=(n+1)&s|0<1=n&s
_!_="<"
n&s='_':n!s

Sebut saja sebagai p "Hello World!".

Ini 1thenadalah 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:

pacman string = go 0 string

-- | In the golfed version: (!)
go _   []                   = "<"                            -- won
go pellets (char:string)
 | char `elem` "ghosGHOS"
 = if pellets < 1        then '<':char:string                -- lost
                         else nextStep (pellets - 1) string  -- ghost
 | char `elem` "elpELP"
 =                            nextStep (pellets + 1) string  -- pellet
 | otherwise
 =                            nextStep  pellets      string  -- anything else

-- | In the golfed version: (&)
nextStep pellets string = '_':(go pellets string)
Marlin
sumber
1
Anda dapat menyimpan beberapa byte dengan meletakkan semua penjaga pada baris yang sama, misalnya n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah.
Daniel Wagner
@ Daniel Wagner Tip yang bagus, terima kasih!
Marlin
Bisakah Anda menambahkan tautan TIO ? Saya terus mendapatkan kesalahan ketika saya mencoba membuatnya bekerja.
Pavel
1

C, 237 byte

#include<stdio.h>
#include<string.h>
main(p,i,j){char s[99];fgets(s,99,stdin);for(p=i=0;s[i];++i){if(strchr("GHOSghos",s[i])){if(p)p--;else break;}else if(strchr("PELpel",s[i]))p++;}j=i-(s[i]==0);while(j--)printf("_");printf("<%s",s+i);}
pengguna2064000
sumber
1

C ++, 315 373 327 Bytes

(Catatan: masih bermain golf)

#include <iostream>
#include <string>
using namespace std;
int main(){string input;getline(cin, input);
if(input.find("Pac-Man loses")!=string::npos||input.find("Pacman loses")!=string::npos)
    cout<<"<"<<input.substr(15,input.length()-1);
else{for(unsigned i=0;i<=input.length();++i)
    cout << "_";
cout<<"<";
}return 0;
}
tachma
sumber
1
Pac-Man tidak kalah ketika seharusnya.
tildearrow
Hai @tildearrow, terima kasih telah meninjau kode saya! Saya akan memperbarui posting saya.
tachma
Saya pikir ini bisa lebih banyak golf. Mencoba menghapus baris / spasi setelah if(), dan menghapus ruang di sekitar !=, ||, =, -, dan <=. Juga, tidak cin>>inputberhasil bukan getline? Anda juga bisa mengembun di sekitar ;.
NoOneIsHere
@NoOneIsHere, terima kasih atas komentar Anda! Saya sebenarnya baru mengenal golf code, jadi saya akan mencoba golf kode saya lagi dan memperbarui posting saya. Jika Anda memiliki saran bermanfaat lainnya tentang kode-golf, saya akan sangat menghargainya.
tachma
1
Anda dapat melihat Tips untuk bermain golf C / C ++ .
NoOneIsHere
1

Ruby, (119 byte)

q=i=0;a=$**" ";a.split(//).each{|c|q+=((c+?p=~/[ple]/i)^1)-((c+?g=~/[ghos]/i)^1);q<0?break : i+=1};p ?_*i+?<+a[i..-1]

Mungkin ada beberapa hal yang saya lewatkan karena saya baru dalam hal ini ...

Ruby adalah temanku :)

pottedmeat7
sumber
1
Selamat datang di PPCG!
FlipTack
0

Perl, 54 (52 + 2) byte

s/([pel](?1)*[ghos]|[^ghos
])*/'_'x(length$&).'<'/ei

Harus -pditentukan dalam opsi baris perintah.

Penjelasan:

The -ppilihan 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:

  • Ini adalah karakter dalam PELLETkecuali untuk T, diikuti oleh string yang dapat diterima, diikuti oleh karakter dalam GHOSTkecuali untuk T.
  • Ini adalah karakter yang tidak ada di dalam GHOSTkecuali untuk Tyang bukan karakter baris baru.
  • Ini adalah gabungan dari sejumlah (termasuk 0) string yang dapat diterima.

Definisi ini memungkinkan lebih banyak pelet daripada hantu: PELkarakter 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 <.

hvd
sumber
iirc flags seperti -p count masing-masing satu byte.
Pavel
1
@Pavel Ini rumit. Jika doa normal tanpa -psudah digunakan -, misalnya perl -e-> perl -pe, maka -itu gratis. Tapi saya pikir perl -eversinya lebih panjang karena mengutip, jadi saya pikir saya tidak bisa menggunakannya di sini.
hvd