Facey McFaceface


47

Хтось пам’ятає Boaty ?

Ви могли повністю скласти будь-яке старе слово, правда?

  • Напишіть функцію, щоб перетворити рядок у Somethingy McSomethingface.
  • Він повинен прийняти один рядок як вхідний. Ігноруйте регістр вводу.
  • Якщо слово закінчується на "у", ваша функція не повинна додавати додаткове "у" до першої інстанції, а повинна видаляти його у другій інстанції.
  • Якщо слово закінчується на '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


Чи можемо ми припустити, що вхід буде містити лише великі та малі літери?
Кевін Кройсейсен

@KevinCruijssen Я не ставив жодних листів у тестових випадках, тому їх фактично не стосується.
AJFaraday

Відповіді:


7

Стакс , 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

Пітон, 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 Знайдено "ЗАМІНА (нижчий (A1), 1,1, верхній (лівий (A1)))", який на 2 байти коротший.
Верніш


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
Використовуючи регулярний вираз з моєї відповіді Retina та трохи скориставшись інтерполяцією рядків, це зводиться до 49: tio.run/##DcxBCsIwEEDRqwxJBF3Y4lpSN0U3igcQwTQmGFptMVNkTOLVY3bvb/…
Martin Ender

@MartinEnder Нічого собі, це зовсім різниця. Я не думаю, що я бачив рядову інтерполяцію без дужок. Я візьму його, якщо ви не хочете використовувати його для власної відповіді Рубі.
iamnotmaynard

Ні, це добре, я б не придумав використовувати =~та будувати цілий рядок, а не використовувати sub. Інтерполяція рядків може використовуватися без дужок, якщо змінна є змінною глобального, примірника або класу.
Мартін Ендер

Ви можете знизити це до 44 + 1 байт, скориставшись -pпрапором та використовуючи sub: tio.run/…
Йорданія




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 Щойно запитав ОП, і здається, що введення містить лише великі та / або малі літери.
Кевін Кройсейсен

1
~32-> 95на 1 байт збережено
Олів'є Грегоар

@ 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
Бенджамін Грюнбаум

Дякую, @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

Спробуйте в Інтернеті!

Збережено 1 байт завдяки DJMcMayhem


1
Можна зробити Yзамістьyy
DJMcMayhem

3

Perl 5 -p , 47 39 байт

Збережено 6 байт із пропозиціями @ Олега В.Волкова, 1 - з @ mwellnhof's та 1 - з моїм власним

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

Спробуйте в Інтернеті!


Ви можете позбутися ucfirst:$_=lc^$";
Волков Олег Васильович

$_=s/y$//r."y Mc".s/e?y$//r.faceна один байт коротше.
nwellnhof


Дух. Я мав це зрозуміти.
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";}

Зауважте, що кланг не компілює це.

Кредит належить Кевіну Кройссену та Олів'є Грегоаре за &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

Ви можете зберегти 11 байтів, не визначившись nта просто скориставшись значенням iциклу "час". Спробуйте в Інтернеті!
Кріс

@Chris Дякую! Мені вдалося відголити ще 2 байти.
OOBalance

2

V , 38 36 32 байт

-5 байт завдяки подвигу @Cows

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

<esc>є буквальним символом втечі і [^кодується як\x84

Спробуйте в Інтернеті!


gu$може статиVu
Kritixi Lithos

2
Оскільки [^це ярлик для регулярних виразів (див. Тут ), ви можете використовувати 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'

Спробуйте в Інтернеті!


3-й елемент списку [s,s[:-1],'',s[:-2]можна змінити, 0щоб зберегти 1 байт.
Мертвий Поссум

В 'y'*1 *1не потрібен. Ще 2 байти
Dead Possum

Перехід від Python 3 до Python 2 та його заміна returnна print1 байт коротший.
Kevin Cruijssen

2

JavaScript (Node.js) , 87 байт

  • завдяки @Shaggy за 5 скорочень на 5 байт
s=>(g=r=>Buffer(s.replace(r,"")).map((x,i)=>i?x|32:x&~32))(/y$/)+`y Mc${g(/e?y$/)}face`

Спробуйте в Інтернеті!


2
Не потрібно називати нерекурсивні функції.
Денніс

1
Чудово зроблено. Я ніколи не думаю використовувати Buffer, доведеться намагатися запам'ятати це для майбутніх викликів. Знизив її до 87 байт .
Кудлатий

2

К4 , 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 - немає "верхнього" вбудованого.
Стрітер

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? Я не знаю Рубі, але чи 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 від мене.
Кевін Круїссен

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

Спробуйте в Інтернеті!

Безголівки:

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

Ой, ой, я виправлю це: Р
РК.

2

Еліксир , 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"}

З'єднайте х з, yякщо він не закінчується y(тобто він не відповідає регексу y$).

#{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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.