Декодер собак Canme, професор Шварцман 2000


31

Вступ

Ми - особливо гірки серед нас, які, як правило, є фанатами - всі пам’ятаємо цей старий мультфільм Far Side :

Гей!  Гей!  Гей!

Зрозуміло, що професор Шварцман міг довести свої навички програмування лише на трохи більше, перш ніж застосувати свій винахід до використання. Але чи можете ви повторити це самостійно ... використовуючи якомога менше байтів?

Вхідні характеристики

Ви повинні створити сценарій, який переводить звуки собак у відповідно інтоновані "Ей". Це чистий код гольфу; виграє найменша кількість байтів.

Ваш вхід буде складатися з комбінації таких лексем:

  • 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 є дійсними маркерами.

Не існує обмеження на тривалість лексеми (наприклад, скільки повторень aможе бути в Barkмаркері); однак, ваш декодер повинен правильно працювати лише для введення маркерів до 10 загальних as, os або 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 байт збережено на основі ідеї у відповіді MT0.

\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

Пітон, 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, Martin Ender, 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

Пітон 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 байти для отримання значень з результату пошуку.

Edit2: 1 байт з полем ("a" Барка не було зараховано належним чином)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.