Spoonerise words

50

Biorąc pod uwagę dwa słowa, łyżkuj je, zmieniając ich początkowe gromady spółgłoskowe. Wygrywa najmniej bajtów.

plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di
few years -> yew fears

Spółgłoski pojawiające się przed pierwszą samogłoską ( aeiou) są zamieniane.

Dane wejściowe: dwa małe litery, które zaczynają się od różnych spółgłosek i każda zawiera samogłoskę aeiou.

Wyjście: dwa spłaszczone łańcuchy w odpowiedniej kolejności.

W przypadku danych wejściowych i / lub wyjściowych dwa ciągi mogą również znajdować się na liście lub tym podobnych, lub jako pojedynczy ciąg z separatorem.


To prawie dupe tego starego pytania , ale mam nadzieję napisać specyfikację, która będzie jaśniejsza i bardziej stabilna, aby stary mógł zostać zamknięty jako duplikat .

xnor
źródło
4
Słowa zaczynają się od spółgłosek.
xnor
21
Odpowiedź powinna być "oozing snotter"imo ~
Patrick Roberts
3
@PatrickRoberts Zgadzam się, ale to sprawia, że ​​wyzwanie jest nieco prostsze.
xnor
1
Niezbyt na temat, ale fajny przykład płatek śniegu -> wąż przepływu
flawr
1
nie można brać udziału w szybkich pechach i buntownikach
Denham Coote

Odpowiedzi:

50

Vim, 18 klawiszy

/[aeiou]<CR>dbwvnhp0P

Kluczową sztuczką jest to, że wklejenie czegoś w trybie wizualnym faktycznie powoduje umieszczenie starej zawartości zaznaczenia wizualnego w buforze wklejania.

orlp
źródło
... och, nie, nie pomyślałem o tym. Utrzymywanie vbycia wyrzuconym przez bycie włączającym i próbowanie wybrania z powrotem samogłoski.
Klamka
10
Jako zwykły użytkownik vima byłem zdumiony, gdy pisałem każde kolejne polecenie
Aaron
4
<CR> oznacza powrót karetki (stary termin pisania maszyny do pisania!), Znany również jako Enter
Kai Carver
22

pieprzenie mózgu, 238 207 bajtów

,[[<+<+>>-]++++[<-------->-]-[<<-->>-----]<<+++++[----[----[------[------>>]]]]>[>>]>,]<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]<[<<]-[<+>---]>[>.>]<[<<]<<[<<]>[>>]>[.>>]<.<[<<]>[>.>]>[>>]>[>>]>[.>>]

Wymaga ,zwrócenia 0 na EOF, 8-bitowym zawijaniu komórek i możliwości przejścia w lewo z komórki 0. Z mojego doświadczenia są to najczęściej używane ustawienia domyślne.

Jestem z tego całkiem zadowolony. Moja pierwsza próba miała 314 bajtów i jest to z pewnością poprawa. :)

Działa poprzez przechowywanie każdego bajtu z danych wejściowych w dwóch komórkach; jeden z rzeczywistą wartością bajtu, a drugi z wyjściem następującego kodu, gdy podano (wartość bajtu - 97):

[
    ----
    [
        ----
        [
            ------
            [
                ------>>
            ]
        ]
    ]
]

Jeśli znak jest spółgłoską, wychodzi z tego z niezerową wartością. Jeśli jest to samogłoska, to staje się 0. Stamtąd wystarczy po prostu ustalić, gdzie zaczyna się drugie słowo i wydrukować wszystko w kolejności.

238 bajtowa wersja tego programu znalazła znak spacji po zebraniu wszystkich danych wejściowych. To był ból głowy, ponieważ wiązało się to z utworzeniem komórki, która zawierała 0 dokładnie tam, gdzie próbowałem na nią zapętlić. Sposób, w jaki rozwiązałem, spowodował odjęcie 30 od każdego znaku w pierwszym słowie i 32 od każdego znaku po nim. Dość duża część kodu została poświęcona obsłudze tych bzdur.

Teraz 32 odejmuje się od każdego znaku w pętli wejściowej, który jest krótszy i ma podobny efekt uboczny, z którym łatwiej sobie poradzić. Jako bonus, zrobienie tego w ten sposób pozwoliło mi stworzyć moją własną postać spacji w krótszy sposób: Zamiast odejmować 139 od 171 (171 dostajesz, gdy biegniesz spacją przez detektor samogłoski powyżej), pętla, która dodaje 32 do każdej postaci dokłada wszelkich starań, aby dodać 32 do komórki 171. To kosztuje cztery bajty, ale oznacza to, że mogę odjąć 171 później (zamiast odjąć 139), aby zaoszczędzić 3 bajty netto.

Z komentarzami:

For every input character
,[

  Make a copy
  [<+<+>>-]

  Subtract 32 from one
  ++++[<-------->-]

  Subtract 97 from the other
  -[<<-->>-----]<<+++++

  If nonzero:
  [

    Subtract 4
    ----

    If nonzero:
    [

      Subtract 4
      ----

      If nonzero:
      [

        Subtract 6
        ------

        If nonzero:
        [

          Subtract 6
          ------>>

        ]

      ]

    ]

  ]

>[>>]>,]

Add 32 to every character and the 171 that the space left behind
<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]

Go to the space
<[<<]

Subtract 171 from (32 plus 171)
-[<+>---]

~~~~~~~~~~~~~~~

Ready to print!

~~~~~~~~~~~~~~~

Print letters from the second word until the value to the left is zero
>[>.>]

Go to the beginning of the first word
<[<<]<<[<<]

Look at cells to the left of letters in the first word until reaching a zero
>[>>]

Print the rest of the letters in the first word
>[.>>]

Print a space
<.

Go to the beginning of the first word
<[<<]

Print letters from the first word until the value to the left is zero
>[>.>]

Go to the beginning of the second word
>[>>]

Look at cells to the left of letters in the second word until reaching a zero
>[>>]

Print the rest of the letters in the second word
>[.>>]
podziemny monorail
źródło
To liczy się yjako samogłoska, ale pytanie mówi, że tak nie jest. ( nye cat-> ce nyat)
Loovjo
1
@Loovjo to naprawdę dziwne, ponieważ kod sprawdzający samogłoski zdecydowanie traktuje yjak spółgłoskę ... Zbadam, dlaczego to robi.
metro
17

vim, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

Zastanawiam się, czy vim rzeczywiście jest konkurencyjny w tym wyzwaniu. Prawdopodobnie nie z językami golfowymi, ale być może z Ruby / Python / Perl / etc.

/[aeiou]<cr>  Find the first vowel
"xd0          "Delete" (cut), to register "x, everything from here to BOL
w             Go to next word
n             Find next vowel
db            "Delete back" - delete from here to the beginning of the word
0             Go to BOL
P             Paste what we just "deleted" (cut) behind the cursor
w             Next word
"xP           Paste backwards from register "x
Klamka
źródło
11
Robię to w trybie wstawiania, prawda?
Alex A.
5
@AlexA. ಠ_ಠ
Gałka
@AlexA. Tryb wstawiania byłby dodatkowym naciśnięciem klawisza
:)
@AlexA. Tryb wstawiania? Miałeś na myśli polecenie
Blacklight Shining
1
@BlacklightShining Nope. To był żart, ponieważ jeśli jesteś w trybie wstawiania i wpisujesz te rzeczy, nie będzie wykonywać żadnych poleceń; właśnie wpisałeś go w pliku.
Alex A.
13

Python, 68 63 60 bajtów

import re
lambda s:re.sub('([^aeiou]+|.+ )'*3,r'\3\2\1',s,1)

Wypróbuj online na Ideone .

Jak to działa

Ciąg wzorca jest powtarzany trzy razy ( *3), co powoduje powstanie wzorca

([^aeiou]+|.+ )([^aeiou]+|.+ )([^aeiou]+|.+ )

Wszystkie instancje będą pasować do niepustego ciągu nieposiadającego samogłosek lub niepustego ciągu, po którym następuje pojedynczy znak spacji.

Pierwsze wystąpienie będzie pasować do spółgłosek na początku pierwszego słowa. Ponieważ +jest chciwy, będzie próbował dopasować jak najwięcej, tj. Wszystkie do pierwszej samogłoski.

Z tego powodu druga instancja rozpocznie się od samogłoski, więc będzie pasować do reszty pierwszego słowa, aż do spacji oddzielającej słowa.

Podobnie jak w pierwszym przypadku, trzeci dopasuje wszystkie spółgłoski na początku drugiego słowa, co spowoduje pomyślne dopasowanie dla całego wzorca.

Nieprzetworzony ciąg znaków \3\2\1( runiemożliwia Pythonowi zamianę \3itp. Na znaki kontrolne) odwraca kolejność dopasowywania nawiasowych wzorców, tzn. Zastępuje je spółgłosek na początku drugiego słowa, a następnie wszystkich znaków z pierwszej samogłoski pierwsze słowo do spacji, a na końcu spółgłosek na początku pierwszego słowa.

Ostatni argument argumentu sub( 1) powoduje, że zwraca on natychmiast po pierwszym udanym zastąpieniu, aby uniknąć bezsensownych zamian w pozostałej części drugiego słowa. Jest to wymagane, ponieważ wzór może pasować do dowolnego ciągu trzech lub więcej kolejnych spółgłosek.

Dennis
źródło
1
Gratulujemy nagrody, za dostarczenie magii wyrażeń regularnych do Pythona za pomocą bardzo wydajnego wyrażenia regularnego. Ładne wyjaśnienie.
xnor
11

JavaScript (ES6), 54 bajty

s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])

Wyjaśnienie

s=>
  s.replace(
    r=/\b[^aeiou ]+/g,     // r = regex to match consonants
    (_,i)=>s.match(r)[+!i] // replace consonants with the consonants from the other word
  )

Test

var solution = s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])
<input type="text" id="input" value="plaster man" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>

użytkownik 81655
źródło
Och, moje złe, źle zrozumiałem. Rzucę okiem na dokumenty mdn, matchkiedy wrócę do domu
Patrick Roberts,
+!iSztuką jest miłym rozwiązaniem. +1
ETHprodukcje
10

Python 3, 108 101 99 bajtów

(Bez użycia wyrażenia regularnego)

Ta funkcja oczekuje danych wejściowych za pomocą 2 argumentów, np f('blushing','crow'). Zwraca nowe słowa w krotce.

S=lambda s,p="":s[0]in"aeiou"and(p,s)or S(s[1:],p+s[0])
def f(x,y):a,b=S(x);c,d=S(y);return c+b,a+d

Istnieje wiele rozwiązań wyrażeń regularnych, więc chciałem napisać coś, co nie korzystało z biblioteki re Pythona.

Jak to działa

Jedyną skomplikowaną częścią jest wyrażenie lambda S(skrót oznacza „ S plit przed pierwszą samogłoską”). Rekurencyjnie „iteruje” po danym słowie, przenosząc po jednym znaku od początku s(który zaczyna się od całego słowa) do końca p(który zaczyna się pusty). Przy pierwszej napotkanej samogłosce zwraca (p,s), tj. (Przedrostek, przyrostek). Zauważ, że jest to niewłaściwa kolejność w porównaniu do parametrów!

Pomyślałem, że bardziej sensowne jest, aby zwrócone zamówienie było prefiksem, a następnie sufiksem (ponieważ generalnie prefiks występuje przed sufiksem). Ta kolejność może a,b=S(x)nieco ułatwić odczytanie kodu.

Ale nie miałem wyboru kolejności parametrów lambda, więc nie mogłem pwcześniej zdefiniować s. Pierwszy parametr s, miał wziąć całe słowo, bo pmiał wartość domyślną, a domyślne parametry przejść ostatni. Dzięki temu nie musiałem wywoływać funkcji Sdwa razy z pustym łańcuchem i można było zapisać kilka bajtów. Być może jednak była to po prostu zła decyzja o zwróceniu prefiksu / sufiksu w odwrotnej kolejności, ponieważ zastosowano go w wyrażeniu lambda.

Jeśli chodzi o wybór wyrażenia lambda def S(s,p=""):returnzamiast funkcji, potrzeba więcej bajtów niż powiedzieć S=lambda s,p="":. Mogę dokonać tego wyboru, ponieważ Python ma ocenę zwarć i operator trójskładnikowy. Nie potrafię jednak odpowiednio wyjaśnić, w jaki sposób zastosowałem zwarcia; trudno jest o tym myśleć.


To moja pierwsza odpowiedź. Mam nadzieję, że zrobiłem to poprawnie i że warto opublikować rozwiązanie, które nie może wygrać.

Edycja: Komentatorzy z podziękowaniami: nieco, dwukrotnie zmniejszono liczbę bajtów i usunięto niepotrzebne informacje. Próbowano poprawić pisanie. Mam nadzieję, że nie popełniłem błędów.

N Beyrich
źródło
witamy w ppcg, świetna pierwsza odpowiedź :) po prostu fyi, większość programów na tej stronie nie ma końcowego nowego wiersza, więc nie musisz o nim wspominać (w rzadkich przypadkach, gdy jest to konieczne, wtedy ludzie o tym wspominają)
undergroundmonorail
3
Witamy w Programowaniu Puzzle i Code Golf! 1. Nie musisz się martwić o format wejściowy. Wyzwanie wyraźnie mówi, że możesz wziąć listę. 2. Zgodnie z wartościami domyślnymi wymienionymi w tagu wiki , możesz przesyłać pełne programy lub funkcje do kodowania wyzwań golfowych. W przypadku tego konkretnego problemu funkcja powinna być o 7 bajtów krótsza.
Dennis
4
W odniesieniu do ostatniego zdania: „Mam nadzieję [...] opublikowanie rozwiązania, które nie może wygrać”. Z pewnością jest! Wszyscy jesteśmy tutaj, aby się bawić, wnosić wkład i uczyć się od siebie nawzajem. Uważam tę odpowiedź za szczególnie sprytną, ponieważ bardziej oczywistym rozwiązaniem jest użycie wyrażeń regularnych. Bardzo dobra robota!
Alex A.
Doskonała pierwsza odpowiedź. Jest dość podobny do tego, co wymyśliłem dla non-regex. Dobrze pomyślałeś o używaniu zwartych wyrażeń logicznych i okazuje się, że mogą one skrócić wyrażenie, choć być może chcesz się zastanowić, jak to zrobić.
xnor
Naprawdę podoba mi się to, że użyłeś rozwiązania rekurencyjnego. Bardzo elegancko zrealizowane!
Ogaday
9

C # 6, 115 bajtów

string S(string a)=>System.Text.RegularExpressions.Regex.Replace(a,"([^aeiou]*)(.*) ([^aeiou]*)(.*)","$3$2 $1$4");

To tylko ból, że przestrzeń nazw dla wyrażenia regularnego jest tak długa.

Hand-E-Food
źródło
2
Mój Boże, to jest pełne.
Conor O'Brien
4
System.Text.RegularExpressions.Regex.Replace44 znaki! +1, ponieważ to musi być jakiś rekord.
Level River St
2
... a teraz masz 44 problemy. ;)
Mason Wheeler
9

CJam, 27 24 22 bajtów

2{l_{"aeiou"&}#/(N\}*o

I / O to jedno słowo w wierszu. Wypróbuj online!

Jak to działa

2{                 }*   Do the following twice:
  l                       Read a line from STDIN.
   _                      Push a copy.
    {"aeiou"&}#           Find the index of the first character that has a non-
                          empty intersection with the string "aeiou".
               /          Split the string into chunks of that size.
                (         Shift out the first chunk, i.e., all leading consonants.
                 N\       Swap the shifted out chunk with a linefeed.
                     o  Print the topmost stack item.
Dennis
źródło
8

JavaScript ES6, 93 58 52 bajtów

Zaoszczędź 6 bajtów dzięki ETHProductions!

x=>x.replace(/([^aeiou]+)(.+ )([^aeiou]+)/,"$3$2$1")

Sprawdź to! (Tylko ES6)

Conor O'Brien
źródło
Właśnie miałem kliknąć odpowiedź na moje 58-bajtowe rozwiązanie, kiedy dokonałeś tej edycji haha
user81655
@ user81655 Och, przepraszam, że tak się stało.
Conor O'Brien
Nie potrzebujesz czwartej grupy przechwytywania ani $4wcale;)
ETHprodukcje
@ETHproductions Och, tak! Dzięki!
Conor O'Brien
7

C, 255 201 199 bajtów

Nie widzę tu wielu odpowiedzi w języku C, więc ciesz się; Również mile widziane granie w golfa, sugestie i krytyka.

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(v[1])+b+1
main(int q,char**v){char r[64],S(v[1],a),S(v[2],b)c,v[2])c+b,v[1]+a);strcat(r," ")l-a,v[1])l,v[2]+b);puts(r);}

Jeśli main () nie jest wymagany, możemy zapisać 24 bajty, dochodząc do 179 bajtów

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(x)+b+1
s(char*x,char*y){char r[64],S(x,a),S(y,b)c,y)c+b, x+a);strcat(r," ")l-a,x)l,y+b);puts(r);}

Nie golfowany:

void spoonerise(char* w1, char* w2)
{
    char rt[64];

    int p1 = strpbrk(w1, "aeiou")-w1;
    int p2 = strpbrk(w2, "aeiou")-w2;

    strcpy(rt, w2);
    strcpy(rt+p2, w1+p1);

    strcat(rt, " ");

    strcpy(rt+strlen(w1)+p2+1-p1, w1);
    strcpy(rt+strlen(w1)+p2+1, w2+p2);

    puts(rt);
}

EDYCJA: Dzięki sugestii feersum zaoszczędziłem 54 bajty. = D.

Lince Assassino
źródło
Polecam zajrzeć strpbrk.
feersum
+1 To świetna pierwsza odpowiedź. Witamy na stronie.
wizzwizz4,
Dzięki za rekomendację @feersum. I dzięki za powitanie @ wizzwizz4!
Lince Assassino
6

Python 2, 364 352 269 251 bajtów

EDYCJA: Dziękuję bardzo @Cyoce za pomoc w golfa 83 bajtów!

Proszę, pomóż mi w golfa! W każdym razie przynajmniej jestem pierwszym odpowiadającym na Pythona. Mam nadzieję, że uda mi się pokonać Javę, jeśli kiedykolwiek pojawi się odpowiedź w języku Java!

i=input()
f=l=''
A='aeiou'
for j in A:
 I=i[0];J=I.find(j)
 if ~J:
  if f:
   if f>I[0][:J]:f=I[:J];break
  else:f=I[:J]
for j in A:
 Y=i[1];J=Y.find(j)
 if ~J:
  if l:
   if l>Y[:J]:l=Y[:J];break
  else:l=Y[:J]
print I.replace(f,l,1),Y.replace(l,f,1)

Wypróbuj tutaj

TanMath
źródło
5
-1 za nie podejmowanie próby gry w golfa poza zmiennymi
jednoznakowymi
@Mego Obiecuję, że pracuję nad tym jak najszybciej. Teraz. Ale pracuję nad wersją regularną.
TanMath
@Mego, zobacz edycję.
TanMath,
5

Japt, 26 25 bajtów

Na szczęście dodałem klasę samogłoski do wyrażeń regularnych Japt kilka dni temu. Niestety nie dodałem klasy nie-samogłoskowej ani nie omijałem podwójnych ukośników odwrotnych w ciągach wyrażeń regularnych.

#¿s4 £Uf"[^\\v]+|.+
?" gX

¿Powinna być surowa char U + 0093. Dane wejściowe są łańcuchem wieloliniowym, jednym słowem / linią. Wypróbuj online!

EDYCJA: Dodałem teraz klasę \Vinną niż samogłoska i obejście \\(z %), więc ten kod działa teraz dla 21 bajtów : ( Wypróbuj online )

#¿s4 £Uf"%V+|.+
?" gX

Jak to działa

                     // Implicit: U = input string
#¿s4                 // Convert the char code (147) into a base-4 string "2103".
     £               // Map each char X in this string to:
      Uf"[^\\v]+|.+  //  Match each group in U of non-vowels or non-newlines,
?"                   //  with an optional trailing newline.
   gX                //  Get the item at position X in the resulting array.
                     // Implicit: output last expression

Stara wersja (26 bajtów):

UrA="\\b[^\\v ]+"@UfA gÂ!Y

Wypróbuj online!

Jak to działa

UrA="\\b[^\\v ]+"@UfA gÂ!Y  // Implicit: U = input string
  A="\\b[^\\v ]+"           // Set variable A to this regex string, which matches
                            // a word boundary followed by one or more non-vowels.
UrA              @          // Take U and replace each match X of A and its index Y with:
                  UfA       //  Take U.match(A).
                      gÂ!Y  //  Get the item at index ~~!Y (converts 0 to 1, anything else to 0).
                            // Implicit: output last expression
ETHprodukcje
źródło
Chciałbym, żeby języki głównego nurtu miały samogłoskową meta dla wyrażeń regularnych!
CJ Dennis
4

Python 3, 100 (lub 99) bajtów

import re
def f(*g):a,b=[re.split("[aeiou]",r)[0] for r in g];return b+g[0][len(a):],a+g[1][len(b):]

Grałem z kilkoma wersjami, ale wydaje się, że nie można go znaleźć poniżej. Można go zmniejszyć o 99 bajtów, używając def f(g)zamiast tego, więc zajmuje listę ciągów zamiast dwóch oddzielnych ciągów, ale wolę dwa argumenty.

Alternatywą jest równa długość:

import re
s=re.split
def f(x,y):v="[aeiou]";a,b=s(v,x)[0],s(v,y)[0];return b+x[len(a):],a+y[len(b):]

Próbowałem zastąpić, jak używa @TanMath, ale nie mogłem go skrócić. Ponadto TanMath może skrócić swoją odpowiedź o bajt, używając również "[aeiou]"zamiast, "[aeiou]+"ponieważ musimy dopasować tylko pojedyncze wystąpienia. Wreszcie, implementacja input()wydaje się zmienić między py2 i py3 - automatycznie ocenia stdin jako ciąg.

Ogaday
źródło
1
Prawdopodobnie masz na myśli s=re.splitalternatywnie?
xnor
Tak! Zdecydowanie. To mój pierwszy raz w golfa, więc wszelkie uwagi i porady są mile widziane.
Ogaday,
1
1. Pytanie wyraźnie pozwala podjąć dwa ciągi w postaci listy, więc wydaje się, że żaden dobry powód *in *g. 2. Druga wersja może być rozgrywana w golfa do lambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):]).
Dennis
Dzięki @Dennis, to rzeczywiście działa, ładne refaktoryzacja. Ciekawe, że nawiasy są potrzebne i nie musisz przekazywać s jako argumentu do drugiej lambdy, prawda? To rozwiązanie daje mi 98 bajtów, z wiodącą instrukcją importu i f=.
Ogaday
1
Nie, sjest domyślnym argumentem, więc nie musisz go określać. Nienazwana lambda jest akceptowalnym poddaniem; f=nie jest wymagany.
Dennis
4

sed, 38 znaków

s/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/

Używanie rozszerzonego wyrażenia regularnego z rozwiązania Retina .

Powyższe ma 37 znaków i wymaga -rprzełącznika (znak +1).

Przykład:

$ cat input | tee /dev/tty | sed -r 's/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/'
plaster man
blushing crow
litigating more
strong wrangler
def ghi
master plan
crushing blow
mitigating lore
wrong strangler
ghef di
Zsolt
źródło
Witamy w Programowaniu Puzzle i Code Golf!
Dennis
3

C # 6, 165 bajtów

string S(string a,string b){int i=V(a),j=V(b);return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);}int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

Rozszerzony:

string S(string a,string b){
    int i=V(a),
        j=V(b);
    return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);
}
int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());
Hand-E-Food
źródło
To jest dość stare, ale "aeiou".ToCharArray()może być 'a','e','i','o','u'za -2 bajty
Embodiment of Ignorance
Nie, @EmbodimentofIgnorance, IndexOfAnynie wymaga parametrów, więc musiałoby byćnew[]{'a','e','i','o','u'}
Hand-E-Food
Ach, mój błąd, myślałem, że IndexOfAnyto metoda params. W każdym razie świetna odpowiedź
Embodiment of Ignorance
3

𝔼𝕊𝕄𝕚𝕟, 24 znaki / 42 bajty

ïē/⟮(⁅ᶌ]+)⟯(.+ )Ⅰ/,`⑶⑵⑴`

Try it here (Firefox only).

Jeśli potrzebujesz pomocy w zrozumieniu tego, przekłada się to na ES6 as

input.replace(/([^aeiou]+)(.+ )([^aeiou]+)/g,'$3$2$1')
Mama Fun Roll
źródło
W jakim języku to jest? Nawet na to dostaję postacie z pudełka.
Jesse Williams
@JesseWilliams To się nazywa ESMin .
ETHproductions
Byłoby miło, gdyby interperator miał coś takiego jak Japt, w którym pokazuje js staje się 𝔼𝕊𝕄𝕚𝕟
Użytkownik ogólny
Skompilowany JS jest logowany w konsoli JS po uruchomieniu kodu.
Mama Fun Roll
3

PowerShell, 52 bajty

"$args "-replace('(.*?)([aeiou]\S+) '*2),'$3$2 $1$4'

e.g. 
PS C:\scripts\> .\Spoonerise.ps1 'blushing crow'
crushing blow

Jest to wyrażenie regularne z czterema grupami przechwytywania; z:

  • Mnożenie ciągów w celu rozwinięcia:
    • ('(.*?)([aeiou]\S+) '*2) do '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • "$args "Siły tablica args w ciągu, i dodaje spacją więc przestrzeń spływu w regex nie złamie go.
TessellatingHeckler
źródło
3

JavaScript (ES6), 120 107 102 101 99 92 bajtów

  • Dzięki upaat!

Uwzględnia to, czy parametry były obiektem takim jak ten i odwrotnie:
var a = {x: "man", y:"plaster"]}

a.b=(e=>e.slice(e.search`[aeiou]`));with(a){c=b(x),d=b(y),x=x.replace(c,d);y=y.replace(d,c)}
Lotka
źródło
.match(/[aeiou]/).indexmoże stać się:.search`[aeiou]`
Downgoat 15.01.2016
3

Python, 129 108 105 109 bajtów

Ten program pobiera listę takich słów ["master","plan"]

EDYCJA : Dzięki @Volatility

EDYCJA: Teraz używa re.split

import re
a=re.split
c='[aeiou]+'
i,j=input()
f=a(c,i)[0]
l=a(c,j)[0]
print i.replace(f,l,1),j.replace(l,f,1)

Ta odpowiedź używa wyrażenia regularnego, jak większość z nich.

Wypróbuj tutaj

TanMath
źródło
Zauważ, że str.replacezastępuje wszystkie instancje podłańcucha, więc chcesz ograniczyć go do jednej zamiany przez posiadanie .replace(f,l,1). Można jednak zaoszczędzić sporo stosując i,j=input()oraz ponowne wiązanie re.findalli '[^aeiou]+'do pojedynczych zmiennych znakowych.
Zmienność
To nie działa tak, jak jest; nawet dwa jednoliterowe słowa dadzą ci trzy znaki, a ty próbujesz rozpakować input()na dwie zmienne. Miałeś na myśli i,j=input().split()(oraz raw_input()w Python 2)?
Blacklight Shining
1
@BlacklightShining słowo musi mieć co najmniej jedną samogłoskę i jedną spółgłoskę. Wejście pobiera listę ciągów znaków, więc i jest pierwszym słowem, a j jest drugim.
TanMath,
@TanMath o ile wiem, że jest domyślnie dozwolone, ale należy powiedzieć, prawdopodobnie w odpowiedzi gdzieś, że nie jest to wymagane
undergroundmonorail
To zbyt wiele zastępuje. "sass","bit" -> "babb", "sit".
xnor
3

Java 8, 343 bajtów

Tutaj masz swoją pierwszą odpowiedź Java. Nie tak doświadczony z golfem, więc każda sugestia jest mile widziana!

java.util.function.Function;public class C{public static void main(String[] a){Function<String, Integer>f=s->{for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;return 0;};int i1=f.apply(a[0]),i2=f.apply(a[1]);System.out.println(a[1].substring(0,i2)+a[0].substring(i1)+" "+a[0].substring(0,i1)+a[1].substring(i2));}}

Nie golfowany:

public class SpooneriseWords {
    public static void main(String[] args)
    {       
        Function<String, Integer> f = s -> {
            for(int i = 0; i < s.length(); ++i)
                if("aeiou".contains(s.substring(i, i + 1))) 
                    return i;
            return 0;
        };

        int i1 = f.apply(args[0]);
        int i2 = f.apply(args[1]);
        System.out.println(args[1].substring(0, i2) + args[0].substring(i1));
        System.out.println(args[0].substring(0, i1) + args[1].substring(i2));
    }
}
Denker
źródło
Co jest java.util.function.Function? Bardzo wątpię, że musi tam być, chyba że masz na myśli import, ale porzuć import, ponieważ odwołujesz się do niego tylko raz. Zmień public class C{public static void Main(String[] a)nainterface C{void Main(String[]a)
cat
Function<String, Integer>nie potrzebuje białych znaków
kot
zmienić dla pętli od for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;dofor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
kot
i1to straszna, zdecydowanie za długa nazwa.
kot
Oznacza to, że zmienia Function<String, Integer>się java.util.function.Function<String,Integer>i upuść import
kot
3

Oktawa, 96 bajtów

Dzięki wbudowanym funkcjom Octave i funkcji „indeksu w dowolnym miejscu” cała ta definicja jest tylko definicją pojedynczej, anonimowej funkcji. Zasadniczo rekonstruujemy spłaszczony ciąg, przechowując punkty odcięcia w ai b. Szczególnie cieszę się z ffunkcji inline , która znajduje punkt odcięcia i uniemożliwiła mi find(ismember(a,b),1)dwukrotne użycie całej tej rzeczy. Również brak wyrażenia regularnego :) .

@(p,q)[q(1:(a=(f=@(m)find(ismember(m,'aeoui'),1))(q))-1),p(b=f(q):end),32,p(1:b-1),q(a:end)];
Sanchises
źródło
2

TeaScript , 27 bajtów

xg/(\w+)(.+ )(\w+)/,"$3$2$1

\wjest właściwie [^aeiou].

Downgoat
źródło
Poczekaj, zmieniłeś domyślną \wmeta wyrażenia regularnego na [^aeiou]? Dlaczego?
ETHprodukcje
@ETHproductions, kiedy tworzyłem niestandardowe klasy znaków. Zapomniałem, że \wbył już używany przez JavaScript. Wkrótce zmienię to
Downgoat
2

Eliksir ,143 117 bajtów

s=fn w->String.split_at(w,elem(hd(Regex.run(~r/[aeiou]/,w,return: :index)),0))end
{v,w}=s.(a)
{x,y}=s.(b)
[x<>w,v<>y]

Podziel dwa ciągi (a, b) na pierwszej samogłosce i skonstruuj nowe ciągi, aby powrócić.

EDYCJA: Odciąłem kilka bajtów, używając dopasowania wzorca zamiast nieporęcznych elemwywołań, aby uzyskać wartości z krotek.

srecnig
źródło
2

Java, 147 bajtów

Zakładam, że tylko funkcja jest w porządku.

String s(String[]i){String r="[aeiou]",f=i[0].split(r)[0],s=i[1].split(r)[0];return s+i[0].substring(f.length())+" "+f+i[1].substring(s.length());}

split(regex)niestety zużywa ogranicznik, co oznacza, że ​​muszę użyć substringprzyrostków.

ECS
źródło
2

Pyth, 30 28 bajtów

Pobiera dane wejściowe i podaje dane wyjściowe jako listę dwóch słów.

ACm,Kh:d"[aeiou]"3.-dKQ+V_GH

Wypróbuj online.

Łukasz
źródło
Myślę, że szukasz ACm,Kh:d"[aeiou]"3.-dKQ+V_GH. Aprzypisuje dwuelementową listę do G i H i Ctransponuje. Może być coś jeszcze lepszego.
lirtosiast
2

Python (bez wyrażeń regularnych), 85 bajtów

t=lambda s:s[1]in'aeiou'or-~t(s[1:])
lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])

Przykładowy przebieg:

>>> t=lambda s:s[1]in'aeiou'or-~t(s[1:])
>>> lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])
<function <lambda> at 0x7f495e534398>
>>> _('plaster', 'man')
('master', 'plan')

tjest funkcją rekurencyjną, która oblicza indeks najwcześniejszej samogłoski po pierwszym znaku w argumencie s. Jeśli drugi znak s[1]jest samogłoską, ocenia True, która ma intwartość 1. W przeciwnym razie wykonuje rekurencyjne wywołanie z usuniętym pierwszym znakiem i dodaje 1 do wynikowego indeksu za pomocą -~(uzupełnienie dwóch uzupełnień jednego). Wreszcie, wyniki tsą używane jako wskaźniki do krojenia łańcuchów w celu obliczenia łyżki.

Anders Kaseorg
źródło
1

GNU Awk 4.0, 48 znaków

split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]

Przykładowy przebieg:

bash-4.3$ for s in 'plaster man' 'blushing crow' 'litigating more' 'strong wrangler' 'def ghi'; do
>     echo -n "$s -> "
>     awk 'split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]' <<< "$s"
> done
plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di
człowiek w pracy
źródło
1

PowerShell, 61 bajtów

"$args"-replace'([^aeiou]+)(.*)\s([^aeiou]+)(.*)','$3$2 $1$4'

Używa wyrażenia regularnego do zamiany pierwszych znaków każdego słowa bez samogłoski

Mathias R. Jessen
źródło