Kata-kata sendok

50

Diberi dua kata, menyendok mereka dengan mengganti kelompok konsonan awal mereka. Bytes paling sedikit menang.

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

Konsonan yang muncul sebelum vokal pertama ( aeiou) diaktifkan.

Input: Dua string huruf kecil yang dimulai dengan konsonan yang berbeda dan masing-masing berisi vokal aeiou.

Keluaran: Dua string spoonerised, dalam urutan yang benar.

Untuk input dan / atau output, dua string mungkin juga ada dalam daftar atau sejenisnya, atau sebagai string tunggal dengan pemisah.


Ini hampir-dupe dari pertanyaan lama ini , tapi saya berharap untuk menulis spec yang lebih jelas dan lebih stabil sehingga yang lama bisa ditutup sebagai dupe .

Tidak
sumber
4
Kata-katanya dimulai dengan konsonan.
xnor
21
Jawabannya harus "oozing snotter"imo ~
Patrick Roberts
3
@ PatrickRoberts Saya setuju, tapi ini membuat tantangannya sedikit lebih sederhana.
xnor
1
Tidak terlalu pada topik, tapi contoh salju serpihan bagus -> ular aliran
flawr
1
lucks cepat dan coy bunts tidak diizinkan untuk berpartisipasi
Denham Coote

Jawaban:

50

Vim, 18 penekanan tombol

/[aeiou]<CR>dbwvnhp0P

Trik penting adalah bahwa menempelkan sesuatu dalam mode Visual benar-benar menempatkan konten lama pilihan visual dalam buffer paste.

orlp
sumber
... oh, ya, tidak memikirkan itu. Terus terlempar dengan vmenjadi inklusif dan mencoba memilih dari belakang vokal.
Gagang Pintu
10
Sebagai pengguna kasual vim, saya terus kagum ketika saya mengetik setiap perintah berturut-turut
Aaron
4
<CR> berarti carriage return (istilah mesin tik lama!), Juga dikenal sebagai Enter
Kai Carver
22

brainfuck, 238 207 byte

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

Membutuhkan , mengembalikan 0 pada EOF, sel pembungkus 8-bit dan kemampuan untuk bergerak ke kiri dari sel 0. Dalam pengalaman saya, ini adalah pengaturan default yang paling umum.

Saya cukup senang dengan yang ini. Percobaan pertama saya adalah 314 byte dan ini jelas merupakan peningkatan. :)

Ia bekerja dengan menyimpan setiap byte dari input dalam dua sel; satu dengan nilai aktual dari byte dan yang lainnya dengan output dari kode berikut ketika diberikan (nilai byte - 97):

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

Jika karakter adalah konsonan, itu keluar dari itu dengan nilai yang tidak nol. Jika itu sebuah vokal, itu menjadi 0. Dari sana itu hanya masalah menemukan di mana kata kedua dimulai dan mencetak semuanya secara berurutan.

Versi 238 byte dari program ini menemukan karakter spasi setelah mengumpulkan semua input. Itu sakit kepala karena hal itu melibatkan pembuatan sel yang berisi 0 tepat di mana saya mencoba untuk memutarnya. Cara saya menyelesaikannya memiliki efek mengurangi 30 dari setiap karakter di kata pertama dan 32 dari setiap karakter setelahnya. Sebagian besar kode didedikasikan untuk menangani omong kosong itu.

Sekarang, 32 dikurangkan dari setiap karakter dalam loop input, yang lebih pendek dan memiliki efek samping serupa yang lebih mudah untuk ditangani. Sebagai bonus, melakukannya dengan cara ini memungkinkan saya untuk membuat karakter ruang saya sendiri dengan cara yang lebih singkat: Alih-alih mengurangi 139 dari 171 (171 adalah apa yang Anda dapatkan ketika Anda menjalankan ruang melalui detektor vokal di atas), loop yang menambahkan 32 untuk setiap karakter keluar dari jalannya untuk juga menambahkan 32 ke 171 sel. Ini biaya empat byte di sana, tetapi berarti saya dapat mengurangi 171 dari nanti (bukannya mengurangi 139) untuk total bersih 3 byte yang disimpan.

Dengan komentar:

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
>[.>>]
monmon bawah tanah
sumber
Ini dianggap ysebagai vokal, tetapi pertanyaannya mengatakan itu tidak. ( nye cat-> ce nyat)
Loovjo
1
@ Loojo itu benar-benar aneh, karena kode yang memeriksa vokal pasti memperlakukan ysebagai konsonan ... Saya akan melihat mengapa ia melakukan itu.
undergroundmonorail
17

vim, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

Saya ingin tahu apakah vim sebenarnya kompetitif dalam tantangan ini. Mungkin tidak dengan bahasa golf, tapi mungkin dengan Ruby / Python / Perl / dll.

/[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
Gagang pintu
sumber
11
Saya melakukan ini dalam mode Sisipkan, kan?
Alex A.
5
@AlexA. ಠ_ಠ
Doorknob
@AlexA. Mode
penyisipan
@AlexA. Sisipkan mode? Apakah maksud Anda memasukkan perintah?
Blacklight Shining
1
@BlacklightShining Nggak. Itu adalah lelucon karena jika Anda berada dalam mode memasukkan dan Anda mengetikkan hal itu, itu tidak akan menjalankan perintah apa pun; Anda baru saja mengetiknya di file.
Alex A.
13

Python, 68 63 60 byte

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

Cobalah online di Ideone .

Bagaimana itu bekerja

String pola diulang tiga kali ( *3), menghasilkan pola

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

Semua instance akan cocok dengan string non-kosong non-vokal, atau string non-kosong diikuti oleh karakter spasi tunggal.

Contoh pertama akan cocok dengan konsonan di awal kata pertama. Karena +serakah, ia akan berusaha untuk mencocokkan sebanyak mungkin, yaitu, semua hingga vokal pertama.

Karena ini, instance kedua akan mulai pada vokal, sehingga akan cocok dengan sisa kata pertama, hingga dan termasuk ruang yang memisahkan kata-kata.

Serupa dengan contoh pertama, yang ketiga akan cocok dengan semua konsonan di awal kata kedua, menghasilkan kecocokan yang berhasil untuk seluruh pola.

String mentah \3\2\1( rmencegah Python dari penggantian \3dll. Dengan karakter kontrol) membalikkan urutan kecocokan dari pola dipatenkan, yaitu, menggantikannya dengan konsonan di awal kata kedua , lalu semua karakter dari vokal pertama dari kata pertama hingga ke angkasa, dan akhirnya konsonan di awal kata pertama.

Argumen terakhir untuk sub( 1) membuatnya kembali segera setelah penggantian pertama yang berhasil, untuk menghindari penggantian yang tidak masuk akal di sisa kata kedua. Ini diperlukan karena pola dapat cocok dengan string apa pun dari tiga konsonan berturut-turut atau lebih.

Dennis
sumber
1
Selamat atas karunia itu, karena membawa sihir regex ke Python dengan regex yang sangat efisien. Penjelasan yang bagus juga.
xnor
11

JavaScript (ES6), 54 byte

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

Penjelasan

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
  )

Uji

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>

pengguna81655
sumber
Ohh, salahku, aku salah paham. Saya akan melihat dokumen mdn matchketika saya tiba di rumah
Patrick Roberts
The +!itrick adalah solusi yang bagus. +1
ETHproduk
10

Python 3, 108 101 99 byte

(Tidak menggunakan regex)

Fungsi ini mengharapkan input melalui 2 argumen, mis f('blushing','crow'). Mengembalikan kata-kata baru dalam sebuah tuple.

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

Ada banyak solusi regex, jadi saya ingin menulis sesuatu yang tidak menggunakan pustaka ulang Python.

Bagaimana itu bekerja

Satu-satunya bagian yang rumit adalah ekspresi lambda S(singkatannya berarti " S plit before the vowel pertama"). Secara berulang "iterates" di atas kata yang diberikan, memindahkan satu karakter pada satu waktu dari awal s(yang dimulai dengan seluruh kata) ke akhir p(yang mulai kosong). Pada vokal pertama yang dijumpainya kembali (p,s), yaitu (awalan, akhiran). Perhatikan bahwa itu adalah urutan yang salah dibandingkan dengan parameter!

Saya pikir lebih masuk akal untuk urutan yang dikembalikan menjadi awalan, lalu sufiks (karena umumnya awalan berjalan sebelum sufiks). Pesanan ini mungkin membuat a,b=S(x)kode sedikit lebih mudah dibaca.

Tetapi saya tidak punya pilihan urutan dalam parameter lambda, jadi saya tidak bisa mendefinisikan psebelumnya s. Parameter pertama s,, harus mengambil seluruh kata karena pmemiliki nilai default, dan parameter default menjadi yang terakhir. Melakukan itu, saya tidak perlu memanggil fungsi Sdengan string kosong dua kali, dan beberapa byte dapat disimpan. Namun, mungkin itu hanyalah keputusan yang buruk untuk mengembalikan awalan / akhiran dalam urutan yang berlawanan seperti yang digunakan dalam ekspresi lambda.

Adapun pilihan ekspresi lambda atas fungsi, dibutuhkan lebih banyak byte untuk mengatakan def S(s,p=""):returndaripada S=lambda s,p="":. Saya dapat membuat pilihan itu karena Python memiliki evaluasi hubung singkat, dan operator ternary. Namun, saya tidak bisa menjelaskan bagaimana saya menggunakan arus pendek; sulit untuk dipikirkan.


Ini jawaban pertamaku. Saya harap saya melakukan ini dengan benar, dan ada nilai untuk memposting solusi yang tidak dapat menang.

Suntingan: Komentator terima kasih: Mengurangi jumlah byte sedikit, dua kali, dan menghapus info yang tidak perlu. Berusaha memperbaiki tulisan. Semoga tidak membuat kesalahan.

N Beyrich
sumber
selamat datang di ppcg, jawaban pertama yang bagus :) hanya fyi, sebagian besar program di situs ini tidak memiliki baris tambahan, jadi Anda tidak perlu menyebutkannya (dalam kasus yang jarang terjadi ketika diperlukan, saat itulah orang menyebutkannya)
undergroundmonorail
3
Selamat Datang di Programming Puzzles & Code Golf! 1. Anda tidak perlu khawatir tentang format input. Tantangannya secara eksplisit mengatakan bahwa Anda dapat mengambil daftar. 2. Per standar yang disebutkan dalam tag wiki , Anda dapat mengirimkan program atau fungsi lengkap untuk mengkode tantangan golf. Untuk masalah khusus ini, fungsi harus lebih pendek 7 byte.
Dennis
4
Mengenai kalimat terakhir, "Saya harap [...] ada nilai untuk memposting solusi yang tidak bisa menang." Pasti ada! Kita semua di sini untuk bersenang-senang, berkontribusi, dan belajar dari satu sama lain. Saya menemukan jawaban ini sangat pintar karena solusi yang lebih jelas adalah dengan menggunakan ekspresi reguler. Kerja yang sangat bagus!
Alex A.
Jawaban pertama yang sangat bagus. Ini sangat mirip dengan apa yang saya buat untuk non-regex. Anda memiliki pemikiran yang baik tentang penggunaan ekspresi logis hubungan pendek, dan ternyata mereka dapat mempersingkat ekspresi, meskipun mungkin Anda ingin berpikir sendiri tentang cara melakukannya.
xnor
Saya sangat menyukai kenyataan bahwa Anda menggunakan solusi rekursif. Diimplementasikan dengan sangat elegan!
Ogaday
9

C # 6, 115 byte

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

Hanya saja sakitnya namespace untuk regex begitu lama.

Makanan Tangan
sumber
2
Ya ampun itu verbose.
Conor O'Brien
4
System.Text.RegularExpressions.Regex.Replace44 karakter! +1 karena itu harus semacam catatan.
Level River St
2
... dan sekarang Anda memiliki 44 masalah. ;)
Mason Wheeler
9

CJam, 27 24 22 byte

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

I / O adalah satu kata per baris. Cobalah online!

Bagaimana itu bekerja

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
sumber
8

Retina , 34

([^aeiou]+)(.+ )([^aeiou]+)
$3$2$1

Cobalah online.

Trauma Digital
sumber
8

JavaScript ES6, 93 58 52 byte

Disimpan 6 byte berkat Produk ETH!

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

Menguji! (Hanya ES6)

Conor O'Brien
sumber
Saya baru saja akan mengklik posting jawaban pada solusi 58 byte saya ketika Anda melakukan pengeditan ini haha
user81655
@ user81655 Oh, maaf itu terjadi seperti itu.
Conor O'Brien
Anda tidak memerlukan grup penangkap keempat atau $4sama sekali;)
ETHproduksi
@ ETProduksi Oh, yeah! Terima kasih!
Conor O'Brien
7

C, 255 201 199 byte

Saya tidak melihat banyak jawaban C di sekitar sini, jadi nikmatilah; Juga, pertama kali bermain golf, saran, dan kritik dipersilakan.

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

Jika main () tidak diperlukan, kami dapat menyimpan 24 byte, mencapai 179 byte

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

Tidak Disatukan:

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: Berkat saran feersum saya menghemat 54 byte. = D

Lince Assassino
sumber
Saya sarankan melihat ke dalam strpbrk.
feersum
+1 Ini adalah jawaban pertama yang bagus . Selamat datang di situs ini.
wizzwizz4
Terima kasih atas rekomendasi @feersum. Dan terima kasih atas sambutannya @ wizzwizz4!
Lince Assassino
6

Python 2, 364 352 269 251 byte

Sunting : Terima kasih banyak kepada @Cyoce karena membantu saya bermain golf 83 byte!

Tolong bantu saya bermain golf ini! Bagaimanapun, setidaknya saya adalah penjawab Python pertama. Dan saya harap saya bisa mengalahkan Jawa, jika ada jawaban 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)

Coba di sini

TanMath
sumber
5
-1 untuk tidak membuat upaya untuk bermain golf ini di luar variabel-karakter tunggal
Mego
@Mego aku berjanji aku akan mengerjakannya secepat mungkin. Sekarang juga. Tapi saya sedang mengerjakan versi regex.
TanMath
@Mego silakan lihat edit.
TanMath
5

Japt, 26 25 byte

Untungnya, saya menambahkan kelas vokal ke fitur regex Japt beberapa hari yang lalu. Sayangnya, saya tidak menambahkan kelas non-vokal atau jalan memutar backslash ganda dalam string regex.

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

The ¿harus char baku U + 0093. Input adalah string multi-baris, satu kata / baris. Cobalah online!

EDIT: Saya sekarang telah menambahkan kelas non-vokal \Vdan jalan \\(dengan %), jadi kode ini sekarang berfungsi untuk 21 byte : ( Coba online )

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

Bagaimana itu bekerja

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

Versi lama (26 byte):

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

Cobalah online!

Bagaimana itu bekerja

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
Produksi ETH
sumber
Saya berharap bahasa umum memiliki meta vokal untuk regex!
CJ Dennis
4

Python 3, 100 (atau 99) byte

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

Dimainkan dengan beberapa versi tetapi sepertinya tidak bisa mendapatkannya di bawah. Dapat menurunkan 99 byte dengan menggunakan def f(g)sebagai gantinya sehingga dibutuhkan daftar string daripada dua string terpisah, tapi saya lebih suka dua arg roue.

Alternatifnya sama dengan panjang:

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

Saya mencoba mengganti, seperti menggunakan @TanMath, tapi saya tidak bisa membuatnya lebih pendek. Selain itu, TanMath bisa mendapatkan jawabannya lebih pendek dengan satu byte dengan juga menggunakan "[aeiou]"alih-alih "[aeiou]+"karena kita hanya perlu mencocokkan satu instance. Akhirnya, implementasi input()tampaknya telah berubah antara py2 dan py3 - secara otomatis mengevaluasi stdin sebagai string.

Ogaday
sumber
1
Mungkin maksud Anda s=re.splitdalam alternatif?
xnor
Iya! Pastinya. Ini adalah pertama kalinya saya bermain golf, jadi umpan balik dan saran sangat dihargai.
Ogaday
1
1. Pertanyaan secara eksplisit memungkinkan untuk mengambil dua string sebagai daftar, jadi sepertinya tidak ada alasan yang bagus untuk *masuk *g. 2. Versi kedua dapat di-golf hingga lambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):]).
Dennis
Terima kasih @ Dennis, itu memang berhasil, refactoring yang bagus. Menarik bahwa tanda kurung diperlukan, dan Anda tidak perlu mengoper sebagai arg ke lambda kedua, bukan? Solusi itu memberi saya 98 byte, dengan pernyataan impor terkemuka dan f=.
Ogaday
1
Tidak, sadalah argumen default, jadi Anda tidak perlu menentukannya. Lambda yang tidak disebutkan namanya adalah pengiriman yang dapat diterima; f=tidak diperlukan.
Dennis
4

sed, 38 karakter

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

Menggunakan ekspresi reguler yang diperluas dari solusi Retina .

Panjang di atas adalah 37 karakter dan membutuhkan -rsakelar (+1 karakter).

Contoh:

$ 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
sumber
Selamat Datang di Programming Puzzles & Code Golf!
Dennis
3

C # 6, 165 byte

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

Diperluas:

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());
Makanan Tangan
sumber
Ini cukup tua, tetapi "aeiou".ToCharArray()bisa 'a','e','i','o','u'untuk -2 byte
Perwujudan Ketidaktahuan
Tidak, @EmbodimentofIgnorance, IndexOfAnytidak butuh params, jadi perlunew[]{'a','e','i','o','u'}
Hand-E-Food
Ah, kesalahan saya, saya pikir IndexOfAnyadalah metode params. Anyways, jawaban yang bagus
Perwujudan Ketidaktahuan
3

𝔼𝕊𝕄𝕚𝕟, 24 karakter / 42 byte

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

Try it here (Firefox only).

Jika Anda perlu bantuan untuk memahami ini, ini diterjemahkan ke ES6 sebagai

input.replace(/([^aeiou]+)(.+ )([^aeiou]+)/g,'$3$2$1')
Mama Fun Roll
sumber
Bahasa apa ini? Saya mendapatkan karakter kotak untuk itu.
Jesse Williams
@ JesseWilliams Ini disebut ESMin .
ETHproduk
Akan lebih baik jika interperator memiliki sesuatu seperti yang Japt di mana ia menunjukkan Anda js 𝔼𝕊𝕄𝕚𝕟 menjadi
Generic User
JS yang dikompilasi dicatat di konsol JS saat kode dijalankan.
Mama Fun Roll
3

PowerShell, 52 byte

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

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

Itu adalah regex ganti dengan empat kelompok tangkap; dengan:

  • Perkalian string untuk diperluas:
    • ('(.*?)([aeiou]\S+) '*2) untuk '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • The "$args "pasukan args array menjadi string, dan menambahkan ruang tambahan sehingga ruang tambahan di regex tidak akan rusak.
TessellatingHeckler
sumber
3

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

  • Terima kasih downgoat!

Ini memperhitungkan jika parameternya adalah objek seperti ini, dan mundur:
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)}
Bulu ayam
sumber
.match(/[aeiou]/).indexdapat menjadi:.search`[aeiou]`
Downgoat
3

Python, 129 108 105 109 byte

Program ini menerima daftar kata-kata seperti ini ["master","plan"]

EDIT : Terima kasih @Vatilitas

EDIT: Sekarang menggunakan 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)

Jawaban ini menggunakan regex seperti kebanyakan dari mereka.

Coba di sini

TanMath
sumber
Perhatikan bahwa str.replacemengganti semua instance dari substring, jadi Anda ingin membatasi itu untuk satu penggantian dengan memiliki .replace(f,l,1). Namun, Anda bisa menyimpan banyak dengan menggunakan i,j=input(), dan memutarkan kembali re.findalldan '[^aeiou]+'ke variabel karakter tunggal.
Volatilitas
Ini tidak berfungsi sebagaimana mestinya; bahkan dua kata satu huruf akan memberi Anda tiga karakter, dan Anda mencoba membongkar input()menjadi dua variabel. Apakah maksud Anda i,j=input().split()(dan raw_input()dengan Python 2)?
Blacklight Shining
1
@BlacklightShining kata tersebut harus memiliki setidaknya satu vokal dan satu konsonan. Input memasukkan daftar string sehingga saya adalah kata pertama dan j adalah yang kedua.
TanMath
@TanMath sejauh yang saya tahu bahwa yang diperbolehkan secara default, tapi Anda mungkin harus mengatakan di suatu tempat jawaban bahwa itu diperlukan
undergroundmonorail
Ini menggantikan terlalu banyak. "sass","bit" -> "babb", "sit".
xnor
3

Java 8, 343 Bytes

Di sini Anda memiliki Java-Answer pertama Anda. Tidak begitu berpengalaman dengan bermain golf, jadi setiap saran sangat dihargai!

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

Tidak Disatukan:

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
sumber
Apa java.util.function.Function? Saya sangat meragukannya harus ada di sana, kecuali maksud Anda import, tetapi hentikan impor karena Anda hanya merujuknya sekali. Ubah public class C{public static void Main(String[] a)keinterface C{void Main(String[]a)
cat
Function<String, Integer>tidak perlu ruang putih
kucing
ubah for loop dari for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;menjadifor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
cat
i1adalah varname yang mengerikan, terlalu lama.
kucing
Artinya, ubah Function<String, Integer>ke java.util.function.Function<String,Integer>dan jatuhkan impor
kucing
3

Oktaf, 96 byte

Berkat penugasan sebaris Octave dan fungsionalitas 'indeks-di mana saja', semua ini hanyalah definisi dari satu fungsi anonim. Pada dasarnya, kami merekonstruksi string spoonerized sambil menyimpan titik cut-in adan b. Saya terutama senang dengan ffungsi inline , yang menemukan titik cut-off, dan mencegah saya harus menggunakan seluruh find(ismember(a,b),1)hal dua kali. Juga, tidak ada regex :) .

@(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
sumber
2

TeaScript , 27 byte

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

\wsebenarnya [^aeiou].

Downgoat
sumber
Tunggu, Anda mengubah \wmeta regex default menjadi [^aeiou]? Mengapa?
ETHproduk
@ ETHproductions ketika saya membuat kelas char kustom. Saya lupa \witu sudah digunakan oleh JavaScript. Saya akan segera mengubahnya kembali
Downgoat
2

Elixir ,143 117 Bytes

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]

Pisahkan dua string (a, b) pada vokal pertama dan buat string baru untuk kembali.

EDIT: Turunkan beberapa byte dengan menggunakan pencocokan pola, bukan elempanggilan kikuk untuk mendapatkan nilai dari tupel.

srecnig
sumber
2

Java, 147 Bytes

Saya berasumsi hanya sebuah fungsi juga baik-baik saja.

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)sayangnya mengkonsumsi pembatas, yang berarti bahwa saya harus menggunakan substringuntuk mendapatkan sufiks.

ECS
sumber
2

Pyth, 30 28 byte

Mengambil input dan memberikan output sebagai daftar dari dua kata.

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

Cobalah online.

Luke
sumber
Saya pikir Anda sedang mencari ACm,Kh:d"[aeiou]"3.-dKQ+V_GH. Amenetapkan daftar dua elemen ke G dan H, dan Cmentransposisi. Mungkin ada sesuatu yang lebih baik.
lirtosiast
2

Python (tanpa regex), 85 byte

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

Contoh dijalankan:

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

tadalah fungsi rekursif yang menghitung indeks vokal paling awal setelah karakter pertama dalam argumennya s. Jika karakter kedua s[1]adalah vokal, ia mengevaluasi True, yang memiliki intnilai 1. Kalau tidak, ia membuat panggilan rekursif dengan karakter pertama dihapus, dan menambahkan 1 ke indeks yang dihasilkan menggunakan -~(komplemen dua komplemen seseorang). Akhirnya, hasil tdigunakan sebagai indeks untuk mengiris tali untuk menghitung spoonerism.

Anders Kaseorg
sumber
1

GNU Awk 4.0, 48 karakter

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

Contoh dijalankan:

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
manatwork
sumber
1

PowerShell, 61 byte

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

Menggunakan regex untuk menukar karakter non-vokal pertama dari setiap kata

Mathias R. Jessen
sumber