Facey McFaceface


47

¿Alguien recuerda a Boaty ?

Podrías hacer cualquier vieja palabra, ¿verdad?

  • Escribe una función para convertir una cadena en Somethingy McSomethingface.
  • Debe aceptar una cadena como entrada. Ignora el caso de la entrada.
  • Si la palabra termina en 'y', su función no debería agregar una 'y' adicional a la primera instancia, sino que debería eliminarla en la segunda instancia.
  • Si la palabra termina en 'ey', no debería tener una 'y' adicional agregada en la primera instancia, pero debería eliminar ambas en la segunda instancia.
  • La salida solo debe tener letras mayúsculas en el primer carácter, la 'M' de 'Mc' y el primer carácter después de 'Mc'.
  • solo necesita trabajar con cadenas de 3 o más caracteres.

Ejemplos:

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

¿Qué pasa con los espacios en la cadena, los dejamos intactos? Ejemplos: ' y'y' '
tocar mi cuerpo

2
Implementaré una sugerencia de @Arnauld y haré un mínimo de tres caracteres. Trate los espacios en blanco como otra letra.
AJFaraday


¿Podemos suponer que la entrada solo contendrá letras mayúsculas y minúsculas?
Kevin Cruijssen

@KevinCruijssen No he puesto ninguna letra en los casos de prueba, por lo que efectivamente no están preocupados.
AJFaraday

Respuestas:


7

Stax , 26 bytes

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

Ejecutar y depurarlo

^           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

Ejecute este


15

V , 27 28 30 bytes

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

Pruébalo en línea!

<Esc> representa 0x1b

  • Golfé dos bytes después de saber que no necesitábamos admitir entradas con menos de 3 caracteres.

  • 1 byte guardado gracias a @DJMcMayhem al trabajar en la segunda línea antes de la primera, eliminando así el G

La entrada está en el búfer. El programa comienza convirtiendo todo a minúsculas

Vselecciona la línea y la upone en minúscula

~ alterna el caso del primer caracter (convirtiéndolo a mayúsculas)

y Ùduplica esta línea arriba, dejando el cursor en la línea inferior

óy reemplaza e¿y$, forma comprimida de e\?y$(opcional ey ya al final de la línea), con nada (sucede en la segunda línea)

H va a la primera línea

óreemplaza y$( yal final de la línea) con nada en la primera línea

Áagrega ya al final de la primera línea

J y une la última línea con la primera con un espacio en el medio, y el cursor se mueve a este espacio

aagrega Mc( <Esc>vuelve al modo normal)

Afinalmente, se agrega faceal final de la línea



13

Python, 144 bytes

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

Pruébalo en línea aquí


2
mi primer intento de código de golf ...
toca mi cuerpo

3
bienvenido a PPCG! ¿Puedo sugerir agregar un enlace para probarlo en línea! para la verificación de la corrección?
Giuseppe

1
f("Face")no cumple con los casos de prueba actuales ( TIO ).
Jonathan Frech

Publicación editada para la corrección, también agregó un ¡Pruébelo en línea! enlace
toca mi cuerpo


12

Excel, 204 144 137 165 bytes

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

Desde adentro hacia afuera:

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

Respuesta anterior, creando todos los bits por separado y luego concatenando (176 bytes). No maneja casos delimitados por espacios correctamente.

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

Desafortunadamente, debido al requisito de manejar casos delimitados por espacios, PROPER(A1)no es válido (vea el DJ Grand Master Flashcaso de entrada), el mejor reemplazo que pude encontrar mientras trabajaba en mi solución VBA fue LEFT(UPPER(A1))&MID(LOWER(A1),2,LEN(A1)): avíseme si termina jugando golf.
Taylor Scott

1
Gracias @TaylorScott. Se encontró 'REPLACE (LOWER (A1), 1,1, UPPER (LEFT (A1)))' que es 2 bytes más corto.
Wernisch


9

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

Muchas gracias 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("$","");

Pruébalo en línea!

C # (.NET Core, con LINQ), 152 bytes

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

Pruébalo en línea!


3
Bienvenido al sitio! :)
DJMcMayhem


7

Ruby , 61 49 bytes

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

Pruébalo en línea!

Guardado 12 bytes dulces gracias a @MartinEnder:


1
Al usar la expresión regular de mi respuesta de Retina y hacer un poco más de uso de la interpolación de cadenas, esto se reduce a 49: tio.run/##DcxBCsIwEEDRqwxJBF3Y4lpSN0U3igcQwTQmGFptMVNkTOLVY3bvb/…
Martin Ender

@ MartinEnder Wow, eso es una gran diferencia. No creo haber visto interpolación de cadenas sin corchetes. Lo tomaré si no quieres usarlo para tu propia respuesta de Ruby.
Restablece a Monica iamnotmaynard el

No, está bien, no se me habría ocurrido usar =~y construir toda la cadena en lugar de usar sub. La interpolación de cadenas se puede usar sin corchetes si la variable es una variable global, de instancia o de clase.
Martin Ender

Puede reducir esto a 44 + 1 bytes usando la -pbandera y usando sub: tio.run/…
Jordan

7

Python 3 , 80 bytes

Ávido lector desde hace mucho tiempo, ¡mi primera presentación por fin!

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

Pruébalo en línea


1
¡Bienvenido a PPCG, y muy buena primera publicación!
Zacharý



5

Java 8, 121 112 107 106 bytes

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

-1 byte gracias a @ OliverGrégoire .

Explicación:

Pruébalo en línea.

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"

¿Qué pasa si el primer carácter no es alfabético? O tal vez podamos agregar una regla sobre eso ...
streetster

1
@streetster Acabo de preguntar OP, y parece que la entrada solo contendrá letras mayúsculas y / o minúsculas.
Kevin Cruijssen

1
~32-> 95por 1 byte guardado
Olivier Grégoire

@ OlivierGrégoire Realmente necesito comenzar a aprender un poco más sobre las operaciones bit a bit ..>.>
Kevin Cruijssen

4

JavaScript, 103 96 94 bytes

Primer paso bastante ingenuo en esto.

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

Pruébalo en línea


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

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

Gracias, @BenjaminGruenbaum, pero el primero falla Donkeyy el segundo Face.
Shaggy


@ Shaggy logré reducir la función g en algunos caracteres :). puedes mirar en mi solución
DanielIndie

3

vim, 35 34 bytes

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

<ESC> es 0x1b

Sin golf

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

Pruébalo en línea!

Guardado 1 byte gracias a DJMcMayhem


1
Puedes hacerlo en Ylugar deyy
DJMcMayhem


3

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

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

Tenga en cuenta que clang no compilará esto.

El crédito es para Kevin Cruijssen y Olivier Grégoire por el &95truco.

Gracias a Chris por jugar al golf 11 bytes.

Pruébelo en línea aquí .

Versión sin golf:

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

No conozco bien C ++, pero puedes jugar 9 bytes: Pruébalo en línea 172 bytes. Resumen de cambios: s[0]=s[0]&~32;a s[0]&=~32;; s[i++]=s[i]|32;a s[i++]|=32; y int i=1,n=s.length()-1,b;lo que sólo necesita 1 int.
Kevin Cruijssen

Ah, y un byte más al eliminar el espacio en#include<string>
Kevin Cruijssen

@KevinCruijssen gracias por atrapar eso! He editado
OOBalance

Puede guardar 11 bytes no definiendo ny simplemente usando el valor idespués del ciclo while. Pruébalo en línea!
Chris

@ Chris Gracias! Logré eliminar 2 bytes más.
OOBalance

2

V , 38 36 32 bytes

-5 bytes gracias a @Cows quack

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

<esc>es un carácter de escape literal y [^está codificado como\x84

Pruébalo en línea!


gu$puede convertirseVu
Kritixi Lithos

2
Dado que [^es un acceso directo regex (ver aquí ), puede usar 0x84 en lugar de [^guardar un byte. Del mismo modo, \?se puede simplificar <M-?>para guardar otro byte. Y $a=>A
Kritixi Lithos


2

Python 3 , 117114 bytes

-3 bytes gracias a 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'

Pruébalo en línea!


El tercer elemento de la lista [s,s[:-1],'',s[:-2]se puede cambiar a 0para guardar 1 byte.
Dead Possum

En 'y'*1 *1no es necesario. 2 bytes más
Dead Possum

El cambio de Python 3 a Python 2, y sustituyendo returncon printes 1 byte más corto.
Kevin Cruijssen


2

K4 , 74 69 68 bytes

Solución:

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

Ejemplos:

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"

Explicación:

Averigua si los últimos caracteres son iguales "ey", convierte el resultado a base-2 para que podamos ignorar las palabras que terminan "e?". Indice en una lista de números de caracteres para recortar.

Logré eliminar 5 bytes de mi código para determinar si los dos últimos caracteres, "ey"pero luchan por mejorarlo ...

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

Prima:

Puerto de 67 bytes en K (oK) :

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

Pruébalo en línea!


1
¿Cuál es el punto en el K4 si su puerto oK lo derrota?
Zacharý

No pensé que lo haría, y el puerto no funciona si el primer carácter no es alfabético, ya que resto ciegamente 32 del valor ASCII, no hay un "superior" incorporado.
Callejero

2

Ruby , 69 bytes

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

Explicación:

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

Pruébalo en línea!


¿Podría agregar un enlace TIO? No conozco a Ruby, pero ¿ s.capitalizereemplaza el anterior s? Si no es así, hace /e?y$/manejar un caso de prueba que termina en Y, EYo Eycorrectamente?
Kevin Cruijssen

1
@KevinCruijssen s.capitalizevs s.capitalize!(diferentes funciones). s.capitalize!clobbers la versión anterior.
dkudriavtsev

@KevinCruijssen He agregado un enlace TIO.
dkudriavtsev

@KevinCruijssen También agregó una explicación
dkudriavtsev

Ah ok, gracias por la explicación y la información sobre s.capitalize!. Nunca programado en Ruby, pero agregar una marca de explicación para reemplazar el valor anterior es bastante bueno. +1 de mi parte
Kevin Cruijssen

2

Jstx , 27 bytes

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

Explicación

      # 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

Pruébalo en línea!


No he visto este idioma antes. Se ve interesante. ¿Hay documentación?
recursivo el


Wow, esto es realmente impresionante. Especialmente por tan poco tiempo de desarrollo. Estoy emocionado de ver a dónde va esto.
recursivo el

2

Rojo , 143 142 bytes

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

Pruébalo en línea!

Sin golf:

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';}

Explicación:

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

Gelatina , 77 75 74 73 bytes

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

Pruébalo en línea!

¡Cualquier sugerencia de golf es bienvenida (y deseada)!


2

Pyth 36 34 bytes

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

Pruébalo en línea!

Explicación:

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

Lamentablemente, esto no funciona, ya que el último caso de prueba falla.
Zacharý

Cambie rz3a rz4para que esto funcione correctamente para el último caso de prueba.
hakr14

Oh, vaya, lo arreglaré: P
RK.

2

Elixir , 112 110 107 106 bytes

ahora tan corto como java

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

Pruébalo en línea!

Explicación:

x=String.capitalize x

Obtiene xcon el primer carácter en mayúscula y todos los demás en minúscula.

#{ code }

Evalúe el código e insértelo en la cadena.

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

Concatena x con ysi no termina con y(es decir, no coincide con la expresión regular y$).

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

Elimina el arrastre eyy el arrastre y.



1

Pyth, 60 59 bytes SBCS

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

Banco de pruebas

Ellos no se muestran aquí, pero tres bytes, \x9c, \x82, y \x8cestán en la cadena de empaquetado entre sy ÷. Tenga la seguridad, el enlace los incluye.

Traducción de 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))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.