Copodope Gopolopfop


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
Можем ли мы добавить «mopmopmopbopop» в качестве контрольного примера? :)
user2390246

Ответы:


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.
Мартин Эндер

понял мою ошибку также вскоре после публикации :) был слишком медленным в удалении. Хорошая точка зрения.
Imus

10

Python , 42 байта

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

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

Если я не ошибаюсь, вы можете просто заменить все ?opс , ?не заботясь о гласные. Если исходная строка содержит op, то она противопоставляется opop, и замена возвращает ее opи не более. Это связано с тем, что шаблон для ?opсовпадения не может перекрываться, поэтому opудаляется только один .

Решение без регулярных выражений на 5 байтов длиннее.

Python , 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
Вау, я давно видел, как кто-то использовал интерробанг. Я думаю, что это способ немного поиграть в ваш комментарий.
Baldrickk

1
@Baldrickk Но в байтах у интерробанга есть байты> =, а не только строка "?!"
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 x=x. Нет необходимости ()в x:(a r).
Ними

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

Обновлено. спасибо @nimi
Давиде Спатаро

1
Еще один байт для сохранения: вы можете опустить пробел между xи ".
Ними

3

PHP , 36 байт

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

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


Как это должно быть запущено?
Тит

Это терпит неудачу для первых двух тестовых случаев. Используйте, preg_replaceчтобы исправить.
Тит

Вы можете сохранить 3 байта путем переименования переменной в любой один символ $ а, например
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

Crystal, 39 байт

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

Как это устроено

Он просто ищет каждую согласную, после чего следует последовательность op. Если да, то заменить эту последовательность только с согласным нашел раньше: ([^aeiou]).

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




0

sed, 22 байта

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

Читает из STDIN до EOF и выводит дешифрованную строку.
Использует ту же технику уменьшения длины из ответа @ xnor's Python


0

R , 29 байт

gsub("(.)op","\\1",scan(,''))

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

Как и большинство других решений здесь, захватывает символ, за которым следует оператор, заменяет его самим символом.

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