Lời nói


50

Với hai chữ, spoonerise họ bằng cách chuyển các cụm phụ âm đầu tiên của họ. Ít byte nhất sẽ thắng.

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

Các phụ âm xuất hiện trước nguyên âm đầu tiên ( aeiou) được chuyển đổi.

Đầu vào: Hai chuỗi chữ thường bắt đầu bằng các phụ âm khác nhau và mỗi chuỗi chứa một nguyên âm aeiou.

Đầu ra: Hai chuỗi muỗng, theo đúng thứ tự.

Đối với đầu vào và / hoặc đầu ra, hai chuỗi cũng có thể nằm trong một danh sách hoặc tương tự hoặc dưới dạng một chuỗi có dấu phân cách.


Đây là một bản sao gần như của câu hỏi cũ này , nhưng tôi hy vọng sẽ viết một thông số rõ ràng và ổn định hơn để câu hỏi cũ có thể được đóng lại dưới dạng một bản sao .


4
Các từ bắt đầu bằng phụ âm.
xnor

21
Câu trả lời phải là "oozing snotter"imo ~
Patrick Roberts

3
@PatrickRoberts Tôi đồng ý, nhưng điều này làm cho thử thách đơn giản hơn một chút.
xnor

1
Không phải về chủ đề, nhưng một ví dụ đẹp về tuyết rơi -> rắn chảy
flawr

1
lucks nhanh và nhút nhát không được phép tham gia
Denham Coote

Câu trả lời:


50

Vim, 18 tổ hợp phím

/[aeiou]<CR>dbwvnhp0P

Thủ thuật quan trọng là dán một cái gì đó trong chế độ Visual thực sự đặt nội dung cũ của lựa chọn hình ảnh vào bộ đệm dán.


... oh, duh, đã không nghĩ về điều đó. Giữ bị ném ra bằng cách vbao gồm và cố gắng chọn từ nguyên âm trở lại.
Doorknob

10
Là một người dùng vim bình thường, tôi luôn ngạc nhiên khi tôi gõ từng lệnh liên tiếp
Aaron

4
<CR> có nghĩa là trả lại xe ngựa (thuật ngữ máy đánh chữ cũ!), Còn được gọi là Enter
Kai Carver

22

brainfuck, 238 207 byte

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

Yêu cầu ,trả về 0 trên EOF, các ô gói 8 bit và khả năng di chuyển sang trái từ ô 0. Theo kinh nghiệm của tôi, đây là các cài đặt mặc định phổ biến nhất.

Tôi khá hài lòng với điều này. Lần thử đầu tiên của tôi là 314 byte và đây chắc chắn là một sự cải tiến. :)

Nó hoạt động bằng cách lưu trữ mỗi byte từ đầu vào trong hai ô; một cái có giá trị thực của byte và cái kia có đầu ra của đoạn mã sau khi được đưa ra (giá trị của byte - 97):

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

Nếu ký tự là một phụ âm, nó xuất phát từ đó với giá trị khác không. Nếu đó là một nguyên âm, nó trở thành 0. Từ đó, vấn đề chỉ là tìm từ thứ hai bắt đầu và in mọi thứ theo thứ tự.

Phiên bản 238 byte của chương trình này đã tìm thấy ký tự khoảng trắng sau khi thu thập tất cả các đầu vào. Thật đau đầu vì làm như vậy liên quan đến việc tạo ra một ô chứa 0 ngay tại nơi tôi đang cố gắng lặp lại nó. Cách tôi giải quyết có tác dụng trừ 30 từ mỗi ký tự trong từ đầu tiên và 32 từ mỗi ký tự sau nó. Một phần khá lớn của mã được dành riêng để xử lý điều vô nghĩa đó.

Bây giờ, 32 được trừ khỏi mọi ký tự trong vòng lặp đầu vào, ngắn hơn và có tác dụng phụ tương tự dễ xử lý hơn. Như một phần thưởng, làm theo cách này cho phép tôi tạo nhân vật không gian của riêng mình theo cách ngắn hơn: Thay vì trừ 139 từ 171 (171 là những gì bạn nhận được khi chạy một khoảng trắng qua trình phát hiện nguyên âm ở trên), vòng lặp thêm 32 cho mỗi nhân vật đi ra ngoài để thêm 32 vào ô 171. Điều này có giá bốn byte ở đó, nhưng có nghĩa là tôi có thể trừ 171 từ nó sau (thay vì trừ 139) cho tổng số 3 byte được lưu.

Với nhận xét:

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

Điều này được tính ylà một nguyên âm, nhưng câu hỏi nói rằng nó không phải. ( nye cat-> ce nyat)
Loovjo

1
@Loovjo điều đó thực sự kỳ lạ, bởi vì mã kiểm tra nguyên âm chắc chắn coi ylà phụ âm ... Tôi sẽ xem xét lý do tại sao nó làm điều đó.
undergroundmonorail

17

vim, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

Tôi tự hỏi nếu vim thực sự cạnh tranh trong thử thách này. Có lẽ không phải với các ngôn ngữ chơi gôn, nhưng có lẽ với Ruby / Python / Perl / vv.

/[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
Tôi làm điều này trong chế độ Chèn, phải không?
Alex A.

5
@AlexA. ಠ_ಠ
tay nắm cửa

@AlexA. Chế độ chèn sẽ là một tổ hợp phím phụ :) ~
pydsigner

@AlexA. Chế độ chèn? Ý của bạn là chèn lệnh?
Blacklight Shining

1
@BlacklightShining Không. Đó là một trò đùa bởi vì nếu bạn đang ở chế độ chèn và bạn nhập nội dung đó, nó sẽ không thực hiện bất kỳ lệnh nào; bạn sẽ vừa gõ nó vào một tập tin.
Alex A.

13

Python, 68 63 60 byte

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

Hãy thử trực tuyến trên Ideone .

Làm thế nào nó hoạt động

Chuỗi mẫu được lặp lại ba lần ( *3), dẫn đến mẫu

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

Tất cả các phiên bản sẽ khớp với một chuỗi các nguyên âm không trống hoặc một chuỗi không trống theo sau là một ký tự khoảng trắng.

Trường hợp đầu tiên sẽ khớp với các phụ âm ở đầu từ đầu tiên. Vì +là tham lam, nó sẽ cố gắng kết hợp càng nhiều càng tốt, tức là, tất cả cho đến nguyên âm đầu tiên.

Bởi vì điều này, trường hợp thứ hai sẽ bắt đầu ở một nguyên âm, vì vậy nó sẽ khớp với phần còn lại của từ đầu tiên, cho đến và bao gồm khoảng trắng phân tách các từ.

Tương tự như ví dụ thứ nhất, từ thứ ba sẽ khớp với tất cả các phụ âm ở đầu từ thứ hai, dẫn đến kết quả khớp thành công cho toàn bộ mẫu.

Chuỗi thô \3\2\1( rngăn Python thay thế, \3v.v. bằng các ký tự điều khiển) đảo ngược thứ tự khớp của các mẫu được ngoặc đơn, nghĩa là nó thay thế chúng bằng các phụ âm ở đầu từ thứ hai , sau đó tất cả các ký tự từ nguyên âm đầu tiên của từ đầu tiên lên đến khoảng trắng, và cuối cùng là phụ âm ở đầu từ đầu tiên.

Đối số cuối cùng để sub( 1) làm cho nó trở lại ngay sau lần thay thế thành công đầu tiên, để tránh thay thế vô nghĩa trong phần còn lại của từ thứ hai. Điều này là bắt buộc vì mẫu có thể khớp với bất kỳ chuỗi gồm ba phụ âm liên tiếp trở lên.


1
Xin chúc mừng tiền thưởng, vì đã mang ma thuật regex cho Python với một regex rất hiệu quả. Giải thích tốt quá.
xnor

11

JavaScript (ES6), 54 byte

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

Giải trình

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
  )

Kiểm tra

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, xấu của tôi, tôi hiểu lầm. Tôi sẽ xem các tài liệu của md matchkhi tôi về nhà
Patrick Roberts

Các +!iBí quyết là một giải pháp tốt đẹp. +1
Sản phẩm ETH

10

Python 3, 108 101 99 byte

(Không sử dụng regex)

Hàm này mong đợi đầu vào thông qua 2 đối số, ví dụ f('blushing','crow'). Trả về các từ mới trong một 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

Có rất nhiều giải pháp regex, vì vậy tôi muốn viết một cái gì đó không sử dụng thư viện re của Python.

Làm thế nào nó hoạt động

Phần phức tạp duy nhất là biểu thức lambda S(viết tắt có nghĩa là " S plit trước nguyên âm đầu tiên"). Nó đệ quy "lặp lại" trên từ đã cho, di chuyển một ký tự tại một thời điểm từ đầu s(bắt đầu bằng toàn bộ từ) đến cuối p(bắt đầu trống). Ở nguyên âm đầu tiên gặp phải, nó trả về (p,s), tức là (tiền tố, hậu tố). Lưu ý rằng đó là thứ tự sai so với các tham số!

Tôi nghĩ rằng nó có ý nghĩa hơn đối với thứ tự trả về là tiền tố, sau đó là hậu tố (vì nói chung tiền tố đi trước hậu tố). Thứ tự này có thể làm cho a,b=S(x)mã dễ đọc hơn một chút.

Nhưng tôi không có lựa chọn nào về thứ tự trong các tham số của lambda, vì vậy tôi không thể xác định ptrước s. Tham số đầu tiên s, phải lấy toàn bộ từ vì pcó giá trị mặc định và tham số mặc định đi sau cùng. Làm điều đó, tôi không cần phải gọi hàm Svới một chuỗi rỗng hai lần và một vài byte có thể được lưu. Tuy nhiên, có lẽ đơn giản là một quyết định tồi khi trả lại tiền tố / hậu tố theo thứ tự ngược lại vì nó được sử dụng trong biểu thức lambda.

Đối với sự lựa chọn của biểu thức lambda qua chức năng, phải mất nhiều byte để nói def S(s,p=""):returnhơn S=lambda s,p="":. Tôi có thể đưa ra lựa chọn đó vì Python có đánh giá ngắn mạch và toán tử ternary. Tuy nhiên, tôi không thể giải thích thỏa đáng về cách tôi sử dụng ngắn mạch; thật khó để lý do.


Đây là câu trả lời đầu tiên của tôi. Tôi hy vọng tôi đã làm điều này một cách chính xác, và có giá trị để đăng một giải pháp không thể thắng.

Chỉnh sửa: Bình luận viên cảm ơn: Giảm số byte một chút, hai lần và xóa thông tin không cần thiết. Đã cố gắng cải thiện chữ viết. Hy vọng không có sai lầm.


Chào mừng bạn đến với ppcg, câu trả lời đầu tiên tuyệt vời :) chỉ cần fyi, hầu hết các chương trình trên trang web này không có dòng mới, vì vậy bạn không cần phải đề cập đến nó (trong những trường hợp hiếm hoi khi cần thiết, đó là khi mọi người đề cập đến nó)
undergroundmonorail

3
Chào mừng bạn đến với Câu đố lập trình & Code Golf! 1. Bạn không phải lo lắng về định dạng đầu vào. Thách thức nói rõ rằng bạn có thể lấy một danh sách. 2. Theo các mặc định được đề cập trong wiki thẻ , bạn có thể gửi các chương trình hoặc chức năng đầy đủ để mã hóa các thách thức golf. Đối với vấn đề cụ thể này, một hàm nên ngắn hơn 7 byte.
Dennis

4
Về câu cuối cùng, "Tôi hy vọng [...] có giá trị để đăng một giải pháp không thể thắng." Chắc chắn là có! Tất cả chúng ta đều ở đây để vui chơi, đóng góp và học hỏi lẫn nhau. Tôi thấy câu trả lời này đặc biệt thông minh vì giải pháp rõ ràng hơn là sử dụng các biểu thức thông thường. Công việc rất tốt!
Alex A.

Một câu trả lời đầu tiên tuyệt vời. Nó khá giống với những gì tôi nghĩ ra cho phi regex. Bạn đã có một suy nghĩ tốt về việc sử dụng các biểu thức logic ngắn mạch, và hóa ra họ có thể rút ngắn biểu thức, mặc dù có lẽ bạn muốn nghĩ về cách làm điều đó.
xnor

Tôi thực sự thích thực tế bạn đã sử dụng một giải pháp đệ quy. Thực hiện rất thanh lịch!
Ogaday

9

C # 6, 115 byte

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

Nó chỉ là một nỗi đau không gian tên cho regex là quá dài.


2
Trời ạ, đó là dài dòng.
Conor O'Brien

4
System.Text.RegularExpressions.Regex.Replace44 ký tự! +1 vì đó phải là một loại hồ sơ.
Cấp sông St

2
... Và bây giờ bạn có 44 vấn đề. ;)
Mason Wheeler

9

CJam, 27 24 22 byte

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

I / O là một từ trên mỗi dòng. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

Đã lưu 6 byte nhờ vào ETH Productstions!

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

Kiểm tra nó! (Chỉ ES6)


Tôi vừa mới bấm vào trả lời bài đăng trên giải pháp 58 byte của mình khi bạn thực hiện chỉnh sửa này haha
user81655

@ user81655 Ồ, xin lỗi vì nó đã xảy ra như thế.
Conor O'Brien

Bạn không cần nhóm bắt giữ thứ tư hoặc $4tất cả;)
ETHproductions

@ETHproductions Oh, yeah! Cảm ơn!
Conor O'Brien

7

C, 255 201 199 byte

Tôi không thấy nhiều câu trả lời C quanh đây, vì vậy hãy tận hưởng; Ngoài ra, lần đầu tiên chơi golf, đề xuất và phê bình được chào đón.

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

Nếu main () không bắt buộc, chúng tôi có thể lưu 24 byte, nhận được tới 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);}

Ung dung:

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: Nhờ đề xuất của frageum, tôi đã lưu được 54 byte. = D


Tôi khuyên bạn nên nhìn vào strpbrk.
frageum

+1 Đây là một câu trả lời đầu tiên tuyệt vời . Chào mừng đến với trang web.
wizzwizz4

Cảm ơn đã giới thiệu @feersum. Và cảm ơn vì sự chào đón @ wizzwizz4!
Lince Assassino

6

Python 2, 364 352 269 251 byte

EDIT: Cảm ơn rất nhiều đến @Cyoce vì đã giúp tôi chơi golf 83 byte!

Xin hãy giúp tôi chơi golf này! Dù sao, ít nhất tôi là người trả lời Python đầu tiên. Và tôi hy vọng tôi có thể đánh bại Java, nếu có câu trả lời 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)

Hãy thử nó ở đây


5
-1 vì đã không cố gắng đánh gôn này ngoài các biến ký tự đơn
Mego

@Mego Tôi hứa tôi đang làm việc trên ASAP đó. Ngay bây giờ. Nhưng tôi đang làm việc trên một phiên bản regex.
TanMath

@Mego vui lòng xem chỉnh sửa.
TanMath

5

Japt, 26 25 byte

May mắn thay, tôi đã thêm một lớp nguyên âm vào các tính năng regex của Japt vài ngày trước. Thật không may, tôi đã không thêm một lớp không nguyên âm hoặc một cách xung quanh dấu gạch chéo kép trong chuỗi regex.

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

Các ¿nên là char thô U + 0093. Đầu vào là một chuỗi nhiều dòng, một từ / dòng. Hãy thử trực tuyến!

EDIT: Bây giờ tôi đã thêm lớp không nguyên âm \Vvà cách xung quanh \\(với %), vì vậy mã này hiện hoạt động với 21 byte : ( Dùng thử trực tuyến )

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

Làm thế nào nó hoạt động

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

Phiên bản cũ (26 byte):

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Tôi muốn các ngôn ngữ chính có meta nguyên âm cho regexes!
CJ Dennis

4

Python 3, 100 (hoặc 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):]

Chơi với một vài phiên bản nhưng dường như không thể có được nó dưới đây. Có thể lấy nó xuống 99 byte bằng cách sử dụng def f(g)thay vào đó để nó có một danh sách các chuỗi chứ không phải hai chuỗi riêng biệt, nhưng tôi thích hai arg roue hơn.

Thay thế là chiều dài bằng nhau:

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

Tôi đã thử thay thế, như @TanMath sử dụng, nhưng tôi không thể rút ngắn được nữa. Ngoài ra, TanMath có thể nhận được câu trả lời của mình ngắn hơn một byte bằng cách sử dụng "[aeiou]"thay "[aeiou]+"vì bởi vì chúng ta chỉ cần khớp với các trường hợp duy nhất. Cuối cùng, việc thực hiện input()dường như đã thay đổi giữa py2 và py3 - nó tự động đánh giá stdin như một chuỗi.


1
Có lẽ bạn có nghĩa là s=re.splittrong thay thế?
xnor

Đúng! Chắc chắn rồi. Đây là lần đầu tiên tôi chơi golf, vì vậy mọi phản hồi và lời khuyên đều được đánh giá cao.
Ogaday

1
1. Câu hỏi rõ ràng cho phép lấy hai chuỗi làm danh sách, vì vậy dường như không có lý do chính đáng nào cho việc *nhập *g. 2. Phiên bản thứ hai có thể được chơi xuống lambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):]).
Dennis

Cảm ơn @Dennis, điều đó thực sự hiệu quả, tái cấu trúc tốt đẹp. Thật thú vị khi các dấu ngoặc là cần thiết, và bạn không cần phải chuyển s thành một đối số cho lambda thứ hai phải không? Giải pháp đó mang lại cho tôi 98 byte, với một câu lệnh nhập hàng đầu và f=.
Ogaday

1
Không, slà một đối số mặc định, vì vậy bạn không phải chỉ định nó. Một lambda không tên là một đệ trình chấp nhận được; f=không được yêu cầu.
Dennis

4

sed, 38 ký tự

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

Sử dụng biểu thức chính quy mở rộng từ giải pháp Retina .

Trên đây là 37 ký tự và yêu cầu -rchuyển đổi (+1 ký tự).

Thí dụ:

$ 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

Chào mừng bạn đến với Câu đố lập trình & 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());

Mở rộng:

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

Điều này khá cũ, nhưng "aeiou".ToCharArray()có thể 'a','e','i','o','u'dành cho -2 byte
Hiện thân của sự thờ ơ

Không, @EmbodimentofIgnorance, IndexOfAnynó không cần thông số, vì vậy nó cần phải cónew[]{'a','e','i','o','u'}
Hand-E-Food

Ah, sai lầm của tôi, tôi nghĩ IndexOfAnylà một phương pháp params. Dù sao, câu trả lời tuyệt vời
Hiện thân của sự thiếu hiểu biết

3

, 24 ký tự / 42 byte

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

Try it here (Firefox only).

Nếu bạn cần trợ giúp để hiểu điều này, điều này dịch sang ES6 là

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

Ngôn ngữ này là gì? Tôi đang nhận được các ký tự hộp cho điều đó.
Jesse Williams

@JlieWilliams Nó được gọi là ESMin .
Sản phẩm ETH

Sẽ thật tuyệt nếu bộ điều khiển có một cái gì đó giống như Japt nơi nó cho bạn thấy js the trở thành
Người dùng chung

Biên dịch JS được ghi vào bảng điều khiển JS khi mã được chạy.
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

Đó là một regex thay thế bằng bốn nhóm bắt; với:

  • Nhân chuỗi để mở rộng:
    • ('(.*?)([aeiou]\S+) '*2) đến '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • Các "$args "mảng buộc các chuỗi args thành một chuỗi và thêm một khoảng trắng ở cuối để khoảng trống ở regex sẽ không phá vỡ nó.

3

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

  • Cảm ơn hạ cấp!

Điều này sẽ được tính đến nếu các tham số là một đối tượng như thế này và lạc hậu:
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]/).indexcó thể trở thành:.search`[aeiou]`
Hạ cấp

3

Python, 129 108 105 109 byte

Chương trình này có một danh sách các từ như thế này ["master","plan"]

EDIT : Cảm ơn @Volatility

EDIT: Hiện đang sử dụng 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)

Câu trả lời này sử dụng regex như hầu hết trong số họ làm.

Hãy thử nó ở đây


Lưu ý rằng str.replacethay thế tất cả các phiên bản của một chuỗi con, vì vậy bạn muốn giới hạn nó trong một thay thế bằng cách có .replace(f,l,1). Tuy nhiên, bạn có thể lưu một bó bằng cách sử dụng i,j=input(), và đóng lại re.findall'[^aeiou]+'các biến ký tự đơn.
Biến động

Điều này không hoạt động như nó là; thậm chí hai từ một chữ cái sẽ cung cấp cho bạn ba ký tự và bạn đang cố gắng giải nén input()thành hai biến. Ý của bạn là i,j=input().split()(và raw_input()trong Python 2)?
Blacklight Shining

1
@BlacklightShining từ cần phải có ít nhất một nguyên âm và một phụ âm. Đầu vào lấy trong một danh sách các chuỗi vì vậy i là từ đầu tiên và j là từ thứ hai.
TanMath

@TanMath như xa như tôi biết rằng được phép theo mặc định, nhưng có lẽ bạn nên nói ở một nơi nào đó câu trả lời mà nó yêu cầu
undergroundmonorail

Điều này thay thế quá nhiều. "sass","bit" -> "babb", "sit".
xnor

3

Java 8, 343 byte

Ở đây bạn có câu trả lời Java đầu tiên của bạn. Không có kinh nghiệm với việc chơi golf, vì vậy mọi đề nghị đều được đánh giá cao!

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

Ung dung:

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

Có gì java.util.function.Function? Tôi rất nghi ngờ nó cần phải ở đó, trừ khi bạn có ý định import, nhưng bỏ nhập vì bạn chỉ tham khảo nó một lần. Đổi public class C{public static void Main(String[] a)thànhinterface C{void Main(String[]a)
mèo

Function<String, Integer>không cần khoảng trắng
mèo

thay đổi vòng lặp for for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;thànhfor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
cat

i1là một biến thể khủng khiếp, quá dài.
mèo

Đó là, sự thay đổi Function<String, Integer>đến java.util.function.Function<String,Integer>và thả nhập khẩu
mèo

3

Octave, 96 byte

Nhờ các bài tập nội tuyến của Octave và chức năng 'chỉ mục ở mọi nơi', toàn bộ điều này chỉ là định nghĩa của một hàm ẩn danh duy nhất. Về cơ bản, chúng tôi xây dựng lại chuỗi thìa trong khi lưu trữ các điểm giới hạn trong ab. Tôi đặc biệt hài lòng với fchức năng nội tuyến , tìm ra điểm giới hạn và ngăn tôi khỏi phải sử dụng toàn bộ ' find(ismember(a,b),1)' hai lần. Ngoài ra, không có 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)];

2

TeaScript , 27 byte

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

\wlà thực sự [^aeiou].


Đợi đã, bạn đã thay đổi \wmeta regex mặc định thành [^aeiou]? Tại sao?
Sản phẩm ETH

@ETHproductions khi tôi đang tạo các lớp char tùy chỉnh. Tôi quên rằng \wđã được sử dụng bởi JavaScript. Tôi sẽ sớm thay đổi lại
Hạ cấp

2

Elixir ,143 117 byte

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]

Tách hai chuỗi (a, b) trên nguyên âm đầu tiên và xây dựng các chuỗi mới để trả về.

EDIT: Giảm một vài byte bằng cách sử dụng khớp mẫu thay vì các elemlệnh gọi cồng kềnh để lấy các giá trị ra khỏi bộ dữ liệu.


2

Java, 147 byte

Tôi giả sử chỉ là một chức năng là tốt quá.

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)không may tiêu thụ dấu phân cách, có nghĩa là tôi phải sử dụng substringđể có các hậu tố.


2

Bình thường, 30 28 byte

Lấy đầu vào và đưa ra đầu ra dưới dạng một danh sách của hai từ.

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

Hãy thử trực tuyến.


Tôi nghĩ rằng bạn đang tìm kiếm ACm,Kh:d"[aeiou]"3.-dKQ+V_GH. Agán danh sách hai yếu tố cho G và H và Choán vị. Có thể có một cái gì đó thậm chí còn tốt hơn.
lirtosiast

2

Python (không có biểu thức chính quy), 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):])

Chạy mẫu:

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

tlà một hàm đệ quy tính toán chỉ số của nguyên âm sớm nhất sau ký tự đầu tiên trong đối số của nó s. Nếu ký tự thứ hai s[1]là nguyên âm, nó đánh giá True, có intgiá trị 1. Mặt khác, nó thực hiện một cuộc gọi đệ quy với ký tự đầu tiên được loại bỏ và thêm 1 vào chỉ mục kết quả bằng cách sử dụng -~(phần bù hai của phần bù của một). Cuối cùng, kết quả của tđược sử dụng như các chỉ số để cắt chuỗi để tính toán công cụ muỗng.


1

GNU Awk 4.0, 48 ký tự

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

Chạy mẫu:

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 byte

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

Sử dụng regex để hoán đổi các ký tự không nguyên âm đầu tiên của mỗi từ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.