Introducción
No sé en particular de dónde vino la tendencia a la moda. Puede ser solo un meme o algo así, pero es algo popular.
Reto
Su trabajo hoy es convertir Fizz Buzz en binario (0, 1) respectivamente, y convertir ese binario en texto. Cosas bastante estándar.
¿Cómo funciona?
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz se traduciría en 01101000 01101001 y eso se traduciría en "hola"
Restricciones
- La entrada es Fizz Buzz en un punto de vista binario (ver ejemplos a continuación).
- La salida debe ser texto.
- Puede suponer que la entrada de FizzBuzz es correcta.
- Este es el código de golf , gana el byte más corto.
Entrada
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz
Salida
"¡Hola!"
Respuestas:
C, 59 bytes
¡Números mágicos, números mágicos en todas partes!
(Además, ¿C más corto que Python, JS, PHP y Ruby? ¡Inaudito!)
Esta es una función que toma una cadena como entrada y salida a STDOUT.
Tutorial
La estructura básica es:
Aquí, las "cosas dentro" son un montón de código seguido de
,*s++
, donde el operador de coma devuelve solo el valor de su segundo argumento. Por lo tanto, esto se ejecutará a través de la cadena y se establecerá*s
en cada carácter, incluido el byte NUL final (ya que postfix++
devuelve el valor anterior), antes de salir.Echemos un vistazo al resto:
Despegando el ternario y cortocircuito
||
, esto se puede expandir a¿De dónde vienen estos números mágicos? Aquí están las representaciones binarias de todos los personajes involucrados:
Primero, necesitamos separar el espacio y NUL del resto de los personajes. La forma en que funciona este algoritmo mantiene un acumulador del número "actual" e imprime cada vez que llega a un espacio o al final de la cadena (es decir
'\0'
). Al notar eso' '
y'\0'
son los únicos caracteres que no tienen ninguno de los dos bits menos significativos establecidos, podemos bit a bit Y el carácter0b11
para obtener cero si el carácter es espacio o NUL y no cero de lo contrario.Profundizando, en la primera rama "si", ahora tenemos un personaje que es uno de ellos
FBizu
. Elegí solo actualizar el acumulador enF
syB
s, por lo que necesitaba alguna forma de filtrar elizu
s. Convenientemente,F
yB
ambos tienen solo el segundo, tercer o séptimo conjunto de bits menos significativo, y todos los otros números tienen al menos otro conjunto de bits. De hecho, todos tienen el primer o cuarto bit menos significativo. Por lo tanto, podemos bit a bit AND con0b00001001
, que es 9, que de lo contrario producirá 0 paraF
andB
y no cero.Una vez que hemos determinado que tenemos un
F
oB
, podemos asignarlos a0
y1
respectivamente tomando su módulo 5, porqueF
es70
yB
es66
. Entonces el fragmentoes solo una forma de decir golf
que también se puede expresar como
que inserta el nuevo bit en la posición menos significativa y cambia todo lo demás en 1.
"¡Pero espera!" Podrías protestar. "Después de imprimir
i
, ¿cuándo vuelve a restablecerse a 0?" Bueno,putchar
arroja su argumento a ununsigned char
, que resulta ser de 8 bits de tamaño. Eso significa que todo lo que pasa del octavo bit menos significativo (es decir, la basura de las iteraciones anteriores) se descarta, y no debemos preocuparnos por eso.¡Gracias a @ETHproductions por sugerir reemplazar
57
con9
, guardando un byte!fuente
Jalea , 9 bytes
Pruébalo en línea!
fuente
Bash + coreutils,
6150 bytes(-11 bytes gracias a Doorknob !)
Pruébalo en línea!
fuente
sed
contr FB 01|tr -d izu
para guardar 11 bytes.Python 3 ,
16910193918581 bytesPruébalo en línea!
Explicación:
fuente
lambda
funciónJavaScript (ES6),
8079 bytesfuente
.replace(/..zz/g,
,'0b'+
etc.n
permite alcanzar 79. Lamentablemente, esto requiere un espacio adicional para agregar a la entrada. De ahí lo bastante costoso`${s} `
.Japt ,
26241917 bytesPruébalo en línea!
Ahorró 2 bytes gracias a @Shaggy y 2 bytes gracias a @ETHproductions
Explicación
fuente
})
conÃ
. Definitivamente hay más para salvar que eso, pero no puedo hacer que funcione en mi teléfono.ò4...q n2
conë4...n2
(ë4
hace lo mismo queò4
, excepto devolver solo el primer elemento; curiosamente, no parece estar documentado)Ruby,
656360 bytesEste es un proceso anónimo que toma entrada y da salida como una cadena.
fuente
JavaScript (ES6),
95888581 bytesIntentalo
fuente
+
es más corto queparseInt
+(m[0]<"F")
podría acortarse am<"F"|0
Perl 5, 33 bytes
Reemplaza 'F' y 'B' en la entrada con 0 y 1 respectivamente, y elimina los otros caracteres. Luego usa la
pack
función de perl para convertir esta cadena de bits en caracteres ASCII.fuente
-p0
opción de línea de comando (que le ahorraría<>=~r
para la entrada y le permitiría usar en$_=
lugar deprint()
). Dependiendo de cómo desee manejar las nuevas líneas, es posible que ni siquiera necesite el0
. (Incluso si desea evitar las penalizaciones de la opción de línea de comando,say
es más corto queprint
.)$_=pack'B*',y/FB -z/01/dr
para su programa baja su puntaje a 26 bytes.Python 2 ,
90838281 bytes-1 byte gracias a totalmente humano
-1 byte gracias a Martmists
-1 byte gracias a Jonathan Frech
Pruébalo en línea!
fuente
*1 for
en*1for
*1
para convertir de booleano a entero, puede guardar un byte utilizando+
:(l<'D')*1for
puede ser+(l<'D')for
.Espacio en blanco, 123 bytes
Representación visible:
Programa no ofuscado:
No hay nada particularmente extraño en la implementación, el único juego de golf real es una extraña reutilización de los temporales, así como no preocuparse por el crecimiento ilimitado de la pila para escatimar algunos bytes más.
fuente
Octava ,
595753 bytesEsto no funciona en TIO, ya que la caja de herramientas de comunicación no está implementada. Funciona bien si lo copia y pega Octave-online . Ni siquiera está cerca de ser código de trabajo en MATLAB.
Se las arregló para guardar dos bytes al transponer la matriz después de voltearla, en lugar de al revés.
Explicación:
Comencemos en el medio de
<code>
:Llamemos al vector booleano (binario) resultante para
t
.fuente
Perl 5, 28 bytes + 4 bytes para banderas = 32 bytes
Corre con las banderas
-040pE
-040
establece el separador de registros en un espacio para que Perl vea cada grupo de FizzBuzzes como una línea separada, luego recorra esas líneas, cambie F a 0, B a 1, elimine todo lo demás, luego convierta a binario y de allí a ascii.fuente
Jalea , 9 bytes
Pruébalo en línea!
-3 bytes gracias a Erik the Outgolfer
fuente
PHP, 67 bytes
Limitado a 8 letras
Pruébalo en línea!
PHP, 77 bytes
Pruébalo en línea!
fuente
Brain-Flak , 107 bytes
Pruébalo en línea!
+3 bytes para el
-c
bandera.Explicación
fuente
q / kdb +,
41403733 bytesSolución:
Ejemplo:
Explicación:
Divida la cadena de entrada
" "
para obtener listas distintas deFizzBuzz...
índice en cada una de estas listas en el primer carácter (es decir0 4 8 ... 28
). Devuelve una lista booleana determinada por si cada carácter es"B"
(ASCII66
). Convierta estas listas a base 10, y luego convierta el resultado a cadena.fuente
Haskell, 72 bytes
Pruébalo en línea!
Cómo funciona
fuente
JavaScript ES6 - 98 bytes
demasiados bytes, pero al menos legible
Definido como función, es de 98 bytes.
prueba:
Explicación:
Coincide con las letras F y B y cualquier otra cosa como grupos
es una función que captura los grupos, devuelve un 0 para F y 1 para B, o ''
c es el personaje que coincide
F y B ahora son parámetros!
el 3er .el grupo se omite como parámetro
F y B son
undefined
cuando se empareja el tercer grupoB es
undefined
cuando se hace coincidir el grupo FLa cadena resultante 0100 .. etc.
se corta en rodajas de 8 bytes
y procesado como cadena binaria 0b
fuente
s=>s.replace( ...
. También incluya un recuento de bytes en el encabezado de su respuesta.let
, las funciones anónimas son aceptables.shortC , 35 bytes
Conversiones en este programa:
A
-int main(int argc, char **argv){
W
-while(
@
-argv
P
-putchar(
);}
Basada en la respuesta de Doorknob.
fuente
APL (Dyalog Classic) , 17 bytes
Explicación
Pruébalo en línea!
fuente
05AB1E , 15 bytes
Pruébalo en línea!
fuente
Hojas de cálculo de Google, 94 bytes
No estoy familiarizado con el binario FizzBuzz, pero parece que están delineados por espacios, por lo que esta fórmula se basa en eso. La lógica es bastante simple:
Fizz
con0
yBuzz
con1
fuente
Java 8,
117115bytesDudo que pueda hacer muchos reemplazos de expresiones regulares sofisticadas en Java como la mayoría de las otras respuestas, principalmente porque no puede hacer nada con los grupos de captura capturados en expresiones regulares Java (es decir,
"$1".charAt(...)
o"$1".replace(...)
no es posible, por ejemplo).Explicación:
Pruébalo aquí.
fuente
J , 20 bytes
Pruébalo en línea!
fuente