เล่นเกมชื่อ


9

จงเขียนโปรแกรมที่จะเล่นเกมชื่อ

อินพุต

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

เอาท์พุต

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

(X), (X), bo-b(Y)
Banana-fana fo-f(Y)
Fee-fi-mo-m(Y)
(X)!

นี่(X)คือชื่อเดิมและ(Y)เป็นชื่อในกรณีที่ต่ำกว่าด้วยการถอดพยัญชนะเริ่มต้นออก

อย่างไรก็ตามมีข้อยกเว้นหนึ่งประการ หากชื่อเดิมเริ่มต้นด้วยm, fหรือbมันควรจะเขียนจดหมายฉบับนี้โดยไม่ต้องอยู่บนเส้นที่สอดคล้องกัน เช่นถ้ามีชื่อเป็นBobที่ "ข" bo-obสายควรจะจบลงด้วยการ ทราบว่าในกรณีนี้พยัญชนะอื่น ๆ จะถูกเก็บไว้เพื่อให้Fredมันไม่ได้fo-redfo-ed

ตัวอย่าง

เชอร์ลี่ย์:

Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!

อาร์โนล:

Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!

บ๊อบ:

Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!

เฟร็ด:

Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดชนะ


1
ผมคิดว่าYมีการจัดการเป็นแกนนำเพื่อให้Yvesเป็นเหมือนหรือIves Arnold
ผู้ใช้ที่ไม่รู้จัก

1
แต่แล้ว Yates, Yestin, Yolanda หรือ Yulia ล่ะ?
ephemient

@ephemient: ฉันคิดว่าคุณสามารถรักษาYสระได้เฉพาะในกรณีที่ตามด้วยพยัญชนะ ที่ควรครอบคลุมกรณีเหล่านั้นอย่างน้อย
hammar

13
ฉันรู้สึกเสียใจกับทักเกอร์
Peter Olson

คำตอบ:


3

vi, 118 115

Y2PA,<ESC>Ypj~Y2PIbo-b<c-o>wBanana-fana fo-f<c-o>wFee-fi-mo-m<c-o>2$!<ESC>HJJ:%s/\vo-(([bfm])\2([^aeiou]*))?([bfm]?)[^aeiou]*/o-\3\4
ZZ

รหัสประกอบด้วยตัวควบคุม 5 ตัวซึ่งฉันใส่ไว้ในวงเล็บ แต่ละตัวจะนับเป็นอักขระตัวเดียวต่อจำนวนอักขระ

แก้ไข: การย้ายการเข้าร่วมครั้งแรก (J) เป็นภายหลังและเปลี่ยนการวางก่อนหน้า (P) เป็นการวางหลังจาก (p) บันทึกฉัน 1 ตัวละคร นอกจากนี้การไม่บันทึกค่าลงใน regex ช่วยฉันเพิ่มอีก 2 ตัวอักษร


3

SNOBOL4, 437 430 bytes

 N = TRIM(INPUT)
 D = REPLACE(N,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+'abcdefghijklmnopqrstuvwxyz')
 B = "b" D
 F = "f" D
 M = "m" D
 &ANCHOR = 1
 D SPAN('bcdfghjklmnpqrstvwxyz') . I REM . R :F(Y)
 B = "b" R
 F = "f" R
 M = "m" R
 I "b" :S(U)
 I "f" :S(V)
 I "m" :S(W) F(Y)
U D "b" REM . B :(Y)
V D "f" REM . F :(Y)
W D "m" REM . M
Y OUTPUT = N ", " N ", bo-" B
 OUTPUT = "Banana-fana fo-" F
 OUTPUT = "Fee-fi-mo-" M
 OUTPUT = N "!"
END

Ungolfed (รวมทั้งฉันได้เพิ่มพรอมต์ข้างบนรอชื่อที่จะพิมพ์):

      OUTPUT = "Please enter your name."
      Name = TRIM(INPUT)
      UC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
      LC = 'abcdefghijklmnopqrstuvwxyz'
      Low = REPLACE(Name, UC, LC)
      BName = "b" Low
      FName = "f" Low
      MName = "m" Low
      Consonants = SPAN('bcdfghjklmnpqrstvwxyz')
      &ANCHOR = 1
      Low Consonants . First REM . Rest  :F(READY)
      BName = "b" Rest
      FName = "f" Rest
      MName = "m" Rest
      First "b"                   :S(BINIT)
      First "f"                   :S(FINIT)
      First "m"                   :S(MINIT) F(READY)
BINIT Low "b" REM . BName         :(READY)
FINIT Low "f" REM . FName         :(READY)
MINIT Low "m" REM . MName
READY OUTPUT = Name ", " Name ", bo-" BName
      OUTPUT = "Banana-fana fo-" FName
      OUTPUT = "Fee-fi-mo-" MName
      OUTPUT = Name "!"
END

นี่เป็นโปรแกรม SNOBOL แรกที่ฉันเคยเขียน

SNOBOL เป็นภาษาที่เน้นบรรทัดเช่น FORTRAN, COBOL หรือ BASIC แต่ละบรรทัดประกอบด้วยป้ายตัวเลือกเริ่มต้นในคอลัมน์ 1 รหัสสำหรับบรรทัดที่สามารถเกี่ยวข้องกับการกำหนดและการจับคู่รูปแบบและสาขาที่เลือกได้ ใช่บรรทัดลงท้ายด้วย GOTO (ตัวเลือก) พวกเขามาในสองรูปแบบ:

        :(TARGET)

สาขาไปยังป้ายTARGETขณะที่

        :S(SUCCESS) F(FAILURE)

สาขาไปSUCCESSหากรูปแบบการจับคู่ประสบความสำเร็จหรือเป็นFAILUREอย่างอื่น นอกจากนี้คุณยังสามารถแยกสาขาสู่ความสำเร็จและล้มเหลวในบรรทัดถัดไปของความล้มเหลวหรือในทางกลับกัน

สายต่อเนื่องเริ่มต้นด้วยหรือ+ ความคิดเห็นที่เริ่มต้นด้วย.*

มันทำงานยังไง?

อ่านในชื่อแปลงเป็นตัวพิมพ์เล็ก ตั้งชื่อ B-, F- และ M โดยสันนิษฐานว่าเริ่มต้นด้วยเสียงสระ จากนั้นตรวจสอบว่ามันเริ่มต้นด้วยพยัญชนะช่วง ถ้าไม่เราพร้อมที่จะไป! ถ้าเป็นเช่นนั้นให้ถอดพยัญชนะนำและตั้งชื่อ B-, F- และ M โดยสมมติว่ามันไม่ได้ขึ้นต้นด้วยตัวอักษรใด ๆ สุดท้ายตรวจสอบว่ามันเริ่มต้นด้วยตัวอักษรแต่ละตัวเหล่านั้นในการแก้ไขชื่อตามที่จำเป็น ถ้าอย่างนั้นเราพร้อมที่จะเล่นเกมชื่อ!

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

 # $RUN *SNOBOL4 5=GOLF.SNO+*SOURCE* 6=*DUMMY*(1,28)+*SINK*(1,4)+*DUMMY*
 # Execution begins   16:57:25
   Snowman
   Snowman, Snowman, bo-bowman
   Banana-fana fo-fowman
   Fee-fi-mo-mowman
   Snowman!
 # Execution terminated   16:57:30  T=0.013

ฉันใช้สิ่งนี้กับเครื่องจำลองเมนเฟรมHercules S / 370 ที่ใช้ระบบเทอร์มินัลมิชิแกนรุ่น 6.0a โดยใช้ SNOBOL4 เวอร์ชัน 3.10 ตั้งแต่วันที่ 1 เมษายน 1973 สร้างขึ้นสำหรับ MTS เมื่อวันที่ 1 พฤษภาคม 1975 แต่อาจมีวิธีที่ง่ายกว่าในการใช้SNOBOL4บน ระบบที่ทันสมัย :)

แก้ไข:ลบสาขาที่ประสบความสำเร็จซ้ำซ้อนซึ่งเทียบเท่ากับข้อผิดพลาด (ฉันไม่ได้ตระหนักว่าฉันสามารถใส่สาขาความล้มเหลวได้ด้วยตัวเอง) ซึ่งกำจัดฉลากสาขาที่ไม่จำเป็นและหันไปไม่มีเงื่อนไขสาขาในบรรทัดก่อนหน้า เพื่อการประหยัด 7 ไบต์

ตอนนี้ TIO มีการรองรับ SNOBOL4 คุณสามารถ ลองออนไลน์ได้! หมายเหตุ: มันแสดงขนาดเป็น 429 มากกว่า 430 เพราะเมื่อฉันวางมันที่นั่น linefeed สุดท้ายจะถูกลบออก ฉันพยายามเปลี่ยนบรรทัดต่อเนื่อง (บรรทัดแรกที่ขึ้นต้นด้วย+) เป็นบรรทัดเดียวซึ่งไม่ถูกกฎหมายในเวอร์ชันเมนเฟรมเพราะสายยาวเกินไปและใช้งานได้และนำลงมาที่ 427 ชัด CSNOBOL4 อนุญาตให้สายยาวขึ้น ฉันจะทิ้งคะแนนไว้ที่ 430 เพราะนั่นคือจำนวนสคริปต์ที่อยู่ในเครื่องของฉันและยิ่งกว่านั้น SNOBOL นั้นค่อนข้างไม่สามารถแข่งขันได้


ตอนนี้คุณสามารถเรียกใช้ SNOBOL4 บนลองออนไลน์
จูเซปเป้

@Giuseppe ว้าวมันเยี่ยมมาก! ขอบคุณสำหรับการให้ฉันรู้ว่า.
David Conrad

CSNOBOL4 มีคู่ความแตกต่างอื่น ๆ ตามที่ได้รับมอบหมายเพียง แต่ต้องใช้พื้นที่ชั้นนำเพื่อให้ทุกสายของคุณชอบสามารถN = TRIM(INPUT) N =TRIM(INPUT)
จูเซปเป้

2

J , 149 ตัวอักษร

1!:2&2>|.(n,'!');('Fee-fi-mo-';'Banana-fana fo-';n,', ',n,', bo-'),&.>;/'mfb'(,`(}.@])`($:}.)@.((=+.2*5='aeiou'i.]){.)"0 _)a.{~32(23 b.)a.i.n=.1!:1]3

2

Javascript, 115 ไบต์

r=x=>x.match(/[aeiou]\w*/i)[0];f=x=>`${x}, ${x}, bo-b${r(x)}\nBanana-fana fo-f${r(x)}\nFee-fi-mo-m${r(x)}\n${x}!`

คำอธิบาย:

ฟังก์ชันนี้คืนค่าชื่อโดยไม่มีตัวอักษรเริ่มต้น

r=x=>x.match(/[aeiouAEIOU]\w*/)[0]

ส่วนที่เหลือเป็นฟังก์ชั่นคืนสตริงสตริงที่สมบูรณ์

f=x=>`${x}, ${x}, bo-b${r(x)}\nBanana-fana fo-f${r(x)}\nFee-fi-mo-m${r(x)}\n${x}!`

แก้ไข: จาก 119 ถึง 115 ไบต์ต้องขอบคุณ @Martin Ender


1
ยินดีต้อนรับสู่ PPCG! ฉันเชื่อว่าคุณสามารถตัดทอน regex ให้สั้นลง/[aeiou]\w*/iได้
Martin Ender

1
คุณสามารถแทนที่เวอร์ชันดั้งเดิมด้วยเวอร์ชันย่อ อันเก่าจะถูกเก็บไว้ในประวัติการแก้ไขของโพสต์ หากคุณต้องการคุณสามารถรวมคะแนนก่อนหน้าเช่นJavaScript, <s>119</s> 115 bytesในส่วนหัวเพื่อให้คำแนะนำแก่คนอื่นว่าเดิมมีรุ่นที่ยาวกว่าหากพวกเขาสนใจ
Martin Ender

อ่าเจ๋ง แก้ไขใหม่อีกครั้ง :)
ดำเนินการ

1

Clojure 292 ตัวอักษรหลังจากย่อเล็กสุด

นี่เป็นความพยายามครั้งแรกเกือบจะเป็นไปได้ที่ฉันจะลบมันได้อีก:

(defn name-game
  [n]
  (let [[b f m] (map (fn [x] (if (some #(= % (first n) (last x)) "bfm")
                              (str (apply str (butlast x)) (apply str (rest n)))
                              (str x (apply str (drop-while (fn [x] (not (some #(= % x) "aeiou"))) n))))) [", bo-b" "\nBanana-fana-fo-f" "\nFee-fi-mo-m"])]
    (str n ", " n b f m "\n" n "!")))

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

- เพื่อตัดพยัญชนะตั้งแต่ต้นของสตริง: (drop-while (fn [x] (not (some #(= % x) "aeiou"))) name)

- เพื่อจัดการกฎพิเศษสำหรับ "b", "f" และ "m", ฉันทำลายข้อความในรายการวลี: [", bo-b" "\nBanana-fana-fo-f" "\nFee-fi-mo-m"]

- จากนั้นฉันใช้ฟังก์ชั่นที่ถามว่าวลีนั้นจบลงหรือไม่ ด้วยตัวอักษรตัวเดียวกับที่ชื่อขึ้นต้นด้วยและใช้เพื่อแปลงวลีทั้งสามตามกฎของปริศนา

- ขั้นตอนสุดท้ายคือการสร้างสตริงที่มีผลลัพธ์


1

สกาล่า 281

ฉันแทนที่ (X) และ (Y) ในรูปแบบที่มีและ# เป็นเพียงชื่อใหม่สำหรับและเป็นคำจำกัดความชวเลข012SStringa(b,c,d)b.replaceAll(c,d)

val v="""#, #, bo-b0
Banana-fana fo-f1
Fee-fi-mo-m2
#!"""
type S=String
def a(b:S,c:S,d:S)=b.replaceAll(c,d)
def r(t:S,n:S,i:Int)=if(n(0)=="bfm"(i).toUpper)a(t,"."+i,n.tail)else
a(t,""+i,a(n,"^[^AEIOUaeiou]*([aeiou].*)","$1")).toLowerCase
def x(n:S)=a(r(r(r(v,n,0),n,1),n,2),"#",n)

ทดสอบการเรียกใช้:

val l = List ("Shirley", "Arnold", "Bob", "Fred") 
for (n <- l) println (x (n) + "\n")

และไม่ดี

val templ = """#, #, bo-b0
Banana-fana fo-f1
Fee-fi-mo-m2
#!"""

val names = List ("Shirley", "Arnold", "Bob", "Fred") 
val keys = "bfm"

def recode (template: String, n: String, i: Int) = 
 if (n(0) == keys(i).toUpper)
   template.replaceFirst ("." + i, n.tail) else 
 template.replaceAll ("" + i, (n.replaceAll ("^[^AEIOUYaeiouy]*([aeiou].*)", "$1").toLowerCase))

for (name <- names)
  println (recode (recode (recode (templ, name, 0), name, 1), name, 2).replaceAll ("#", name) + "\n")

1

Python 3, 148 145 142 ไบต์

ใช่ฉันรู้ว่ามันสายไปนิด แต่ ...

n=input();i=0
r=n[i:].lower()
while n[i]not in'aeiouAEIOU':i+=1;r=n[i:]
print(f'{n}, {n}, bo-b{r}\nBanana-fana fo-f{r}\nFee-fi-mo-m{r}\n{n}!')

มันใช้สตริง fใหม่เพื่อจัดรูปแบบสตริงผลลัพธ์

ฉันไม่คิดว่า TIO รองรับ f-strings แต่น่าเสียดายที่

เวอร์ชั่นเก่า

def f(n,i=0):
 r=n[i:].lower()
 while n[i].lower()not in'aeiou':i+=1;r=n[i:]
 return f'{n}, {n}, bo-b{r}\nBanana-fana fo-f{r}\nFee-fi-mo-m{r}\n{n}!'

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


บันทึกสามไบต์ด้วยการใช้ 'AEIOUaeiou' ตามตัวอักษรและหลีกเลี่ยงการต่ำกว่า () ในบรรทัดที่ 3
เป็นทางการ

1

Sed, 162 ไบต์

sed 'h;G;G;G' |sed '1s/.*/&, &, bo-b\L&/i;2s/^.*/Banana-fana fo-f\L&/;3s/^.*/Fee-fi-mo-m\L&/;4s/$/!/;tx;:x;s/o-\([bfm]\)\1/o-/i;tz;s/\(o-[bfm]\)[^aeiou]\+/\1/;:z'

ฉันไม่เคยรู้อะไรมาก่อนเลยดีกว่า ฉันเอ่อรู้มันมากดีกว่าตอนนี้ sed แรกในไปป์ไลน์ซ้ำชื่อสามครั้งดังนั้นมันจึงกลายเป็น "Bob \ nBob \ nBob \ nBob" แทนที่จะเป็นเพียง "Bob" sed ถัดไปทำการยกของหนัก

คาดว่าจะมีการป้อนข้อมูลเช่น stdin echo Name |sed ...

Ungolfed:

sed 'h                           ;# copy to hold buffer
G                                ;# append newline + hold buffer to pattern
G                                ;# ditto for next two G's
G' |sed '1s/.*/&, &, bo-b\L&/i   ;# 1st line -> X, X bo-bx (lowercase)
2s/^.*/Banana-fana fo-f\L&/      ;# 2nd line -> Banana-fana fo-fx
3s/^.*/Fee-fi-mo-m\L&/           ;# 3rd line -> Fee-fi-mo-mx
4s/$/!/                          ;# bang the 4th line!
tx                               ;# jump to :x if any s/// has matched
:x                               ;# spoiler alert: it has! reset t-flag
s/o-\([bfm]\)\1/o-/i             ;# match some o-cc where c = [bfm]
tz                               ;# if that matched, branch to :z
s/\(o-[bfm]\)[^aeiou]\+/\1/      ;# replace o-[bfm] plus consonants with o-[bfm]
:z                               ;# target of tz, skips over previous s///'

คู่ของบันทึกย่อ การจับคู่สี่ครั้งแรก 1s, 2s, 3s, 4s เปลี่ยนผลลัพธ์เป็นสิ่งที่ไม่ถูกต้อง บ๊อบกลายเป็นนักเลงเฟร็ดกลายเป็นเฟรดเฟร็ดและไมค์กลายเป็นโม -mike Kay จะกลายเป็น mo-mkay, mkay?

จากนั้นเราต้องแทนที่ bo-bbob ด้วย bo-ob หรือ bo-bkay ด้วย bo-bay ในการทำเช่นนั้นเราสามารถใช้คุณสมบัติที่เราทำการทดแทนหนึ่ง s /// แล้วทำการแยกหากประสบความสำเร็จกระโดดข้ามอันที่สองที่ตอนนี้เราต้องการข้าม แต่ถ้าพลาดเราต้องการที่จะล้มสาขาและทำการทดแทนครั้งต่อไป

คำสั่ง t [label] ทำเช่นนั้นแยกเฉพาะเมื่อ s /// ก่อนหน้าตรงกัน แต่ในตอนต้นของสคริปต์ฉันได้ทำหนึ่ง s /// สำหรับแต่ละบรรทัดแล้ว (ตัวเลขนำหน้าใน 1s, 2s ฯลฯ เป็นที่อยู่พวกเขาหมายถึงคำสั่งจะดำเนินการเฉพาะเมื่อที่อยู่ตรงกัน) ดังนั้นไม่ว่าเราจะอยู่บนเส้นใด 1, 2, 3 หรือ 4 อย่างน้อยหนึ่ง s /// ได้เข้าคู่กัน (ฉันลองทำอีกวิธีหนึ่งแล้วนวดชื่อและเพิ่ม "Banana ฯลฯ " หลังจากนั้น แต่ติดอยู่กับที่และพยายามทำทุกอย่างทันทีจะทำให้เกิดการซ้ำซ้อน) โชคดีที่ธงสามารถ สามารถเคลียร์ได้โดยรับสาขาดังนั้นเราจึงทำเช่นนั้นด้วย "tx;: x" tx แยกไปที่ x label และ: x เป็น x label

ต๊าย! นั่นเป็นการเคลียร์ลิ้นสำหรับการเปลี่ยนตัวสองครั้งสุดท้าย เราลองอันใดอันหนึ่งและถ้ามันประสบความสำเร็จเราก็แตกสาขาอื่นมิฉะนั้นเราจะทำอันที่สอง วิธีที่เราสิ้นสุดที่ป้ายกำกับ: z และบัฟเฟอร์รูปแบบมีเนื้อเพลงหนึ่งบรรทัดซึ่งพิมพ์ไปยัง stdout

ขอขอบคุณที่หลอกให้ฉันใช้เวลามากพอกับหน้า man sed และคู่มือ Texinfo เพื่อทำความเข้าใจในที่สุดว่าจะทำยังไงมากกว่า s / foo / bar /


โอ้ฉันจะนับความยาวทั้งหมดของสคริปต์ด้วยคำสั่ง sed และ|และทั้งหมด บางทีฉันควรจะเรียก bash / sed นี้หรือนับมันแตกต่างกัน? ฉันไม่รู้ ฉันมีความสุขกับมันตามที่เป็น แต่แจ้งให้เราทราบว่าควรจะแตกต่างกันตามมาตรฐานของ PPCG
David Conrad

0

Python, 161

x=raw_input('')
a,b,c=x[0],x[1:],'bfm'
if b[0] in c:b=b[1:]
d="X, X, bo-@\nBanana-fana fo-@\nFee-fi-mo-@\nX!".replace('X',a)
for y in c:d=d.replace('@',y+b,1)
print d

เพิ่งรู้ว่ารหัสของฉันล้มเหลว ...
- ไม่ลบพยัญชนะเริ่มต้น
- ไม่จัดการธุรกิจ 'bo-ob'

มันเป็นที่สุดที่ฉันได้รับบางทีใครบางคนสามารถทำมันให้เสร็จ


0

Groovy, 146

r={n->m={n[0]==it[0]?n[1..-1]:it[1]+(n.toLowerCase()=~'[aeiou].*')[0]};"$n, $n, bo-${m 'Bb'}\nBanana-fana fo-${m 'Ff'}\nFee-fi-mo-${m 'Mm'}\n$n!"}

assert ['Shirley', 'Arnold', 'Bob', 'Fred'].collect { r(it) } == [
'''Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!''',
'''Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!''',
'''Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!''',
'''Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!'''
]

0

R, 189 ตัวอักษร

x=scan(,'');f=function(b)if(grepl(b,x))sub('.','',x)else tolower(sub('^[^aoueiy]*',b,x,i=T));cat(sprintf('%s, %1$s, bo-%s\nBanana-fana fo-%s\nFee-fi-mo-%s\n%1$s!\n',x,f('B'),f('F'),f('M')))

แต่ด้วยอักขระอีกเพียงหนึ่งตัวคุณสามารถป้อนชื่อได้มากมายในครั้งเดียว:

x=scan(,'');f=function(b)ifelse(grepl(b,x),sub('.','',x),tolower(sub('^[^aoueiy]*',b,x,i=T)));cat(sprintf('%s, %1$s, bo-%s\nBanana-fana fo-%s\nFee-fi-mo-%s\n%1$s!\n',x,f('B'),f('F'),f('M')))

0

Pyth , 111 ไบต์SBCS

V"BFM"IqhzN=aYtrz0.?=aY+rN0:rz0"^[^aeiou]+"k))+%." s­ÞXY:lÍ"*]z2@Y0+." o1}1ÃЬÛJî½"@Y1+."-o Âkq°ë¹è"@Y2+z\!

ชุดทดสอบ

รหัสใช้อักขระที่ไม่สามารถพิมพ์ได้และเป็นเช่นนั้นแสดงไม่ถูกต้องใน Stack Exchange ลิงค์ที่ให้นั้นมีตัวละครเหล่านี้และเป็นเวอร์ชั่นที่ถูกต้องของโปรแกรม


-1

หลาม

n=raw_input('')
if n[0].lower() in ("m", "f", "b"): r=n[1:]
else:
    i = iter(n.lower())
    for a in range(len(n)):
        if i.next() in ("a","e","i","o","u"):
            r = n[a:]
            break
print "%s, %s, bo-b%s\nBanana-fana fo-f%s\nFee-fi-mo-m%s\n%s!" %(name,name,rhyme,rhyme,rhyme,name)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.