Profesör Schwartzman'ın Acme Canine Dekoder 2000


31

Giriş

Biz - özellikle de aramızdaki meraklılar, hayran olma eğiliminde olan - hepimiz bu eski Far Side karikatürünü hatırlıyorum :

Hey!  Hey!  Hey!

Açıkçası, Profesör Schwartzman, kullanmaya icadı koymadan önce programlama becerilerinden biraz daha fazla yararlanabilirdi. Ama mümkün olduğu kadar az bayt kullanarak ... kendiniz çoğaltabilirsiniz?

Giriş Özellikleri

Köpek seslerini uygun şekilde tonlanmış "Hey" lere çeviren bir komut dosyası oluşturmalısınız. Bu saf kod golf; en düşük bayt sayısı kazanır.

Girişiniz aşağıdaki belirteçlerin bir kombinasyonundan oluşacaktır:

  • Bark, Baark, Baaark, Baaaark, ... (olduğunu, B*rk en az 1 olan ayıldız işareti yerine)
  • Woof, Wooof, Woooof, ... ( W*fen azından ile 2 o s yıldız işareti yerine)
  • Grr, Grrr, Grrrr, ..., ( Gen azından, ardından 2 r s)
  • Girdide herhangi bir yerde meydana gelebilecek herhangi bir sayıda .(nokta), !(ünlem işareti) ve / veya ?(soru işareti) karakteri

Yine, Wooftabanlı ve Grrtabanlı belirteçlerin daima en az iki o saniye ve rs gerektirdiğini unutmayın ; Wofve Grvardır değil geçerli belirteçleri.

Bir jetonun ne kadar süre olabileceği konusunda bir sınır yoktur (örneğin, bir jetonda kaç tekrarlanan aolabilir Bark); bununla birlikte, kod çözücünüzün yalnızca toplamda 10a sn, osn veya rsn olan giriş belirteçleri için doğru şekilde çalışması gerekir .

Çıkış özellikleri

Schwartzman'ın tasarımına sadık kalarak, köpek dekoder programınız aşağıdaki şekilde çıktı metnine dönüştürmelidir:

  • Bark, Woofve Grrhaline Hey;
  • Baark, Wooofve Grrrhaline Heyy;
  • Baaark, Woooofve Grrrrhaline Heyyy; vb.
  • Tüm Barktabanlı belirteçler için, yçıktı Heytemelli belirtecin içindeki as sayısı, s sayısına eşit olmalıdır ;
  • Tüm Wooftabanlı belirteçler için, yçıktı Heytemelli belirtecin içindeki s sayısı, s sayısından daha az olmalıdır o;
  • Tüm Grrtabanlı belirteçler için, yçıktı Heytemelli belirtecin içindeki s sayısı, s sayısından daha az olmalıdır r;
  • Tüm noktalama işaretleri ( .,, !ve ?) değişmeden bırakılır.

Sadece s ve s yiçin çıktıdan bir tane bırakmayı unutmayın ! 8 s'lik giriş , 8 s'lik eşleşen bir setle olacak . Ancak, 7 s ile , sadece olur .WoofGrrBaaaaaaaark?aHeyyyyyyyy?yWoooooooof?Heyyyyyyy?y

Yine, programınızın sınırsız büyüklükteki giriş belirteçleri için çalışmasını sağlayabilirsiniz, bu harika, ancak bu zorluğun amaçları için, programınız yalnızca 10'dan fazla tekrarlanan harfe sahip olmayan giriş belirteçleri için doğru çalıştığından emin olmak için kontrol edilecektir. .

Girişteki tüm Bark-, Woof- ve - Grrtemelli jetonların büyük harfle başlayacağı varsayılır. Bu nedenle, orada gerek kolu çevirme için Bark grrriçine Hey heyyveya benzer bir şey.

Örnek Girişler ve Çıkışlar

    • Giriş: Bark. Bark! Bark!!
    • Çıktı: Hey. Hey! Hey!!
    • Giriş: Baaaaaark?(altı as)
    • Çıktı: Heyyyyyy?(altı ys)
    • Giriş: Grrrrrrrr...(sekiz rsaniye)
    • Çıktı: Heyyyyyyy...( yedi y s)
    • Giriş: ?...!
    • Çıktı: ?...!
    • Giriş: Wooof Woof? Grrrr. Baaaark Grr!
    • Çıktı: Heyy Hey? Heyyy. Heyyyy Hey!

10
Merhaba, siteye hoş geldiniz! Sadece bildiğiniz gibi, bu sitede en kısa cevabı kabul etmeden önce bir süre beklemek alışılmış. Kabul ettiğiniz cevabın kabul edilmemesini ve en kısa cevabı kabul etmeden önce bu sorudaki faaliyetin sona ermesini bekleyin. Bu aynı zamanda daha fazla cevabı teşvik edecektir.
DJMcMayhem


Kabul işlemiyle ilgili ipuçları için teşekkürler. Aslında birkaç saatte bir cevap listesini kontrol etmeyi planlıyordum ve daha iyi bir cevap geldiğini fark edersem kabul et. Buradaki itibarını reddettiğim için özür dilerim.
A. Mirabeau,

5
@ A.Mirabeau Onurlu ve nasıl ideal bir şekilde işe yaradığını, ancak bazı insanlar o kadar dikkatli değiller, bu nedenle çoğu cevap veren kazanan kişinin zaten seçildiğini varsayabilir. Güncellemeyi planlıyorsanız hemen kazanan seçmede yanlış bir şey olmamasına rağmen, bazı şikayetlerle birlikte daha az yanıt alacağınız için, genellikle en az bir hafta beklemek daha iyidir.
Martin Ender

Yanıtlar:


16

Retina , 24 18 17 16 bayt

MT0'ın cevabındaki bir fikre dayanarak 1 bayt kaydedildi.

\wf?k?
y
\byy
He

Çevrimiçi deneyin!

açıklama

\wf?k?
y

Bu basitçe tüm harfleri dönüştürür y, ancak bir tarafından takip edilirlerse fya da khemen değiştiririz. Çıkarmakla fve kkelimelerin uzunluklarını "normalize ediyoruz", böylece artık hepsinin yihtiyaç duyduklarından iki tane daha var .

\byy
He

Bu , dönüşümü tamamlayan yher kelimenin ilk ikisini Hedönüştürür.


Şimdiye kadarki en etkili cevap, aferin. Henüz kabul etmeyeceğim, ama CAT FUD’u hakettiğinizi söyleyebilirim.
A. Mirabeau

10

Perl, 51 41 39 bayt

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

kullanım

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

Giriş

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

Çıktı

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

Nasıl çalışır

Otomatik baskı kullanarak basit regexp ikamesi -psayıma 1 bayt ekler. /geher şablonun yerine koyma işlemini uygular ve yerine koyma kodunu çalıştırır.


Eski bir sürüm üç yollu bir algılama kullandı, ancak Martin Ender yeterince saldırgan olmadığımı fark etti, bu da 10 baytı kurtardı.

msh210He , iki bayttan tasarruf ederek dizgenin etrafında tırnaklara ihtiyacınız olmadığını söyledi .


2
Şimdiye kadarki en iyisi, tebrikler.
A. Mirabeau,

1
@ A.Mirabeau Teşekkürler, burayı birkaç dakika önce kaydettikten sonra iltifat ediyorum!
boru

Üç çözüme sahip olmak, birkaç saat önce burada kayıt yaptırdığım için motive edici.
A. Mirabeau,

1
Etrafında tırnak gerekmez He.
msh210

@ msh210 İlginç, onları orada atlamak için izin verildiğini bilmiyordum!
pipo

5

Python, 106 bayt

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:])

gösteri

https://repl.it/C6Rr


Kabul edilen cevap olmasa da, bu sadece üç gerekli köpek dili anahtar kelimesini değiştiren en yüksek baytlı çözüm olduğu için onurlu bir sözü hakediyor .
A. Mirabeau

4

JavaScript (ES6) - 57 55 52 51 Bayt

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

Ölçek:

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) );} );

Bayt 56 & 51 için @MartinEnder ve diğer bazı talaşların ilham kaynağı.


4

Vimscript, 51 39 37 33 32 29 28 bayt,

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

Regex 9 byte daha fazla tıraş için kredi: MT0, Martin Ender, msh210

asciicast gösteri

Açıklama:

                               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

1
Vimscript'i tanımıyorum ama \<yybunun yerine kullanabilir misiniz \<\hy?
msh210

@ msh210 evet bu mümkün ve çözümü güncelledik, teşekkürler
starcorder 19


2

Javascript, 72 66 64 Bayt

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

Düzenleme: ayrılmış f=ve işlev + azaltılmış bayt sayısı


1
Buna gerek yok f=(PPCG bir varsayılan olarak), bu yüzden 64 eser bayt.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Harika, bunu bilmiyordum
starcorder

1

Pyke, 35 bayt

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

Burada dene!

Heyler oluşturur, noktalama işaretleri oluşturur, birlikte fermuarlar yapar, katılır


1

Python 3, 140 135 134 bayt

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)])

Değiştirilebilir karakterlerin oluşumunu bulmak için regex kullanma.

Düzenleme: Golf 1 bayt boşluk ve 4 bayt sayılabilir sonuçtan değer elde etme.

Edit2: Golf 1 bayt (Bark "a" düzgün sayılmadı)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.