Fizz-Buzzify una cadena

21

Se le dará una cadena que solo contiene letras del alfabeto inglés, tanto en minúsculas como en mayúsculas (ASCII 65-90 y 97-122). Su tarea es generar la versión Fizz-Buzzified de String.

¿Cómo Fizz-Buzzify una cadena?

  • Cada letra que tenga un índice par en el alfabeto inglés (el alfabeto debe estar indexado en 1 a->1,b->2,...,z->26) se convertirá en fizzminúsculas y FIZZen mayúsculas ( f -> fizz, F -> FIZZ).

  • Cada letra que tenga un índice impar en el alfabeto inglés se convertirá buzzsi está en minúscula y BUZZsi está en mayúscula ( e -> buzz, E -> BUZZ).

  • Veamos un ejemplo, para ilustrar el algoritmo, usando la cadena CodeGolf(espacios añadidos para mayor claridad):

    "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)
    
  • Si es más conveniente para su idioma, también puede dejar espacios individuales entre los grupos ( fizz, buzz, FIZZ, BUZZ). Por lo tanto, un resultado como fizzBUZZbuzzbuzztambién se puede devolver como fizz BUZZ buzz buzz. No se permiten otros separadores.


Casos de prueba:

Entrada -> Salida 

"huevo" -> "buzzbuzzbuzz"
"CodeGolf" -> "BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
"Restablecer" -> "FIZZbuzzbuzzbuzzfizz"
"ATOM" -> "BUZZFIZZBUZZBUZZ"
"yOuArEgReAt" -> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

Sr. Xcoder
fuente
Salvadera.
Sr. Xcoder

Respuestas:

7

Carbón , 26 24 bytes

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

Pruébalo en línea! Originalmente inspirado por @CarlosAlejo. Editar: guardado 2 bytes al recorrer las letras de fizz / buzz en lugar de asignar a un temporal. Explicación:

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
fuente
Finalmente pude entender tu solución. Pensé que Ordinal(i)devolvía la posición del icarácter en su cadena original, pero devuelve su valor ASCII (código de carácter). ¡Una solución muy inteligente, todavía necesito mejorar mucho mis habilidades con el carbón!
Charlie
Cómo hacer esto en carbón vegetal en solo 24 bytes ...
Erik the Outgolfer
¿En qué codificación están estos 24 bytes?
Ruslan
@Ruslan En la página de códigos personalizados de Charcoal .
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
fuente
Publicado prácticamente al mismo tiempo, pero guardó un byte en mi solución al ordenar el ternario de la manera más corta +1
TheLethalCoder
@TheLethalCoder ahh, perdón por eso.
LiefdeWen
¡No hay nada de que arrepentirse, publicamos con 12 segundos de diferencia! ¡Y el tuyo es más corto!
TheLethalCoder
¿C # te permitirá usarlo x%2directamente como booleano, sin necesidad de la <1parte? Si es así, puede guardar algunos bytes de esa manera.
Brian J
@BrianJ No, no lo hace implícitamente
LiefdeWen
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");}

Pruébalo en línea!

Mucho golfable, muy bytes, ¡así que Java!

Muy jugado por @KevinCruijssen por 9 bytes!

Olivier Grégoire
fuente
Pensé que quizás las transmisiones harían esto más corto, así que escribí uno. s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));Por desgracia, tiene 105 caracteres de longitud :( Si solo pudieran agregar joindirectamente en la secuencia o integrar un toList, en realidad, cualquier cosa sensata sería buena.
Olivier Grégoire
1
La impresión directa en lugar de devolver una Cadena es 6 bytes más corta, y el uso en getBytes()lugar de toCharArray()es 3 bytes más cortos:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Kevin Cruijssen
Olvidó los 3 bytes adicionales al cambiar toCharArray()a getBytes(). :)
Kevin Cruijssen
1
Hice clic antes de su edición y no lo vi después;) Además, solo pensé en ello antes de ver su comentario 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 prueba

Arnauld
fuente
3

C #, 97 bytes

using System.Linq;s=>string.Concat(s.Select(c=>"fizzbuzzFIZZBUZZ".Substring(c%2*4+(c>96?0:8),2)))
TheLethalCoder
fuente
No sé C #, pero ¿no puedes usarloc%2>1?c>96?"fizz":"buzz":...
Sr. Xcoder
3

La llanura Inglés , 820 632 610 bytes

El Sr. Xcoder sugirió eliminar una trampa de error innecesaria, que ahorró 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 sin golf:

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.

El IDE en inglés simple está disponible en github.com/Folds/english . El IDE se ejecuta en Windows. Se compila en código x86 de 32 bits.

Jaspe
fuente
1
"Puede suponer que la entrada no estará vacía". así que creo que puedes dejarloIf the s is "", exit.
Sr. Xcoder
@ Mr.Xcoder - Gracias. Resulta que la trampa no era necesaria, incluso si s estaba vacía.
Jasper
2

Carbón , 40 36 bytes

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

Pruébalo en línea!

Explicación:

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"

Una alternativa con el mismo número de bytes:

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

Pruébalo en línea! ( Versión detallada )

  • ¡4 bytes guardados gracias a Neil!
Charlie
fuente
1
Use Counto Ordinalrespectivamente en lugar de Findguardar algunos bytes.
Neil
Todo ifcuenta como una sola declaración, por lo que no necesita el {}s. También guardé un byte moviendo el Uppercaseinterior a Ternary: ¡ Pruébelo en línea!
Neil
Mejor aún, Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχpara 26 bytes. (A Deverbosifier no le gusta esta versión.)
Neil
@Neil Muchas gracias, pero ni siquiera puedo entender tu última versión, así que no puedo dar crédito por ello, creo que no es mi propia respuesta. Me sentiría honrado de ser superado por usted si escribe su propia publicación. :-)
Charlie
2

> <> , 68 bytes

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

¡Pruébelo en línea o mírelo en el área de juegos para peces !

(¡Pero mira la respuesta de Aaron, que es 13 bytes más corta!)

Si no está familiarizado con> <>, hay un pez que nada a través del código en 2D y los bordes se envuelven. Los símbolos >, <, ^y vestablecer la dirección de los peces, /y \son espejos que reflejan la misma, y ?significa "hacer la siguiente instrucción si la cosa superior de la pila no es cero, de lo contrario saltar por encima de la siguiente instrucción".

En la primera línea, el pez toma un carácter de input ( i); si es -1 para EOF, se detiene ( :0(?;); obtiene el mod charcode 2 ( :2%$); y empuja un 1 o 0 en la pila dependiendo de si el código de char es menor o mayor que el código de char de "^" ( "^"(). Las siguientes tres líneas redirigen al pez a la cadena derecha de fizz / buzz, luego la última línea lo imprime (una opara cada personaje) y envía el pez de regreso al inicio.

No un arbol
fuente
@ Aaron, ¡eso es genial! Pensé en esa idea pero no pude hacer que funcionara. ¿Te gustaría publicar eso como tu propia solución?
No es un árbol
@ Aaron, también has encontrado un error en TIO o en el intérprete en línea ; en ese intérprete, !o ?seguido de un espacio, solo se salta el espacio, pero TIO espera hasta que salte la próxima cosa no espacial ...
No es un árbol
@ Aaron, tu envío es mucho mejor que el mío, así que puedes publicarlo tú mismo y eliminaré este.
No es un árbol
!debería omitir espacios AFAIK, pero el intérprete en línea rellena su espacio de códigos con espacios, que es probablemente lo que está viendo
Aaron
Continuemos esta discusión en el chat .
Aaron
2

> <> , 55 bytes

Basado en la respuesta de Not a tree .

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

En lugar de representar los 4 resultados posibles en el código, solo represento sus versiones en mayúsculas y agrego 32 al código de caracteres para obtener los equivalentes en minúsculas.

Pruébalo en línea!

Código modificado para el intérprete en línea , que rellena su espacio de código con celdas vacías:

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

Perl5 , 50 + 1 bytes

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

Crea una lista de 128 elementos que asigna caracteres ASCII a la palabra de código adecuada.

ikegami
fuente
1

05AB1E , 22 bytes

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

Pruébalo en línea!

Explicación

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

Solución alternativa de 22 bytes

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

F # , 154 153 145 bytes

ahorrado 1 9 bytes gracias 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""

Pruébalo en línea!


fuente
Ahorre 1 byte eliminando el espacio entre concaty ""en la última línea
Sr. Xcoder
145 bytes , elimine los espacios en blanco innecesarios
Sr. Xcoder
Gracias @ Mr.Xcoder ¡Todavía me estoy acostumbrando a F # y cuando la sangría es significativa!
1
Y por cierto, ¡Bienvenido a PPCG! No sé F # en absoluto, solo
eliminé
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
fuente
1

Java 8, 89 bytes

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

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

Anthony Garcia
fuente
1

q / kdb +, 48 bytes

Solución:

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

Ejemplos:

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"

Explicación:

Bastante sencillo, tome la cadena de entrada, convierta en valores ASCII, cree una lista de 1 o 0 dependiendo de si es impar o par (pista A = 65 = impar), luego use esta lista para indexar en una lista de fizzy buzz. Convierta esto en una cadena, y luego para los casos en que la entrada sea <91 (inferior a una Z) aplicaremos la upperfunción para obtener a FIZZo a BUZZ.

q se interpreta de derecha a izquierda:

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
callejero
fuente
No conozco este idioma, pero ¿puedes eliminar el espacio entre mody 2?
Sr. Xcoder
Desafortunadamente no, podría escribirse como mod[x;2]si no quisiéramos espacios en blanco, ¡pero eso termina siendo 1 byte más!
Callejero
1

Ruby , 61 + 1 = 62 bytes

Usa la -pbandera.

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

Pruébalo en línea!

Tinta de valor
fuente
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())}

Sin golf:

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()
    )
}

Lo que estoy haciendo es recorrer cada carácter en la cadena. Convierto cada uno a su valor ASCII, luego verifico si es par o impar, y luego verifico si es mayúscula o minúscula y obtengo el valor correspondiente del bucle. Luego unir todos los elementos de la matriz resultante en una sola cadena e imprimirlo.

Esta solución utiliza Swift 4, por lo que todavía no hay forma de probarlo fácilmente en línea.

¡Gracias a @ Mr.Xcoder por salvarme 9 bytes!

Caleb Kleveter
fuente
error: value of type 'String' has no member 'map', porque una cadena no se convierte automáticamente en una lista en tiempo de ejecución.
Sr. Xcoder
Además, ese servicio no es gratuito. Debe agregar una tarjeta de crédito para probar su envío si no lo copio y pego. Considere cambiar el servicio de prueba.
Sr. Xcoder
Para que funcione, debe convertirlo en$0.characters.map{...}
Sr. Xcoder
@ Mr.Xcoder Cloud 9 tiene un nivel gratuito, en el que solo obtiene un espacio de trabajo privado y espacios de trabajo públicos ilimitados. Debería poder iniciar sesión a través de GitHub. Nunca he compartido nada con él, así que no estaba seguro de si funcionaría. Además, debería haber mencionado que estoy usando Swift 4, donde String se ajusta a Collection. Esto significa que tiene una función de mapa.
Caleb Kleveter
1
Como puedo ver, la antigua declaración de función todavía es válida en Swift 4, func f(s:String){...}por lo que puede guardar 9 bytes utilizando el siguiente código, que utiliza en printlugar de return: pastebin.com/06kiiGaJ . Si no funciona, házmelo saber.
Sr. 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')))

Tiene que ser más corto usando ASCII? Fue más corto. Ver historial de edición de respuesta de edad, que utiliza letters.

Comprueba cada letra para (1) si es mayúscula o no ( >91) y si es a fizzo a buzz.

BLT
fuente
-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
fuente
66
¡Hola! Bienvenido a PPCG! Somos una comunidad de golf, por lo que tratamos de eliminar tantos bytes como sea posible; esto incluye bytes en nombres de variables y espacios en blanco, que se pueden eliminar de su respuesta. Además, las presentaciones deben ser un programa completo (incluido el estándar public static void main) o una función. Actualmente, el tuyo es un fragmento.
Stephen