La La Land …ไม่ต้องรอหมู่แสงจันทร์หมู่


122

ความท้าทายนี้เป็นเครื่องบรรณาการให้กับผู้ชนะรางวัล Best Picture at the Oscars 2017, La La Land Moonlight !


เขียนฟังก์ชั่น / โปรแกรมที่รับสายที่มีเพียงตัวอักษร[A-Za-z]สัญลักษณ์สี่ตัวที่ใช้กันทั่วไปในประโยค.,'?และช่องว่างทุกวัน และแสดงสตริงในรูปแบบของ La La Land

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

คุณอาจสันนิษฐานว่าสตริงทั้งหมดมีสระอย่างน้อยหนึ่งสระและสตริงทั้งหมดเริ่มต้นด้วยตัวอักษร

กรณีทดสอบ:

Land
La La Land

Moonlight
Moo Moo Moonlight

quEueIng
quEueI quEueI quEueIng

This isn't a single word.
Thi Thi This isn't a single word.

It's fun to play golf
I I It's fun to play golf

Ooo
Ooo Ooo Ooo

I'm okay
I I I'm okay

Hmm, no. There will be at least one vowel, but it can be anywhere.
Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.

Why is y a vowel?
Why Why Why is y a vowel?

นี่คือดังนั้นรหัสที่สั้นที่สุดในแต่ละภาษาชนะ คำอธิบายได้รับการสนับสนุนในภาษากระแสหลักเช่นกัน


1
MOONLIGHTกรณีทดสอบสำหรับกรณีที่ไม่รู้สึก: และเพื่อความสนุกสนาน:Why did the chicken cross the road?
ติตัส

35
ความท้าทายที่สนับสนุนโดย: National Stuttering Association
sergiol

6
หรือศ. Quirrell
Brian J

1
กรณีทดสอบที่ 6 ซื้อให้คุณโดย Louis Prima และ The Jungle Book เข้าร่วมเพียงเพื่อเพิ่ม pun นี้ (ไม่ดี)
Toby

คำตอบ:



30

05AB1E , 23 19 18 ไบต์

ที่บันทึกไว้ 1 ไบต์ขอบคุณที่Okx

Dlð«žOsSåJTk>£D¹ðý

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

 Dl                  # create a lowercase copy of implicit input
   ð«                # append a space
     žO              # push the vowels
       s             # swap lowercase input to the top of the stack
        S            # split into a list of chars
         å           # check each char for membership in the vowel-string
                     # (creates a list with 1 at the index of vowels and 0 for non-vowels)
          J          # join to string
           Tk        # find the index of 10
             >       # increment
              £      # take that many items from input
               D     # duplicate this string
                ¹    # push input
                 ðý  # join the strings by space

25

เยลลี่ , 24 22 20 19 14 ไบต์

-5 ไบต์โดยใช้เคล็ดลับจากคำตอบที่ยอดเยี่ยมของ Emigna (มองหา 10 ในรายการ isVowel)

;⁶e€Øyw⁵ḣ@;⁶Ȯ;

ลองออนไลน์! (ไม่แน่ใจว่าจะทำชุดทดสอบสำหรับโปรแกรมเต็มรูปแบบนี้ได้อย่างไร)


ทางเลือก15ไบต์:

;⁶e€Øyw⁵ḣ@;⁶ẋ2;

นี่คือชุดทดสอบเต็มรูปแบบ

อย่างไร?

;⁶e€Øyw⁵ḣ@;⁶Ȯ; - Main link: string s
 ⁶             - space character
;              - concatenate to s (for all vowel edge case)
    Øy         - vowels + y yield
  e€           - exists in? for €ach (gives a list of isVowel identifiers)
       ⁵       - 10
      w        - index of first sublist (with implicit decimalisation of 10 to [1,0])
        ḣ@     - head with reversed @rguments (start of word up to & including vowel group)
           ⁶   - space character
          ;    - concatenate (start of word up to & including vowel group plus a space)
            Ȯ  - print and yield (hence a full program...
               -     ...the alternative ẋ2 repeats instead in order to return the result)
             ; - join with the input, s
               - implicit print (of the second repetition and input string)

19

Python ขนาด 61 ไบต์

import re;lambda x:re.sub('(.*?[aeiouy]+)',r'\1 \1 \1',x,1,2)

ต่อไปนี้เป็นภาษาที่ไม่ใช่ภาษา Regex แรก (ใช้ regex)

ที่บันทึกไว้ 1 ไบต์ขอบคุณที่นีล


18

JavaScript (ES6), 40 46

แก้ไข 5 + 1 ไบต์บันทึกขอบคุณ @Arnauld

นานเกินไปเมื่อเทียบกับที่อื่นโดยใช้กลอุบายเดียวกัน (ตามปกติ)

x=>x.replace(/.*?[aeiouy]+/i,'$& $& $&')

let f=
x=>x.replace(/.*?[aeiouy]+/i,'$& $& $&')

test=`Land
La La Land

Moonlight
Moo Moo Moonlight

queueing
queuei queuei queueing

This isn't a single word.
Thi Thi This isn't a single word.

It's fun to play golf
I I It's fun to play golf

Ooo
Ooo Ooo Ooo

I'm okay
I I I'm okay

Hmm, no. There will be at least one vowel, but it can be anywhere.
Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.`
test.split(`\n\n`).forEach(z=>{
  var [i,k]=z.split(`\n`),x=f(i);
  console.log(k==x ? 'OK':'KO',i+'\n'+x);
})


@Annauld ไม่ แต่ฉันสามารถใช้'$& $& $&'- ฉันมักจะลืมตัวอักษรพิเศษดอลลาร์ ขอขอบคุณ. น่าเสียดายที่ตอนนี้มันเป็นคำตอบที่จอประสาทตาของมาร์ติน
edc65

^เป็นสิ่งจำเป็นใน Retina ซึ่ง - ฉันคิด - มองตรงทั้งหมดโดยค่าเริ่มต้น แต่เราต้องการมันที่นี่จริงเหรอ?
Arnauld

@Arnauld คุณพูดถูกอีกครั้ง
edc65

-2:x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x
ขีดล่าง

@ETHproductions ในความเป็นจริง ขอบคุณที่สังเกต
edc65


12

แบตช์ 180 ไบต์

@echo off
set/ps=
set v=aeiouy
set g=c
set t=
:l
call set w=%%v:%s:~,1%=%%
if %v%==%w% goto %g%
set g=o
:c
set t=%t%%s:~,1%
set s=%s:~1%
goto l
:o
echo %t% %t% %t%%s%

ใช้เครื่องสถานะ gติดตามว่าเราเคยเห็นสระหรือไม่ดังนั้นถ้าตัวอักษรปัจจุบันไม่ใช่สระเรารู้ว่าจะเอาท์พุทหรือดำเนินการต่อด้วยตัวอักษรถัดไป



8

ทับทิม, วันที่ 31 32 30 ไบต์

->s{(s[/.*?[aeiouy]+/i]+' ')*2+s}

บันทึกสองไบต์ด้วย GB และ Cyoce


6

PHP, 55 54 ไบต์

หมายเหตุ: รุ่นที่เข้ารหัสใช้การเข้ารหัส IBM-850

echo preg_filter("/^(.*?[aeiouy]+)/i","$1 $1 $0",$argn);
echo preg_filter(~ðíÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn);     # Encoded

ทำงานแบบนี้:

echo "This isn't a single word." | php -nR 'echo preg_filter(~ðíÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn);'

คำอธิบาย

เพียงแค่ regex แทนที่ด้วย non-eager จับคู่อักขระใด ๆ ที่จุดเริ่มต้นของสตริงตามด้วยจำนวนเสียงสระใด ๆ (ใช้iตัวเลือกสำหรับ case insensitivity) กลุ่มการจับนั้นนั้นจะถูกพิมพ์สองครั้งตามด้วยสตริงทั้งหมด

การปรับแต่ง

  • บันทึกเป็นไบต์โดยใช้-Rเพื่อให้$argnพร้อมใช้งาน (ขอบคุณมาก)

6

Javascript (ES6), 38 ไบต์

x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x

f=
x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value))>
<datalist id=l><option value=Land>
<option value=Moonlight>
<option value=queueing>
<option value="This isn't a single word.">
<option value="It's fun to play golf">
<option value=Ooo>
<option value="I'm okay.">
<option value="Hmm, no. There will be at least one vowel, but it can be anywhere.">
<option value="Why is y a vowel?">




5

C, 202 196 195 193 190 180

i,j,k,m,n;f(char*a){if((a[i/12]-"AEIOUY"[i++%6])%32==0)k=n=24-(i%12);else if(k&&!n--){m=j=(i-13)/12;for(i=0;i<j*2;)printf("%c%c",a[i%j],(i==j-1)*32),i++;printf(" %s", a);}m?:f(a);}

ลองออนไลน์!


สิ่งที่ทิ้งไว้ให้กอล์ฟ:

•ยุบสอง printf เป็นหนึ่ง

•การพิมพ์ space ของฉันสามารถเปลี่ยนเป็น%*cตรรกะได้ฉันแน่ใจ

•ฉันใช้เงื่อนไขที่สามารถลบออกได้อย่างใด

j=(i-13)/12มีโอกาสสั้นลงได้

• [AY] ตรวจสอบตามเงื่อนไขว่า==0ปกติไม่จำเป็นหรือไม่แม้ว่าฉันจะติดอยู่กับสิ่งนั้น (ลองสลับ if-else และ ditching ==0ทั้งหมด แต่ต้องเพิ่ม {วงเล็บ} มากขึ้นและเพิ่มขนาดไบต์)


เคล็ดลับที่ฉันเคยเล่นกอล์ฟนี้ลง:

•รวมคู่สำหรับการค้นหาสตริงแบบวนซ้ำโดยใช้โมดูโลสำหรับแกน x และการหารจำนวนเต็มสำหรับแกน y (อินพุตสตริงกับสตริงสระ) (แกน X นั้นวนซ้ำสองครั้งก่อนที่จะทำการวนซ้ำหนึ่งครั้งบนแกน y ซึ่งเป็นครั้งแรกที่ [AZ] และครั้งที่สองด้วย [az] โดยใช้ค่าตัวอักษร 32 ดิฟเฟอเรนเชียล

•ข้ามต้องใช้ "[AY] และ [ay]" เพียงแค่ใช้ระยะห่างระหว่างชุดอักขระและโมดูโล 32 วิธีนั้นถ้าระยะห่างเป็น 0 (AA) หรือถ้าระยะทางเป็น 32 (aA)

•การใช้ตัวแปรจำนวนเต็มที่ไม่ได้ใช้เป็นตัวแปรบูลีนอีกต่อไป

•เรียกใช้ฟังก์ชันที่มีสตริงเดียวกันซ้ำ ๆ เพื่อประมวลผลและหลีกเลี่ยงการวนซ้ำครั้งที่สอง

•ตั้งค่า BOOL เป็นตรรกะของการตั้งค่าตัวแปรอื่น (เช่น bool = i = 5;) เพื่อทำให้ทั้งคู่ออกมาด้วยหินก้อนเดียว

•การใช้ประโยชน์ในทางที่ผิดที่ผิดที่เกิดขึ้นจริงแบบไตรภาค (GCC)


รูปแบบที่อ่านได้:

i,j,k,m,n;
f(char*a){
    if((a[i/12]-"AEIOUY"[i++%6])%32==0)
        k=n=24-(i%12);
    else
        if(k&&!n--){
            m=j=(i-13)/12;
            i=0;
            for(;i<j*2;)
               printf("%c%c",a[i%j],(i==j-1)?32:0),i++;
            printf(" %s", a);
        }
    m?:f(a);
}

เคาะออก 10 ไบต์ด้วย Keyu Gan (ในความคิดเห็น)


หมายเหตุถึงตนเอง: j=(i-13)/12น่าจะสั้นลงได้
Albert Renshaw

ฉันไม่มีอะไรหรือคุณอาจจะเริ่มต้นด้วยi=j=k=m=n=0;?
Richard Irons

@RichardIrons ตัวแปรต้องถูกประกาศก่อน
Albert Renshaw

คุณสามารถใช้i,j,k,m,n;สำหรับการเริ่มต้น
Keyu Gan

@KeyuGan พฤติกรรมที่ไม่ได้กำหนดไม่รับประกันว่าจะเป็น 0 (เท่าที่ฉันรู้หรือไม่)
Albert Renshaw

4

MATL, 33 ไบต์

'(^.*?[yY%s]+)'13Y2YD'$1 $1 $1'YX

ลองใช้ที่MATL Online

คำอธิบาย

                % Implicitly grab input as a string
'(^.*?[yY%s]+)' % Push this string literal (regex pattern)
13Y2            % Push the string literal 'AEIUOaeiuo'
YD              % Replace the '%s' in the string with 'AEIUOaeiuo'
'$1 $1 $1'     % Push the string literal to use for replacement which repeats
                % the first match 3 times
YX              % Perform regular expression matching and replacement
                % Implicitly display the result

'(^.*?[yY%s]+)'13Y2YD'$1 '8:)YXบันทึก 2 ไบต์
Luis Mendo

'(^.*?[%s]+)'19Y2YD'$1 '8:)YXประหยัดอีก 2
B. เมธา

@ B.Mehta 19Y2ไม่มีอยู่เมื่อส่งคำตอบนี้โชคไม่ดี
Suever

ใช่คาดว่าจะตอบกลับเล็กน้อย ... ฉันจะเก็บความคิดเห็นของฉันไว้เพื่อให้คนอื่นสามารถเรียนรู้เกี่ยวกับ 'aeiouy' ตัวอักษรในตัวได้เช่นกัน
B. Mehta

@ B.Mehta ไม่ต้องกังวล ด้วย MATL Online (matl.suever.net) คุณสามารถเลือกรุ่นที่ต้องการโดยใช้เมนูแบบเลื่อนลงที่ด้านบนขวา
Suever

4

V , 21 , 20 ไบต์

é /ã[aeiouy]«“.
3ä|<

ลองออนไลน์!

คำอธิบาย:

é               " Insert a space
  /             " Jump forward too...
   ã[aeiouy]«. "   The first non-vowel after a vowel
3ä              " Make three copies of
  |             " Everything from the cursor to the first character
   <            " Delete the space we inserted

hexdump:

00000000: e920 2fe3 5b61 6569 6f75 795d ab93 2e0a  . /.[aeiouy]....
00000010: 33e4 7c3c                                3.|<

รุ่นสำรอง (21 ไบต์):

Í㨃[aeiouy]«©/± ± &

ลองออนไลน์!

วิธีนี้ใช้การบีบอัด regex ที่ไร้สาระและยังคงสามารถจัดการกับภาษาอื่น ๆ ของการตีกอล์ฟได้ สำหรับการอ้างอิงนี่เป็นความยาวประมาณสองในสามของเวอร์ชั่น "ไม่มีการบีบอัด" ปกติคือ:

:%s/\v\c(.{-}[aeiou]).*/\1 \1 &

คำอธิบาย:

Í                               " Replace on every line:
 ã                              "   Case-insensitive
  ¨              ©              "   Capture-group 1
   <131>                        "   Any character, any number of times (non-greedy)
        [aeiouy]«               "   A vowel, repeated once or more
                  <129>         "   Followed by anything
                       /        " Replaced with:
                        ± ±     "   Capture group one twice, with spaces between
                            &   "   The whole matched pattern

นี่คือ hexdump:

00000000: cde3 a883 5b61 6569 6f75 795d aba9 812f  ....[aeiouy].../
00000010: b120 b120 26                             . . &

2
+1 สิ่งนี้จะต้องเป็นผลงาน V ​​regex ที่น่าประทับใจที่สุดที่ฉันเคยเห็น
วัวต้มตุ๋น


4

Python 3 , 75 68 ไบต์

lambda s:(s[:[x in"aAeEiIoOuUyY"for x in s][1:].index(0)+1]+" ")*2+s

ลองออนไลน์!

คำอธิบาย:

ทำงานโดยการสร้างค่าบูลีนสำหรับอักขระทุกตัวในสตริงอินพุตโดยพิจารณาว่าเป็นสระหรือไม่และค้นหาดัชนีที่ต่ำที่สุดของ0ไม่ใช่สระแรก (ไม่รวมอักขระแรก) มันจะส่งคืนซับสตริงไปยังดัชนีนี้สองครั้งคั่นด้วยช่องว่างและสตริงเดิม


4

Clojure, 192 188 181 ไบต์

(fn[p](let[[f] p v #(#{\a \e \i \o \u \y}(Character/toLowerCase %))[q r](split-with(if(v f)v #(not(v %)))p)[w _](split-with v r)as #(apply str %)](str(as(repeat 2(str(as q)(as w) \ )))p)))

-4 ไบต์โดยอินไลน์first-sp-pred(อ๊ะ)

-7 ไบต์โดยการลบช่องว่างที่ไม่ได้รับ

นี่มันท้าทายมากกว่าที่ฉันคิดเอาไว้! ฉันแยกวิเคราะห์สตริงด้วยตัวเอง ... เนื่องจากฉันยังไม่ได้เรียนรู้ regex:

ดูรหัสก่อนเล่นกอล์ฟเพื่อดูรายละเอียด:

(defn repeat-prefix-cons [phrase]
  (let [[first-letter] phrase ; Get first letter

        ; Function that checks if a lowercased character is a part of the vowel set
        vowel? #(#{\a \e \i \o \u \y} (Character/toLowerCase %))

        ; cons(onant)? Negation of above
        cons? #(not (vowel? %))

        ; Decide how to split it depending on if the first character is a vowel
        first-sp-pred (if (vowel? first-letter) vowel? cons?)

        ; Split off the first chunk of cons/vowels
        [pre1 r] (split-with first-sp-pred phrase)

        ; Split off the rest of the vowels
        [pre2 r2] (split-with vowel? r)

        ; Shortcut function that turns a list into a string (Basically (join "" some-list-of-strings) )
        as #(apply str %)]

    (str ; ... then concat the prefix in front of the original phrase, and return
      (as ; ...then turn it back into a string since "repeat" returns a list... ^
        (repeat 2 ; ... then repeat it twice (shame Clojure doesn't have string multiplication)... ^
                (str (as pre1) (as pre2) \ ))) ; Concat the 2 prefix parts together with an space at the end... ^
      phrase)))

4

Python 3 , 101 96 ไบต์

s=input()
v=i=0
for c in s:
 w=c in'aAeEiIoOuUyY'
 if v*~-w:break
 v=w;i+=1
print(s[:i],s[:i],s)

ลองออนไลน์!

โซลูชันที่ไม่ใช่ regex


แสดงความคิดเห็น:

s=input()
a='aAeEiIoOuUyY'
v=i=0
for c in s:          # for each character in the string
 w=c in a            # w = True if the character is a vowel, else false
                     # true is equivalent to 1  and false to zero
                     # v*(w-1) evaluates only to true (-1 in this case) if v=1 (last character was a vowel) and w=0 (current character is not a vowel)
 if v*(w-1):break    # if so, break the loop
 v=w;i+=1            # increase the counter and set v to w
print(s[:i],s[:i],s)

ทำไมคุณต้องมี แทนที่w=c in aด้วยw=c in'aAeEiIoOuUyY'
sagiksp

4

โอห์ม , 19 ไบต์ (CP437), ไม่ใช่การแข่งขัน

ภาษาใหม่และเป็นเช่นนั้นฉันต้องเพิ่มคุณสมบัติใหม่บางอย่างเพื่อให้งานนี้ซึ่งน่าเศร้าที่ทำให้สิ่งนี้ไม่ใช่การแข่งขัน (เพราะช่องโหว่)

≡┬üC▓αy_ε;TF«u├DQüj

คำอธิบาย:

≡┬üC▓αy_ε;TF«u├DQüj     Main wire, arguments: s

≡                       Triplicate input
 C                    Push input, all lowercase with concatenated space character
    ▓    ;              Map string into an array with...
     αy_ε                 Boolean: is element a vowel?
          TF«u          Find first occurrence of [true, false]
              ├D        Slice input up to that index and duplicate it
                Q       Reverse stack
                 üj     Join on spaces, implicitly print

ฉันอยากรู้ว่าคุณใช้คุณลักษณะใด ...
Stewie Griffin

@StewieGriffin การกลับรายการสแต็ก ( Q) การค้นหา subarray ( u) การแบ่งสตริง / อาร์เรย์ ( ) และค่าคงที่สระ ( αvและαy)
Nick Clifford

4

PHP, 69 65 53 ไบต์

<?=preg_filter("#.*?[aeiouy]+#i","$0 $0 $0",$argn,1);

ต้องใช้ PHP 5.3 ขึ้นไป ทำงานเป็นท่อที่มี-Fหรือลองบางรุ่นออนไลน์

บันทึก 4 ไบต์ (และแก้ไขรหัส) ด้วย regex ที่ถูกขโมยจาก @aross;
10 มากขึ้นด้วยการpreg_filterแทนpreg_matchและ-F
และอีกสองกับ regex ที่ดีขึ้น

75 81 ไบต์สำหรับเวอร์ชันที่ไม่ใช่ regex:

for(;$c=$argn[$i++];)($k+=$k^!trim($c,aeiouyAEIOUY))>1?:$w.=$c;echo"$w $w $argn";

ต้องการ PHP 5 หรือใหม่กว่า; แทนที่?:ด้วย?1:สำหรับ PHP รุ่นเก่า ทำงานด้วย-nR

ชำรุด

for(;$c=$argn[$i++];)       // loop $c through input characters
    ($k+=$k^!                   // 2. !$k and vowel or $k and not vowel: increment $k
        trim($c,aeiouyAEIOUY)   // 1. strip vowels -> vowel=false, non-vowel=true
    )>1                         // 3. if $k>1
    ?                           // do nothing
    :$w.=$c;                    // else append $c to $w
echo"$w $w $argn";          // output

ดูเหมือนจะไม่ทำงาน เอาออกสำหรับThis isn't a single word:T T This isn't a single word.
aross

@aross ดูเหมือนว่ากำลังตรวจสอบค่าที่เป็นตัวพิมพ์เล็กใช่ไหม ฉันอาจจะผิดฉันไม่รู้ PHP ดีนัก
Albert Renshaw

1
@AlbertRenshaw เวอร์ชัน regex ใช้โมดิฟายเออร์iที่แสดงผลตัวพิมพ์เล็กและใหญ่ อีกเวอร์ชันหนึ่งตรวจสอบตัวพิมพ์เล็กเท่านั้น แก้ไขแล้ว.
ติตัส

4

R, 49bytes

sub("(.*?[aeiouy]+)","\\1 \\1 \\1",scan(,""),T,T)

การแทนที่ตาม Regex จับคู่ทุกอย่างจนกว่าจะไม่มีเสียงสระจับและแทนที่ด้วยตัวมันเอง 3 ครั้ง

scanรอให้doubleอินพุตประเภทบอกให้ใช้charactertype เราต้องให้สองอาร์กิวเมนต์ก่อนอื่นคือค่าเริ่มต้นสตริง emtpy สำหรับ stdin และครั้งที่สองการประเมิน R อนุญาตให้ใช้เฉพาะcในกรณีที่มันไม่ชัดเจนcharacterในบริบทนี้

Tย่อมาจากTRUEและบันทึกถ่านบางส่วนเป็นพารามิเตอร์ที่ 4 และ 5 เพื่อย่อยเพื่อบอกให้ไม่สนใจขนาดตัวพิมพ์และใช้ PCRE (ความโลภไม่เหมือนกันกับไวยากรณ์ R regex)

4 ไบต์บันทึกความอนุเคราะห์ของSumner18พร้อมกับลิงค์ Tio เพื่อเรียกใช้รหัส


3

Java 8, 147 140 ไบต์

แข็งแรงเล่นกอล์ฟ:

import java.util.regex.*;s->{Matcher m=Pattern.compile("([^aeiouy]*[aeiouy]+)",2).matcher(s);m.find();return m.group()+" "+m.group()+" "+s;}

Ungolfed:

import java.util.regex.*;

public class LaLaLandNoWaitMooMooMoonlight {

  public static void main(String[] args) {
    for (String[] strings : new String[][] { { "Land", "La La Land" }, { "Moonlight", "Moo Moo Moonlight" },
        { "queueing", "queuei queuei queueing" }, { "This isn't a single word.", "Thi Thi This isn't a single word." },
        { "It's fun to play golf", "I I It's fun to play golf" }, { "Ooo", "Ooo Ooo Ooo" },
        { "I'm okay", "I I I'm okay" }, { "Hmm, no. There will be at least one vowel, but it can be anywhere.",
            "Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere." } }) {
      final String input = strings[0];
      final String expected = strings[1];
      final String actual = f(s -> {
        java.util.regex.Matcher m = java.util.regex.Pattern.compile("([^aeiouy]*[aeiouy]+)", 2).matcher(s);
        m.find();
        return m.group() + " " + m.group() + " " + s;
      } , input);
      System.out.println("Input:    " + input);
      System.out.println("Expected: " + expected);
      System.out.println("Actual:   " + actual);
      System.out.println();
    }

  }

  private static String f(java.util.function.Function<String, String> function, String input) {
    return function.apply(input);
  }
}

หมายเหตุ: ตัวอักษรในรหัสคือค่าของ2java.util.regex.Pattern.CASE_INSENSITIVE


2
ฉันคิดว่าคุณสามารถใช้import java.util.regex.*;เพื่อบันทึกไบต์
Roman Gräf

@ RomanGräfคุณถูกต้อง ฉันสะกดแพคเกจแล้วเพราะในรหัสรุ่นก่อนหน้า (ไม่ทำงาน) มันสั้นกว่าที่จะไม่ใช้การนำเข้า ฉันไม่ได้ประเมินใหม่หลังจากแก้ไขรหัสแล้ว

3

C, 123 ไบต์

#define v(x)while(x strchr("AEIOUY",*s&95))++s;
a;f(s,t)char*s,*t;{t=s;v(!)v()a=*s;*s=0;printf("%s %s ",t,t);*s=a;puts(t);}

โทรเป็น:

main(){char s[] = "queueing"; f(s);}

1
นี่เป็นสิ่งที่ดี! คุณเคาะสารละลาย C ของฉันออกจากสวนสาธารณะฮ่า ๆ ๆ
Albert Renshaw


2

เรติน่า 24 ไบต์

i1`.*?[aeiouy]+
$0 $0 $0

ลองออนไลน์


ค่อนข้างคล้ายกับสิ่งนี้
Emigna

ใช่ฉันรู้. แต่ฉันทำคำตอบอย่างอิสระ ถึงกระนั้นก็มีการตัดสินใจว่าคำตอบที่ซ้ำกันได้รับอนุญาตหากงานไม่ได้ลอกเลียนแบบ
mbomb007

2

Python 3 , 130 102 ไบต์

w=input();a='';v=0
for i in w:
	if i in 'aeiouyAEIOUY': v=1
	elif v:
		break
	a+=i
a+=' ';print(a*2+w)

ลองออนไลน์!

ไม่ใช้ฟังก์ชันใด ๆ และไม่มีห้องสมุดภายนอก! (ยกเว้นการพิมพ์และการป้อนข้อมูลนับเป็นฟังก์ชั่นที่พวกเขาทำ)

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

บันทึกแล้ว 28 ไบต์ขอบคุณ @LliwTelracs


2

MATLAB / Octave, 58 51 ไบต์

บันทึก 7 ไบต์ด้วย @HughNolan

@(x)regexprep(x,'(^.*?[aeiouyAEIOUY]+)','$1 $1 $1')

สร้างฟังก์ชั่นที่ไม่ระบุชื่อansซึ่งสามารถเรียกได้โดยการส่งสตริงไปที่มันans('Land')

การสาธิตออนไลน์

สำหรับความเข้ากันได้ของ MATLAB $0ควรใช้แทน$1ฟังก์ชั่นด้านบน


กำลังคิดเกี่ยวกับสิ่งนี้แล้วเห็นว่าคุณทำไปแล้ว บันทึกไม่กี่ไบต์: @(x)regexprep(x,'^.*?[aeiouyAEIOUY]+','$0 $0 $0 ');- เช่นกัน Matlab ดูเหมือนว่าจะใช้ $ 0 แทนที่จะเป็น $ 1 อย่างน่าประหลาดใจ
Hugh Nolan

@ HughNolan จุดที่ดีขอบคุณ!
Suever

2

C (gcc) , 111 110 ไบต์

*d="AEIOUYaeiouy";b;f(char*a){b=strcspn(a,d);write(printf(" "),a,write(1,a,b+strspn(a+b,d)));printf(" %s",a);}

ลองออนไลน์!

เพียงแค่นี้ก็ใช้ฟังก์ชั่นห้องสมุดstrspn()และstrcspn()และใช้ประโยชน์จากลำดับที่ GCC ประเมินค่าฟังก์ชัน ตีกอล์ฟน้อยลงเล็กน้อย

*d="AEIOUYaeiouy";b;
f(char*a){
  b=strcspn(a,d);
  write(printf(" "),a,write(1,a,b+strspn(a+b,d)));
  printf(" %s",a);
}

ขอบคุณ @gastropner สำหรับ -1


ว้าว!! เยี่ยมมาก!
Albert Renshaw


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