Facey McFaceface

47

Czy ktoś pamięta Boaty ?

Możesz całkowicie wypowiedzieć stare słowo, prawda?

  • Napisz funkcję, aby zamienić ciąg znaków w Somethingy McSomethingface.
  • Powinien przyjmować jeden ciąg jako dane wejściowe. Zignoruj ​​przypadek wejścia.
  • Jeśli słowo kończy się na „y”, twoja funkcja nie powinna dodawać dodatkowego „y” do pierwszej instancji, ale powinna usunąć ją w drugiej instancji.
  • Jeśli słowo kończy się na „ey”, nie powinno mieć dodatkowego „y” dodanego w pierwszej instancji, ale powinno usunąć oba w drugiej instancji.
  • Dane wyjściowe powinny zawierać tylko wielkie litery pierwszego znaku, „M” „Mc” i pierwszy znak po „Mc”.
  • musi działać tylko z ciągami 3 lub więcej znaków.

Przykłady:

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
źródło
Co ze spacjami w ciągu, czy pozostawiamy je nietknięte? Przykłady: ' y'i' '
dotknij mojego ciała
2
Zamierzam zaimplementować sugestię z @Arnauld i sprawić, by zawierała minimum trzy znaki. Traktuj białe znaki jak kolejną literę.
AJFaraday
Czy możemy założyć, że dane wejściowe będą zawierać tylko wielkie i małe litery?
Kevin Cruijssen
@KevinCruijssen Nie umieściłem żadnych liter innych niż przypadki testowe, więc nie są one tym zainteresowane.
AJFaraday

Odpowiedzi:

7

Stax , 26 bajtów

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

Uruchom i debuguj

^           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

Uruchom ten

rekurencyjny
źródło
15

V , 27 28 30 bajtów

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

Wypróbuj online!

<Esc> reprezentuje 0x1b

  • Grał w golfa dwa bajty po tym, jak dowiedziałem się, że nie musieliśmy obsługiwać danych wejściowych zawierających mniej niż 3 znaki.

  • 1 bajt zapisany dzięki @DJMcMayhem, pracując na drugiej linii przed pierwszą, usuwając w ten sposób G

Dane wejściowe znajdują się w buforze. Program zaczyna się od konwersji wszystkiego na małe litery

Vwybiera linię i uopuszcza ją małymi literami

~ przełącza wielkość liter pierwszego znaku (konwertując go na wielkie litery)

i Ùpowiela tę linię powyżej, pozostawiając kursor w dolnej linii

ói zastępuje e¿y$skompresowaną formę e\?y$(opcjonalną ei yna końcu linii), nic (dzieje się w drugiej linii)

H idzie do pierwszej linii

ózastępuje y$( yna końcu wiersza) niczym w pierwszym wierszu

Ádołącza a yna końcu pierwszego wiersza

J i łączy ostatnią linię z pierwszą ze spacją na środku, a kursor jest przenoszony na to miejsce

adołącza Mc( <Esc>wraca do trybu normalnego)

Ana końcu dołącza facena końcu wiersza

Kritixi Lithos
źródło
27 bajtów: Wypróbuj online!
DJMcMayhem
13

Python, 144 bajty

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

Wypróbuj online tutaj

dotykać mojego ciała
źródło
2
moja pierwsza próba golfa kodem ...
dotknij mojego ciała
3
Witamy w PPCG! czy mogę zasugerować dodanie linku do wypróbowania online! do weryfikacji poprawności?
Giuseppe
1
f("Face")nie jest zgodny z obecnymi przypadkami testowymi ( TIO ).
Jonathan Frech
Edytowany post pod kątem poprawności, dodał także Try It Online! link
dotknij mojego ciała
1
97 bajtów.
całkowicie ludzki
12

Excel, 204 144 137 165 bajtów

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

Od wewnątrz na zewnątrz:

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

Stara odpowiedź, tworząc wszystkie bity osobno, a następnie łącząc (176 bajtów). Nie obsługuje poprawnie rozdzielanych spacjami przypadków.

=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
źródło
Niestety, z powodu wymogu obsługi spraw rozdzielonych spacjami, PROPER(A1)jest nieważny (patrz DJ Grand Master Flashprzypadek wejściowy), najlepszym zamiennikiem, jaki mogłem znaleźć podczas pracy nad moim rozwiązaniem VBA było LEFT(UPPER(A1))&MID(LOWER(A1),2,LEN(A1))- proszę dać mi znać, jeśli skończysz grać w golfa.
Taylor Scott
1
Dziękuję @TaylorScott. Znaleziono „REPLACE (LOWER (A1), 1,1, UPPER (LEFT (A1)))”, który jest o 2 bajty krótszy.
Wernisch
9

C # (.NET Core) , 122 108 139 175 180 179 154 bajtów

Wielkie dzięki, 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("$","");

Wypróbuj online!

C # (.NET Core, z LINQ), 152 bajty

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

Wypróbuj online!

Anderson Pimentel
źródło
3
Witamy na stronie! :)
DJMcMayhem
7

Rubin , 61 49 bajtów

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

Wypróbuj online!

Zaoszczędź 12 słodkich bajtów dzięki @MartinEnder:

iamnotmaynard
źródło
1
Użycie wyrażenia regularnego z mojej odpowiedzi Retina i nieco większe wykorzystanie interpolacji ciągów sprowadza to do 49: tio.run/##DcxBCsIwEEDRqwxJBF3Y4lpSN0U3igcQwTQmGFptMVNkTOLVY3bvb/…
Martin Ender
@MartinEnder Wow, to całkiem spora różnica. Nie sądzę, że widziałem interpolację łańcuchów bez nawiasów. Wezmę to, jeśli nie chcesz użyć go do własnej odpowiedzi Ruby.
iamnotmaynard
Nie, w porządku, nie wymyśliłbym użycia =~i zbudowania całego łańcucha zamiast użycia sub. Interpolacji łańcuchów można używać bez nawiasów, jeśli zmienna jest zmienną globalną, instancją lub klasą.
Martin Ender
Możesz to zmniejszyć do 44 + 1 bajtów, używając -pflagi i używając sub: tio.run/…
Jordan
7

Python 3 , 80 bajtów

Dawno zapalony czytelnik, w końcu moje pierwsze zgłoszenie!

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

Wypróbuj online

eten
źródło
1
Witamy w PPCG i bardzo fajny pierwszy post!
Zacharý
5

Python 2 , 88 92 bajtów

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

Wypróbuj online!

Chas Brown
źródło
3
Nie działa z „FamilY”
Dead Possum
@Dead Possum: Naprawiono. Dzięki!
Chas Brown
5

Java 8, 121 112 107 106 bajtów

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

-1 bajt dzięki @ OliverGrégoire .

Wyjaśnienie:

Wypróbuj 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
źródło
Co jeśli pierwszy znak nie jest alfabetyczny? A może dodamy do tego regułę…
streetster
1
@streetster Właśnie zapytałem OP, i wydaje się, że dane wejściowe będą zawierać tylko wielkie i / lub małe litery.
Kevin Cruijssen
1
~32-> 95za 1 bajt zapisany
Olivier Grégoire
@ OlivierGrégoire Naprawdę muszę nauczyć się nieco więcej o operacjach bitowych ..>.>
Kevin Cruijssen
4

JavaScript, 103 96 94 bajty

Dość naiwne pierwsze podanie.

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

Wypróbuj online

Kudłaty
źródło
s =>${s=s[0].toUpperCase()+s.slice(1).toLowerCase().replace(/y$/,``)}y Mc${s.replace(/e?y$/,``)}face
Benjamin Gruenbaum
Jeden mniej: s =>${s=s[0].toUpperCase()+s.slice(1).toLowerCase().replace(/y$/,'')}y Mc${s.replace(/e$/,``)}face
Benjamin Gruenbaum
Dzięki, @BenjaminGruenbaum, ale pierwszy kończy się niepowodzeniem, Donkeya drugi za Face.
Shaggy
Obniżka
Benjamin
@Shaggy udało mi się zmniejszyć funkcję g o kilka znaków :). możecie zajrzeć w moje rozwiązanie
DanielIndie
3

vim, 35 34 bajtów

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

<ESC> jest 0x1b

Bez golfa

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

Wypróbuj online!

Zaoszczędzono 1 bajt dzięki DJMcMayhem

Promień
źródło
1
Możesz zrobić Yzamiastyy
DJMcMayhem
3

Perl 5 -p , 47 39 bajtów

Zapisałem 6 bajtów z sugestiami @ OlegV.Volkov, 1 z @ mwellnhof i 1 samodzielnie

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

Wypróbuj online!

Xcali
źródło
Możesz pozbyć się ucfirst:$_=lc^$";
Oleg V. Volkov
$_=s/y$//r."y Mc".s/e?y$//r.facejest o jeden bajt krótszy.
nwellnhof
1
/y$|$/->/y?$/
Oleg V. Volkov
Duh. Powinienem był to zrozumieć.
Xcali
3

C ++ 14 (g ++), 181 171 148 147 134 bajtów

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

Zauważ, że clang tego nie skompiluje.

Podziękowania dla Kevina Cruijssena i Oliviera Grégoire za tę &95sztuczkę.

Dzięki Chrisowi za grę w golfa 11 bajtów.

Wypróbuj online tutaj .

Wersja bez golfa:

[] (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";
}
OOBalance
źródło
Nie znam tak dobrze C ++, ale możesz zagrać w golfa 9 bajtów: Wypróbuj online 172 bajty. Podsumowanie zmian: s[0]=s[0]&~32;na s[0]&=~32;; s[i++]=s[i]|32;do s[i++]|=32; a int i=1,n=s.length()-1,b;więc trzeba tylko 1 int.
Kevin Cruijssen
I jeszcze jeden bajt, usuwając spację w#include<string>
Kevin Cruijssen
@KevinCruijssen dzięki za złapanie tego! Edytowałem.
OOBalance
Możesz zapisać 11 bajtów, nie definiując ni po prostu używając wartości ipo pętli while. Wypróbuj online!
Chris
@Chris Thanks! Udało mi się ogolić jeszcze 2 bajty.
OOBalance
2

V , 38 36 32 bajtów

-5 bajtów dzięki kwakowi @Cows

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

<esc>to dosłowny znak ucieczki i [^jest zakodowany jako\x84

Wypróbuj online!

Herman L.
źródło
gu$może zostaćVu
Kritixi Lithos
2
Ponieważ [^jest to skrót wyrażenia regularnego (patrz tutaj ), możesz użyć 0x84 zamiast [^zapisać bajt. Podobnie \?można uprościć, <M-?>aby zapisać kolejny bajt. I $a=>A
Kritixi Lithos
2

Python 3 , 117 114 bajtów

-3 bajty dzięki 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'

Wypróbuj online!

Dat
źródło
Trzeci element listy [s,s[:-1],'',s[:-2]można zmienić, 0aby zapisać 1 bajt.
Dead Possum
W 'y'*1 *1nie jest potrzebne. Jeszcze 2 bajty
Dead Possum
Przejście z Python 3 na Python 2 i zastąpienie returngo printjest o 1 bajt krótsze.
Kevin Cruijssen
2

JavaScript (Node.js) , 87 bajtów

  • dzięki @Shaggy za 5 redukcji 5 bajtów
s=>(g=r=>Buffer(s.replace(r,"")).map((x,i)=>i?x|32:x&~32))(/y$/)+`y Mc${g(/e?y$/)}face`

Wypróbuj online!

DanielIndie
źródło
2
Nie musisz nazywać funkcji nierekurencyjnych.
Dennis
1
Ładnie wykonane. Nigdy nie myślę o użyciu Buffer, będę musiał spróbować zapamiętać to na przyszłe wyzwania. Sprowadziłem dla Ciebie do 87 bajtów .
Shaggy
2

K4 , 74 69 68 bajtów

Rozwiązanie:

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

Przykłady:

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"

Wyjaśnienie:

Sprawdź, czy ostatnie znaki są równe "ey", przekonwertuj wynik na base-2, abyśmy mogli zignorować słowa, które się kończą "e?". Indeksuj do listy liczb znaków do przycięcia.

Udało mi się zgolić 5 bajtów mojego kodu, aby ustalić, czy dwa ostatnie znaki, "ey"ale starają się go poprawić ...

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

Premia:

67 bajtowy port w K (oK) :

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

Wypróbuj online!

streetster
źródło
1
Jaki jest sens K4, jeśli Twój port ok pokonuje go?
Zacharý
Nie sądziłem, że tak się stanie, a port nie działa, jeśli pierwszy znak nie jest alfabetyczny, ponieważ ślepo odejmuję 32 od wartości ASCII - nie ma wbudowanego „górnego”.
streetster
2

Rubinowy , 69 bajtów

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

Wyjaśnienie:

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

Wypróbuj online!

dkudriavtsev
źródło
Czy możesz dodać link do TIO? Nie znam Ruby, ale czy s.capitalizezastępuje poprzednie s? Jeśli nie, to czy /e?y$/uchwyt przypadek testowy kończy się Y, EYczy Eysłusznie?
Kevin Cruijssen
1
@KevinCruijssen s.capitalizevs s.capitalize!(różne funkcje). s.capitalize!usuwa starą wersję.
dkudriavtsev
@KevinCruijssen Dodałem link do TIO.
dkudriavtsev
@KevinCruijssen Dodano również wyjaśnienie
dkudriavtsev
Ach, ok, dzięki za wyjaśnienie i informacje o s.capitalize!. Nigdy nie programowane w Rubim, ale dodanie znaku objaśnienia w celu zastąpienia poprzedniej wartości jest całkiem fajne. +1 ode mnie
Kevin Cruijssen
2

Jstx , 27 bajtów

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

Wyjaśnienie

      # 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

Wypróbuj online!

Quantum64
źródło
Nie widziałem tego języka wcześniej. To wygląda interesująco. Czy jest dokumentacja?
rekurencyjny
1
@recursive Oto dokumentacja.
Quantum64
Wow, to naprawdę imponujące. Zwłaszcza na tak krótki czas programowania. Jestem podekscytowany, aby zobaczyć, gdzie to idzie.
rekurencyjne
2

Czerwony , 143 142 bajtów

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

Wypróbuj online!

Nie golfowany:

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 Iwanow
źródło
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';}

Wyjaśnienie:

<?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
źródło
2

Galaretka , 77 75 74 73 bajtów

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

Wypróbuj online!

Wszelkie sugestie dotyczące gry w golfa są mile widziane (i potrzebne)!

Zacharý
źródło
2

Pyth 36 34 bajty

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

Wypróbuj online!

Wyjaśnienie:

++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.
źródło
Niestety to nie działa, ponieważ ostatni przypadek testowy kończy się niepowodzeniem.
Zacharý
Przełącz rz3na, rz4aby działało poprawnie dla ostatniego przypadku testowego.
hakr14
Ojej, naprawię to: P
RK.
2

Eliksir , 112 110 107 106 bajtów

teraz tak krótki jak java

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

Wypróbuj online!

Wyjaśnienie:

x=String.capitalize x

Pobiera xpierwszy znak wielkimi literami, a wszystkie pozostałe małe litery.

#{ code }

Oceń kod i wstaw go do ciągu.

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

Łączy x z, yjeśli się nie kończy y(tzn. Nie pasuje do wyrażenia regularnego y$).

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

Usuwa końcowe eyi końcowe y.

Okx
źródło
1

PHP , 45 46 bajtów

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

Wypróbuj online!

Berry M.
źródło
Nie działa na dwa różne sposoby z wejściem boAty. (Niewłaściwe czapki, „y” nie został usunięty)
Oleg V. Volkov
1

Pyth, 60 59 bajtów SBCS

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

Zestaw testowy

Nie tutaj wyświetlane, ale trzy bajty \x9c, \x82i \x8csą w zapakowanym łańcucha pomiędzy si ÷. Zapewniamy, że link je zawiera.

Tłumaczenie 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
źródło