面子McFaceface


47

任何人都记得博伊吗?

您完全可以说出一句老话吧?

  • 编写一个将字符串转换为Somethingy McSomethingface的函数。
  • 它应该接受一个字符串作为输入。忽略输入的大小写。
  • 如果单词以“ y”结尾,则函数不应在第一个实例中添加额外的“ y”,而应在第二个实例中将其删除。
  • 如果单词以“ ey”结尾,则在第一个实例中不应添加其他“ y”,而在第二个实例中应将两者都删除。
  • 输出应仅在首字符中包含大写字母,“ Mc”中的“ M”以及“ 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


我们是否可以假定输入将仅包含大写和小写字母?
凯文·克鲁伊森

@KevinCruijssen我没有在测试用例中放入任何非字母,因此他们实际上并不关心。
AJFaraday

Answers:


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个字符的输入后,就打了两个字节。

  • @DJMcMayhem通过在第一行之前的第二行工作节省了1个字节,从而删除了 G

输入在缓冲区中。该程序首先将所有内容都转换为小写

V选择线并将其u小写

~ 切换第一个字符的大小写(将其转换为大写)

Ù在上方复制此行,将光标留在底部

ó并替换为的e¿y$压缩形式e\?y$(可选,ey在行的末尾),不包含任何内容(发生在第二行)

H 转到第一行

ó用第一行的任何内容替换y$y在行的末尾)

Á将a附加y到第一行的末尾

J 并将最后一行与第一行连接在一起,中间有一个空格,然后光标移动到该空格

a追加Mc<Esc>返回普通模式)

A最后,附加face在该行的末尾


27个字节:在线尝试!
DJMcMayhem

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!我可能建议添加一个链接到“ 在线试用”!验证正确性?
朱塞佩

1
f("Face")不符合当前的测试用例(TIO)。
乔纳森·弗雷希

编辑帖子以确保正确性,还添加了“在线试用”!链接
触摸我的身体,


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))-如果您打高尔夫球失败了,请告诉我。
泰勒·斯科特

1
谢谢@TaylorScott。找到了'REPLACE(LOWER(A1),1,1,UPPER(LEFT(A1))))',它短了2个字节。
维尔尼施'18


9

C#(.NET核心)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

红宝石61 49字节

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

在线尝试!

感谢@MartinEnder,节省了12个甜蜜的字节:


1
使用我的Retina回答中的正则表达式并更多地使用字符串插值可以将其降低到49:tio.run/##DcxBCsIwEEDRqwxJBF3Y4lpSN0U3igcQwTQmGFptMVNkTOLVY3bvb/…
Martin Ender

@MartinEnder哇,那是完全不同的。我认为我没有看到没有括号的字符串插值。如果您不想将其用于自己的Ruby回答,我将接受它。
iamnotmaynard

不,没关系,我不会想出使用=~并构建整个字符串而不是使用sub。如果变量是全局变量,实例变量或类变量,则可以在不带括号的情况下使用字符串插值。
Martin Ender '18

您可以使用-p标志并使用sub以下命令将其压缩
Jordan

7

Python 3,80个字节

长期的热心读者,我的第一篇论文终于发表了!

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

在线尝试


1
欢迎来到PPCG,非常好的第一篇文章!
扎卡里



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,看来输入将只包含大写和/或小写字母。
凯文·克鲁伊森

1
~32-> 95保存1个字节
OlivierGrégoire18年

@OlivierGrégoire我真的需要开始学习更多有关按位操作的知识。
>>>

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
本杰明·格林鲍姆

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

谢谢@BenjaminGruenbaum,但第一个失败,Donkey第二个失败Face
粗野的


@Shaggy我设法通过一些字符减少了g函数:)。你可以看看我的解决方案
DanielIndie

3

vim,35 34字节

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

<ESC>0x1b

不打高尔夫球

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

在线尝试!

多亏了DJMcMayhem,节省了1个字节


1
您可以Y代替yy
DJMcMayhem来做


3

C ++ 14(克++),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";}

注意,clang不会编译它。

值得称赞的凯文·克鲁伊森Kevin Cruijssen)奥利维尔·格雷戈尔OlivierGrégoire)&95

由于克里斯打高尔夫球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;,所以你只需要1 int
凯文·克鲁伊森

哦,还有一个字节,那就是删除以下位置的空间#include<string>
凯文·克鲁伊森

@KevinCruijssen感谢您抓住这一点!我已经编辑。
OOBalance

通过不定义n而仅使用iwhile循环之后的值,可以节省11个字节。在线尝试!
克里斯(Chris)

@克里斯谢谢!我设法减少了2个字节。
OOBalance

2

V38 36 32字节

-5字节,感谢@Cows quack

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

<esc>是字面转义字符,[^编码为\x84

在线尝试!


gu$可以成为Vu
Kritixi Lithos

2
由于[^是regex快捷方式(请参见此处),因此可以使用0x84而不是[^保存字节。同样,\?可以简化为<M-?>节省另一个字节。And $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个更多的字节
死貂

切换在Python 3到Python 2,以及替换returnprint为1个字节短。
凯文·克鲁伊森


2

K474个 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)

奖金:

K(oK)中的67字节端口:

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

在线尝试!


1
如果您的OK端口击败了K4,那又有什么意义呢?
扎卡里

我没想到会这样,如果第一个字符不是字母,那么端口将无法工作,因为我从ASCII值中盲目地减去了32-内置没有“ upper”。
streetster

2

红宝石,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链接吗?我不了解Ruby,但是会s.capitalize取代以前的s吗?如果没有,/e?y$/处理一个测试用例中结束YEYEy是否正确?
凯文·克鲁伊森

1
@KevinCruijssen s.capitalizevs s.capitalize!(不同的功能)。s.capitalize!破坏旧版本。
dkudriavtsev

@KevinCruijssen我添加了一个TIO链接。
dkudriavtsev

@KevinCruijssen还添加了一个解释
dkudriavtsev

好的,谢谢您的解释和有关的信息s.capitalize!。从未使用Ruby编程过,但是添加一个解释标记来替换以前的值非常酷。向我+1。
凯文·克鲁伊森

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

红色143142字节

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

在线尝试!

取消高尔夫:

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

果冻77 75 74 73字节

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

遗憾的是,这不起作用,因为最后一个测试用例失败了。
扎卡里

切换rz3rz4以使其在最后一个测试用例中正常工作。
hakr14 '18

哦,我要解决这个问题:P
RK。

2

酏剂112个 110 107 106字节

现在短于java

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

如果xy不以结尾连接y(即,它与regex不匹配y$),则将x连接在一起。

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

删除尾随ey和尾随y



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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.