Introdução
Eu particularmente não sei de onde veio a tendência do fizz buzz. Pode ser apenas um meme ou algo assim, mas é um pouco popular.
Desafio
Sua tarefa hoje é converter o Fizz Buzz em binário (0, 1), respectivamente, e converter esse binário em texto. Material bastante padrão.
Como isso funciona?
O FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz se traduziria em 01101000 01101001 e, em seguida, se traduziria em "oi"
Restrições
- A entrada é o Fizz Buzz do ponto de vista binário (veja os exemplos abaixo).
- A saída deve ser texto.
- Você pode assumir que a entrada do FizzBuzz está correta.
- Isso é código-golfe , os bytes mais curtos vencem.
Entrada
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzFizzFizzBuzz
Saída
"Oi!"
Respostas:
C, 59 bytes
Números mágicos, números mágicos em todos os lugares!
(Além disso, C menor que Python, JS, PHP e Ruby? Inédito!)
Esta é uma função que recebe uma string como entrada e sai para STDOUT.
Passo a passo
A estrutura básica é:
Aqui, o "material interno" é um monte de código seguido por
,*s++
, em que o operador de vírgula retorna apenas o valor do seu segundo argumento. Portanto, isso percorrerá a cadeia e definirá*s
todos os caracteres, incluindo o byte NUL à direita (já que o postfix++
retorna o valor anterior), antes de sair.Vamos dar uma olhada no resto:
Retirando o circuito ternário e curto-circuito
||
, isso pode ser expandido paraDe onde vêm esses números mágicos? Aqui estão as representações binárias de todos os personagens envolvidos:
Primeiro, precisamos separar espaço e NUL do resto dos personagens. Da maneira como esse algoritmo funciona, ele mantém um acumulador do número "atual" e o imprime sempre que atinge um espaço ou o final da string (ou seja
'\0'
). Ao perceber que' '
e'\0'
são os únicos caracteres que não possuem nenhum dos dois bits menos significativos definidos, podemos AND bit a bit e0b11
obter o zero se o caractere for espaço ou NUL e diferente de zero.Indo mais fundo, no primeiro ramo "se", agora temos um personagem que é um deles
FBizu
. Eu escolhi apenas atualizar o acumulador emF
s eB
s, então eu precisava de uma maneira de filtrar osizu
s. Convenientemente,F
eB
ambos têm apenas o segundo, terceiro ou sétimo bits menos significativos definidos, e todos os outros números têm pelo menos um outro conjunto de bits. De fato, todos eles têm o primeiro ou o quarto bit menos significativo. Assim, podemos bit a bit E com0b00001001
, o qual é 9, o que vai originar 0 paraF
eB
e diferente de zero em contrário.Depois de determinarmos que temos um
F
ouB
, podemos mapeá-los para0
e1
respectivamente, tomando seu módulo 5, porqueF
é70
eB
é66
. Então o trechoé apenas uma maneira de dizer golfe
que também pode ser expresso como
que insere o novo bit na posição menos significativa e muda todo o resto em 1.
"Mas espere!" você pode protestar. "Depois de imprimir
i
, quando é que ele é redefinido para 0?" Bem,putchar
lança seu argumento para anunsigned char
, que por acaso tem 8 bits de tamanho. Isso significa que tudo que passou do oitavo bit menos significativo (ou seja, o lixo das iterações anteriores) é jogado fora, e não precisamos nos preocupar com isso.Agradecemos a @ETHproductions por sugerir a substituição
57
por9
, salvando um byte!fonte
Geléia , 9 bytes
Experimente online!
fonte
Bash + coreutils,
6150 bytes(-11 bytes graças à maçaneta da porta !)
Experimente online!
fonte
sed
portr FB 01|tr -d izu
para salvar 11 bytes.Python 3 ,
16910193918581 bytesExperimente online!
Explicação:
fonte
lambda
funçãoJavaScript (ES6),
8079 bytesfonte
.replace(/..zz/g,
,'0b'+
etc.n
permite chegar a 79. Infelizmente, isso requer um espaço extra a ser adicionado à entrada. Daí o bastante caro`${s} `
.Japt ,
26241917 bytesExperimente online!
Economizou 2 bytes graças a @Shaggy & 2 bytes graças a @ETHproductions
Explicação
fonte
})
porÃ
. Definitivamente, há mais a ser salvo do que isso, mas não consigo fazê-lo funcionar no meu telefone.ò4...q n2
comë4...n2
(ë4
não a mesma coisa queò4
, exceto retornar apenas o primeiro item; estranhamente, ele não parece ser documentado)Ruby,
656360 bytesEste é um processo anônimo que recebe entrada e fornece saída como uma string.
fonte
JavaScript (ES6),
95888581 bytesTente
fonte
+
é mais curto queparseInt
+(m[0]<"F")
poderia ser reduzido param<"F"|0
Perl 5, 33 bytes
Substitui 'F' e 'B' na entrada por 0 e 1 respectivamente e exclui os outros caracteres. Ele então usa a
pack
função perl para transformar essa sequência de bits em caracteres ASCII.fonte
-p0
opção de linha de comando (que iria salvá-lo<>=~r
para a entrada, e permitem que você use$_=
em vez deprint()
). Dependendo de como você deseja lidar com novas linhas, talvez você nem precise do0
. (Mesmo que você queira evitar multas por opção de linha de comando,say
é menor queprint
.) #$_=pack'B*',y/FB -z/01/dr
para o seu programa, sua pontuação é reduzida para 26 bytes.Python 2 ,
90838281 bytes-1 byte graças ao totalmente humano
-1 byte graças ao Martmists
-1 byte graças a Jonathan Frech
Experimente online!
fonte
*1 for
em*1for
*1
a conversão de booleano para inteiro, você pode salvar um byte usando a+
:(l<'D')*1for
can be+(l<'D')for
.Espaço em branco, 123 bytes
Representação visível:
Programa não ofuscado:
Não há nada de particularmente estranho na implementação, o único golfe real está em uma reutilização estranha de temporários, além de não se importar com o crescimento ilimitado da pilha para reduzir mais alguns bytes.
fonte
Oitava ,
595753 bytesIsso não funciona no TIO, pois a caixa de ferramentas de comunicação não está implementada. Funciona bem se você copiar e colar no Octave-online . Não é nem perto de estar trabalhando com código no MATLAB.
Conseguiu salvar dois bytes transpondo a matriz depois de lançá-la, e não o contrário.
Explicação:
Vamos começar no meio de
<code>
:Vamos chamar o vetor booleano (binário) resultante para
t
.fonte
Perl 5, 28 bytes + 4 bytes para sinalizadores = 32 bytes
Corra com as bandeiras
-040pE
-040
define o separador de registros como um espaço para que o perl veja cada grupo de FizzBuzzes como uma linha separada, em seguida, faça um loop sobre essas linhas, alterando F para 0, B para 1, excluindo tudo o resto, convertendo para binário e daí para ascii.fonte
Geléia , 9 bytes
Experimente online!
-3 bytes graças a Erik, o Outgolfer
fonte
PHP, 67 bytes
Limitado a 8 letras
Experimente online!
PHP, 77 bytes
Experimente online!
fonte
Flak cerebral , 107 bytes
Experimente online!
+3 bytes para o
-c
sinalizador.Explicação
fonte
q / kdb +,
41403733 bytesSolução:
Exemplo:
Explicação:
Divida a sequência de entrada
" "
para fornecer listas distintas deFizzBuzz...
, indexe em cada uma dessas listas no primeiro caractere (ie0 4 8 ... 28
). Retornar lista booleana determinada por cada caractere"B"
(ASCII66
). Converta essas listas na base 10 e depois converta o resultado em sequência.fonte
Haskell, 72 bytes
Experimente online!
Como funciona
fonte
JavaScript ES6 - 98 bytes
muitos bytes, mas pelo menos legível
Definido como função, é 98 bytes
teste:
Explicação:
Corresponde às letras F e B e qualquer outra coisa como Grupos
é uma função que captura os grupos, retorna 0 para F e 1 para B ou ''
c é o caractere correspondente
F e B agora são Parâmetros!
o terceiro . grupo é omitido como parâmetro
F e B são
undefined
quando o terceiro grupo é correspondidoB é
undefined
quando o grupo F é correspondidoA sequência 0100 .. etc resultante
é cortado em fatias de 8 bytes
e processado como cadeia binária 0b
fonte
s=>s.replace( ...
. Além disso, inclua uma contagem de bytes no cabeçalho da sua resposta.let
funções anônimas são aceitáveis.shortC , 35 bytes
Conversões neste programa:
A
-int main(int argc, char **argv){
W
-while(
@
-argv
P
-putchar(
);}
Fortemente baseado na resposta da maçaneta da porta.
fonte
APL (Dyalog Classic) , 17 bytes
Explicação
Experimente online!
fonte
05AB1E , 15 bytes
Experimente online!
fonte
Planilhas Google, 94 bytes
Eu não estou familiarizado com o binário do FizzBuzz, mas parece que eles são delineados por espaços, então essa fórmula depende disso. A lógica é bem simples:
Fizz
por0
eBuzz
com1
fonte
Java 8,
117115 bytesDuvido que você possa fazer muitas substituições sofisticadas de regex em Java, como a maioria das outras respostas, principalmente porque você não pode fazer nada com os grupos de captura capturados em Java-regexes .. (
"$1".charAt(...)
Ou seja, ou"$1".replace(...)
não são possíveis, por exemplo).Explicação:
Experimente aqui.
fonte
J , 20 bytes
Experimente online!
fonte