Acme Canine Decoder 2000 profesora Schwartzmana


31

Wprowadzenie

Wszyscy - zwłaszcza maniacy wśród nas, którzy są fanami - wszyscy pamiętamy tę starą kreskówkę z Far Side :

Hej!  Hej!  Hej!

Najwyraźniej profesor Schwartzman mógł odrobinę poprawić swoje umiejętności programistyczne, zanim zastosuje swój wynalazek. Ale czy możesz to samodzielnie odtworzyć ... używając jak najmniej bajtów?

Dane wejściowe

Musisz stworzyć skrypt, który tłumaczy odgłosy psa na odpowiednio intonowane „Hej”. To jest czysty golf; najniższa liczba bajtów wygrywa.

Twój wkład będzie składał się z kombinacji następujących tokenów:

  • Bark, Baark, Baaark, Baaaark, ... (to znaczy B*rk co najmniej 1 azastępując gwiazdka)
  • Woof, Wooof, Woooof... ( W*fz co najmniej 2 o a zastąpienie gwiazdka)
  • Grr, Grrr, Grrrr, ..., ( Gpo co najmniej 2 r S)
  • Dowolna liczba .(kropka), !(wykrzyknik) i / lub ?(znak zapytania), które mogą wystąpić w dowolnym miejscu na wejściu

Zauważ ponownie, że tokeny Woofoparte i Grroparte zawsze zawsze wymagają co najmniej dwóch o si r; Wofi nieGr są prawidłowymi tokenami.

Nie ma ograniczenia co do długości tokenów (np. Ile powtórzeń amoże znajdować się w Barktokenie); Jednak twój dekoder musi pracować poprawnie tylko dla żetonów wejściowych o wysokości do 10 sumy as, oS lub rS, aby przejść to wyzwanie.

Dane wyjściowe

Wierny projektowi Schwartzmana, twój program dekodera dla psów musi przetworzyć go na tekst wyjściowy w następujący sposób:

  • Bark, WoofI Grrstać Hey;
  • Baark, WooofI Grrrstać Heyy;
  • Baaark, WoooofI Grrrrstać Heyyy; itp.
  • W przypadku wszystkich Barktokenów liczba ys w Heytokenie opartym na danych wyjściowych musi być równa liczbie as;
  • W przypadku wszystkich Wooftokenów liczba ys na Heytokenie opartym na danych wyjściowych musi być o jeden mniejsza niż liczba os;
  • W przypadku wszystkich Grrtokenów liczba ys na Heytokenie opartym na danych wyjściowych musi być o jeden mniejsza niż liczba rs;
  • Cała interpunkcja ( ., !i ?) pozostaje niezmieniona.

Pamiętaj, aby usunąć jeden yz danych wyjściowych tylko dla Woofs i Grrs! Wejście Baaaaaaaark?z 8 as stanie się Heyyyyyyyy?z pasującym zestawem 8 ys. Jednak Woooooooof?staje się tylko Heyyyyyyy?, z 7 ys.

Ponownie, jeśli możesz sprawić, aby Twój program działał dla tokenów wejściowych o nieograniczonym rozmiarze, to świetnie, ale na potrzeby tego wyzwania Twój program zostanie sprawdzony tylko pod kątem prawidłowego działania tokenów wejściowych, które nie zawierają więcej niż 10 powtarzających się liter .

Zakłada się, że wszystkie Bark-, Woof- i Grroparte na tokenach w danych wejściowych zaczynają się od wielkich liter. Dlatego nie ma potrzeby radzenia sobie ze zmienianiem się Bark grrrw Hey heyycoś podobnego.

Przykładowe wejścia i wyjścia

    • Wkład: Bark. Bark! Bark!!
    • Wydajność: Hey. Hey! Hey!!
    • Dane wejściowe: Baaaaaark?(sześć as)
    • Wyjście: Heyyyyyy?(sześć ys)
    • Dane wejściowe: Grrrrrrrr...(osiem rs)
    • Wyjście: Heyyyyyyy...( siedem y s)
    • Wkład: ?...!
    • Wydajność: ?...!
    • Wkład: Wooof Woof? Grrrr. Baaaark Grr!
    • Wydajność: Heyy Hey? Heyyy. Heyyyy Hey!

10
Witam i witam na stronie! Po prostu wiesz, że na tej stronie zwykle czeka się chwilę przed zaakceptowaniem najkrótszej odpowiedzi. Zachęcam cię do nieakceptowania odpowiedzi, którą zaakceptowałeś, i czekam, aż zaniknie aktywność związana z tym pytaniem, zanim zaakceptujesz najkrótszą odpowiedź. To również zachęci do większej liczby odpowiedzi.
DJMcMayhem


Dziękujemy za wskazówki dotyczące procesu akceptacji. Właściwie planowałem sprawdzać listę odpowiedzi co kilka godzin i, jeśli zauważyłem, że pojawiła się lepsza odpowiedź, zaakceptuj ją. Przepraszam za każdego, kogo mogłem tutaj odmówić reputacji.
A. Mirabeau

5
@ A.Mirabeau To zaszczyt i jak by to działało idealnie, ale niektórzy ludzie nie są tak uważni, więc większość osób odpowiadających może założyć, że zwycięzca został już wybrany. Chociaż nie ma nic złego w wyborze zwycięzcy od razu, jeśli planujesz go zaktualizować, prawdopodobnie uzyskasz mniej odpowiedzi z tego powodu wraz z pewnymi skargami, więc zwykle lepiej poczekać co najmniej tydzień.
Martin Ender

Odpowiedzi:


16

Siatkówka , 24 18 17 16 bajtów

1 bajt zapisany na podstawie pomysłu w odpowiedzi MT0.

\wf?k?
y
\byy
He

Wypróbuj online!

Wyjaśnienie

\wf?k?
y

To po prostu zamienia wszystkie litery w y, ale jeśli są one poprzedzone znakiem flub k, również natychmiast je zastępujemy. Usuwając fi k„normalizujemy” długości słów, tak aby wszystkie miały teraz o dwa więcej ys niż potrzebują.

\byy
He

To zamienia pierwsze dwa ykażdego słowa He, kończąc transformację.


Najbardziej wydajna jak dotąd odpowiedź, dobra robota. Nie zamierzam tego jeszcze akceptować, ale mogę powiedzieć, że zasługujesz na CAT FUD.
A. Mirabeau,

10

Perl, 51 41 39 bajtów

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

Stosowanie

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

Wkład

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

Wydajność

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

Jak to działa

Proste podstawianie wyrażeń regularnych za pomocą automatycznego drukowania, -pdodając 1 bajt do liczby. /gewykonuje podstawienie dla każdego wzorca i uruchamia zamianę jako kod.


Starsza wersja używała wykrywania trójstronnego, ale Martin Ender zauważył, że nie byłem wystarczająco agresywny, co pozwoliło mi zaoszczędzić 10 bajtów.

msh210 poinformował mnie, że nie potrzebujesz cudzysłowów wokół ciągu He, oszczędzając dwa bajty.


2
Jak dotąd najlepszy, gratulacje.
A. Mirabeau,

1
@ A.Mirabeau Dzięki, to całkiem komplement, biorąc pod uwagę, że zarejestrowałem się tutaj kilka minut temu!
rura

Trzy rozwiązania są motywujące, biorąc pod uwagę, że zarejestrowałem się tutaj kilka godzin temu.
A. Mirabeau

1
Nie potrzebujesz cytatów He.
msh210

@ msh210 Ciekawe, nie wiedziałem, że możesz je tam pominąć!
rura

5

Python, 106 bajtów

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

Próbny

https://repl.it/C6Rr


Chociaż nie jest to odpowiedź zaakceptowana, ta zasługuje na wyróżnienie za najbardziej wydajne bajtowo rozwiązanie, które zmienia tylko trzy niezbędne słowa kluczowe w języku psim.
A. Mirabeau,

4

JavaScript (ES6) - 57 55 52 51 bajtów

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

Test:

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

Dzięki @MartinEnder za bajty 56 i 51 oraz inspirację dla niektórych innych wiórów.


4

Vimscript, 51 39 37 33 32 29 28 bajtów,

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

Kredyty Regex na golenie 9 kolejnych bajtów: MT0, Martin Ender, msh210

asciicast Próbny

Wyjaśnienie:

                               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
Nie znam Vimscript, ale czy możesz go użyć \<yyzamiast \<\hy?
msh210

@ msh210 tak, jest to możliwe i zaktualizowałem rozwiązanie, dzięki
starcorder


2

JavaScript, 72 66 64 bajtów

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

Edycja: oddzielone f=i funkcja + zmniejszona liczba bajtów


1
Nie potrzebujesz f=(domyślnie PPCG), więc działa 64 bajtów.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Świetnie, nie wiedziałem o tym
starcorder


1

Python 3, 140 135 134 bajtów

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

Używanie wyrażenia regularnego do znajdowania wystąpień znaków wymiennych.

Edycja: Golfed 1 bajtowy biały znak i 4 bajty po uzyskaniu wartości z wyniku wyszukiwania.

Edycja2 : 1 bajt w golfa („a” Bark nie został poprawnie policzony)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.