A, Buzz, C, D, E, Fizz, G


14

Простий FizzBuzz з використанням рядків.

Дано

  • 1 слово або фраза (рядок)
  • 2 унікальних персонажа

Вихідні дані

Слово або словосполучення з кожним виникненням першого символу замінюється фізком, а кожен другий символ замінюється гудом

Правила

  • Перший лист як у Fizz, так і в Buzz повинен залишатися з великої літери
  • Для решти слів "fizz" та "buzz" ви повинні відповідати регістру заміненого символу (якщо його немає, тоді зберігайте малі літери)
  • Якщо заданих символів немає у фразі, виведіть оригінальну фразу

Випробування

Given: Hello, h, l
Output: FIZZeBuzzBuzzo

Given: test, a, b
Output: test

Given: PCG rocks!,  , !
PCGFizzrocksBuzz

Given: This
Is
SPARTA!, 
, S
Output: ThiBuzzFizzIBuzzFizzBUZZPARTA!

Given: FizzBuzz, a, b
Output: FizzBUZZuzz

Це код-гольф, тому найкоротший код у байтах виграє!

Примітка

Технічне поводження з корпусом нового рядка (This Is SPARTA!) Є частиною завдання. Однак я не втрачу відповіді за те, що не включив її, оскільки це дуже складно або навіть неможливо в деяких мовах.


2
you must match the case of the replaced characterі, Input is not case sensitiveздається, суперечать один одному.
Грег Мартін

@GregMartin ах спасибі, я намагався сказати, що два символи як вхідні дані чутливі до регістру (наприклад, A означає те саме, що і)
GracefulLemming

1
ThiBuzzFizzIBuzzFizzBUZZPARTAвідсутній остаточний знак оклику.
Арнольд

Чи ми повинні підтримувати такі матеріали, як aa, a, f? Яким буде очікуваний вихід? BUZZizzBUZZizz, FizzFizzабо обидва дозволені на наш вибір?
Арнольд

@Amauld Виходячи з останнього тестового випадку, я б сказав, що його слід вивести FizzFizz.
Фонд позову Моніки

Відповіді:


2

Желе , 34 байти

Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦

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

Як?

Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦ - Main link: characters, string
Œl                                 - lowercase the characters
       ¤                           - nilad followed by link(s) as a nilad:
    ⁹                              -     right argument, the string
     Œl                            -     lowercase
  =€                               - equals (vectorises) for €ach (a list of 2 lists that identify the indexes of the string matching the characters regardless of case)
           “¡Ṭ4“Ụp»                - dictionary strings ["Fizz", "Buzz"]
          "                        - zip with
        ȧ€                         -     logical and (non-vectorising) for €ach (replace the 1s with the words)
                     /             - reduce with:
                    "              -     zip with:
                   o               -         logical or (vectorises) (make one list of zeros and the words)
                                   - implicit right argument, string
                       "           - zip with:
                      ȯ            -     logical or (non-vectorising) (replace the zeros with the original characters from the string)
                                 ¦ - apply...
                        Œu         -     uppercase
                                   - ...to the indexes (the words at indexes):
                                ¤  -     nilad followed by link(s) as a nilad:
                          ⁹        -         right argument, the string
                              $    -         last two links as a monad (i.e. the string on both sides):
                           Œl      -             lowercase
                             n     -             not equals (vectorises)
                               T   -         truthy indexes (the indexes of the capital letters in the string)

+1, Дякуємо, що використовували корпус нового рядка. Це робить це перше цілком правильне подання
GracefulLemming

6

Python 3 , 180 174 168 160 152 байт

from sys import*
J=''.join
L=str.lower
s,a,b=J(stdin).split(', ')
print(J('FBFBiuIUzzZZzzZZ'[L(k)==L(b)::2][k!=L(k)::2]*(L(k)in L(a+b))or k for k in s))

Це просто більш гольф-версія Стівена , в Python 3. Це 42% його байтів. Python 2 врятував би один байт на друку, але така ціна прогресу. Це правильно обробляє нові рядки.

Завдяки Blckknight за збереження 8 байт на вході.


1
Для чого fileinputвикористовуються модулі?
caird coinheringaahing

@ValyrioAccount, fileinput.input переосмислює вбудований метод введення. Це дозволяє вводити нові рядки.
Бен Франкель

2
Як щодо from sys import*та s,a,b=J(stdin).split(', ')зберегти кілька символів?
Blckknght

4

Пітон, 109 байт

lambda s,w:"".join([c,"Fizz","Buzz","BUZZ","FIZZ"][-~w.lower().find(c.lower())*-~(-2*c.isupper())]for c in s)

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


Приймає два символи як один рядок

Редагувати: Додано тестовий зразок до посилання TIO, також працює новий рядок


2

Python 2 , 271 , 261 байт

import fileinput as f
a=''
for m in f.input():a+=m
a=a.split(', ')
l=L=list(a[0])
for i in range(0,len(a[0])):
 j,k=l[i].lower(),l[i].istitle()
 if j==a[1].lower():
  L[i]='FIZZ'if k else'Fizz'
 elif j==a[2].lower():
  L[i]='BUZZ'if k else'Buzz'
print''.join(L)

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

Ого, цей був дозі! Виявляється, python не прийме багаторядкові введення, тому його fileinputпотрібно використовувати.

редагувати: зараз слід пройти всі справи :)


Виразний +1 для розгляду справи новими рядками! Не багато хто вміє це включити
GracefulLemming

Ви можете врятувати 3 байти, зробивши щось на кшталт import fileinput as f...for m in f.input():
ВитонченийЛеммінг

@Caleb Дякую за пропозицію! воно повинно пройти всі випробування зараз
Стівен

2

MATLAB / Octave , 106 102 111 байт

@(a,b,c)regexprep(a,num2cell([lower([b c]) upper([b c]) '1234']),{'2','4','1','3','FIZZ','Fizz','BUZZ','Buzz'})

Можливо, це можна було б оптимізувати далі.

Він використовує просту заміну Regex. Однак необхідний проміжний крок, попередньо замінивши символи введення цифрами. Це так, що якщо другий лист заміни вводу містився в Fizzтому, що Fizzвін не заміняється, коли виконується наступний регулярний вираз.

Звичайно, це передбачає, що у введенні немає цифр. Однак, з огляду на питання, що введення - це слово чи фраза, я вважаю, що це прийнятне припущення.

Код буде правильно обробляти нові рядки на вході.

Ви можете спробувати онлайн!


2

Bash 4,4 + GNU sed, 70 228 222 227 байт

IFS=;alias e=echo;K=`sed $([[ $2 != '
' ]]&&e "s/${2,}/Fizz/g;s/${2^}/FIZZ/g"||:)$([[ $3 != '
' ]]&&e ";s/${3,}/Buzz/g;s/${3^}/BUZZ/g"||:)<<<"$1"`;[[ $2 = '
'||$3 = '
' ]]&&e ${K//$'\n'/`[[ $2 = '
' ]]&&e Fizz||e Buzz`}||e "$K"

Мабуть, alias e=echoвидає помилку, якщо вона посилається на Bash 4.3 або нижче, версія TIO, очевидно, використовує. Тому довший і еквівалентний код Bash 4.3 наведений у нижченаведеному наборі тестів TIO заради тестування. Це проходить усі тестові випадки, так що це приємно.

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


@thedarkwanderer Тепер слід. Вибачте, що це виправило небагато часу.
Р. Кап

2

JavaScript (ES6), 92 байти

Приймає дані як рядок і масив з двох символів. Підтримує нові рядки.

f=(s,[a,b],r='Fizz')=>a?f(s.replace(RegExp(a,'gi'),m=>m<'a'?r.toUpperCase():r),[b],'Buzz'):s

Тестові справи



1

GNU sed , 135 + 1 (r прапор) = 136 байт

За замовчуванням сценарій sed виконується стільки разів, скільки є рядки введення. Для обробки багатолінійного введення я використовую цикл, щоб додати всі можливі залишилися рядки до першого, не починаючи новий цикл.

:r
$!N
$!br
s:, (.), (.):;\u\1FIZZ;\l\1Fizz;\u\2BUZZ;\l\2Buzz:
s:^:,:
:
s:,(.)(.*;\1)(...)(.):\3,\4\2\3\4:
s:,(.):\1,:
/,;.F/!t
s:,.*::

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

Таблиця заміщення, що використовується на рядку 4, повинна бути в такому точному порядку, тобто "Fizz" та "Buzz" після їхніх великих букв. Це пояснюється тим, що регулярний вираз sed .*, який використовується під час пошуку таблиці, жадібний. Якщо поточний знак знаряддя, який потрібно замінити, не є літерою (жоден регістр), тоді потрібна рядка рядка (відповідна остання).

Оскільки sed не має типів даних, я використовую роздільник символів для ітерації рядка. Він позначить моє поточне положення і в циклі я зміщу його зліва направо. На щастя, я можу використати ,для цього, оскільки це роздільник вхідних даних.

Пояснення:

:r                                                 # reading loop
$!N                                                # append next input line
$!br                                               # repeat till EOF
s:, (.), (.):;\u\1FIZZ;\l\1Fizz;\u\2BUZZ;\l\2Buzz: # create replacement table
s:^:,:                                             # append my string delimiter
:                                                  # main loop
s:,(.)(.*;\1)(...)(.):\3,\4\2\3\4:                 # apply char replacement, if any
s:,(.):\1,:                                        # shift delimiter to right
/,;.F/!t                                           # repeat till end of string
s:,.*::                                            # print only the final string

0

Haskell, 114 байт

u=Data.Char.toUpper
p[f,b]x|f==u x="Fizz"|b==u x="Buzz"|2>1=[x]
q x y|u y<y=x|2>1=u<$>x
r x=concatMap$q=<<p(u<$>x)

rприймає символи fizz та buzz як список двох елементів як перший аргумент, а рядок введення - як другий аргумент. Нові рядки та унікод повинні оброблятися належним чином, хоча функція, на жаль, не є повною (допускаючи недійсні входи, збережені 5 байт).


u=Data.Char.toUpperнаскільки я знаю, працює лише в ghci. У стандартному Haskell вам потрібно import. Однак ви повинні мати можливість зберегти деякі байти, використовуючи =<<замість concatMap.
Лайконі

0

Математика, 94 байти

a=ToLowerCase;b=ToUpperCase;StringReplace@{a@#->"Fizz",b@#->"FIZZ",a@#2->"Buzz",b@#2->"BUZZ"}&

Анонімна функція. Приймає два рядки як вхідні дані і повертає функцію, яка приймає рядок як вхідний і повертає рядок як вихідний як вихідний. Його потрібно викликати у форматі prog["c1", "c2"]["s"], де "s"є цільова рядок "c1"і "c2"є двома символами. Можливо, можна було б пограти в гольф далі.

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