Wajah McFaceface

47

Adakah yang ingat Boaty ?

Anda benar-benar bisa membuat kata lama, bukan?

  • Tulis fungsi untuk mengubah string menjadi Sesuatu McSomethingface.
  • Ini harus menerima satu string sebagai input. Abaikan kasus input.
  • Jika kata berakhir dengan 'y', fungsi Anda seharusnya tidak menambahkan 'y' tambahan ke instance pertama, tetapi harus menghapusnya dalam instance kedua.
  • Jika kata berakhir dengan 'ey', seharusnya tidak ada tambahan 'y' yang ditambahkan pada instance pertama, tetapi harus menghapus keduanya pada instance kedua.
  • Output seharusnya hanya memiliki huruf besar dalam karakter pertama, 'M' dari 'Mc' dan karakter pertama setelah 'Mc'.
  • hanya perlu bekerja dengan string 3 karakter atau lebih.

Contoh:

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
AJFaraday
sumber
Bagaimana dengan spasi dalam string, apakah kita membiarkannya tetap utuh? Contoh: ' y'dan' '
sentuh tubuh saya
2
Saya akan menerapkan saran dari @Arnauld dan membuatnya minimum tiga karakter. Perlakukan spasi putih seperti surat lain.
AJFaraday
Bisakah kita berasumsi bahwa input hanya akan berisi huruf besar dan kecil?
Kevin Cruijssen
@KevinCruijssen Saya belum memasukkan non-huruf dalam kasus uji, jadi mereka secara efektif tidak peduli.
AJFaraday

Jawaban:

7

Stax , 26 byte

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

Jalankan dan debug itu

^           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

Jalankan yang ini

rekursif
sumber
15

V , 27 28 30 byte

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

Cobalah online!

<Esc> mewakili 0x1b

  • Golf dua byte setelah mengetahui bahwa kami tidak perlu mendukung input dengan kurang dari 3 karakter.

  • 1 byte disimpan berkat @DJMcMayhem dengan bekerja pada baris kedua sebelum yang pertama, sehingga menghapus G

Input ada di buffer. Program dimulai dengan mengubah segalanya menjadi huruf kecil

Vmenyeleksi garis dan ulowercases itu

~ matikan huruf besar karakter pertama (mengubahnya menjadi huruf besar)

dan Ùmenduplikasi baris ini di atas, meninggalkan kursor di baris bawah

ódan mengganti e¿y$, bentuk terkompresi e\?y$(opsional edan a ydi akhir baris), tanpa apa-apa (terjadi pada baris kedua)

H pergi ke baris pertama

ómengganti y$( ypada akhir baris) dengan tidak ada pada baris pertama

Ámenambahkan a yke akhir baris pertama

J dan bergabung dengan baris terakhir dengan yang pertama dengan spasi di tengah, dan kursor dipindahkan ke ruang ini

amenambahkan Mc( <Esc>kembali ke mode normal)

Aakhirnya, ditambahkan facedi akhir baris

Kritixi Lithos
sumber
27 byte: Cobalah online!
DJMcMayhem
13

Python, 144 byte

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

Cobalah online di sini

sentuh tubuhku
sumber
2
upaya kode golf pertama saya ...
sentuh tubuh saya
3
selamat datang di PPCG! mungkin saya sarankan menambahkan tautan ke Coba Online! untuk verifikasi kebenaran?
Giuseppe
1
f("Face")tidak mematuhi kasus uji saat ini ( TIO ).
Jonathan Frech
Posting yang diedit untuk kebenaran, juga menambahkan Try It Online! tautan
sentuh tubuh saya
1
97 byte.
totallyhuman
12

Excel, 204 144 137 165 byte

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

Dari dalam ke luar:

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

Jawaban lama, membuat semua bit secara terpisah, dan kemudian menggabungkan (176 byte). Tidak menangani kasus dengan pembatas ruang dengan benar.

=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"
Wernisch
sumber
Sayangnya, karena persyaratan untuk menangani kasus-kasus yang dibatasi ruang, PROPER(A1)tidak valid (lihat DJ Grand Master Flashkasus input), pengganti terbaik yang dapat saya temukan saat mengerjakan solusi VBA saya adalah LEFT(UPPER(A1))&MID(LOWER(A1),2,LEN(A1))- tolong beri tahu saya jika Anda akhirnya bermain golf di bawah.
Taylor Scott
1
@TaylorScott terima kasih. Ditemukan 'REPLACE (LOWER (A1), 1,1, UPPER (LEFT (A1))) `yang lebih pendek 2 byte.
Wernisch
9

C # (.NET Core) , 122 108 139 175 180 179 154 byte

Terima kasih banyak, lee!

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

Cobalah online!

C # (.NET Core, dengan LINQ), 152 byte

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

Cobalah online!

Anderson Pimentel
sumber
3
Selamat datang di situs ini! :)
DJMcMayhem
7

Ruby , 61 49 byte

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

Cobalah online!

Menyimpan 12 byte manis berkat @MartinEnder:

iamnotmaynard
sumber
1
Menggunakan regex dari jawaban Retina saya dan membuat sedikit lebih banyak penggunaan interpolasi string menjadi 49: tio.run/##DcxBCsIwEEDRqwxJBF3Y4lpSN0U3igcQwTQmGFptMVNkTOLVY3bvb/…
Martin Ender
@ MartinEnder Wow, itu sangat berbeda. Saya tidak berpikir saya telah melihat interpolasi string tanpa tanda kurung. Saya akan menerimanya jika Anda tidak ingin menggunakannya untuk jawaban Ruby Anda sendiri.
iamnotmaynard
Nah, tidak apa-apa, saya tidak akan datang dengan menggunakan =~dan membangun seluruh string daripada menggunakan sub. Interpolasi string dapat digunakan tanpa tanda kurung jika variabelnya adalah variabel global, instance atau kelas.
Martin Ender
Anda bisa mendapatkan ini hingga 44 +1 byte dengan menggunakan -pbendera dan menggunakan sub: tio.run/...
Jordan
7

Python 3 , 80 byte

Pembaca yang sudah lama sekali, kiriman pertama saya akhirnya!

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

Cobalah online

etene
sumber
1
Selamat datang di PPCG, dan posting pertama yang sangat bagus!
Zacharý
6

Retina , 29 byte

.+
$T
0`(e)?y$|$
$1y Mc$`face

Cobalah online!

Martin Ender
sumber
5

Python 2 , 88 92 byte

lambda s:(s+'y'*-~-(s[-1]in'yY')).title()+' Mc'+re.sub('e?y$','',s.title())+'face'
import re

Cobalah online!

Chas Brown
sumber
3
Gagal dengan 'FamilY'
Dead Possum
@Dead Possum: Diperbaiki. Terima kasih!
Chas Brown
5

Java 8, 121 112 107 106 byte

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

-1 byte terima kasih kepada @ OliverGrégoire .

Penjelasan:

Cobalah online.

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"
Kevin Cruijssen
sumber
Bagaimana jika char pertama tidak sesuai abjad? Atau mungkin kita bisa mendapatkan aturan tambahan tentang hal itu ..
streetster
1
@streetster Baru saja bertanya OP, dan sepertinya input hanya akan berisi huruf besar dan / atau huruf kecil.
Kevin Cruijssen
1
~32-> 95untuk 1 byte disimpan
Olivier Grégoire
@ OlivierGrégoire Saya benar-benar harus mulai belajar lebih banyak tentang operasi bitwise ..>.>
Kevin Cruijssen
4

JavaScript, 103 96 94 byte

Pass pertama yang cukup naif saat ini.

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

Cobalah online

Shaggy
sumber
s =>${s=s[0].toUpperCase()+s.slice(1).toLowerCase().replace(/y$/,``)}y Mc${s.replace(/e?y$/,``)}face
Benjamin Gruenbaum
Satu kurang: s =>${s=s[0].toUpperCase()+s.slice(1).toLowerCase().replace(/y$/,'')}y Mc${s.replace(/e$/,``)}face
Benjamin Gruenbaum
Terima kasih, @BenjaminGruenbaum, tapi yang pertama gagal Donkeydan yang kedua gagal Face.
Shaggy
Penurunan harga merusak kode: gist.github.com/benjamingr/8fec077b5436846cc9c52be353238037
Benjamin Gruenbaum
@ Shaggy saya berhasil mengurangi fungsi g dengan beberapa karakter :). Anda dapat melihat dalam solusi saya
DanielIndie
3

vim, 35 34 byte

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

<ESC> aku s 0x1b

Tidak disatukan

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

Cobalah online!

Disimpan 1 byte berkat DJMcMayhem

sinar
sumber
1
Anda bisa melakukannya Ydaripadayy
DJMcMayhem
3

Perl 5 -p , 47 39 byte

Disimpan 6 byte dengan saran @ OlegV.Volkov, 1 dengan @ mwellnhof's, dan 1 pada saya sendiri

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

Cobalah online!

Xcali
sumber
Anda dapat menyingkirkan ucfirst:$_=lc^$";
Oleg V. Volkov
$_=s/y$//r."y Mc".s/e?y$//r.facelebih pendek satu byte.
nwellnhof
1
/y$|$/->/y?$/
Oleg V. Volkov
Duh. Aku seharusnya menyadari itu.
Xcali
3

C ++ 14 (g ++), 181 171 148 147 134 byte

[](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";}

Perhatikan bahwa dentang tidak akan mengkompilasi ini.

Penghargaan untuk Kevin Cruijssen dan Olivier Grégoire untuk &95trik ini.

Terima kasih kepada Chris untuk bermain golf 11 byte.

Cobalah online di sini .

Versi tidak disatukan:

[] (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";
}
Ketidakseimbangan
sumber
Saya tidak tahu C ++ dengan baik, tetapi Anda bisa bermain golf 9 byte: Cobalah secara online 172 byte. Ringkasan perubahan: s[0]=s[0]&~32;ke s[0]&=~32;; s[i++]=s[i]|32;untuk s[i++]|=32; dan int i=1,n=s.length()-1,b;sehingga Anda hanya perlu 1 int.
Kevin Cruijssen
Oh, dan satu byte lagi dengan menghapus spasi di#include<string>
Kevin Cruijssen
@KevinCruijssen terima kasih sudah menangkapnya! Saya telah mengedit.
OOBalance
Anda dapat menyimpan 11 byte dengan tidak mendefinisikan ndan hanya menggunakan nilai isetelah loop sementara. Cobalah online!
Chris
@ Chris, terima kasih! Saya berhasil mencukur 2 byte lagi.
OOBalance
2

V , 38 36 32 byte

-5 byte terima kasih kepada @Cows dukun

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

<esc>adalah karakter pelarian literal dan [^dikodekan sebagai\x84

Cobalah online!

Herman L.
sumber
gu$bisa menjadiVu
Kritixi Lithos
2
Karena [^ini adalah jalan pintas regex (lihat di sini ), Anda dapat menggunakan 0x84 alih-alih [^menyimpan byte. Demikian pula, \?dapat disederhanakan menjadi <M-?>untuk menyimpan byte lain. Dan $a=>A
Kritixi Lithos
2

Python 3 , 117 114 byte

-3 byte berkat 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'

Cobalah online!

Dat
sumber
Elemen ke-3 daftar [s,s[:-1],'',s[:-2]dapat diubah 0untuk menghemat 1 byte.
Dead Possum
Dalam 'y'*1 *1tidak diperlukan. 2 byte lagi
Dead Possum
Beralih dari Python 3 ke Python 2, dan mengganti returndengan print1 byte lebih pendek.
Kevin Cruijssen
2

JavaScript (Node.js) , 87 byte

  • terima kasih kepada @Shaggy untuk 5 mengurangi 5 byte
s=>(g=r=>Buffer(s.replace(r,"")).map((x,i)=>i?x|32:x&~32))(/y$/)+`y Mc${g(/e?y$/)}face`

Cobalah online!

DanielIndie
sumber
2
Anda tidak harus menyebutkan fungsi yang tidak rekursif.
Dennis
1
Bagus sekali. Saya tidak pernah berpikir untuk menggunakan Buffer, harus mencoba mengingatnya untuk tantangan di masa depan. Dapatkan hingga 87 byte untuk Anda.
Shaggy
2

K4 , 74 69 68 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Cari tahu apakah karakter terakhir sama dengan "ey", konversi hasil ke basis-2 sehingga kita dapat mengabaikan kata-kata yang berakhir "e?". Indeks ke dalam daftar jumlah karakter yang akan dipotong.

Berhasil mencukur 5 byte dari kode saya untuk menentukan apakah dua karakter terakhir "ey"tetapi berjuang untuk lebih baik ...

{$[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)

Bonus:

67 byte port dalam K (oK) :

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

Cobalah online!

streetster
sumber
1
Apa gunanya K4 jika port oK Anda mengalahkannya?
Zacharý
Saya tidak berpikir itu akan, dan port tidak berfungsi jika karakter pertama tidak sesuai abjad karena saya secara acak mengurangi 32 dari nilai ASCII - tidak ada built-in "atas".
streetster
2

Ruby , 69 byte

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

Penjelasan:

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

Cobalah online!

dkudriavtsev
sumber
Bisakah Anda menambahkan tautan TIO? Saya tidak tahu Ruby, tetapi apakah s.capitalizemenggantikan yang sebelumnya s? Jika tidak, tidak /e?y$/menangani kasus uji berakhir di Y, EY, atau Eybenar?
Kevin Cruijssen
1
@KevinCruijssen s.capitalizevs s.capitalize!(fungsi yang berbeda). s.capitalize!clobbers versi lama.
dkudriavtsev
@KevinCruijssen Saya telah menambahkan tautan TIO.
dkudriavtsev
@KevinCruijssen Juga menambahkan penjelasan
dkudriavtsev
Ah ok, terima kasih atas penjelasan dan informasinya s.capitalize!. Tidak pernah diprogram di Ruby, tetapi menambahkan tanda penjelasan untuk mengganti nilai sebelumnya cukup keren. +1 dari saya.
Kevin Cruijssen
2

Jstx , 27 byte

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

Penjelasan

      # 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

Cobalah online!

Quantum64
sumber
Saya belum pernah melihat bahasa ini sebelumnya. Itu terlihat menarik. Apakah ada dokumentasi?
rekursif
1
@recursive Berikut ini beberapa dokumentasi.
Quantum64
Wow, ini sangat mengesankan. Terutama untuk waktu pengembangan yang begitu sedikit. Saya senang melihat di mana ini pergi.
rekursif
2

Merah , 143 142 byte

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"]]

Cobalah online!

Tidak Disatukan:

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"
    ]
]
Galen Ivanov
sumber
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';}

Penjelasan:

<?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';
}
Chris Forrence
sumber
2

Jelly , 77 75 74 73 byte

2ḶNṫ@€⁼"“y“ey”S
ØA;"ØaF
¢y⁸µ¢Uyµ1¦
Çṫ0n”yẋ@”y;@Ç;“ Mc”
⁸JU>ÑTị3Ŀ;@Ç;“face

Cobalah online!

Semua saran bermain golf disambut (dan diinginkan)!

Zacharý
sumber
2

Pyth, 36 34 byte

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

Cobalah online!

Penjelasan:

++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
RK.
sumber
Sayangnya ini tidak berhasil, karena test case terakhir gagal.
Zacharý
Beralih rz3ke rz4agar ini berfungsi dengan benar untuk kasus uji terakhir.
hakr14
Aduh, aku akan memperbaikinya: P
RK.
2

Elixir , 112 110 107 106 byte

sekarang sependek java

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

Cobalah online!

Penjelasan:

x=String.capitalize x

Mendapat xkarakter pertama dalam huruf besar dan semua lainnya huruf kecil.

#{ code }

Evaluasi kode dan masukkan ke dalam string.

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

Gabungan x dengan yjika tidak diakhiri dengan y(yaitu tidak cocok dengan regex y$).

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

Menghapus trailing eydan trailing y.

Okx
sumber
1

PHP , 45 46 byte

<?=($s=ucfirst(fgets(STDIN)))."y Mc{$s}face";

Cobalah online!

Berry M.
sumber
Gagal dalam dua cara berbeda dengan input boAty. (Topi salah, 'y' tidak dilepas).
Oleg V. Volkov
1

Pyth, 60 59 byte SBCS

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

Suite uji

Mereka tidak menampilkan di sini, tapi tiga byte, \x9c, \x82, dan \x8cberada di string dikemas antara sdan ÷. Yakinlah, tautannya termasuk mereka.

Terjemahan 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))
hakr14
sumber