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

14

Простой FizzBuzz с использованием строк.

Данный

  • 1 слово или фраза (строка)
  • 2 уникальных персонажа

Выход

Слово или фраза, в которой каждое вхождение первого символа заменено на fizz, а каждый второй символ заменяется на buzz

правила

  • Первая буква в 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

Это код-гольф, поэтому выигрывает самый короткий код в байтах!

Заметка

Технически работа с новой строкой (это СПАРТА!) Является частью проблемы. Тем не менее, я не буду аннулировать ответ за его отсутствие, поскольку в некоторых языках это очень сложно или даже невозможно.

GracefulLemming
источник
2
you must match the case of the replaced characterи, Input is not case sensitiveкажется, противоречат друг другу.
Грег Мартин
@GregMartin ах спасибо, я пытался сказать, что 2 символа в качестве входных данных чувствительны к регистру (например, A означает то же, что и 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

Python, 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():
GracefulLemming
@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

Контрольные примеры

Arnauld
источник
1

Pyth - 25 байт

sXzsrBQ1scL2rB"FizzBuzz"1

Тестовый пакет .

Maltysen
источник
2
Заглавная буква, как один из символов, кажется, вызывает проблемы - "Hl", Helloнеправильно выводит заглавные буквы и "hL", Helloне заменяет ls.
Джонатан Аллан
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 Regex.* , используемое при поиске в таблице, является жадным. Если текущий символ, который необходимо заменить, не является буквой (без регистра), тогда нужна строчная строка (соответствует последней).

Поскольку у 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
seshoumara
источник
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 в качестве списка из 2 элементов в качестве первого аргумента, а входную строку - в качестве второго аргумента. Новые строки и юникод должны обрабатываться надлежащим образом, хотя, к сожалению, эта функция не является полной (с учетом неправильных входных данных, сохраненных 5 байтов).

Ник Хансен
источник
u=Data.Char.toUpperработает только в ghci, насколько я знаю. В стандартном Haskell вам нужен import. Однако вы должны быть в состоянии сохранить некоторые байты, используя =<<вместо concatMap.
Лайкони
0

Mathematica, 94 байта

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

Анонимная функция. Принимает две строки в качестве входных данных и возвращает функцию, которая принимает строку в качестве входных данных и возвращает строку в качестве выходных данных. Он должен вызываться в формате prog["c1", "c2"]["s"], где "s"находится целевая строка "c1"и "c2"два символа. Возможно, будет в гольф дальше.

LegionMammal978
источник