Facey McFaceface


47

ใครจำBoaty ?

คุณสามารถสร้างคำเก่า ๆ ได้ใช่ไหม?

  • เขียนฟังก์ชั่นเพื่อเปลี่ยนสตริงเป็น Somethingy McSomethingface
  • ควรยอมรับหนึ่งสตริงเป็นอินพุต ละเว้นกรณีของการป้อนข้อมูล
  • หากคำลงท้ายด้วย 'y' ฟังก์ชั่นของคุณไม่ควรเพิ่ม 'y' เพิ่มเติมในอินสแตนซ์แรก แต่ควรลบออกในอินสแตนซ์ที่สอง
  • หากคำลงท้ายด้วย 'ey' คำนั้นไม่ควรเพิ่ม 'y' เพิ่มเติมในอินสแตนซ์แรก แต่ควรลบทั้งสองในอินสแตนซ์ที่สอง
  • ผลลัพธ์ควรมีตัวอักษรตัวพิมพ์ใหญ่ในอักขระตัวแรกคือ 'M' ของ 'Mc' และตัวอักษรตัวแรกหลัง 'Mc'
  • มันจะต้องทำงานกับสายอักขระ 3 ตัวขึ้นไป

ตัวอย่าง:

boat                  =>  Boaty McBoatface
Face                  =>  Facey McFaceface
DOG                   =>  Dogy McDogface
Family                =>  Family McFamilface
Lady                  =>  Lady McLadface
Donkey                =>  Donkey McDonkface
Player                =>  Playery McPlayerface
yyy                   =>  Yyy McYyface
DJ Grand Master Flash =>  Dj grand master flashy McDj grand master flashface

สิ่งที่เกี่ยวกับช่องว่างในสตริงเราจะปล่อยพวกเขาเหมือนเดิม? ตัวอย่าง: ' y'และ' '
สัมผัสร่างกายของฉัน

2
ฉันจะใช้ข้อเสนอแนะจาก @Arnauld และทำให้มันเป็นอักขระขั้นต่ำสามตัว ปฏิบัติกับช่องว่างเหมือนตัวอักษรอื่น
AJFaraday


เราสามารถสมมติว่าการป้อนข้อมูลจะมีเพียงตัวอักษรบนและล่าง?
Kevin Cruijssen

@KevinCruijssen ฉันไม่ได้ใส่ตัวอักษรใด ๆ ในกรณีทดสอบดังนั้นพวกเขาจึงไม่กังวลอย่างมีประสิทธิภาพ
AJFaraday

คำตอบ:


7

Stax , 26 ไบต์

ëO╛εh╕⌠î&!}∞┌C^U╟«äδ◙Bg⌠└¿

เรียกใช้และแก้ไขข้อบกพร่อง

^           convert input to upper case                     "FACE"
B~          chop first character and push it back to input  70 "ACE"
v+          lowercase and concatenate                       "Face"
c'yb        copy, push "y", then copy both                  "Face" "Face" "y" "Face" "y"
:]          string ends with?                               "Face" "Face" "y" 0
T           trim this many character                        "Face" "Face" "y"
+           concatenate                                     "Face" "Facey"
p           output with no newline                          "Face"
"e?y$"z     push some strings                               "Face" "e?y$" ""
" Mc`Rface  execute string template; `R means regex replace " Mc Faceface"
            result is printed because string is unterminated

เรียกใช้อันนี้


15

V , 27 28 30ไบต์

Vu~Ùóe¿y$
Hóy$
ÁyJaMc<Esc>Aface

ลองออนไลน์!

<Esc> หมายถึง 0x1b

  • เล่นกอล์ฟสองไบต์หลังจากเรียนรู้ว่าเราไม่จำเป็นต้องสนับสนุนอินพุตที่มีอักขระน้อยกว่า 3 ตัว

  • บันทึก 1 ไบต์ต้องขอบคุณ @DJMcMayhem ด้วยการทำงานในบรรทัดที่สองก่อนหน้าบรรทัดแรกจึงทำการลบ G

อินพุตอยู่ในบัฟเฟอร์ โปรแกรมเริ่มต้นด้วยการแปลงทุกอย่างเป็นตัวพิมพ์เล็ก

Vเลือกเส้นและลดขนาดuมัน

~ สลับกรณีของอักขระตัวแรก (แปลงเป็นตัวพิมพ์ใหญ่)

และÙทำซ้ำบรรทัดนี้ด้านบนโดยปล่อยเคอร์เซอร์ไว้ที่บรรทัดล่างสุด

óและแทนที่e¿y$รูปแบบการบีบอัดของe\?y$(ตัวเลือกeและ a yที่ท้ายบรรทัด) โดยไม่มีสิ่งใด (เกิดขึ้นในบรรทัดที่สอง)

H ไปที่บรรทัดแรก

óแทนที่y$( yที่ส่วนท้ายของบรรทัด) โดยไม่มีอะไรในบรรทัดแรก

Áผนวก a yถึงท้ายบรรทัดแรก

J และรวมบรรทัดสุดท้ายกับบรรทัดแรกที่มีช่องว่างตรงกลางและเคอร์เซอร์จะถูกย้ายไปยังพื้นที่นี้

aผนวกMc( <Esc>กลับสู่โหมดปกติ)

Aในที่สุดผนวกfaceท้ายบรรทัด



13

Python ขนาด 144 ไบต์

def f(s):
 s=s[0].upper()+s[1:].lower()
 y=lambda s:s[:-1]if s[-1]=='y'else s
 t=y(s)
 u=s[:-2]if s[-2:]=='ey'else y(s)
 return t+'y Mc%sface'%u

ลองออนไลน์ได้ที่นี่


2
ความพยายามในการตีกอล์ฟครั้งแรกของฉัน ...
สัมผัสร่างกายของฉัน

3
ยินดีต้อนรับสู่ PPCG! ฉันขอแนะนำให้เพิ่มลิงค์เพื่อลองออนไลน์! สำหรับการตรวจสอบความถูกต้อง?
Giuseppe

1
f("Face")ไม่สอดคล้องกับกรณีทดสอบในปัจจุบัน ( TIO )
Jonathan Frech

โพสต์ที่แก้ไขแล้วเพื่อความถูกต้องเพิ่ม Try It Online! ลิงค์
แตะร่างกายของฉัน


12

Excel, 204 144 137 165 ไบต์

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(REPT(REPLACE(LOWER(A1),1,1,UPPER(LEFT(A1)))&"~",2),"~","y Mc",1),"yy ","y "),"ey~","~"),"y~","~"),"~","face")

จากภายในสู่ภายนอก:

REPLACE(LOWER(A1),1,1,UPPER(LEFT(A1)))      Replaces PROPER to handle space-delimited cases
REPT(%&"~",2)                   Duplicate.                    Donkey~Donkey~
SUBSTITUTE(%,"~","y Mc",1)      Replace first ~.              Donkeyy McDonkey~
SUBSTITUTE(%,"yy ","y ")        Handle words ending in 'y'.   Donkey McDonkey~
SUBSTITUTE(%,"ey~","~")         Handle words ending in 'ey'   Donkey McDonk~
SUBSTITUTE(%,"y~","~")          Handle words ending in 'y'    Donkey McDonk~
SUBSTITUTE(%,"~","face")        Adding face.                  Donkey McDonkface

คำตอบเก่าสร้างบิตทั้งหมดแยกต่างหากจากนั้นต่อกัน (176 ไบต์) ไม่จัดการกรณีที่คั่นด้วยช่องว่างอย่างถูกต้อง

=PROPER(A1)&IF(LOWER(RIGHT(A1,1))="y",,"y")&" Mc"&IF(LOWER(RIGHT(A1,2))="ey",LEFT(PROPER(A1),LEN(A1)-2),IF(LOWER(RIGHT(A1,1))="y",LEFT(PROPER(A1),LEN(A1)-1),PROPER(A1)))&"face"

น่าเสียดายเนื่องจากความต้องการในการจัดการกรณีที่มีการคั่นด้วยช่องว่างPROPER(A1)นั้นไม่ถูกต้อง (ดูตัวDJ Grand Master Flashพิมพ์ที่ป้อน) การแทนที่ที่ดีที่สุดที่ฉันสามารถหาได้ในขณะที่ทำงานกับโซลูชัน VBA ของฉันคือLEFT(UPPER(A1))&MID(LOWER(A1),2,LEN(A1))- โปรดแจ้งให้เราทราบหากคุณเล่นกอล์ฟ
Taylor Scott

1
ขอบคุณ @TaylorScott พบ 'REPLACE (LOWER (A1), 1,1, UPPER (LEFT (A1)))' ซึ่งสั้นกว่า 2 ไบต์
Wernisch


9

C # (. NET Core) , 122 108 139 175 180 179 154 ไบต์

ขอบคุณมากเลย!

s=>((s.EndsWith("y")?s:s+"y")+" Mc"+(s+"$").Replace("ey$","")+"face").Replace(s,s.ToUpper()[0]+s.Substring(1).ToLower()).Replace("y$","").Replace("$","");

ลองออนไลน์!

C # (.NET Core พร้อม LINQ) 152 ไบต์

s=>((s.Last()=='y'?s:s+"y")+" Mc"+(s+"$").Replace("ey$","")+"face").Replace(s,s.ToUpper()[0]+s.Substring(1).ToLower()).Replace("y$","").Replace("$","");

ลองออนไลน์!


3
ยินดีต้อนรับสู่เว็บไซต์! :)
DJMcMayhem


7

Ruby , 61 49 ไบต์

->s{s.capitalize=~/(e)?y$|$/;"#$`#$1y Mc#$`face"}

ลองออนไลน์!

บันทึก 12 ไบต์หวานด้วย @MartinEnder:


1
การใช้ regex จากคำตอบ Retina ของฉันและใช้การแก้ไขสตริงเพิ่มเติมอีกเล็กน้อยจะทำให้ 49: tio.run/##DcxBCsIwEEDRqwxJBF3Y4lpSN0U3igcQwTQmGFptMVNkTOLVY3bvb/…
Martin Ender

@ มาร์ตินอีกครั้งว้าวค่อนข้างแตกต่างกัน ฉันไม่คิดว่าฉันเคยเห็นการแก้ไขสตริงโดยไม่ต้องวงเล็บ ฉันจะรับมันถ้าคุณไม่ต้องการใช้สำหรับคำตอบ Ruby ของคุณเอง
iamnotmaynard

Nah ก็ปรับผมจะไม่ได้เกิดขึ้นกับการใช้และการสร้างสตริงทั้งแทนการใช้=~ subการแก้ไขสตริงสามารถใช้โดยไม่มีวงเล็บถ้าตัวแปรเป็นตัวแปรโกลบอลอินสแตนซ์หรือคลาส
Martin Ender

คุณสามารถลดขนาดลงเหลือ 44 + 1 ไบต์โดยใช้การ-pตั้งค่าสถานะและใช้sub: tio.run/…
Jordan

7

Python 3 , 80 ไบต์

ผู้อ่านตัวยงมานานการส่งครั้งแรกของฉันในที่สุด

lambda y:re.sub("([\w ]+?)((e)?y)?$",r"\1\3y Mc\1face",y.capitalize())
import re

ลองออนไลน์


1
ยินดีต้อนรับสู่ PPCG และโพสต์แรกที่ดีมาก!
Zacharý



5

Java 8, 121 112 107 106 ไบต์

s->(s=(char)(s.charAt(0)&95)+s.toLowerCase().substring(1)).split("y$")[0]+"y Mc"+s.split("e?y$")[0]+"face"

-1 ขอบคุณไบต์@ OliverGrégoire

คำอธิบาย:

ลองออนไลน์

s->                         // Method with String as both parameter and return-type
  (s=                       //  Replace and return the input with:
     (char)(s.charAt(0)&95) //   The first character of the input as Uppercase
     +s.toLowerCase().substring(1))
                            //   + the rest as lowercase
  .split("y$")[0]           //  Remove single trailing "y" (if present)
  +"y Mc"                   //  Appended with "y Mc"
  +s.split("e?y$")[0]       //  Appended with the modified input, with "y" or "ey" removed
  +"face"                   //  Appended with "face"

เกิดอะไรขึ้นถ้าตัวอักษรตัวแรกไม่ใช่ตัวอักษร? หรือบางทีเราสามารถเพิ่มกฎเกี่ยวกับเรื่องนั้นได้
ท้องถนน

1
@streetster เพิ่งถาม OP และดูเหมือนว่าอินพุตจะมีตัวอักษรตัวพิมพ์ใหญ่และ / หรือตัวพิมพ์เล็กเท่านั้น
Kevin Cruijssen

1
~32-> 95บันทึกได้ 1 ไบต์
Olivier Grégoire

@ OlivierGrégoireฉันต้องเริ่มเรียนรู้เพิ่มเติมเล็กน้อยเกี่ยวกับการทำงานในระดับบิต .. >.>
Kevin Cruijssen

4

JavaScript, 103 96 94 ไบต์

ค่อนข้างไร้เดียงสาผ่านครั้งแรกที่นี้

s=>(g=r=>s[0].toUpperCase()+s.slice(1).toLowerCase().split(r)[0])(/y$/)+`y Mc${g(/e?y$/)}face`

ลองออนไลน์


s =>${s=s[0].toUpperCase()+s.slice(1).toLowerCase().replace(/y$/,``)}y Mc${s.replace(/e?y$/,``)}face
Benjamin Gruenbaum

น้อยกว่าหนึ่ง: s =>${s=s[0].toUpperCase()+s.slice(1).toLowerCase().replace(/y$/,'')}y Mc${s.replace(/e$/,``)}face
Benjamin Gruenbaum

ขอบคุณ @BenjaminGruenbaum แต่ล้มเหลวในครั้งแรกและครั้งที่สองสำหรับDonkey Face
Shaggy

markdown กำลังทำลายรหัส: gist.github.com/benjamingr/8fec077b5436846cc9c52be353238037
Benjamin Gruenbaum

@Shaggy ฉันจัดการเพื่อลดฟังก์ชั่น g โดยตัวอักษรบางตัว :) คุณสามารถดูวิธีการแก้ปัญหาของฉัน
DanielIndie

3

เป็นกลุ่ม, 35 34 ไบต์

Vu~Yp:s/ey$
:%s/y$
kgJiy Mc<ESC>Aface<ESC>

<ESC> คือ 0x1b

Ungolfed

Vu~                      # Caseify McCaseface
Yp                       # dup line
:s/ey$ 
:%s/y$                   # Get the suffixes right
kgJiy Mc<ESC>Aface<ESC>  # Join lines and add the extra chars

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณ DJMcMayhem


1
คุณสามารถทำYแทนyy
DJMcMayhem

3

Perl 5 -p , 47 39 ไบต์

บันทึกแล้ว 6 ไบต์ด้วยคำแนะนำของ @ OlegV.Volkov, 1 กับ @ mwellnhof's และอีก 1 คนเป็นของฉันเอง

$_=lc^$";$_=s/y?$/y Mc/r.s/e?y$//r.face

ลองออนไลน์!


คุณสามารถกำจัดucfirst:$_=lc^$";
Oleg V. Volkov

$_=s/y$//r."y Mc".s/e?y$//r.faceสั้นลงหนึ่งไบต์
nwellnhof

1
/y$|$/->/y?$/
Oleg V. Volkov

ดุจ ฉันควรตระหนักว่า
Xcali

3

C ++ 14 (g ++), 181 171 148 147 134 ไบต์

[](auto s){s[0]&=95;int i=1,b;for(;s[i];)s[i++]|=32;b=s[--i]-'y';return s+(b?"y":"")+" Mc"+(b?s:s.substr(0,s[i-1]-'e'?i:i-1))+"face";}

โปรดทราบว่าเสียงดังกราวจะไม่รวบรวมสิ่งนี้

เครดิตไปที่เควิน CruijssenและโอลิเวียGrégoireสำหรับ&95เคล็ดลับ

ขอบคุณChrisสำหรับการเล่นกอล์ฟ 11 ไบต์

ลองออนไลน์ได้ที่นี่

เวอร์ชันที่ไม่ถูกปรับแต่ง:

[] (auto s) { // lambda taking an std::string as argument and returning an std::string
    s[0] &= 95; // convert the first character to upper case
    int i = 1, // for iterating over the string
    b; // we'll need this later
    for(; s[i] ;) // iterate over the rest of the string
        s[i++] |= 32; // converting it to lower case
    // i is now s.length()
    b = s[--i] - 'y'; // whether the last character is not a 'y'
    // i is now s.length()-1
    return s + (b ? "y" : "") // append 'y' if not already present
    + " Mc"
    + (b ? s : s.substr(0, s[i-1] - 'e' ? i : i-1)) // remove one, two, or zero chars from the end depending on b and whether the second to last character is 'e'
    + "face";
}

ฉันไม่รู้ C ++ ที่ดี แต่คุณสามารถเล่นกอล์ฟ 9 ไบต์: ลองออนไลน์172 ไบต์ สรุปการเปลี่ยนแปลง: s[0]=s[0]&~32;เป็นs[0]&=~32;; s[i++]=s[i]|32;ถึงs[i++]|=32; และint i=1,n=s.length()-1,b;ดังนั้นคุณจะต้อง int1
Kevin Cruijssen

โอ้และอีกหนึ่งไบต์โดยการลบช่องว่างที่#include<string>
Kevin Cruijssen

@KevinCruijssen ขอบคุณที่รับชม! ฉันแก้ไขแล้ว
OOBalance

คุณสามารถบันทึก 11 ไบต์โดยไม่กำหนดnและเพียงใช้ค่าiหลังจากวนรอบในขณะนั้น ลองออนไลน์!
Chris

@Chris ขอบคุณ! ฉันจัดการเพื่อลบ 2 ไบต์เพิ่มเติม
OOBalance

2

V , 38 36 32 ไบต์

-5 ไบต์ขอบคุณ @Cack นักต้มตุ๋น

Vu~hy$ó[^y]$/&y
A Mc<esc>póe¿y$
Aface

<esc>เป็นตัวอักษรหลบหนีตามตัวอักษรและ[^ถูกเข้ารหัสเป็น\x84

ลองออนไลน์!


gu$สามารถเป็นVu
Kritixi Lithos

2
เนื่องจาก[^เป็นทางลัด regex (ดูที่นี่ ) คุณสามารถใช้ 0x84 แทน[^การบันทึกไบต์ ในทำนองเดียวกัน\?สามารถทำให้ง่ายขึ้นใน<M-?>การบันทึกไบต์อื่น และ$a=>A
Kritixi Lithos


2

Python 3 , 117 114 ไบต์

-3 ไบต์ขอบคุณ Dead Possum

def f(s):s=s.title();return s+'y'*(s[-1]!='y')+' Mc'+([s,s[:-1],0,s[:-2]][(s[-1]=='y')+((s[-2:]=='ey')*2)])+'face'

ลองออนไลน์!


องค์ประกอบที่สามของรายการ[s,s[:-1],'',s[:-2]สามารถเปลี่ยน0เป็นบันทึก 1 ไบต์
Dead Possum

ใน'y'*1 *1ไม่จำเป็น 2 ไบต์เพิ่มเติม
Dead Possum

การเปลี่ยนจาก Python 3 เป็น Python 2 และการแทนที่returnด้วยprintจะสั้นลง 1 ไบต์
Kevin Cruijssen

2

JavaScript (Node.js) , 87 ไบต์

  • ขอบคุณ @Shaggy สำหรับการลด 5 ไบต์
s=>(g=r=>Buffer(s.replace(r,"")).map((x,i)=>i?x|32:x&~32))(/y$/)+`y Mc${g(/e?y$/)}face`

ลองออนไลน์!


2
คุณไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นที่ไม่เกิดซ้ำ
Dennis

1
ทำได้ดีมาก ฉันไม่เคยคิดที่จะใช้Bufferจะต้องพยายามจำมันสำหรับความท้าทายในอนาคต รับไปถึง87 ไบต์สำหรับคุณ
Shaggy

2

K4 , 74 69 68 ไบต์

วิธีการแก้:

{$[r;x;x,"y"]," Mc",_[r:0&1-2/:"ye"=2#|x;x:@[_x;0;.q.upper]],"face"}

ตัวอย่าง:

q)k)f:{$[r;x;x,"y"]," Mc",_[r:0&1-2/:"ye"=2#|x;x:@[_x;0;.q.upper]],"face"}
q)f each ("boat";"Face";"DOG";"Family";"Lady";"Donkey";"Player")
"Boaty McBoatface"
"Facey McFaceface"
"Dogy McDogface"
"Family McFamilface"
"Lady McLadface"
"Donkey McDonkface"
"Playery McPlayerface"

คำอธิบาย:

คิดออกว่าตัวอักษรตัวสุดท้ายมีค่าเท่ากับ"ey", แปลงผลลัพธ์เป็นฐาน 2 เพื่อให้เราสามารถละเว้นคำที่ลงท้าย"e?"เพื่อให้เราสามารถละเว้นคำว่าสิ้น จัดทำดัชนีในรายการจำนวนอักขระที่ต้องการตัดแต่ง

จัดการเพื่อลบรหัสของฉัน 5 ไบต์เพื่อตรวจสอบว่าตัวอักษรสองตัวสุดท้ายที่"ey"แต่พยายามที่จะดีกว่า ...

{$[r;x;x,"y"]," Mc",_[r:0&1-2/:"ye"=2#|x;x:@[_x;0;.q.upper]],"face"} / the solution
{                                                                  } / lambda function
                                                            ,"face"  / join with "face"
                    _[                  ;                  ]         / cut function
                                           @[_x; ;        ]          / apply (@) to lowercased input
                                                0                    / at index 0
                                                  .q.upper           / uppercase function
                                         x:                          / save back into x
                                      |x                             / reverse x
                                    2#                               / take first two chars of x
                               "ye"=                                 / equal to "ye"?
                             2/:                                     / convert to base 2
                           1-                                        / subtract from 1
                         0&                                          / and with 0 (take min)
                       r:                                            / save as r
             ," Mc",                                                 / join with " Mc"
 $[r;x;x,"y"]                                                        / join with x (add "y" if required)

โบนัส:

พอร์ต67 ไบต์ในK (oK) :

{$[r;x;x,"y"]," Mc",((r:0&1-2/"ye"=2#|x)_x:@[_x;0;`c$-32+]),"face"}

ลองออนไลน์!


1
อะไรคือจุดสำคัญใน K4 ถ้าพอร์ต OK ของคุณเอาชนะมันได้?
Zacharý

ฉันไม่คิดว่ามันจะเป็นเช่นนั้นและพอร์ตจะไม่ทำงานหากอักขระตัวแรกไม่ได้เรียงตามตัวอักษรเพราะฉันลบ 32 จากค่า ASCII แบบสุ่ม - ไม่มีตัว "ด้านบน" ในตัว
roadster

2

Ruby , 69 ไบต์

->s{"#{(s.capitalize!||s)[-1]==?y?s:s+?y} Mc#{s.gsub /e?y$/,""}face"}

คำอธิบาย:

->s{                                                                } # lambda 
    "#{                                 } Mc#{                }face" # string interpolation
       (s.capitalize!||s) # returns string capitalized or nil, in that case just use the original string
                         [-1]==?y # if the last character == character literal for y
                                 ?s:s+?y # then s, else s + "y"
                                              s.gsub /e?y$/,"" # global substitute
                                                               # remove "ey" from end

ลองออนไลน์!


คุณสามารถเพิ่มลิงค์ TIO ได้หรือไม่? ฉันไม่รู้จักรูบี แต่s.capitalizeแทนที่ก่อนหน้านี้sหรือไม่ ถ้าไม่ได้ไม่/e?y$/จัดการกับกรณีการทดสอบที่ลงท้ายด้วยY, EYหรือEyถูกต้องหรือไม่
Kevin Cruijssen

1
@KevinCruijssen s.capitalizevs s.capitalize!(ฟังก์ชั่นต่าง ๆ ) s.capitalize!อุดตันรุ่นเก่า
dkudriavtsev

@KevinCruijssen ฉันได้เพิ่มลิงค์ TIO
dkudriavtsev

@KevinCruijssen ได้เพิ่มคำอธิบาย
dkudriavtsev

s.capitalize!อาโอเคขอบคุณสำหรับคำอธิบายและข้อมูลเกี่ยวกับ ไม่เคยตั้งโปรแกรมใน Ruby แต่เพิ่มเครื่องหมายคำอธิบายเพื่อแทนที่ค่าก่อนหน้านี้ค่อนข้างเท่ห์ +1 จากฉัน
Kevin Cruijssen

2

Jstx , 27 ไบต์

h</►yT↓►y/◙♂ Mc♀/◄eyg►yg/íå

คำอธิบาย

      # Command line args are automatically loaded onto the stack
h     # Title case the top of the stack
<     # Duplicate the top value on the stack twice
/     # Print the top value on the stack
►y    # Load 'y' onto the stack
T     # Returns true if the 2nd element on the stack ends with the top
↓     # Execute block if the top of the stack is false
  ►y  # Load 'y' onto the stack
  /   # Print the top value on the stack
◙     # End the conditional block
♂ Mc♀ # Load ' Mc' onto the stack
/     # Print the top value on the stack
◄ey   # Load 'ey' onto the stack
g     # Delete the top of the stack from the end of the 2nd element on the stack if it exists
►y    # Load 'y' onto the stack
g     # Delete the top of the stack from the end of the 2nd element on the stack if it exists
/     # Print the top of the stack
íå    # Load 'face' onto the stack
      # Print with newline is implied as the program exits

ลองออนไลน์!


ฉันไม่เคยเห็นภาษานี้มาก่อน มันดูน่าสนใจ มีเอกสารประกอบหรือไม่?
เรียกซ้ำ


ว้าวนี่ช่างน่าประทับใจจริงๆ โดยเฉพาะอย่างยิ่งสำหรับเวลาในการพัฒนาน้อยมาก ฉันตื่นเต้นที่จะเห็นว่าสิ่งนี้จะไป
เรียกซ้ำ

2

สีแดง , 143 142 ไบต์

func[s][s: lowercase s s/1: uppercase s/1
w: copy s if"y"<> last s[append w"y"]rejoin[w" Mc"parse s[collect keep to[opt["y"|"ey"]end]]"face"]]

ลองออนไลน์!

Ungolfed:

f: func[s][
   s: lowercase s                      ; make the entire string lowercase
   s/1: uppercase s/1                  ; raise only its first symbol to uppercase 
   w: copy s                           ; save a copy of it to w
   if "y" <> last s[append w "y"]     ; append 'y' to w if it doesn't have one at its end
   rejoin[w                            ; assemble the result by joining:
          " Mc"
          ; keep the string until "y", "ey" or its end
          parse s[collect keep to [opt ["y" | "ey"] end]]
          "face"
    ]
]

2

PHP: 132

<?php function f($s){$s=ucfirst(strtolower($s));return $s.(substr($s,-1)=='y'?'':'y').' Mc'.preg_replace('/(ey|y)$/','',$s).'face';}

คำอธิบาย:

<?php

function f($s)
{
    // Take the string, make it all lowercase, then make the first character uppercase
    $s = ucfirst(strtolower($s));

    // Return the string, followed by a 'y' if not already at the end, then ' Mc'
    // and the string again (this time, removing 'y' or 'ey' at the end), then
    // finally tacking on 'face'.
    return $s
        . (substr($s, -1) == 'y' ? '' : 'y')
        . ' Mc'
        . preg_replace('/(ey|y)$/', '', $s)
        . 'face';
}


2

Pyth, 36 34 ไบต์

++Jrz4*\yqJK:J"e?y$"k+" Mc"+K"face

ลองออนไลน์!

คำอธิบาย:

++Jrz4*\yqJK:J"(e)?y$"k+" Mc"+K"face

  Jrz4                                  Set J to the titlecase of z (input)
           K:J"e?y$"k                   Set K to (replace all matches of the regex e?y$ in J with k (empty string))
         qJ                             Compare if equal to J
      *\y                               Multiply by "y" (if True, aka if no matches, this gives "y", else it gives "")
 +                                      Concatenate (with J)
                             +K"face    Concatenate K with "face"
                       +" Mc"           Concatenate " Mc" with that
+                                       Concatenate

น่าเศร้าที่กรณีนี้ใช้ไม่ได้เนื่องจากกรณีทดสอบครั้งล่าสุดล้มเหลว
Zacharý

สลับเป็นrz3เพื่อrz4ให้สิ่งนี้ทำงานได้อย่างถูกต้องสำหรับกรณีทดสอบครั้งสุดท้าย
hakr14

โอ้โหฉันจะแก้ไขนั่น: P
RK

2

Elixir , 112 110 107 106 ไบต์

ตอนนี้สั้นเป็นจาวา

fn x->x=String.capitalize x;"#{x<>if x=~~r/y$/,do: "",else: "y"} Mc#{String.replace x,~r/e?y$/,""}face"end

ลองออนไลน์!

คำอธิบาย:

x=String.capitalize x

รับxพร้อมกับอักขระตัวแรกเป็นตัวพิมพ์ใหญ่และอื่น ๆ ทั้งหมดเป็นตัวพิมพ์เล็ก

#{ code }

ประเมินรหัสและแทรกลงในสตริง

#{x<>if x=~ ~r/y$/, do: "", else: "y"}

เชื่อมx เข้าด้วยกันyหากไม่ได้ลงท้ายด้วยy(เช่นไม่ตรงกับ regex y$)

#{String.replace x, ~r/e?y$/, "")}

ลบต่อท้ายและท้ายeyy



1

Pyth, 60 59 ไบต์SBCS

K"ey"Jrz4Iq>2JK=<2J=kK.?=k\yIqeJk=<1J))%." s÷   WZÞàQ"[JkJ

ชุดทดสอบ

พวกเขาไม่ได้แสดงที่นี่ แต่สามไบต์\x9c, \x82และ\x8cอยู่ในระหว่างสตริงบรรจุและs ÷มั่นใจได้ว่าลิงค์จะรวมไว้

Python 3 การแปล:
K="ey"
J=input().capitalize()
if J[-2:]==K:
    J=J[:-2]
    k=K
else:
    k="y"
    if J[-1]==k:
        J=J[:-1]
print("{}{} Mc{}face".format(J,k,J))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.