Коподоп Гополопфоп


15

Мова: опитування

Смішна мова для розмови створюється шляхом застосування наступного процесу до кожного слова:

  1. Поставте opпісля кожного приголосного. Так Codeстає Copodope.

Так, це все. Для цього виклику yзавжди є приголосний.

Виклик: Депресія

Давши опромінене слово, поверніть початкове слово. Введення буде містити лише літери. Перша літера може бути написана з великої літери. Оригінальне слово ніколи не буде порожнім і завжди буде містити голосну.

Випробування:

Oppified      ->         Original 
a                        a
I                        I
itop                     it
opop                     op
Opop                     Op
popopop                  pop
Copopop                  Cop
opopopop                 opop
Kopicopkop               Kick
Asopia                   Asia
soptopopop               stop
hopoopopsop              hoops
hopoopopedop             hooped
ooooohop                 oooooh
aaaopopaaa               aaaopaaa
Popopopsopicoplope       Popsicle
gopaloplopopopinopgop    galloping
aopopbopopopcopopop      aopbopcop

8
Жоден з ваших тестових випадків не містить голосної, за якою слідує відповідь op, тому відповідь у відповідь replace(/(.)op/, '\1')не буде невдалою жодної з них. Я пропоную вам додати слово на кшталт hoopабо loopedдо тестових випадків.
Дверна ручка

@ mbomb007 Я додав ще кілька складних тестових випадків.
xnor

Чи має відповідь працювати лише для попередньо підтверджених даних або всіх входів?
CalculatorFeline

@CalculatorFeline "Дано осквернене слово"
mbomb007

2
Чи можемо ми додати "mopmopmopbopopop" як тестовий випадок? :)
користувач2390246

Відповіді:


10

V , 12 , 5 байт

Í.“op

Спробуйте в Інтернеті!

00000000: cd2e 936f 70                             ...op

Збережено 7 байт завдяки усвідомленню @ Xnor, що оскільки вхід завжди має бути налаштований, нам не потрібно перевіряти голосні.


Гм, це здається настільки важким для перемоги ...
Ерік Аутгольфер

4
Шестнадцятковий смітник: ...op змушує мене сміятися набагато важче, ніж слід
nmjcman101

12

Сітківка , 9 байт

(?!\G)op

Спробуйте в Інтернеті!

Замість того, щоб перевіряти, що попередній символ є приголосним, ми просто переконуємось, що струм opне примикає ні до початку рядка, ні до попереднього збігу. Єдиний випадок, коли ми можемо відповідати неправильному, opце якщо початковий рядок містив op(в результаті opop). Але в такому випадку ми просто видалимо перше opзамість другого, і результат буде однаковим.


Хіба це не дасть неправильну відповідь на вхід loop?
Лев

4
@Leo loopне є коректним вводом, тому що ви не можете отримати його, коли опитується інше слово.
Мартін Ендер

@MartinEnder Але lopoop(оприлюднена версія loop) є дійсним, і не депоніфікується loop.
Імус

@Imus ні, опікована версія loopє lopoopop.
Мартін Ендер

я зрозумів свою помилку також незабаром після публікації її :) був надто повільним у видаленні. Гарна думка.
Імус

10

Пітон , 42 байти

lambda s:re.sub('(.)op',r'\1',s)
import re

Спробуйте в Інтернеті!

Якщо я не помиляюся, ви можете просто замінити всі ?opз , ?не піклуючись про голосні. Якщо початковий рядок містить op, то він піддається оптимізації opop, а заміна повертає його opта не надалі. Це відбувається тому, що відповідність шаблону for ?opне може перекриватися, тому opвидаляється лише одна .

Розчин, що не повторюється, на 5 байт довше.

Пітон , 47 байт

f=lambda s:s and s[0]+f(s[1+2*(s[1:3]=='op'):])

Спробуйте в Інтернеті


3
Ви можете імпортувати re після посилання на нього‽
Adám

4
@ Adám Python не оцінює його, коли функція визначена, лише коли вона викликається.
xnor

4
Нічого собі, минув час, коли я бачив, як хтось користується інтерробангом. Я здогадуюсь, це спосіб трохи відіграти ваш коментар.
Балдрік

1
@Baldrickk Але в байтах interrobang має> = байти, ніж просто рядок "?!"
MilkyWay90

5

Perl 5 , 10 + 1 = 11 байт

s/.\Kop//g

Спробуйте в Інтернеті!

Виконати з -p(1 байт штрафу); мови для гри в гольф можуть робити неявні введення / виведення автоматично, але Perl потрібен варіант для цього.

Коли я побачив відповідь @ xnor , зрозумів, що її можна вдосконалити, використовуючи специфічну для Perl функцію регулярного вираження; s/a\Kb/c/gеквівалентний s/ab/ac/g(іншими словами, s///єдиний замінює речі після першого \K). Тож ось як це виглядає в Perl.




3

Haskell (93 62 61 байт)

a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
a(x:r)=x:a r
a x=x

дякую @nimi пропозиції в коментарях!


2
Деякі поради: як ви користуєтесь, vі oлише один раз, ви можете вбудувати їх. notElemкоротше, ніж not(...elem...). Ви можете замінити &&охорону на a ,. Останній випадок для aможна записати як a x=x. Немає потреби ()в x:(a r).
німі

1
... о, і тест на =="op"можна замінити буквальним зразком:a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
nimi

Оновлено. дякую @nimi
Davide Spataro

1
Ще один байт для збереження: ви можете опустити пробіл між xі ".
німі

3

PHP , 36 байт

<?=preg_replace("#.\Kop#","",$argn);

Спробуйте в Інтернеті!


Як це слід проводити?
Тіт

Він не вдається для перших двох тестових випадків. Використовуйте preg_replaceдля виправлення.
Тіт

Ви можете зберегти 3 байти, перейменувавши змінну на будь-який окремий символ, наприклад, $ a
junkfoodjunkie

@junkfoodjunkie $argn- це зарезервована змінна, яка доступна, коли PHP запускається з -Rпараметрами з командного рядка
Jörg Hülsermann,

Ах, гаразд, не знав цього. Інтернет-тестер цього не враховує. :-)
junkfoodjunkie


1

JavaScript (ES6), 35 байт

Додайте f=на початку та посилайтесь на зразок f(arg).

s=>s.replace(/([^aeiou])op/gi,"$1")

Я здивований, поки ніхто не розмістив рішення JavaScript ....

Тест-фрагмент

let f=
s=>s.replace(/([^aeiou])op/gi,"$1")

console.log("a" + " -> " + f("a"));
console.log("I" + " -> " + f("I"));
console.log("itop" + " -> " + f("itop"));
console.log("opop" + " -> " + f("opop"));
console.log("Opop" + " -> " + f("Opop"));
console.log("popopop" + " -> " + f("popopop"));
console.log("Copopop" + " -> " + f("Copopop"));
console.log("opopopop" + " -> " + f("opopopop"));
console.log("Kopicopkop" + " -> " + f("Kopicopkop"));
console.log("Asopia" + " -> " + f("Asopia"));
console.log("soptopopop" + " -> " + f("soptopopop"));
console.log("hopoopopsop" + " -> " + f("hopoopopsop"));
console.log("hopoopopedop" + " -> " + f("hopoopopedop"));
console.log("ooooohop" + " -> " + f("ooooohop"));
console.log("aaaopopaaa" + " -> " + f("aaaopopaaa"));
console.log("Popopopsopicoplope" + " -> " + f("Popopopsopicoplope"));
console.log("gopaloplopopopinopgop" + " -> " + f("gopaloplopopopinopgop"));
console.log("aopopbopopopcopopop" + " -> " + f("aopopbopopopcopopop"));



0

/// , 18 байт

/op/.//../o\p//.//

Спробуйте в Інтернеті!

Зауважте, що цей фрагмент хоче замінити opна "a" ., але пізніше буде визначена заміна, де opповертається в рядок. Цю другу інструкцію opзамінили б на .(і, таким чином, вставити .в кінцевий результат), тому я використав \між oі pдля розбиття шаблону.



0

Кристал, 39 байт

def o(s)s.gsub(/([^aeiou])op/,"\\1")end

Як це працює

Він просто шукає кожного приголосного з наступною послідовністю op. Якщо так, то замінити цю послідовність тільки з згодним знайшов раніше: ([^aeiou]).

Спробуйте в Інтернеті




0

sed, 22 байт

sed -E 's/(.)op/\1/g'

Читає від STDIN до EOF та виводить рядок, що не знижується,
Використовує техніку зменшення довжини з відповіді Python @ xnor


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