Spoonerise kelimeleri


50

İki kelime göz önüne alındığında , ilk ünsüz kümelerini değiştirerek onlara göz kulak olun . En az bayt kazanır.

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

İlk ünlü harfinden ( aeiou) önce gelen ünsüzler değiştirilir.

Giriş: Farklı ünsüzlerle başlayan ve her biri bir sesli harf içeren iki küçük harfli dize aeiou.

Çıktı: İki kaşık dizili, doğru sırada.

Giriş ve / veya çıkış için, iki dizi de bir listede veya benzerinde olabilir veya ayırıcı ile tek bir dize olarak olabilir.


Bu, bu eski sorunun yakınımda , ancak eski olanın bir dupe olarak kapatılabilmesi için daha net ve daha kararlı bir özellik yazmayı umuyorum .


4
Kelimeler ünsüzlerle başlar.
xnor

21
Cevap "oozing snotter"imo olmalı ~
Patrick Roberts

3
@PatrickRoberts Katılıyorum, ancak bu meydan okuma biraz daha basit hale getirir.
Xnor

1
Çok konu değil, ama güzel bir örnek kar tanesi -> akış yılanı
kusur 13 Ocak'ta

1
hızlı şanslar ve utangaç körlüklerin katılmasına izin verilmiyor
Denham Coote

Yanıtlar:


50

Vim, 18 tuş vuruşlarını

/[aeiou]<CR>dbwvnhp0P

Önemli olan, görsel modda bir şeyin üzerine yapıştırmanın aslında görsel seçimin eski içeriğini yapıştırma arabelleğine koymasıdır.


... ah, ah, bunu düşünmedim. vKapsayıcı olma ve ünlüden geri seçim yapmaya çalışarak atılmaya devam etti .
Doorknob

10
Sıradan bir vim kullanıcısı olarak, art arda gelen her komutu
Aaron

4
<CR> satır başı anlamına gelir, ayrıca Enter olarak bilinen (eski daktilo terimini!)
Kai Carver

22

brainfuck, 238 207 bayt

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

Gerektirir ,EOF 0'a dönmek için, hücreleri ve yeteneğini sarma 8 bit Tecrübelerime hücreden 0. dan sola hareket etmek, bu en yaygın varsayılan ayarlardır.

Bununla çok mutluyum. İlk denemem 314 byte oldu ve bu kesinlikle bir gelişme. :)

Her baytı girdiden iki hücreye kaydederek çalışır; bunlardan biri baytın gerçek değeri ile, diğeri ise verildiğinde aşağıdaki kodun çıktısı ile (baytın değeri - 97):

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

Karakter bir ünsüz ise, sıfır olmayan bir değerden de çıkar. Eğer bir sesli harf ise, 0 olur. Oradan, ikinci kelimenin nerede başladığını ve her şeyi sırayla basıp bulma meselesi.

Bu programın 238 bayt sürümü, tüm girdileri topladıktan sonra boşluk karakterini buldu. Başım ağrıyordu çünkü bunu yapmak üzereyken 0 üzerinde bir hücre oluşturmaya çalışıyordu. Bunu çözme biçimim, ilk kelimedeki her karakterden 30'u ve sonrasındaki her karakterden 32 çıkarmayı etkiledi. Kodun oldukça büyük bir kısmı bu saçmalığı işlemeye adanmıştı.

Şimdi, 32 daha kısa olan ve başa çıkması kolay bir benzer yan etkiye sahip olan giriş döngüsündeki her karakterden çıkarılır . Bir bonus olarak, bu şekilde yapmam, kendi boşluk karakterimi daha kısa bir şekilde oluşturmamı sağladı: 139'u 171'den çıkarmak yerine (171 yukarıdaki sesli algılayıcıda bir boşluk çalıştırdığınızda elde ettiğiniz şeydir), 32 ekleyen döngü her karaktere 171 hücreye 32 ekleme yolunda gider. Bu, orada dört bayta mal olur, ancak kaydedilen net toplam 3 bayt için 171'i ondan sonra çıkarabilirim (139'u çıkarmak yerine).

Yorumlarla:

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
>[.>>]

Bu ybir ünlü olarak sayılıyor , ancak soru olmadığını söylüyor. ( nye cat-> ce nyat)
Loovjo

1
@Loovjo gerçekten garip, çünkü ünlüleri kontrol eden kod kesinlikle ybir ünsüz gibi davranıyor ... Neden böyle yaptığını inceleyeceğim.
undergroundmonorail

17

vim, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

Vim'in bu mücadelede gerçekten rekabetçi olup olmadığını merak ediyorum. Muhtemelen golf dillerinde değil, belki de Ruby / Python / Perl / etc ile.

/[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

11
Bunu Ekle modunda yapıyorum, değil mi?
Alex A.

5
@AlexA. ಠ_ಠ
Doorknob

@AlexA. Ekleme modu ekstra bir tuş olacaktır:) ~
pydsigner

@AlexA. Mod ekle? Bunu mu demek istedin insert insert ?
Blacklight,

1
@BlacklightShining Hayır. Bu bir şakaydı çünkü ekleme modundaysanız ve o şeyi yazarsanız herhangi bir komut çalıştırmaz; az önce bir dosyaya yazmış olacaksınız.
Alex A.

13

Python, 68 63 60 bayt

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

Ideone'da çevrimiçi olarak deneyin .

Nasıl çalışır

Desen dizgisi, desenle *3sonuçlanarak üç kez ( ) tekrarlanır.

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

Tüm örnekler, boş olmayan bir sesli olmayan dizeyle ya da boş olmayan bir dizeyle ve ardından tek bir boşluk karakteriyle eşleşir.

İlk örnek ünsüzlerle ilk kelimenin başında eşleşecek. Yana +açgözlü, tüm birinci sesli kadar yani mümkün olduğunca çok maç dener.

Bu nedenle, ikinci örnek bir sesli harfle başlayacaktır, bu yüzden kelimeleri birbirinden ayıran boşluğu da içine alan ilk kelimenin kalanıyla eşleşecektir.

Birinci örneğe benzer şekilde, üçüncü, ikinci kelimenin başlangıcındaki tüm ünsüzlerle eşleşecek ve tüm kalıp için başarılı bir eşleşme ile sonuçlanacaktır.

Ham dize \3\2\1( rPython'un \3vb. Karakterleri kontrol karakterleriyle değiştirmesini önler ) parantez içindeki desenlerin eşleşmesinin sırasını tersine çevirir, yani bunları ikinci kelimenin ilk harfindeki ünsüz harflerle değiştirir ; uzaya ilk kelime ve ilk kelimenin başında nihayet ünsüzler.

sub( 1) İfadesinin son argümanı , ikinci sözcüğün geri kalan kısmındaki saçma sapan değişikliklerden kaçınmak için ilk başarılı değişimin hemen ardından geri dönmesini sağlar. Bu, model üç veya daha fazla ardışık ünsüzün herhangi bir dizgisine denk gelebileceği için gereklidir.


1
Regex büyüsünü Python'a çok verimli bir regex ile getirdiğin için tebrikler. Güzel bir açıklama da.
xnor

11

JavaScript (ES6), 54 bayt

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

açıklama

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
  )

Ölçek

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>


Ohh, benim kötü, yanlış anladım. Ben mdn dokümanlar bir göz alacağım matcheve dönünce
Patrick Roberts

İşin +!ipüf noktası güzel bir çözüm. +1
ETHProductions

10

Python 3, 108 101 99 bayt

(Regex kullanmayın)

Bu fonksiyon girişi, 2 argüman üzerinden bekler, örn f('blushing','crow'). Bir tuple içindeki yeni kelimeleri döndürür.

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

Çok sayıda regex çözümü var, bu yüzden Python'un kütüphanesini kullanmayan bir şey yazmak istedim.

Nasıl çalışır

Tek karmaşık kısım lambda ifadesidir S(kısaltma " ilk ünlüden önce S plit " anlamına gelir ). Verilen kelime üzerinde tekrar tekrar "yinelenir", bir anda bir karakterin başlangıcından s(tüm kelimeyle başlayan) sonuna kadar p(boş başlar) hareket eder. İlk sesli harfle karşılaştığında, döndürür (p,s), yani (önek, sonek). Bunun parametrelere kıyasla yanlış sıra olduğuna dikkat edin!

Döndürülen siparişin önek olması, sonra sonek için daha anlamlı olduğunu düşündüm (çünkü genellikle bir önek sonekten önce gider). Bu sipariş a,b=S(x)kodu okumayı biraz kolaylaştırabilir.

Ama lambda'nın parametrelerinde hiçbir emir seçeneğim yoktu, bu yüzden daha pönce tanımlayamadım s. Birinci parametre, s, vardı çünkü tüm kelime almak pvarsayılan bir değer vardı ve varsayılan parametreleri son gidin. Bunu yaparken, işlevi Siki kez boş bir dize ile çağırmam gerekmedi ve birkaç bayt kaydedilebilirdi. Bununla birlikte, belki de lambda ifadesinde kullanıldığı gibi önek / soneki ters sırada döndürmek çok kötü bir karardı.

İşlev üzerinden lambda ifadesinin seçimine gelince, söylenenden def S(s,p=""):returndaha fazla byte gerekir S=lambda s,p="":. Bu seçimi yapabilirim çünkü Python'un kısa devre değerlendirmesi ve üçlü operatör var. Ancak, kısa devreleri nasıl kullandığımı yeterince açıklayamıyorum; mantıklı olması zor.


Bu benim ilk cevabım. Umarım bunu doğru yaptım ve kazanamayacağınız bir çözüm yollamakta değer var.

Düzenlemeler: Teşekkürler yorum yapanlar: Bayt sayısını biraz, iki kez düşürdüler ve gereksiz bilgileri kaldırdık. Yazmayı geliştirmeye çalışıldı. Umarım hata yapmadı.


ppcg'ye hoş geldiniz, ilk cevap büyük :) :) sadece, bu sitedeki çoğu programın izleyen bir yeni hattı yok, bu yüzden bunu söylemenize gerek yok (nadir durumlarda gerekli olduğunda, insanlar söz konusu olduğunda)
undergroundmonorail,

3
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! 1. Giriş formatı için endişelenmenize gerek yok. Buradaki zorluk açıkça bir liste alabileceğinizi söylüyor. 2. wiki etiketinde belirtilen varsayılan değerlere göre , golf mücadelelerini kodlamak için tam programlar veya işlevler gönderebilirsiniz. Bu özel problem için, bir fonksiyon 7 bayt daha kısa olmalıdır.
Dennis

4
Son cümleyle ilgili olarak, "Umarım [...] kazanamayan bir çözüm yollamanın değeri vardır." Kesinlikle var! Hepimiz eğlenmek ve birbirimizden öğrenmek ve katkıda bulunmak için buradayız. Bu cevabı özellikle zekice buluyorum çünkü en belirgin çözüm düzenli ifadeler kullanmak. Güzel iş!
Alex A.

Mükemmel bir ilk cevap. Regex olmayanlar için bulduğum şeye oldukça benziyor. Kısa devre yapan mantıksal ifadeleri kullanma konusunda iyi bir fikriniz vardı ve ortaya çıkan ifadeyi kısaltabilecekleri ortaya çıktı, belki de bunun nasıl yapılacağını kendiniz düşünmek istersiniz.
xnor

Özyinelemeli bir çözüm kullanmandan gerçekten hoşlanıyorum. Çok zarif bir şekilde uygulandı!
Ogaday

9

C # 6, 115 bayt

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

Regex'in isim alanının çok uzun olması bir acı.


2
Tanrım, bu ayrıntılı.
Conor O'Brien,

4
System.Text.RegularExpressions.Regex.Replace44 karakter! +1 çünkü bu bir tür rekor olmalı.
Seviye Nehri St

2
... ve şimdi 44 probleminiz var. ;)
Mason Wheeler

9

CJam, 27 24 22 bayt

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

G / Ç, satır başına bir kelimedir. Çevrimiçi deneyin!

Nasıl çalışır

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.



8

JavaScript ES6, 93 58 52 bayt

ETHProductions sayesinde 6 byte kurtarıldı!

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

Dene! (Yalnızca ES6)


Bu düzenlemeyi yaparken 58 baytlık çözümümün yanıtını göndermek
üzereyim

@ user81655 Oh, böyle olduğu için üzgünüm.
Conor O'Brien,

Dördüncü yakalama grubuna ya da $4hepsine ihtiyacınız yok ;)
ETHproductions 13.01

@ETHproductions Ah, evet! Teşekkürler!
Conor O'Brien,

7

C, 255 201 199 bayt

Buralarda çok fazla C cevabı göremiyorum, o yüzden tadını çıkar; Ayrıca, ilk kez golf oynama, öneri ve eleştiriye açıktır.

#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);}

Main () gerekli değilse, 24 bayt kaydedebilir, 179 bayta ulaşabiliriz

#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);}

Ungolfed:

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);
}

EDIT: Feersum önerisi sayesinde 54 byte tasarruf ettim. = D


Bakmanızı tavsiye ederim strpbrk.
feersum,

+1 Bu harika bir ilk cevap. Siteye Hoşgeldiniz.
wizzwizz4

Recommedation @feersum için teşekkürler. Ve konuksever @ wizzwizz4 için teşekkürler!
Lince Assassino,

6

Python 2, 364 352 269 251 bayt

EDİT: 83 bayt golf atmam için bana yardım ettiğin için teşekkürler!

Lütfen golf oynamama yardım et! Her neyse, en azından ilk Python cevaplayıcısıyım. Ve umarım bir Java cevabı varsa Java'yı yenebilirim!

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)

Burada dene


5
-1 golf bir girişim tek karakterlik değişkenler ötesinde bu yapmıyor için
Mego

@Mego Söz veriyorum asap üzerinde çalışıyorum. Şimdi. Ama bir regex sürümü üzerinde çalışıyorum.
TanMath

@Mego lütfen düzenlemeye bakınız.
TanMath

5

Japt, 26 25 bayt

Neyse ki, Japt'un regex özelliklerine birkaç gün önce bir ünlü sınıfı ekledim. Ne yazık ki, sesli olmayan bir sınıf veya regex dizelerinde çift ters eğik çizgi etrafında bir yol eklemedim.

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

¿Ham karakter U +, 0093 olmalıdır. Giriş, çok satırlı bir dize, bir sözcük / satırdır. Çevrimiçi deneyin!

EDIT: Şimdi ünlü olmayan sınıfı \Vve \\(ile %) etrafında bir yol ekledim , bu yüzden şimdi bu kod 21 bayt için çalışıyor : ( Çevrimiçi deneyin )

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

Nasıl çalışır

                     // 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

Eski versiyon (26 bayt):

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

Çevrimiçi deneyin!

Nasıl çalışır

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

Keşke ana dillerin regex'ler için ünlü bir metası olsaydı!
CJ Dennis

4

Python 3, 100 (veya 99) bayt

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):]

Birkaç sürüm ile oynandı ancak aşağıda elde edemiyor gibi görünüyor. Bunun yerine 99 byte'ı indirebilir, def f(g)böylece iki ayrı dizge yerine dizelerin bir listesini alır, ancak iki arg roue'u tercih ederim.

Alternatif eşit uzunluktur:

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):]

@TanMath'ın kullandığı gibi değiştirmeyi denedim, ancak daha kısa sürede elde edemedim. Ayrıca, TanMath da tek bir örnekle eşleşmemiz gerektiğinden, "[aeiou]"bunun yerine yerine bir byte kullanarak cevabını kısaltabilir "[aeiou]+". Son olarak, input()py2 ve py3 arasında değişmiş gibi görünüyor - stdin'i otomatik olarak bir string olarak değerlendirir.


1
Muhtemelen s=re.splitalternatifte demek istiyorsun ?
xnor

Evet! Kesinlikle. Bu benim ilk defa golf oynamak, bu yüzden herhangi bir geri bildirim ve tavsiye takdir edilmektedir.
Ogaday

1
1. soru açıkça bir liste olarak iki dizeyi almasına izin veriyor, böylece için iyi bir neden var gibi görünüyor *in *g. 2. İkinci versiyon aşağıya doğru golf edilebilir lambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):]).
Dennis

Thanks @Dennis, gerçekten işe yarıyor, güzel yeniden düzenleme. Parantezlerin gerekli olduğu ve ikinci lambda için bir argüman olarak s geçmeniz gerekmiyor mu? Bu çözüm bana önde gelen bir ithalat ifadesiyle ve 98 bayt verir f=.
Ogaday

1
Hayır, svarsayılan bir argümandır, bu nedenle belirtmeniz gerekmez. Adsız bir lambda kabul edilebilir bir sunumdur; f=gerekli değil.
Dennis

4

sed, 38 karakter

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

Retina çözümünden genişletilmiş düzenli ifade kullanma .

Yukarıdaki 37 karakter uzunluğunda ve -ranahtar (+1 karakter) gerektirir .

Örnek:

$ 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

Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz!
Dennis

3

C # 6, 165 bayt

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());

Expanded:

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());

Bu oldukça eski, ama "aeiou".ToCharArray()olabilir 'a','e','i','o','u'-2 bayt için
Düzenleme Cahiliyye

Hayır, @EmbodimentofIgnorance, IndexOfAnyparams almaz, bu yüzden olması gereknew[]{'a','e','i','o','u'}
Hand-E-Food

Ah, benim hatam, IndexOfAnybir params yöntemi olduğunu düşündüm . Her neyse, büyük cevap
Ignorance'ın

3

24, 24 karakter / 42 bayt

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

Try it here (Firefox only).

Bunu anlamak için yardıma ihtiyacınız olursa, bu,

input.replace(/([^aeiou]+)(.+ )([^aeiou]+)/g,'$3$2$1')

Bu hangi dilde? Bunun için kutu karakterleri alıyorum.
Jesse Williams

@JesseWilliams deniyor ESMin .
ETH Sunumları

Müdahalenin Japt'a benzer bir şey yapması güzel olurdu, burada js size 𝔼𝕊𝕄𝕚𝕟 olur
Generic User

Derlenmiş JS, kod çalıştırıldığında JS konsolunda günlüğe kaydedilir.
Mama Fun Roll

3

PowerShell, 52 bayt

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

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

Dört yakalama grubuyla regex yerine geçer; ile:

  • Genişletmek için dize çarpımı:
    • ('(.*?)([aeiou]\S+) '*2) için '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • "$args "Regex sonunda boşluk onu kırmak olmaz böylece kuvvetler bağımsız değişken bir dizeye dizi ve sonunda bir boşluk ekler.

3

JavaScript (ES6), 120 107 102 101 99 92 bayt

  • Teşekkürler

Parametreler bunun gibi bir nesne olsaydı ve geriye doğru:
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)}

.match(/[aeiou]/).indexolabilir:.search`[aeiou]`
Downgoat

3

Python, 129 108 105 109 bayt

Bu program, bunun gibi kelimelerin bir listesini alır. ["master","plan"]

EDIT : Teşekkür @Volatility

EDIT: Şimdi re.split kullanarak

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)

Bu cevap, çoğu kişinin yaptığı gibi regex kullanır.

Burada dene


Not str.replaceyerini tüm sen alarak bir yedek bunu sınırlamak istediğiniz böylece, bir alt dize örneklerini .replace(f,l,1). Ancak, kullanarak i,j=input()ve yeniden birleştirerek re.findallve '[^aeiou]+'tek karakterli değişkenleri kullanarak bir demet kaydedebilirsiniz .
Oynaklık,

Bu, olduğu gibi çalışmıyor; iki tek harfli kelime bile size üç karakter verir ve siz input()iki değişkene açmaya çalışıyorsunuz . Bunu mu demek istediniz i,j=input().split()(ve raw_input()Python 2'de)?
Blacklight,

1
@BlacklightShining sözcüğü en az bir ünlü ve bir ünsüz olması gerekir. Giriş, dizelerin bir listesini alır, bu yüzden i, ilk sözcük ve j, ikinci sözcükdür.
TanMath

@TanMath kadarıyla bana bilmediğim olarak edilir varsayılan olarak izin, ancak muhtemelen gerekli olduğunu bir yerde cevap demeliyim
undergroundmonorail

Bu çok fazla değiştirir. "sass","bit" -> "babb", "sit".
xnor

3

Java 8, 343 Bayt

Burada ilk Java-Cevabınız var. Bu golf ile deneyimli değil, bu yüzden her öneri takdir!

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));}}

Ungolfed:

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));
    }
}

Nedir java.util.function.Function? Bunu kastetmediğiniz sürece orada olması gerektiğinden şüpheliyim import, ancak içe aktarmayı düşürün, çünkü yalnızca bir kez başvurursunuz. Değişim public class C{public static void Main(String[] a)içininterface C{void Main(String[]a)
kedi

Function<String, Integer>boşluk
kedi

dan döngü için değiştirmek for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;içinfor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
kedi

i1çok, çok uzun bir varname var.
kedi

Yani, değiştirecek Function<String, Integer>kadar java.util.function.Function<String,Integer>ve ithalat damla
kedi

3

Oktav, 96 bayt

Octave'nin satır içi atamaları ve 'her yerde dizin' işlevi sayesinde, tüm bunlar yalnızca adsız bir işlevin tanımıdır. Temel olarak, kesme noktalarını ave içinde saklarken, kaşıkçı ipi yeniden yapılandırıyoruz b. Özellikle fkesme noktasını bulan ve tüm ' find(ismember(a,b),1)' şeyini iki kez kullanmak zorunda kalmamı engelleyen satır içi işlevinden memnunum . Ayrıca, regex yok :) .

@(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)];

2

TeaScript , 27 bayt

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

\waslında [^aeiou].


Bekle, varsayılan \wregex metaini değiştirdin [^aeiou]mi? Neden?
ETHProductions

Özel char sınıfları oluştururken @ETHproductions. Bunun \wzaten JavaScript tarafından kullanıldığını unuttum . Yakında geri değiştireceğim
Downgoat

2

İksir ,143 117 Bayt

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]

İlk harfin üzerindeki iki diziyi (a, b) ayırın ve geri dönmek için yeni diziler oluşturun.

DÜZENLEME: elemDeğerleri kayıtlardan çıkarmak için sıra dışı çağrılar yerine desen eşleştirmesini kullanarak birkaç bayt ayırın.


2

Java, 147 Bayt

Sadece bir fonksiyonun da iyi olduğunu farz ediyorum.

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)maalesef sınırlayıcıyı tüketiyor, bu da substringekleri almak için kullanmam gerektiği anlamına geliyor .


2

Pyth, 30 28 bayt

Girdiyi alır ve iki sözcüğün listesi olarak çıktı verir.

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

Çevrimiçi deneyin.


Bence aradığınızı düşünüyorum ACm,Kh:d"[aeiou]"3.-dKQ+V_GH. AG ve H'ye iki elemanlı bir liste atar ve Caktarır. Daha iyi bir şey olabilir.
lirtosiast,

2

Python (düzenli ifade yok), 85 bayt

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):])

Örnek çalışma:

>>> 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')

targümanındaki ilk karakterden sonra en eski sesli harflerin dizinini hesaplayan özyinelemeli bir işlevdir s. İkinci karakter s[1]bir ünlü ise True, hangi intdeğere sahip olduğunu değerlendirir 1. Aksi halde, ilk karakter kaldırılmış olan özyinelemeli bir çağrı yapar ve -~(ikisinin tamamlayıcısının tamamlayıcısı) kullanılarak elde edilen dizine 1 ekler . Son olarak, sonuçları t, kaşıkçılığı hesaplamak için dize dilimleme indeksleri olarak kullanılır.


1

GNU Awk 4.0, 48 karakter

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

Örnek çalışma:

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

1

PowerShell, 61 bayt

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

Her kelimenin ilk sesli olmayan karakterlerini değiştirmek için regex kullanır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.