Fizz-Buzzify uma String

21

Você receberá uma String que contém apenas letras do alfabeto inglês, minúsculas e maiúsculas (ASCII 65-90 e 97-122). Sua tarefa é produzir a versão Fizz-Buzzified da String.

Como Fizz-Buzzify uma String?

  • Cada letra que tem um índice par no alfabeto inglês (o alfabeto deve ser indexado 1:) a->1,b->2,...,z->26será transformada em fizzminúsculas e FIZZmaiúsculas ( f -> fizz, F -> FIZZ).

  • Cada letra que tenha um índice ímpar no alfabeto inglês será transformada em buzzminúsculas e em BUZZmaiúsculas ( e -> buzz, E -> BUZZ).

  • Vamos dar um exemplo, para ilustrar o algoritmo, usando a string CodeGolf(espaços adicionados para maior clareza):

    "C o d e G o l f" ->  "BUZZ buzz fizz buzz BUZZ buzz fizz fizz"
     ^ ^ ^ ^ ^ ^ ^ ^
     1 1 0 1 1 1 0 0       (1 is odd index, 0 is even index)
    
  • Se for mais conveniente para o seu idioma, você também pode deixar espaços únicos entre os grupos ( fizz, buzz, FIZZ, BUZZ). Portanto, um resultado como fizzBUZZbuzzbuzztambém pode ser retornado como fizz BUZZ buzz buzz. Outros separadores não são permitidos.


Casos de teste:

Entrada -> Saída 

"ovo" -> "buzzbuzzbuzz"
"CodeGolf" -> "BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
"Redefinir" -> "FIZZbuzzbuzzbuzzfizz"
"Átomo" -> "BUZZFIZZBUZZBUZZ"
"yOuArEgReAt" -> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

  • Qualquer método padrão para E / S pode ser usado.

  • Aplicam-se lacunas padrão .

  • Você só pode receber informações no tipo String nativo do seu idioma. O mesmo se aplica à saída.

  • Você pode assumir que a entrada não estará vazia.

  • O código mais curto em bytes em todos os idiomas vence. Boa Sorte e Fizz-Buzz!

Mr. Xcoder
fonte
Caixa de areia.
Mr. Xcoder

Respostas:

7

Carvão , 26 24 bytes

FθF⎇﹪℅ι²buzz¦fizz⎇№αι↥κκ

Experimente online! Originalmente inspirado por @CarlosAlejo. Editar: economizou 2 bytes repetindo as letras de fizz / buzz em vez de atribuir a um temporário. Explicação:

Fθ          Loop over the input (i = loop variable)
  F         Choose and loop over the word (k = loop variable)
   ⎇        Ternary
    ﹪℅ι²    If i has an odd ASCII code
    buzz
    fizz
            Print (implicit)
  ⎇         Ternary
   №αι      If i is an uppercase letter
    ↥κ      Uppercase(k)
     κ      k
Neil
fonte
Finalmente entendi sua solução. Eu pensei que Ordinal(i)retornou a posição do ichar em sua seqüência original, mas ele retorna seu valor ASCII (código de caractere). Solução muito inteligente, ainda preciso melhorar muito minhas habilidades em carvão!
27717 Charlie
Como fazer isso no carvão vegetal em apenas 24 bytes ...
Erik as Outgolfer
Em qual codificação são esses 24 bytes?
Ruslan
@Ruslan Na página de códigos personalizados do Charcoal .
28417 Neil
6

C #, 92 bytes

using System.Linq;a=>string.Concat(a.Select(x=>x%2<1?x<97?"FIZZ":"fizz":x<97?"BUZZ":"buzz"))
LiefdeWen
fonte
Postado praticamente no mesmo tempo, mas você salvou um byte para a minha solução, ordenando o ternário o caminho mais curto +1
TheLethalCoder
@TheLethalCoder ahh, desculpe por isso.
LiefdeWen
Não há desculpas por termos postado 12 segundos de diferença! E o seu é mais curto!
TheLethalCoder
O C # permitirá que você use x%2diretamente como um booleano, sem precisar da <1parte? Nesse caso, você poderá salvar alguns bytes dessa maneira.
Brian J
@BrianJ Não, não fazê-lo implicitamente
LiefdeWen
4

C (gcc) , 75 bytes

f(char*s){for(;*s;++s)printf(*s>90?*s%2?"buzz":"fizz":*s%2?"BUZZ":"FIZZ");}

Experimente online!

Giacomo Garabello
fonte
4

Java (OpenJDK 8) , 105 100 94 91 90 bytes

s->{for(int i:s.getBytes())System.out.print(i%2<1?i>90?"fizz":"FIZZ":i>90?"buzz":"BUZZ");}

Experimente online!

Muito jogável, muito bytes, então Java!

Muito jogado por @KevinCruijssen por 9 bytes!

Olivier Grégoire
fonte
Eu pensei que talvez os fluxos tornassem isso mais curto, então eu escrevi um. s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));Infelizmente, é 105 caracteres longo :( Se só eles poderiam adicionar o joindiretamente no córrego ou integrar um toList, na verdade, qualquer coisa sensata seria bom.
Olivier Grégoire
1
Imprimir diretamente em vez de retornar uma String é 6 bytes mais curto, e usar em getBytes()vez de toCharArray()é mais 3 bytes mais curto:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Kevin Cruijssen
Você esqueceu os 3 bytes adicionais alterando toCharArray()para getBytes(). :)
Kevin Cruijssen
1
Eu cliquei antes da sua edição e não a vi depois;) Além disso, pensei nisso antes de ver seu comentário xD
Olivier Grégoire
3

JavaScript (ES6), 79 77 bytes

s=>s.replace(/./g,c=>['BUZZ','buzz','FIZZ','fizz'][parseInt(c,36)%2*2|c>'Z'])

Casos de teste

Arnauld
fonte
3

C #, 97 bytes

using System.Linq;s=>string.Concat(s.Select(c=>"fizzbuzzFIZZBUZZ".Substring(c%2*4+(c>96?0:8),2)))
TheLethalCoder
fonte
Eu não sei C #, mas você não pode usarc%2>1?c>96?"fizz":"buzz":...
Mr. Xcoder
3

Plain Inglês , 820 632 610 bytes

O Sr. Xcoder sugeriu a eliminação de uma interceptação de erro desnecessária, que economizou 22 bytes.

A fizzy string is a string.
To convert a s string to a z fizzy string:
Clear the z.
Slap a r rider on the s.
Loop.
If the r's source's first is greater than the r's source's last, exit.
Put the r's source's first's target in a b byte.
If the b is not any letter, bump the r; repeat.
Put "FIZZ" in a t string.
If the b is d, put "BUZZ" in the t.
If the b is _, lowercase the t.
Append the t to the z.
Bump the r.
Repeat.
To decide if a b byte is d:
Put the b in a n number.
If the n is odd, say yes.
Say no.
To decide if a b byte is _:
Put the b in a c byte.
Lowercase the c.
If the c is the b, say yes.
Say no.

Código não destruído:

A fizzy string is a string.

To convert a string to a fizzy string:
  Clear the fizzy string.
  Slap a rider on the string.
  Loop.
    If the rider's source's first is greater than the rider's source's last, exit.
    Put the rider's source's first's target in a byte.
    If the byte is not any letter, bump the rider; repeat.
    Put "FIZZ" in another string.
    If the byte is odd, put "BUZZ" in the other string.
    If the byte is lower case, lowercase the other string.
    Append the other string to the fizzy string.
    Bump the rider.
  Repeat.

To decide if a byte is odd:
  Put the byte in a number.
  If the number is odd, say yes.
  Say no.

To decide if a byte is lower case:
  Privatize the byte.
  Lowercase the byte.
  If the byte is the original byte, say yes.
  Say no.

O IDE do inglês simples está disponível em github.com/Folds/english . O IDE é executado no Windows. Ele é compilado no código x86 de 32 bits.

Jaspe
fonte
1
"Você pode assumir que a entrada não estará vazia." então eu acho que você pode deixar cairIf the s is "", exit.
Sr. Xcoder 28/17/17
@ Mr.Xcoder - Obrigado. Acontece que a armadilha não era necessária, mesmo que s estivesse vazio.
Jasper
2

Carvão , 40 36 bytes

Fθ¿№αι¿﹪⌕αι²FIZZ¦BUZZ¿﹪⌕βι²fizz¦buzz

Experimente online!

Explicação:

Fθ                                      for every char i in the input:
   ¿№αι                                    if i is found in the uppercase alphabet
       ¿﹪⌕αι²                             if i is an even uppercase char
              FIZZ¦BUZZ                    print "FIZZ" or else "BUZZ"
                       ¿﹪⌕βι²             if i is an even lowercase char
                              fizz¦buzz    print "fizz" or else "buzz"

Uma alternativa com a mesma contagem de bytes:

AfizzφAbuzzχFθ¿№αι¿﹪⌕αι²↥φ↥χ¿﹪⌕βι²φχ

Experimente online! ( Versão detalhada )

  • 4 bytes salvos graças ao Neil!
Charlie
fonte
1
Use Countou Ordinalrespectivamente em vez de Findpara economizar alguns bytes.
Neil
O total ifconta como uma única declaração, para que você não precise dos {}s. Também salvei um byte movendo o Uppercaseinterior a Ternary: Experimente online!
Neil
Melhor ainda, Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχpor 26 bytes. (Deverbosifier não gosta desta versão.)
Neil
@ Neil Muito obrigado, mas eu não consigo nem entender sua última versão, então não posso me responsabilizar por isso, eu me sentiria como se não fosse minha própria resposta. Eu ficaria honrado em ser superado por você se você escrever seu próprio post. :-)
Charlie
2

> <> , 68 bytes

<vv?("^"$%2:;?(0:i
v\?\"zzif"
v \\"zzub"
v \ "ZZIF"
v  \"ZZUB"
\oooo

Experimente online ou assista ao playground de peixes !

(Mas veja a resposta de Aaron que é 13 bytes mais curta!)

Se você não está familiarizado com> <>, há um peixe que nada pelo código em 2D e as bordas se abrem. Os símbolos >, <, ^e vdefinir o sentido do peixe, /e \são espelhos que reflectem-lo, e? significa "fazer a próxima instrução se o topo coisa na pilha não é zero, caso contrário, saltar sobre a próxima instrução".

Na primeira linha, o peixe assume um caractere de input ( i); se for -1 para EOF, ele pára ( :0(?;); obtém o código de modificação mod 2 ( :2%$); e pressiona 1 ou 0 na pilha, dependendo se o código é menor ou maior que o código de "^" ( "^"(). As próximas três linhas redirecionam o peixe para a seqüência correta de efervescência / zumbido, depois a última linha o imprime (uma opara cada caractere) e envia o peixe de volta ao início.

Não é uma árvore
fonte
@ Aaron, isso é ótimo! Pensei nessa idéia, mas não consegui fazê-la funcionar. Deseja postar isso como sua própria solução?
Não é uma árvore
@ Aaron, você também ter encontrado um bug em qualquer TIO ou a intérprete on-line - em que intérprete, !ou ?seguido de um espaço apenas ignora o espaço, mas TIO espera até a próxima coisa que não seja de espaço para pular ...
Não uma árvore
@ Aaron, sua submissão é muito melhor que a minha, então você pode publicá-la e eu excluirei esta.
Não é uma árvore
!espaços devem salta AFAIK, mas o intérprete on-line Almofadas sua codespace com espaços, o que é provavelmente o que você está vendo
Aaron
2

> <> , 55 bytes

Baseado na resposta Não é uma árvore .

<v%2$)"^":;?(0:i
 \?v"ZZIF"
~v >"ZZUB"!
^>{:}" "*+ol1=?

Em vez de representar as 4 saídas possíveis no código, eu apenas represento suas versões em maiúsculas e adiciono 32 ao código de caractere para obter os equivalentes de maiúsculas e minúsculas.

Experimente online!

Código modificado para o intérprete online , que preenche seu espaço de código com células vazias:

<v%2$)"^":;?(0:i
 \?v"ZZIF"
~v >"ZZUB"     !
^>{:}" "*+o l1=?
Aaron
fonte
2

Perl5 , 50 + 1 bytes

perl -nE'say+((FIZZ,BUZZ)x48,(fizz,buzz)x16)[unpack"C*",$_]'

Cria uma lista de 128 itens que mapeia caracteres ASCII para a palavra de código apropriada.

ikegami
fonte
1

05AB1E , 22 bytes

v‘FIZZÒÖ‘#yÇÉèAyåil}J?

Experimente online!

Explicação

v                        # for each char y of input string
 ‘FIZZÒÖ‘#               # push the list ['FIZZ','BUZZ']
          yÇÉ            # check if y has an odd character code
             è           # use this to index into the list
              Ayåi       # if y is a member of the lowercase alphabet
                  l}     # convert to lowercase
                    J?   # unwrap from list and print

Solução alternativa de 22 bytes

ÇÉAISå·+‘FIZZÒÖ‘#Dl«èJ
Emigna
fonte
1

PHP , 67 bytes

for(;$c=$argn[$i++];)echo[FIZZ,BUZZ,fizz,buzz][ord($c)%2+2*($c>Z)];

Experimente online!

Jörg Hülsermann
fonte
1

F # , 154 153 145 bytes

salvou 1 9 bytes graças a @Mr. Xcoder

let g s=
 Seq.map(fun c->match int c with
|x when x>64&&x<91->if x%2=0 then"FIZZ"else"BUZZ"
|x->if x%2=0 then"fizz"else"buzz")s
|>String.concat""

Experimente online!


fonte
Salve 1 byte, removendo o espaço entre concate ""na última linha
Mr. Xcoder
145 bytes , remova o espaço em branco desnecessário
Sr. Xcoder
Obrigado @ Mr.Xcoder ainda estou me acostumando com F # e quando o recuo é significativo!
1
E BTW, bem-vindo ao PPCG! Eu não sei F # em tudo, apenas o material removido para ver o que acontece :)
Mr. Xcoder
1

Mathematica, 134 bytes

""<>{(s=Max@ToCharacterCode@#;If[96<s<123,If[EvenQ@s,c="fizz",c="buzz"]];If[64<s<91,If[EvenQ@s,c="FIZZ",c="BUZZ"]];c)&/@Characters@#}&
J42161217
fonte
1

Java 8, 89 bytes

s->s.chars().mapToObj(i->i%2<1?i>90?"fizz":"FIZZ":i>90?"buzz":"BUZZ").collect(joining());

Assume import static java.util.stream.Collectors.*;

Anthony Garcia
fonte
1

q / kdb +, 48 bytes

Solução:

raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$

Exemplos:

q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"egg"
"buzzbuzzbuzz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"CodeGolf"
"BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"Reset"
"FIZZbuzzbuzzbuzzfizz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"ATOM"
"BUZZFIZZBUZZBUZZ"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"yOuArEgReAt"
"buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

Explicação:

Bastante simples, pegue a string de entrada, converta-a em valores ASCII, crie uma lista de 1 ou 0 dependendo se é ímpar ou par (dica A = 65 = ímpar) e use essa lista para indexar em uma lista de fizze buzz. Faça a conversão para uma string e, nos casos em que a entrada for <91 (menor que um Z), aplicamos a upperfunção para obter um FIZZou umBUZZ .

q é interpretado da direita para a esquerda:

raze{@[string `fizz`buzz x mod 2;where x < 91;upper]}"i"$ / ungolfed version
                                                     "i"$ / cast input to ascii values
    {                                               }     / anonymous lambda
     @[                         ;            ;     ]      / apply 
                                              upper       / upper-case
                                 where x < 91             / indices where input is less than 91 (ie uppercase)
                         x mod 2                          / returns 0 if even and 1 if odd
              `fizz`buzz                                  / 2 item list, which we are indexing into
       string                                             / cast symbols to strings `buzz -> "buzz"
raze                                                      / raze (merge) list into a single string
rua
fonte
Não conheço esse idioma, mas você pode remover o espaço entre mode 2?
Mr. Xcoder
Infelizmente não, poderia ser escrito como mod[x;2]se não quiséssemos espaço em branco - mas isso acaba sendo 1 byte a mais!
streetster
1

Rubi , 61 + 1 = 62 bytes

Usa a -pbandeira.

gsub(/./){k=$&.ord%2*4;$&<?_?"FIZZBUZZ"[k,4]:"fizzbuzz"[k,4]}

Experimente online!

Value Ink
fonte
1

Swift 4 , 144 135 bytes

func f(s:String){print(s.map{let d=Int(UnicodeScalar("\($0)")!.value);return d%2<1 ?d>90 ?"fizz":"FIZZ":d>90 ?"buzz":"BUZZ"}.joined())}

Sem golfe:

func f(s:String){
    print(
        s.map{
            let d=Int(UnicodeScalar("\($0)")!.value)
            return d%2 < 1 ? d > 90 ? "fizz" : "FIZZ" : d > 90 ? "buzz" : "BUZZ"
        }.joined()
    )
}

O que estou fazendo é fazer um loop sobre cada caractere na string. Eu converto cada um para o seu valor ASCII, depois verifico se é par ou ímpar e, em seguida, verifico se está em maiúsculas ou minúsculas e produzo o valor correspondente do loop. Em seguida, uno todos os elementos da matriz resultante em uma única sequência e a imprimo.

Esta solução usa o Swift 4, portanto ainda não há como testá-lo online facilmente.

Obrigado a @ Mr.Xcoder por me salvar 9 bytes!

Caleb Kleveter
fonte
error: value of type 'String' has no member 'map', porque uma String não é convertida automaticamente em uma lista em tempo de execução.
Xcoder
Além disso, esse serviço não é gratuito. Você precisa adicionar um cartão de crédito para testar seu envio, se eu não copiar e colar. Considere alterar o serviço de teste.
Sr. Xcoder
Para fazê-lo funcionar, você deve transformá-lo em:$0.characters.map{...}
Sr. Xcoder
@ Mr.Xcoder Cloud 9 tem um nível gratuito, no qual você obtém apenas um espaço de trabalho privado e espaços de trabalho públicos ilimitados. Você deve conseguir entrar no GitHub. Eu nunca compartilhei nada com isso, então não tinha certeza se funcionaria. Além disso, eu deveria ter mencionado que estou usando o Swift 4, onde String está em conformidade com Collection. Isso significa que ele tem uma função de mapa.
Caleb Kleveter
1
Como posso ver, a antiga declaração de função ainda é válida no Swift 4, func f(s:String){...}portanto, você pode salvar 9 bytes usando o seguinte código, que usa em printvez de return: pastebin.com/06kiiGaJ . Se não funcionar, me avise.
Mr. Xcoder
1

R, 150 123 108 bytes

i=ifelse
cat(i(sapply(el(strsplit(scan(,''),'')),utf8ToInt)>91,i(x%%2,'buzz','fizz'),i(x%%2,'BUZZ','FIZZ')))

Tem que ser mais curto usando ASCII? Foi mais curto. Veja o histórico de edições para obter respostas antigas, usadasletters .

Verifica cada letra em busca de (1) se é maiúsculo ou não ( >91) e se é um fizzou um buzz.

BLT
fonte
-3

Java

str.chars().forEach(ch ->{
    if(ch >= 97)
        strb.append(ch % 2 == 0 ? "fizz" : "buzz");
    else
        strb.append(ch % 2 == 0 ? "FIZZ" : "BUZZ");
});
shwetha
fonte
6
Olá! Bem-vindo ao PPCG! Como somos uma comunidade de golfe, tentamos retirar o máximo de bytes possível - isso inclui bytes nos nomes das variáveis ​​e espaços em branco, que podem ser removidos da sua resposta. Além disso, as submissões devem ser um programa completo (incluindo o padrão public static void main) ou uma função. Atualmente, o seu é um trecho de código.
Stephen