Um simples FizzBuzz usando strings.
Dado
- 1 palavra ou frase (string)
- 2 caracteres únicos
Resultado
A palavra ou frase com cada ocorrência do primeiro caractere substituído por efervescência e cada um do segundo caractere substituído por zumbido
Regras
- A primeira letra do Fizz e do Buzz deve permanecer em maiúscula
- Para o restante das palavras "fizz" e "buzz", você deve corresponder ao caso do caractere substituído (se nenhum caso for mantido em letras minúsculas)
- Se os caracteres fornecidos não estiverem na frase, imprima a frase original
Casos de teste
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
Isso é código-golfe, então o código mais curto, em bytes, vence!
Nota
Manipular tecnicamente o caso da nova linha (Isso é SPARTA!) Faz parte do desafio. No entanto, não anularei uma resposta por não incluí-la, pois é muito desafiadora ou mesmo impossível em alguns idiomas.
you must match the case of the replaced character
eInput is not case sensitive
parecem se contradizer.ThiBuzzFizzIBuzzFizzBUZZPARTA
está faltando um ponto de exclamação final.aa, a, f
? Qual seria o resultado esperado?BUZZizzBUZZizz
,FizzFizz
Ou ambos permitiu a nossa opção?FizzFizz
.Respostas:
Geléia , 34 bytes
Experimente online!
Quão?
fonte
Python 3 ,
180174168160152 152 bytesEsta é apenas uma versão mais desafiadora da resposta de Stephen , em Python 3. Isso corta 42% de seus bytes. O Python 2 economizaria um byte na impressão, mas esse é o preço do progresso. Isso lida com as novas linhas corretamente.
Agradecimentos a Blckknight por salvar 8 bytes na entrada.
fonte
fileinput
servem os módulos?from sys import*
es,a,b=J(stdin).split(', ')
salvar alguns caracteres?Python, 109 bytes
Experimente online!
Pega os dois caracteres como uma única sequência
Edit: Adicionado testcase ao link do TIO, a nova linha também funciona
fonte
Python 2 ,
271, 261 bytesExperimente online!
Uau, este foi um doozie! Acontece que o python não aceita entradas com várias linhas, portanto
fileinput
deve ser usado.edit: deve passar todos os casos agora :)
fonte
import fileinput as f
...for m in f.input():
MATLAB / Oitava ,
106102111 bytesProvavelmente isso poderia ser otimizado ainda mais.
Ele usa uma substituição simples do Regex. No entanto, é necessária uma etapa intermediária substituindo os caracteres de entrada pelos números primeiro. Isso é feito para que, se a segunda letra de substituição de entrada estiver contida em
Fizz
que oFizz
não, em seguida, são substituídos quando a próxima regex é realizada.Obviamente, isso pressupõe que não há números na entrada. No entanto, considerando que a pergunta diz que a entrada é uma palavra ou frase, sinto que essa é uma suposição aceitável.
O código manipulará novas linhas na entrada corretamente.
Você pode experimentá-lo online!
fonte
Bash 4,4 + GNU sed,
70228222227 bytesAparentemente,
alias e=echo
gera um erro se mencionado no Bash 4.3 ou abaixo, a versão que o TIO aparentemente está usando. Portanto, o código Bash 4.3 mais longo e equivalente é fornecido no conjunto de testes TIO abaixo para fins de teste. Isso passa em todos os casos de teste, o que é bom.Experimente online!
fonte
JavaScript (ES6), 92 bytes
Recebe entrada como uma sequência e uma matriz de dois caracteres. Suporta novas linhas.
Casos de teste
Mostrar snippet de código
fonte
Pitão - 25 bytes
Conjunto de Teste .
fonte
"Hl", Hello
não capitaliza a saída corretamente e"hL", Hello
não substitui osl
s.GNU sed , 135 + 1 (sinalizador r) = 136 bytes
Por padrão, um script sed é executado quantas vezes houver linhas de entrada. Para lidar com a entrada de várias linhas, eu uso um loop para anexar todas as linhas restantes possíveis à primeira, sem iniciar um novo ciclo.
Experimente online!
A tabela de substituição usada na linha 4 precisa estar na ordem exata, ou seja, 'Fizz' e 'Buzz' após as formas maiúsculas. Isso ocorre porque o sed regex
.*
, usado durante a pesquisa da tabela, é ganancioso. Se o caractere atual que precisa ser substituído não for uma letra (sem maiúsculas e minúsculas), a seqüência de caracteres em minúsculas será necessária (correspondida por último).Como sed não possui tipos de dados, eu uso um delimitador de caracteres para iterar uma string. Ele marcará minha posição atual e, em um loop, eu a desligo da esquerda para a direita. Felizmente, eu posso usar
,
isso, pois é o delimitador de dados de entrada.Explicação:
fonte
Haskell, 114 bytes
r
usa os caracteres fizz e buzz como uma lista de 2 elementos como o primeiro argumento e a string de entrada como o segundo argumento. Novas linhas e unicode devem ser tratados adequadamente, embora a função infelizmente não seja total (permitindo entradas inválidas salvas em 5 bytes).fonte
u=Data.Char.toUpper
só funciona em ghci, tanto quanto eu sei. No padrão Haskell, você precisa doimport
. No entanto, você poderá salvar alguns bytes usando em=<<
vez deconcatMap
.Mathematica, 94 bytes
Função anônima. Pega duas strings como entrada e retorna uma função que pega uma string como entrada e retorna uma string como saída como saída. Ele deve ser chamado no formato
prog["c1", "c2"]["s"]
, onde"s"
é a cadeia alvo e"c1"
e"c2"
são os dois personagens. Provavelmente poderia ser jogado ainda mais.fonte