Decoder 2000 Profesor Schwartzman Acme Canine

31

pengantar

Kami - terutama orang-orang aneh di antara kami, yang cenderung menjadi penggemar - semua mengingat kartun Far Side yang lama ini :

Hei!  Hei!  Hei!

Jelas, Profesor Schwartzman dapat memoles keterampilan pemrogramannya sedikit lebih lama sebelum ia menggunakan penemuannya. Tetapi bisakah Anda mereplikasi sendiri ... menggunakan sesedikit mungkin byte?

Spesifikasi Input

Anda harus membuat skrip yang menerjemahkan suara anjing menjadi "Hei" yang dilantunkan dengan tepat. Ini adalah golf kode murni; jumlah byte terendah menang.

Input Anda akan terdiri dari beberapa kombinasi token berikut:

  • Bark, Baark, Baaark, Baaaark, ... (yaitu, B*rk dengan setidaknya 1 amengganti tanda bintang)
  • Woof, Wooof, Woooof, ... ( W*fdengan setidaknya 2 o s menggantikan tanda bintang)
  • Grr, Grrr, Grrrr, ..., ( Gdiikuti sedikitnya 2 r s)
  • Sejumlah .(periode), !(tanda seru) dan / atau ?(tanda tanya) karakter, yang dapat terjadi di mana saja di input

Perhatikan, sekali lagi, bahwa token berbasis- Woofdan Grrberbasis selalu masing-masing membutuhkan setidaknya dua o dan r; Wofdan Gryang tidak token valid.

Tidak ada batasan berapa lama token bisa (misalnya, berapa banyak token yang abisa ada dalam Barktoken); Namun, dekoder Anda hanya perlu bekerja dengan benar untuk token input hingga 10 total a, os, atau rs untuk melewati tantangan ini.

Spesifikasi Keluaran

Sesuai dengan desain Schwartzman, program dekoder anjing Anda harus memprosesnya menjadi teks keluaran sebagai berikut:

  • Bark,, Woofdan Grrmenjadi Hey;
  • Baark,, Wooofdan Grrrmenjadi Heyy;
  • Baaark,, Woooofdan Grrrrmenjadi Heyyy; dll.
  • Untuk semua Barktoken berbasis, jumlah ys dalam Heytoken berbasis keluaran harus sama dengan jumlah as;
  • Untuk semua Wooftoken berbasis, jumlah ys dalam Heytoken berbasis- keluaran harus satu lebih sedikit dari jumlah os;
  • Untuk semua Grrtoken berbasis, jumlah ys dalam Heytoken berbasis- keluaran harus satu lebih sedikit dari jumlah rs;
  • Semua tanda baca ( ., !, dan ?) yang tersisa tidak berubah.

Ingatlah untuk menjatuhkan satu ydari output hanya untuk Woofdan Grrhanya! Input Baaaaaaaark?, dengan 8 adetik, akan menjadi Heyyyyyyyy?, dengan satu set 8 ydetik yang cocok. Namun, Woooooooof?menjadi hanya Heyyyyyyy?, dengan 7 ydetik.

Sekali lagi, jika Anda bisa membuat program Anda bekerja untuk token input dengan ukuran tidak terbatas, itu bagus, tetapi untuk tujuan tantangan ini, program Anda hanya akan diperiksa untuk memastikan bahwa itu berfungsi dengan baik untuk token input yang tidak memiliki lebih dari 10 huruf berulang .

Semua Bark-, Woof-, dan- Grrtoken berbasis pada input Anda diasumsikan dimulai dengan huruf kapital. Oleh karena itu, tidak perlu menangani perubahan Bark grrrmenjadi Hey heyyatau hal serupa lainnya.

Contoh Input dan Output

    • Memasukkan: Bark. Bark! Bark!!
    • Keluaran: Hey. Hey! Hey!!
    • Input: Baaaaaark?(enam as)
    • Output: Heyyyyyy?(enam ys)
    • Input: Grrrrrrrr...(delapan rs)
    • Output: Heyyyyyyy...( tujuh y s)
    • Memasukkan: ?...!
    • Keluaran: ?...!
    • Memasukkan: Wooof Woof? Grrrr. Baaaark Grr!
    • Keluaran: Heyy Hey? Heyyy. Heyyyy Hey!
A. Mirabeau
sumber
10
Hai, dan selamat datang di situs ini! Asal tahu saja, sudah lazim di situs ini menunggu sebentar sebelum menerima jawaban terpendek. Saya mendorong Anda untuk tidak menerima jawaban yang telah Anda terima, dan menunggu sampai aktivitas pada pertanyaan ini mereda sebelum menerima jawaban terpendek. Ini juga akan mendorong lebih banyak jawaban.
DJMcMayhem
Terkait
Martin Ender
Terima kasih atas tips tentang proses penerimaan. Saya sebenarnya berencana memeriksa daftar jawaban setiap beberapa jam dan, jika saya perhatikan ada jawaban yang lebih baik, terima saja. Maaf untuk siapa pun yang saya mungkin telah menolak reputasinya di sini.
A. Mirabeau
5
@ A. Mirabeau Itu terhormat dan bagaimana itu bekerja idealnya, tetapi beberapa orang tidak begitu perhatian, sehingga sebagian besar penjawab mungkin menganggap bahwa pemenang telah dipilih. Meskipun tidak ada yang salah dengan memilih pemenang segera jika Anda berencana untuk memperbaruinya, Anda kemungkinan akan mendapatkan lebih sedikit jawaban karena itu bersama dengan beberapa keluhan, jadi biasanya lebih baik menunggu setidaknya satu minggu.
Martin Ender

Jawaban:

16

Retina , 24 18 17 16 byte

1 byte disimpan berdasarkan ide dalam jawaban MT0.

\wf?k?
y
\byy
He

Cobalah online!

Penjelasan

\wf?k?
y

Ini hanya mengubah semua huruf menjadi y, tetapi jika diikuti oleh fatau kkami segera menggantinya juga. Dengan menghapus fdan kkami "menormalkan" panjang kata-kata sehingga mereka sekarang memiliki dua lebih ydari yang mereka butuhkan.

\byy
He

Ini mengubah dua ykata pertama dari setiap kata menjadi He, menyelesaikan transformasi.

Martin Ender
sumber
Jawaban paling efisien sejauh ini, dilakukan dengan baik. Saya tidak akan menerimanya dulu, tetapi saya dapat memberitahu Anda bahwa Anda pantas mendapatkan CAT FUD.
A. Mirabeau
10

Perl, 51 41 39 byte

s/(G.|[BW]..)(\w+)/He."y"x length$2/ge

Pemakaian

perl -pE 's/(G.|[BW]..)(\w+)/He."y"x length$2/ge'

Memasukkan

Bark. Bark! Bark!!
Baaaaaark?
Grrrrrrrr...
?...!
Wooof Woof? Grrrr. Baaaark Grr!

Keluaran

Hey. Hey! Hey!!
Heyyyyyy?
Heyyyyyyy...
?...!
Heyy Hey? Heyyy. Heyyyy Hey!

Bagaimana itu bekerja

Substitusi regexp sederhana menggunakan pencetakan otomatis -pmenambahkan 1 byte ke hitungan. /gemengeksekusi substitusi untuk setiap pola, dan menjalankan penggantian sebagai kode.


Versi yang lebih lama menggunakan deteksi tiga arah, tetapi Martin Ender memperhatikan bahwa saya tidak cukup agresif, yang menyelamatkan saya 10 byte.

msh210 memberi tahu saya bahwa Anda tidak perlu tanda kutip di sekitar string He, menghemat dua byte.

pipa
sumber
2
Yang terbaik sejauh ini, selamat.
A. Mirabeau
1
@ A. Mirabeau Terima kasih, itu pujian yang cukup mengingat saya baru saja mendaftar di sini beberapa menit yang lalu!
pipa
Memiliki tiga solusi memotivasi mengingat saya baru saja mendaftar di sini beberapa jam yang lalu.
A. Mirabeau
1
Anda tidak perlu mengutip He.
msh210
@ msh210 Menarik, tidak tahu Anda diizinkan menghilangkannya di sana!
pipa
5

Python, 106 byte

f=lambda s,a="B,He,Gr,He,Wo,He,a,y,r,y,o,y,f,,yk,".split(","):s if a==[]else f(s.replace(a[0],a[1]),a[2:])

Demo

https://repl.it/C6Rr

Chuck Morris
sumber
Meskipun bukan jawaban yang diterima, jawaban ini pantas disebut terhormat karena merupakan solusi paling efisien byte yang hanya mengubah tiga kata kunci bahasa anjing yang diperlukan.
A. Mirabeau
4

JavaScript (ES6) - 57 55 52 51 Bytes

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He')

Uji:

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He');

[
  'Bark. Bark! Bark!!',
  'Baaaaaark?',
  'Grrrrrrrr...',
  '?...!',
  'Wooof Woof? Grrrr. Baaaark Grr!'
].forEach( s=>{console.log( f(s) );} );

Terima kasih kepada @MartinEnder untuk byte 56 & 51 dan inspirasi untuk beberapa serutan lainnya.

MT0
sumber
4

Vimscript, 51 39 37 33 32 29 28 byte,

%s/\hk\?f\?/y/g|%s/\<yy/He/g

Kredit Regex untuk mencukur 9 byte lebih: MT0, Martin Ender, msh210

asciicast Demo

Penjelasan:

                               1. Normalize words to same length & replace letters with ys 

%s                             Regex search and replace 
  /                            Regex search begin
   \hk\?f\?                    Find any letter (\h) optionally followed by k or f
           /                   Regex search end and replace start
            y                  Replace with y
             /                 Replace end
              g                Replace globally

               |               New command

                               2. Overwrite first two y of every word with He

                %s             Regex search and replace
                  /            Regex search begin
                   \<yy        Find yy at a word's beginning
                        /      Regex search end and replace start
                         He    replace with He
                           /   Replace end
                            g  Replace globally
starcorder
sumber
1
Saya tidak tahu Vimscript, tetapi dapat Anda gunakan \<yybukan \<\hy?
msh210
@ msh210 ya itu mungkin dan saya memperbarui solusinya, terima kasih
starcorder
2

Perl 5, 25 byte

Salinan Perl dari jawaban Retina Martin Ender . 24 byte, ditambah 1 untuk -pebukannya -e.

s;\wf?k?;y;g;s;\byy;He;g
msh210
sumber
2

Javascript, 72 66 64 Bytes

f=
t=>t.replace(/k|f/g,'').replace(/\w/g,'y').replace(/\byy/g,'He')

Sunting: dipisahkan f=dan berfungsi + jumlah byte dikurangi

starcorder
sumber
1
Anda tidak memerlukan f=(sebagai default PPCG), jadi 64 byte berfungsi.
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Hebat, saya tidak tahu ini
starcorder
1

Pyke, 35 byte

.cFDlR\G.^+3-\y*"He"R+)Rdc~lL-],AsJ

Coba di sini!

Menghasilkan Heys, Menghasilkan tanda baca, ritsleting bersama, bergabung

Biru
sumber
1

Python 3, 140 135 134 byte

from re import*
f=lambda s:''.join('He'+'y'*len(x)+y for x,y in[(a+b+c,d)for a,b,c,d in findall('(?:Wo(o+)f|Gr(r+)|B(a+)rk)(\W+)',s)])

Menggunakan regex untuk menemukan kemunculan karakter yang dapat diganti.

Sunting: Golfed 1 byte spasi putih dan 4 byte untuk mendapatkan nilai dari hasil findall.

Edit2: Golfed 1 byte (Bark's "a" tidak dihitung dengan benar)

Gábor Fekete
sumber