Copodope Gopolopfop


15

The Language: Oppification

Zabawny język do mówienia jest tworzony przez zastosowanie następującego procesu do każdego słowa:

  1. Umieść oppo każdej spółgłosce. Tak się Codestaje Copodope.

Tak, to jest to. Na potrzeby tego wyzwania yzawsze jest spółgłoską.

Wyzwanie: przeciwdziałanie opresji

Podane słowo przeciwne, zwróć słowo oryginalne. Dane wejściowe będą zawierać tylko litery. Pierwsza litera może być pisana wielkimi literami. Oryginalne słowo nigdy nie będzie puste i zawsze będzie zawierać samogłoskę.

Przypadki testowe:

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
Żaden z przypadków testowych nie zawiera samogłoski, po której następuje odpowiedź op, więc replace(/(.)op/, '\1')żadna z nich nie zawiedzie. Proponuję dodać słowo podobne hooplub loopeddo przypadków testowych.
Klamka

@ mbomb007 Dodałem kilka trudniejszych przypadków testowych.
xnor

Czy odpowiedź musi działać tylko w przypadku wstępnie zatwierdzonych danych wejściowych lub wszystkich danych wejściowych?
CalculatorFeline

@CalculatorFeline „Biorąc pod uwagę słowo przeciwne”
mbomb007

2
Czy możemy dodać „mopmopmopbopopop” jako przypadek testowy? :)
user2390246

Odpowiedzi:



12

Siatkówka , 9 bajtów

(?!\G)op

Wypróbuj online!

Zamiast sprawdzać, czy poprzedni znak jest spółgłoską, po prostu upewniamy się, że prąd opnie sąsiaduje ani z początkiem łańcucha, ani z poprzednim dopasowaniem. Jedyny przypadek, w którym możemy dopasować niepoprawny, opto jeśli oryginalny ciąg zawierał op(powodujący opop) Ale w takim przypadku usuniemy pierwszy opzamiast drugiego, a wynik będzie taki sam.


Czy to nie dałoby niepoprawnej odpowiedzi na takie dane wejściowe loop?
Leo

4
@Leo loopnie jest prawidłowym wejściem, ponieważ nie można uzyskać go poprzez przeciwstawienie się innemu słowu.
Martin Ender,

@MartinEnder Ale lopoop(przeciwna wersja loop) jest ważna i nie można jej się sprzeciwić loop.
Imus

@Imus nie, przeciwna wersja loopto lopoopop.
Martin Ender

zorientowałem się, że mój błąd również wkrótce po opublikowaniu go :) był zbyt powolny w usuwaniu. Słuszna uwaga.
Imus

10

Python , 42 bajty

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

Wypróbuj online!

Jeśli się nie mylę, można po prostu zastąpić wszystko ?opz ?nie dbając o samogłosek. Jeśli oryginalny ciąg zawiera op, oznacza to, że jest on przeciwny opop, a zamiana zwraca go do opi nie dalej. Wynika to z tego, że dopasowanie wzorca dla ?opnie może się pokrywać, więc tylko jeden opjest usuwany.

Rozwiązanie inne niż wyrażenia regularne jest o 5 bajtów dłuższe.

Python , 47 bajtów

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

Wypróbuj online


3
Możesz zaimportować re po odwołaniu‽
Adám

4
@ Adám Python nie ocenia go, gdy funkcja jest zdefiniowana, tylko gdy jest wywoływana.
xnor

4
Wow, minęło trochę czasu, odkąd widziałem, jak ktoś używa interrobangu. Myślę, że jest to sposób na odrobinę golfa w twoim komentarzu.
Baldrickk

1
@Baldrickk Ale w bajtach interrobang ma> = bajty niż tylko ciąg „?!”
MilkyWay90

5

Perl 5 , 10 + 1 = 11 bajtów

s/.\Kop//g

Wypróbuj online!

Uruchom z -p(kara 1 bajtowa); języki gry w golfa mogą automatycznie wykonywać ukryte operacje we / wy, ale Perl potrzebuje takiej opcji.

Kiedy zobaczyłem odpowiedź @ xnor , zdałem sobie sprawę, że można ją poprawić za pomocą funkcji wyrażenia regularnego specyficznego dla Perla; s/a\Kb/c/gjest równoważne s/ab/ac/g(innymi słowy, s///jedyne zastępuje rzeczy po pierwszym \K). Oto, jak to wygląda w Perlu.




3

Haskell (93 62 61 bajtów)

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

dzięki sugestiom @nimi w komentarzach!


2
Kilka wskazówek: w trakcie używania vi otylko raz możesz ją wstawić. notElemjest krótszy niż not(...elem...). Możesz zastąpić &&strażnika symbolem ,. Ostatni przypadek amoże być zapisany jako a x=x. Nie ma potrzeby ()w x:(a r).
nimi

1
... och, a test na =="op"można zastąpić dosłownym dopasowaniem wzorca:a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
nimi

Zaktualizowano dzięki @nimi
Davide Spataro

1
Jeszcze jeden bajt do zapisania: możesz pominąć spację między xi ".
nimi

3

PHP , 36 bajtów

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

Wypróbuj online!


Jak to ma być uruchomione?
Titus

Nie udaje się to w dwóch pierwszych przypadkach testowych. Użyj, preg_replaceaby naprawić.
Tytus

Możesz zapisać 3 bajty, zmieniając nazwę zmiennej na dowolny pojedynczy znak, na przykład $ a
junkfoodjunkie

@junkfoodjunkie $argnjest zmienną zastrzeżoną, która jest dostępna, gdy PHP jest uruchamiane z -Ropcją z wiersza poleceń
Jörg Hülsermann

Ach, dobra, nie wiedziałem o tym. Tester online nie bierze tego pod uwagę. :-)
junkfoodjunkie


1

JavaScript (ES6), 35 bajtów

Dodaj f=na początku i wywołaj jak f(arg).

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

Dziwi mnie, że nikt jeszcze nie opublikował rozwiązania JavaScript ...

Test Snippet

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 bajtów

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

Wypróbuj online!

Zauważ, że ten fragment chce zastąpić opz ., ale później nie jest zamiennikiem zdefiniowane gdzie opwystawiona jest z powrotem do łańcucha. Ta druga instrukcja opzastąpiłaby .(a więc wstawiłaby .wynik końcowy), więc użyłem znaku \pomiędzy oi, paby przerwać wzór.



0

Kryształ, 39 bajtów

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

Jak to działa

Po prostu wyszukuje każdą spółgłoskę, a następnie sekwencję op. Jeśli tak, wymień tę sekwencję tylko spółgłoska znaleziony przed: ([^aeiou]).

Wypróbuj online





0

R , 29 bajtów

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

Wypróbuj online!

Podobnie jak większość innych rozwiązań tutaj, przechwytuje postać, po której następuje op, zastępuje ją samą postacią.

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.