Acme Canine Decoder профессора Шварцмана 2000


31

Введение

Мы - особенно гики среди нас, которые склонны быть фанатами - все помнят этот старый мультфильм о Дальней стороне :

Привет!  Привет!  Привет!

Очевидно, профессор Шварцман мог бы еще чуть-чуть освежить свои навыки программирования, прежде чем использовать свое изобретение. Но можете ли вы повторить это самостоятельно ... используя как можно меньше байтов?

Входные характеристики

Вы должны создать сценарий, который переводит звуки собак в соответственно интонированные "Эй". Это чистый код гольф; выигрывает наименьшее количество байтов.

Ваш вход будет состоять из некоторой комбинации следующих токенов:

  • Bark, Baark, Baaark, Baaaark, ... (то есть, B*rk по крайней мере , 1 aзамена звездочки)
  • Woof, Wooof, Woooof, ... ( W*fс , по меньшей мере , 2 o с заменой звездочки)
  • Grr, Grrr, Grrrr, ..., ( с Gпоследующим по меньшей мере , 2 r с)
  • Любое количество символов .(точка), !(восклицательный знак) и / или ?(знак вопроса), которые могут встречаться в любом месте ввода

Обратите внимание, опять же, что токены на Woofоснове и на Grrоснове всегда требуют как минимум двух o s и rs соответственно; Wofи неGr являются действительными токенами.

Нет ограничений на длину токена (например, сколько повторных as может быть в Barkтокене); Однако, ваш декодер должен только работать правильно для входных лексем до 10 полных aс, oс, или rS передать этот вызов.

Выходные характеристики

В соответствии с замыслом Шварцмана, ваша программа-декодер для собак должна обработать его в выходной текст следующим образом:

  • Bark, WoofИ Grrстали Hey;
  • Baark, WooofИ Grrrстали Heyy;
  • Baaark, WoooofИ Grrrrстали Heyyy; и т.п.
  • Для всех Barkоснованных токенов число ys в выходном Heyтокене должно быть равно количеству as;
  • Для всех Woofоснованных токенов число ys в выходном Heyтокене должно быть на единицу меньше числа os;
  • Для всех Grrоснованных токенов число ys в выходном Heyтокене должно быть на единицу меньше числа rs;
  • Все знаки препинания ( ., !и ?) остается без изменений.

Не забудьте удалить один yиз выходных данных только для Woofs и Grrs! Ввод Baaaaaaaark?, с 8 aс, станет Heyyyyyyyy?, с совпадающим набором 8 yс. Правда, Woooooooof?становится только Heyyyyyyy?, с 7 yс.

Опять же, если вы можете заставить свою программу работать на входных токенах неограниченного размера, это здорово, но для этой задачи ваша программа будет проверяться только на то, чтобы убедиться, что она работает правильно для входных токенов, которые имеют не более 10 повторяющихся букв ,

Все Bark-, Woof-, и Grr-На маркеры в вашем входе предполагается начать с заглавной буквы. Таким образом, нет никакой необходимости , чтобы ручки поворота Bark grrrв Hey heyyили что - нибудь подобное.

Пример входов и выходов

    • Входные данные: Bark. Bark! Bark!!
    • Выход: Hey. Hey! Hey!!
    • Вход: Baaaaaark?(шесть aс)
    • Выход: Heyyyyyy?(шесть yс)
    • Ввод: Grrrrrrrr...(восемь rс)
    • Выход: Heyyyyyyy...( семь y с)
    • Входные данные: ?...!
    • Выход: ?...!
    • Входные данные: Wooof Woof? Grrrr. Baaaark Grr!
    • Выход: Heyy Hey? Heyyy. Heyyyy Hey!

10
Привет и добро пожаловать на сайт! Просто чтобы вы знали, на этом сайте принято подождать некоторое время, прежде чем принять кратчайший ответ. Я призываю вас не принимать ответ, который вы приняли, и подождать, пока активность в этом вопросе не прекратится, прежде чем принимать самый короткий ответ. Это также будет стимулировать больше ответов.
DJMcMayhem


Спасибо за советы, касающиеся процесса принятия. На самом деле я планировал проверять список ответов каждые несколько часов и, если заметил, что пришел лучший ответ, примите его. Извините за кого-то, что я, возможно, отрицал репутацию здесь.
А. Мирабо

5
@ A.Mirabeau Это честно, и как это будет работать в идеале, но некоторые люди не так внимательны, поэтому большинство отвечающих могут предположить, что победитель уже выбран. Хотя нет ничего плохого в том, чтобы сразу выбрать победителя, если вы планируете его обновить, вы, скорее всего, получите меньше ответов из-за него вместе с некоторыми жалобами, поэтому обычно лучше подождать как минимум неделю.
Мартин Эндер

Ответы:


16

Сетчатка , 24 18 17 16 байт

1 байт сохранен на основе идеи в ответе МТ0.

\wf?k?
y
\byy
He

Попробуйте онлайн!

объяснение

\wf?k?
y

Это просто превращает все буквы в y, но если за ними следует fили, или kмы немедленно заменим это. Удаляя fи kмы «нормализуем» длины слов, чтобы у всех них было на два больше больше, yчем нужно.

\byy
He

Это превращает первые два yкаждого слова в He, завершая преобразование.


Самый эффективный ответ на данный момент, хорошо сделано. Я пока не собираюсь это принимать, но могу сказать, что вы заслуживаете CAT FUD.
А. Мирабо

10

Perl, 51 41 39 байт

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

использование

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

вход

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

Выход

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

Как это работает

Простая подстановка регулярных выражений с использованием автопечати с -pдобавлением 1 байта к счетчику. /geвыполняет замену для каждого шаблона и выполняет замену как код.


В старой версии использовалось трехстороннее обнаружение, но Мартин Эндер заметил, что я недостаточно агрессивен, что позволило мне сэкономить 10 байт.

msh210 сообщил мне, что вам не нужны кавычки вокруг строки He, сохраняя два байта.


2
Лучший на сегодняшний день, поздравляю.
А. Мирабо

1
@ A.Mirabeau Спасибо, это комплимент, учитывая, что я только что зарегистрировался здесь несколько минут назад!
труба

Три решения мотивируют, учитывая, что я только что зарегистрировался здесь несколько часов назад.
А. Мирабо

1
Вам не нужны цитаты вокруг He.
msh210

@ msh210 Интересно, не знал, что тебе там разрешено опускать их!
труба

5

Python, 106 байт

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

демонстрация

https://repl.it/C6Rr


Хотя это и не принятый ответ, он заслуживает похвального упоминания за то, что является наиболее эффективным с точки зрения байтов решением, которое изменяет только три необходимых ключевых слова на собачьем языке.
А. Мирабо

4

JavaScript (ES6) - 57 55 52 51 байт

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

Тест:

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

Спасибо @MartinEnder за байты 56 и 51 и вдохновение для некоторых других стружек.


4

Vimscript, 51 39 37 33 32 29 28 байт,

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

Regex кредиты для бритья еще 9 байтов: MT0, Мартин Эндер, msh210

asciicast демонстрация

Объяснение:

                               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, но вы можете использовать \<yyвместо \<\hy?
msh210

@ msh210 да, это возможно, и я обновил решение, спасибо
starcorder


2

Javascript, 72 66 64 байта

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

Редактировать: разделенный f=и функция + уменьшенное количество байтов


1
Вам не нужно f=(по умолчанию PPCG), поэтому работает 64 байта.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Отлично, я этого не знал
звездная камера


1

Python 3, 140 135 134 байта

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

Использование регулярных выражений для поиска заменяемых символов.

Редактировать: Гольф 1 байтовый пробел и 4 байта при получении значений из результата findall.

Edit2: Гольф 1 байт ("a" Барка не был посчитан должным образом)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.