คำพูดของสปูน


50

ได้รับสองคำspooneriseพวกเขาโดยการเปลี่ยนพยัญชนะกลุ่มแรกของพวกเขา ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

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

พยัญชนะปรากฏขึ้นก่อนที่จะเปลี่ยนเสียงสระแรก ( aeiou)

การป้อนข้อมูล:aeiouสองสตริงตัวพิมพ์เล็กที่ขึ้นต้นด้วยพยัญชนะที่แตกต่างกันและแต่ละประกอบด้วยสระ

เอาท์พุท:สองสายช้อนในลำดับที่ถูกต้อง

สำหรับอินพุตและ / หรือเอาต์พุตทั้งสองสตริงอาจอยู่ในรายการหรือสิ่งที่คล้ายหรือเป็นสตริงเดี่ยวที่มีตัวคั่น


นี่คือใกล้ล่อของคำถามนี้เก่าแต่ฉันหวังว่าจะเขียนสเป็คที่เป็นที่ชัดเจนและมีเสถียรภาพมากขึ้นเพื่อให้คนเก่าสามารถปิดเป็นล่อ


4
คำเริ่มต้นด้วยพยัญชนะ
xnor

21
คำตอบควรเป็น"oozing snotter"imo ~
Patrick Roberts

3
@PatrickRoberts ฉันเห็นด้วย แต่นี่ทำให้การท้าทายง่ายขึ้นเล็กน้อย
xnor

1
ไม่มากในหัวข้อ แต่เป็นตัวอย่างที่ดีเกล็ดหิมะ -> flow snake
flawr

1
ไม่อนุญาตให้นำโชคอย่างรวดเร็วและเขี้ยวลากดินเข้าร่วม
Denham Coote

คำตอบ:


50

เป็นกลุ่ม 18 การกดแป้น

/[aeiou]<CR>dbwvnhp0P

เคล็ดลับสำคัญคือการวางสิ่งในโหมด Visual จริง ๆ แล้วทำให้เนื้อหาเก่าของการเลือกภาพในบัฟเฟอร์การวาง


... โอ้ใช่แล้วไม่คิดอย่างนั้น ทำให้ถูกโยนออกไปโดยvรวมและพยายามที่จะเลือกจากเสียงสระกลับ
Doorknob

10
ในฐานะผู้ใช้ที่ไม่เป็นทางการฉันยังคงประหลาดใจเมื่อฉันพิมพ์คำสั่งที่ต่อเนื่องกันทุกครั้ง
Aaron

4
<CR> หมายถึงการคืนรถ (คำศัพท์เครื่องพิมพ์ดีดเก่า!) หรือที่รู้จักในชื่อ Enter
Kai Carver

22

brainfuck, 238 207 ไบต์

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

ต้อง,คืน 0 ใน EOF, เซลล์ห่อ 8 บิตและความสามารถในการย้ายไปทางซ้ายจากเซลล์ 0 จากประสบการณ์ของฉันสิ่งเหล่านี้คือการตั้งค่าเริ่มต้นทั่วไป

ฉันมีความสุขมากกับอันนี้ ความพยายามครั้งแรกของฉันคือ 314 ไบต์และนี่เป็นการปรับปรุงอย่างแน่นอน :)

มันทำงานได้โดยการเก็บทุกไบต์จากอินพุตในสองเซลล์ หนึ่งที่มีมูลค่าที่แท้จริงของไบต์และอื่น ๆ ที่มีเอาท์พุทของรหัสต่อไปนี้เมื่อได้รับ (ค่าของไบต์ - 97):

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

หากตัวละครเป็นพยัญชนะมันจะออกมาจากที่มีค่าที่ไม่เป็นศูนย์ ถ้ามันเป็นเสียงสระมันจะกลายเป็น 0 จากนั้นเป็นเพียงการค้นหาว่าคำที่สองเริ่มต้นและพิมพ์ทุกอย่างตามลำดับ

เวอร์ชัน 238 ไบต์ของโปรแกรมนี้พบอักขระช่องว่างหลังจากรวบรวมอินพุตทั้งหมด มันปวดหัวเพราะการทำเช่นนั้นเกี่ยวข้องกับการสร้างเซลล์ที่มี 0 ตรงที่ฉันพยายามวนไปรอบ ๆ มัน วิธีที่ฉันแก้ไขซึ่งมีผลในการลบ 30 จากตัวละครทุกตัวในคำแรกและ 32 จากตัวละครทุกตัวหลังจากนั้น ส่วนใหญ่ของรหัสนั้นอุทิศให้กับการจัดการเรื่องไร้สาระนั้น

ตอนนี้ 32 ถูกลบออกจากตัวละครทุกตัวในอินพุตวนซึ่งสั้นกว่าและมีผลข้างเคียงที่คล้ายกันซึ่งง่ายต่อการจัดการ ในฐานะโบนัสการทำแบบนี้ทำให้ฉันสามารถสร้างตัวละครในอวกาศของฉันในวิธีที่สั้นกว่า: แทนที่จะลบ 139 จาก 171 (171 เป็นสิ่งที่คุณได้รับเมื่อคุณวิ่งผ่านช่องว่างผ่านเครื่องตรวจจับเสียงสระด้านบน) ห่วงที่เพิ่ม 32 ตัวละครทุกตัวออกไปเพื่อเพิ่ม 32 เซลล์ 171 ตัว ค่าใช้จ่ายนี้มีสี่ไบต์ แต่หมายความว่าฉันสามารถลบ 171 ได้ในภายหลัง (แทนการลบ 139) สำหรับการบันทึกสุทธิทั้งหมด 3 ไบต์

ด้วยความคิดเห็น:

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

สิ่งนี้นับyเป็นสระ แต่คำถามบอกว่าไม่ใช่ ( nye cat-> ce nyat)
Loovjo

1
@ Loovjo มันแปลกจริงๆเพราะรหัสที่ตรวจสอบเสียงสระถือว่าyเป็นพยัญชนะอย่างแน่นอน... ฉันจะดูว่าทำไมมันถึงทำแบบนั้น
undergroundmonorail

17

เป็นกลุ่ม, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

ฉันสงสัยว่าเสียงเรียกเข้านั้นแข่งขันกับความท้าทายนี้ได้หรือไม่ อาจไม่ใช่ภาษากอล์ฟ แต่อาจใช้กับ 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

11
ฉันทำสิ่งนี้ในโหมดแทรกใช่ไหม
Alex A.

5
@AlexA ಠ_ಠ
Doorknob

@AlexA โหมดการแทรกจะเป็นการกดแป้นพิเศษ
:)

@AlexA แทรกโหมดหรือไม่ คุณหมายถึง insert command?
แบล็กไลท์ส่องแสง

1
@BlacklightShining Nope มันเป็นเรื่องตลกเพราะถ้าคุณอยู่ในโหมดแทรกและคุณพิมพ์สิ่งนั้นมันจะไม่รันคำสั่งใด ๆ คุณจะพิมพ์มันลงในไฟล์
Alex A.

13

Python, 68 63 60 ไบต์

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

ลองมันออนไลน์บนIdeone

มันทำงานอย่างไร

สตริงรูปแบบซ้ำสามครั้ง ( *3) ส่งผลให้รูปแบบ

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

อินสแตนซ์ทั้งหมดจะจับคู่สตริงที่ไม่ว่างที่ไม่ใช่สระหรือสตริงที่ไม่ว่างแล้วตามด้วยอักขระเว้นวรรคเดียว

อินสแตนซ์แรกจะจับคู่พยัญชนะตอนต้นของคำแรก เนื่องจาก+เป็นโลภมันจะพยายามจับคู่ให้มากที่สุดเท่าที่จะเป็นไปได้นั่นคือทั้งหมดจนถึงสระแรก

ด้วยเหตุนี้อินสแตนซ์ที่สองจะเริ่มต้นด้วยเสียงสระดังนั้นจึงจะตรงกับส่วนที่เหลือของคำแรกจนถึงและรวมถึงช่องว่างที่แยกคำ

เช่นเดียวกันกับอินสแตนซ์แรกตัวที่สามจะจับคู่พยัญชนะทั้งหมดในตอนต้นของคำที่สองทำให้เกิดการจับคู่ที่ประสบความสำเร็จสำหรับรูปแบบทั้งหมด

สตริง raw \3\2\1( rป้องกัน Python ไม่ให้แทนที่\3ฯลฯ ด้วยอักขระควบคุม) กลับคำสั่งของการจับคู่ของรูปแบบเครื่องหมายวงเล็บเช่นแทนที่ด้วยตัวอักษรที่เริ่มต้นของคำที่สองจากนั้นอักขระทั้งหมดจากสระแรกของ คำแรกขึ้นไปยังพื้นที่และในที่สุดก็พยัญชนะที่จุดเริ่มต้นของคำแรก

อาร์กิวเมนต์สุดท้ายเป็นsub( 1) ทำให้กลับมาทันทีหลังจากการแทนที่สำเร็จครั้งแรกเพื่อหลีกเลี่ยงการแทนที่แบบไร้สาระในส่วนที่เหลือของคำที่สอง สิ่งนี้จำเป็นเนื่องจากรูปแบบสามารถจับคู่สตริงของพยัญชนะสามตัวขึ้นไปติดต่อกัน


1
ขอแสดงความยินดีกับรางวัลสำหรับการนำเวทมนตร์ regex มาสู่ Python ด้วย regex ที่มีประสิทธิภาพมาก คำอธิบายที่ดีเช่นกัน
xnor

11

JavaScript (ES6), 54 ไบต์

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

คำอธิบาย

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
  )

ทดสอบ

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>


โอ้ฉันไม่ดีฉันเข้าใจผิด ฉันจะดูเอกสาร mdn สำหรับmatchเมื่อฉันกลับถึงบ้าน
Patrick Roberts

+!iเคล็ดลับคือการแก้ปัญหาที่ดี +1
ETHproductions

10

Python 3, 108 101 99 ไบต์

(ไม่ใช้ regex)

ฟังก์ชั่นนี้คาดว่าจะมีการป้อนข้อมูลผ่านทาง 2 f('blushing','crow')ข้อโต้แย้งเช่น ส่งคืนคำศัพท์ใหม่ใน 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

มีวิธีแก้ปัญหา regex จำนวนมากดังนั้นฉันต้องการเขียนสิ่งที่ไม่ได้ใช้ไลบรารีของ Python

มันทำงานอย่างไร

ส่วนที่ซับซ้อนเท่านั้นคือการแสดงออกแลมบ์ดาS(ตัวย่อหมายถึง " S plit ก่อนสระแรก") มันซ้ำ "ซ้ำ" เหนือคำที่กำหนดย้ายตัวละครตัวหนึ่งในเวลาตั้งแต่จุดเริ่มต้นของs(ซึ่งเริ่มต้นด้วยคำทั้งหมด) ไปยังจุดสิ้นสุดของp(ซึ่งเริ่มว่าง) ที่สระแรกพบว่ามันกลับ(p,s)มาคือ (คำนำหน้าคำต่อท้าย) ขอให้สังเกตว่านั่นเป็นคำสั่งที่ผิดเมื่อเทียบกับพารามิเตอร์!

ฉันคิดว่ามันเหมาะสมกว่าที่คำสั่งที่ส่งคืนจะเป็นคำนำหน้าจากนั้นคำต่อท้าย (เพราะโดยทั่วไปคำนำหน้าจะอยู่ก่อนคำต่อท้าย) คำสั่งนี้อาจทำให้อ่านa,b=S(x)รหัสได้ง่ายขึ้นเล็กน้อย

แต่ผมไม่มีทางเลือกของการสั่งซื้อในพารามิเตอร์แลมบ์ดาฯ ดังนั้นฉันไม่สามารถกำหนดก่อนp sพารามิเตอร์แรกs, ต้องใช้ทั้งคำเนื่องจากpมีค่าเริ่มต้นและพารามิเตอร์เริ่มต้นใช้งานล่าสุด การทำเช่นนั้นฉันไม่จำเป็นต้องเรียกใช้ฟังก์ชันSด้วยสตริงว่างสองครั้งและสามารถบันทึกได้สองสามไบต์ อย่างไรก็ตามอาจเป็นการตัดสินใจที่ไม่ถูกต้องที่จะคืนคำนำหน้า / คำต่อท้ายตามลำดับตรงกันข้ามเนื่องจากมันถูกใช้ภายในนิพจน์แลมบ์ดา

ในฐานะที่เป็นทางเลือกในการแสดงออกแลมบ์ดามากกว่าฟังก์ชั่นก็จะใช้เวลาไบต์มากกว่าที่จะพูดมากกว่าdef S(s,p=""):return S=lambda s,p="":ฉันสามารถเลือกได้เพราะ Python มีการประเมินผลการลัดวงจรและผู้ประกอบการที่ประกอบไปด้วยสามส่วน อย่างไรก็ตามฉันไม่สามารถอธิบายวิธีใช้วงจรลัดได้อย่างเพียงพอ มันยากที่จะให้เหตุผลเกี่ยวกับ


นี่คือคำตอบแรกของฉัน ฉันหวังว่าฉันทำสิ่งนี้ถูกต้องและมีคุณค่าในการโพสต์โซลูชันที่ไม่สามารถชนะได้

การแก้ไข: ผู้แสดงความคิดเห็นขอบคุณ: ลดจำนวนไบต์ลงสองเท่าและลบข้อมูลที่ไม่จำเป็นออกไป พยายามปรับปรุงการเขียน หวังว่าจะไม่มีข้อผิดพลาด


ยินดีต้อนรับสู่ ppcg คำตอบแรกที่ดี :) เพียงแค่ fyi โปรแกรมส่วนใหญ่ในเว็บไซต์นี้ไม่มีบรรทัดใหม่ที่ต่อท้ายดังนั้นคุณไม่ต้องพูดถึงมัน (ในกรณีที่หายากเมื่อจำเป็นมันคือเมื่อมีคนพูดถึงมัน)
undergroundmonorail

3
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! 1. คุณไม่ต้องกังวลกับรูปแบบการป้อนข้อมูล ความท้าทายบอกอย่างชัดเจนว่าคุณสามารถทำรายการได้ 2. ตามค่าเริ่มต้นที่กล่าวถึงในแท็ก wikiคุณสามารถส่งโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบเพื่อเขียนรหัสการแข่งขันกอล์ฟ สำหรับปัญหาเฉพาะนี้ฟังก์ชั่นควรสั้นลง 7 ไบต์
Dennis

4
เกี่ยวกับประโยคสุดท้าย"ฉันหวังว่า [... ] จะมีค่าต่อการโพสต์โซลูชันที่ไม่สามารถชนะได้" แน่นอนที่สุดคือ! เราทุกคนอยู่ที่นี่เพื่อความสนุกสนานและมีส่วนร่วมและเรียนรู้จากกันและกัน ฉันพบว่าคำตอบนี้ฉลาดโดยเฉพาะอย่างยิ่งวิธีแก้ปัญหาที่ชัดเจนยิ่งขึ้นคือการใช้นิพจน์ทั่วไป เป็นงานที่ดีมาก!
Alex A.

คำตอบแรกที่ยอดเยี่ยม มันค่อนข้างคล้ายกับสิ่งที่ฉันคิดขึ้นมาสำหรับ non-regex คุณมีความคิดที่ดีเกี่ยวกับการใช้การแสดงออกเชิงตรรกะแบบลัดวงจรและปรากฎว่าพวกเขาสามารถทำให้การแสดงออกสั้นลงแม้ว่าบางทีคุณอาจต้องการคิดเองเกี่ยวกับวิธีการทำเช่นนั้น
xnor

ฉันชอบความจริงที่คุณใช้โซลูชันแบบเรียกซ้ำ ดำเนินการอย่างหรูหรามาก!
Ogaday

9

C # 6, 115 ไบต์

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

เป็นเพียงความเจ็บปวดเนมสเปซสำหรับ regex นั้นยาวมาก


2
พุทโธ่ของฉันที่ verbose
Conor O'Brien

4
System.Text.RegularExpressions.Regex.Replace44 ตัวอักษร! +1 เพราะนั่นต้องเป็นบันทึก
เลเวลริเวอร์เซนต์

2
... และตอนนี้คุณมีปัญหา 44 ข้อ ;)
Mason Wheeler

9

CJam, 27 24 22 ไบต์

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

I / O คือหนึ่งคำต่อบรรทัด ลองออนไลน์!

มันทำงานอย่างไร

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.

9

Perl, 33 ไบต์

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

โค้ดด้านบนยาว32 ไบต์และต้องการ-pสวิตช์ ( +1 ไบต์ )

การเปลี่ยนตัวผู้เล่นเป็นอย่างมากคล้ายกับหนึ่ง@ คำตอบ Retina DigitalTrauma ของแต่คำตอบนี้จะได้ประโยชน์จากsubpatterns recursive PCRE ของ

ลองมันออนไลน์บนIdeone



8

JavaScript ES6, 93 58 52 ไบต์

บันทึก 6 ไบต์ด้วย ETHProductions!

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

ทดสอบ! (ES6 เท่านั้น)


ฉันเพิ่งจะคลิกคำตอบโพสต์ในโซลูชั่น 58 byte ของฉันเมื่อคุณทำการแก้ไขนี้ฮ่า ๆ
user81655

@ user81655 โอ้ขอโทษที่เกิดขึ้นแบบนั้น
Conor O'Brien

คุณไม่ต้องการกลุ่มจับภาพที่สี่หรือ$4เลย;)
ETHproductions

@ ETHproductions โอ้ใช่! ขอบคุณ!
Conor O'Brien

7

C, 255 201 199 ไบต์

ฉันไม่เห็นคำตอบ C จำนวนมากที่นี่ดังนั้นสนุก นอกจากนี้ยังยินดีต้อนรับการเล่นกอล์ฟครั้งแรกข้อเสนอแนะและคำวิจารณ์

#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 () เราสามารถบันทึก 24 bytes ได้ที่ 179 bytes

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

แก้ไข: ขอบคุณคำแนะนำของ feersum ฉันบันทึก 54 ไบต์ = D


strpbrkผมขอแนะนำให้มองเข้าไปใน
feersum

+1 นี่คือคำตอบแรกที่ดี ยินดีต้อนรับสู่เว็บไซต์
wizzwizz4

ขอบคุณสำหรับ recommedation @feersum และขอบคุณสำหรับการต้อนรับ @ wizzwizz4!
Lince Assassino

6

Python 2, 364 352 269 251 ไบต์

แก้ไข:ขอบคุณมากที่ @Cyoce ช่วยฉันกอล์ฟ 83 ไบต์!

โปรดช่วยฉันเล่นกอล์ฟนี้ด้วย! อย่างไรก็ตามอย่างน้อยฉันก็เป็นผู้ตอบ Python คนแรก และฉันหวังว่าฉันสามารถเอาชนะ Java ได้หากมีคำตอบของ 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)

ลองที่นี่


5
-1 สำหรับการไม่พยายามตีเกินตัวแปรตัวเดียว
Mego

@Mego ฉันสัญญาว่าฉันกำลังทำงานโดยเร็วที่สุด ตอนนี้ แต่ฉันกำลังทำงานกับรุ่น regex
TanMath

@Mego โปรดดูการแก้ไข
TanMath

5

Japt 26 26ไบต์

โชคดีที่ฉันเพิ่มสระลงในคุณสมบัติ regex ของ Japt เมื่อไม่กี่วันที่ผ่านมา น่าเสียดายที่ฉันไม่ได้เพิ่มคลาสที่ไม่ใช่เสียงสระหรือวิธีที่ทับแบ็กสแลชคู่ในสตริง regex

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

สิ่งนี้¿ควรเป็น raw char U + 0093 อินพุตเป็นสตริงที่มีหลายบรรทัดหนึ่งคำ / บรรทัด ลองออนไลน์!

แก้ไข:ตอนนี้ฉันได้เพิ่มคลาสที่ไม่ใช่เสียงสระ\Vและวิธีการ\\(ด้วย%) ดังนั้นตอนนี้รหัสนี้ใช้งานได้21 ไบต์ : ( ลองออนไลน์ )

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

มันทำงานอย่างไร

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

รุ่นเก่า (26 ไบต์):

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

ลองออนไลน์!

มันทำงานอย่างไร

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

ฉันหวังว่าภาษากระแสหลักจะมี meta ของสระสำหรับ regexes!
CJ Dennis

4

Python 3, 100 (หรือ 99) ไบต์

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

เล่นกับรุ่นไม่กี่ แต่ดูเหมือนจะไม่ได้รับด้านล่าง สามารถทำให้มันลดลง 99 bytes โดยใช้def f(g)แทนดังนั้นจึงใช้รายการของสายอักขระแทนที่จะเป็นสองสายแยกกัน แต่ฉันชอบ arg roue สองตัว

ทางเลือกคือความยาวเท่ากัน:

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 ใช้ แต่ฉันไม่สามารถทำให้สั้นลงได้ นอกจากนี้ TanMath ยังสามารถทำให้คำตอบของเขาสั้นลงโดยใช้"[aeiou]"แทน"[aeiou]+"เพราะเราต้องการจับคู่อินสแตนซ์เดียวเท่านั้น ในที่สุดการใช้งานของinput()ดูเหมือนจะมีการเปลี่ยนแปลงระหว่าง py2 และ py3 - มันประเมิน stdin เป็นสตริงโดยอัตโนมัติ


1
สมมุติว่าคุณหมายถึงs=re.splitทางเลือกอื่นหรือไม่?
xnor

ใช่ อย่างแน่นอน. นี่เป็นครั้งแรกของฉันที่ได้เล่นกอล์ฟ
Ogaday

1
1. คำถามที่ชัดเจนจะช่วยให้การใช้สองสายเป็นรายการเพื่อให้มีดูเหมือนว่าจะไม่มีเหตุผลที่ดีสำหรับใน* *g2. รุ่นที่สองสามารถลงไปlambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):])ได้
Dennis

ขอบคุณ @Dennis, ที่ใช้งานได้จริง น่าสนใจว่าจำเป็นต้องใช้ตัวยึดและคุณไม่จำเป็นต้องผ่าน s เป็นอาร์กิวเมนต์สำหรับแลมบ์ดาที่สองใช่ไหม? วิธีการแก้ปัญหาที่ทำให้ผม 98 f=ไบต์ที่มีคำสั่งนำเข้าชั้นนำและ
โอกาเดย์

1
ไม่sเป็นอาร์กิวเมนต์เริ่มต้นดังนั้นคุณไม่จำเป็นต้องระบุ แลมบ์ดาที่ไม่มีชื่อนั้นเป็นสิ่งที่ยอมรับได้ f=ไม่จำเป็นต้องใช้.
Dennis

4

sed, 38 ตัวอักษร

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

โดยใช้การแสดงออกปกติยื่นออกมาจากการแก้ปัญหาจอประสาทตา

ด้านบนมีความยาว 37 ตัวอักษรและต้องใช้-rสวิตช์ (+1 ตัวอักษร)

ตัวอย่าง:

$ 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

ยินดีต้อนรับสู่ Programming Puzzles & Code Golf!
Dennis

3

C # 6, 165 ไบต์

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

ขยาย:

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

นี่ค่อนข้างเก่า แต่"aeiou".ToCharArray()อาจมี'a','e','i','o','u'ขนาด -2 ไบต์
ศูนย์รวมแห่งความไม่รู้

ไม่ @EmbodimentofIgnorance IndexOfAnyมันไม่ใช้ params ดังนั้นมันจะต้องเป็นnew[]{'a','e','i','o','u'}
Hand-E-Food

อาฉันผิดฉันคิดว่าIndexOfAnyเป็นวิธี params อย่างไรก็ตามคำตอบที่ดี
ศูนย์รวมแห่งความไม่รู้

3

𝔼𝕊𝕄𝕚𝕟, 24 ตัวอักษร / 42 ไบต์

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

Try it here (Firefox only).

หากคุณต้องการความช่วยเหลือในการทำความเข้าใจสิ่งนี้แปลเป็น ES6 ว่า

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

สิ่งนี้เป็นภาษาอะไร ฉันได้รับกล่องอักขระสำหรับเรื่องนั้น
Jesse Williams

@JesseWilliams มันเรียกว่าESMin
ETHproductions

มันจะดีถ้า interperator มีบางอย่างที่เหมือนกับ Japt ที่มันแสดงให้คุณเห็นว่า js 𝔼𝕊𝕄𝕚𝕟กลายเป็น
ผู้ใช้ทั่วไป

รวบรวม JS ถูกบันทึกไว้ในคอนโซล JS เมื่อรันรหัส
Mama Fun Roll

3

PowerShell ขนาด 52 ไบต์

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

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

มันเป็น regex แทนที่ด้วยสี่กลุ่มการจับ; ด้วย:

  • การคูณสตริงเพื่อขยาย:
    • ('(.*?)([aeiou]\S+) '*2) ไปยัง '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • "$args "กองกำลังอาร์เรย์ args เป็นสตริงและเพิ่มพื้นที่ต่อท้ายเพื่อให้พื้นที่ต่อท้ายใน regex จะไม่ทำลายมัน

3

JavaScript (ES6), 120 107 102 101 99 92 ไบต์

  • ขอบคุณมาก!

สิ่งนี้คำนึงถึงว่าพารามิเตอร์เป็นวัตถุเช่นนี้และย้อนกลับ:
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]/).indexสามารถกลายเป็น:.search`[aeiou]`
Downgoat

3

Python, 129 108 105 109 ไบต์

โปรแกรมนี้ใช้เวลาในรายการคำเช่นนี้ ["master","plan"]

แก้ไข : ขอบคุณ @ ความผันผวน

แก้ไข:ตอนนี้ใช้ 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)

คำตอบนี้ใช้ regex เป็นส่วนใหญ่ทำ

ลองที่นี่


โปรดทราบว่าstr.replaceแทนที่ทุกกรณีของสตริงย่อยดังนั้นคุณจึงต้องการที่จะ จำกัด .replace(f,l,1)มันเป็นหนึ่งในการเปลี่ยนโดยมี อย่างไรก็ตามคุณสามารถบันทึกพวงได้โดยใช้i,j=input()และการปฏิเสธre.findallและ'[^aeiou]+'ไปยังตัวแปรอักขระเดียว
ความผันผวน

มันใช้งานไม่ได้ แม้แต่คำเดียวที่มีตัวอักษรสองตัวจะให้อักขระสามตัวและคุณกำลังพยายามแยกinput()ตัวแปรออกเป็นสองตัวแปร คุณหมายถึงi,j=input().split()(และraw_input()ใน Python 2) ใช่ไหม
Blacklight Shining

1
@ Blacklight การส่องคำต้องมีสระอย่างน้อยหนึ่งสระและพยัญชนะหนึ่งตัว อินพุตจะอยู่ในรายการของสตริงดังนั้นฉันจึงเป็นคำแรกและ j คือคำที่สอง
TanMath

@TanMath เท่าที่ผมรู้ว่าจะได้รับอนุญาตโดยเริ่มต้น แต่คุณอาจจะบอกว่าในคำตอบบางที่มันจำเป็น
undergroundmonorail

สิ่งนี้แทนที่มากเกินไป "sass","bit" -> "babb", "sit".
xnor

3

Java 8, 343 ไบต์

ที่นี่คุณมี Java-Answer แรกของคุณ ไม่ได้มีประสบการณ์ในการเล่นกอล์ฟดังนั้นข้อเสนอแนะทุกข้อจึงถูกชื่นชม!

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

อะไรนะjava.util.function.Function? ฉันสงสัยอย่างมากว่ามันจำเป็นต้องอยู่ที่นั่นเว้นแต่คุณจะหมายถึงimportแต่ลดการนำเข้าเนื่องจากคุณอ้างถึงเพียงครั้งเดียว เปลี่ยนpublic class C{public static void Main(String[] a)เป็นinterface C{void Main(String[]a)
cat

Function<String, Integer>ไม่ต้องการช่องว่าง
cat

เปลี่ยน for วนวนจากfor(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;เป็นfor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
cat

i1เป็น varname ที่น่ากลัวและยาวเกินไป
แมว

นั่นคือการเปลี่ยนFunction<String, Integer>ไปjava.util.function.Function<String,Integer>และวางนำเข้า
แมว

3

ระดับเสียงคู่, 96 ไบต์

ต้องขอบคุณการกำหนดแบบอินไลน์ของ Octave และฟังก์ชั่น 'ดัชนีได้ทุกที่' สิ่งทั้งหมดนี้เป็นเพียงนิยามของฟังก์ชั่นเดียวที่ไม่ระบุชื่อ โดยทั่วไปเราสร้างสตริง spoonerized ในขณะที่การจัดเก็บจุดตัดในและa bฉันมีความสุขเป็นพิเศษกับfฟังก์ชั่นอินไลน์ซึ่งพบว่าจุดตัดและป้องกันไม่ให้ฉันต้องใช้ทั้งหมด ' find(ismember(a,b),1)' สองครั้ง ยังไม่มี 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 ไบต์

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

\w[^aeiou]เป็นจริง


รอคุณเปลี่ยน\wเมตาดาต้าเริ่มต้นเป็น[^aeiou]? ทำไม?
ETHproductions

@ETHproductions เมื่อฉันสร้างคลาสถ่านที่กำหนดเอง ฉันลืม\wJavaScript ที่ใช้ไปแล้ว ฉันจะเปลี่ยนมันเร็ว ๆ นี้
Downgoat

2

ยาอายุวัฒนะ ,143 117 ไบต์

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]

แยกสองสาย (a, b) บนสระแรกและสร้างสายใหม่เพื่อกลับ

แก้ไข: มีสองสามไบต์ออกโดยใช้การจับคู่รูปแบบแทนการelemโทรแบบclunky เพื่อรับค่าจากสิ่งอันดับ


2

Java, 147 ไบต์

ฉันสมมติว่าฟังก์ชั่นก็ใช้ได้เช่นกัน

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)น่าเสียดายที่ใช้ตัวคั่นซึ่งหมายความว่าฉันต้องใช้substringเพื่อให้ได้คำต่อท้าย


2

Pyth, 30 28 ไบต์

รับอินพุตและให้เอาต์พุตเป็นรายการของสองคำ

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

ลองออนไลน์


ACm,Kh:d"[aeiou]"3.-dKQ+V_GHผมคิดว่าคุณกำลังมองหา Aกำหนดรายการสององค์ประกอบให้กับ G และ H และCสลับรายการ อาจมีบางสิ่งที่ดีกว่านี้
lirtosiast

2

Python (ไม่มี regexes), 85 ไบต์

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

วิ่งตัวอย่าง:

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

tsเป็นฟังก์ชันเวียนที่คำนวณดัชนีของสระที่เก่าแก่ที่สุดหลังจากที่ตัวอักษรตัวแรกในอาร์กิวเมนต์ ถ้าตัวละครที่สองs[1]เป็นสระก็ประเมินTrueซึ่งมีค่าint 1มิฉะนั้นจะทำการเรียกซ้ำโดยลบอักขระแรกและเพิ่ม 1 ในดัชนีผลลัพธ์โดยใช้-~(ส่วนประกอบสองส่วนของส่วนประกอบหนึ่งตัว) ในที่สุดผลของการtใช้เป็นดัชนีสำหรับการแบ่งสตริงเพื่อคำนวณการสปูน


1

GNU Awk 4.0, 48 ตัวอักษร

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

วิ่งตัวอย่าง:

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 ไบต์

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

ใช้ regex เพื่อสลับอักขระที่ไม่ใช่สระตัวแรกของแต่ละคำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.