Seu objetivo é determinar se um número é divisível por 3 sem usar condicionais. A entrada será um número de 8 bits não assinado de 0 a 255. Criatividade incentivada!
Você só tem permissão para usar
Igualdade / desigualdade (
==
,!=
,>
,<
,>=
,<=
)Aritmética (
+
,-
,x
)Operadores lógicos (
!
não,&&
e,||
ou)Bit a bit Operadores (
~
não,&
e,|
ou,^
xor,<<
,>>
,>>>
mudanças certas aritmética e lógica esquerda e)Constantes (seria melhor se você mantivesse essas pequenas)
Atribuição variável
Saída 0
se falsa, 1
se verdadeira.
Aplicam-se as regras atômicas de código-golfe padrão. Se você tiver alguma dúvida, deixe-a nos comentários. Métodos de exemplo aqui . Um token é uma das alternativas e variáveis excluídas acima.
Respostas:
C - 2 fichas
Parece funcionar até 2 31 -1.
Créditos
zalgo("nhahtdh")
para a ideia inversa multiplicativa.fonte
<=
funciona e lembre-se de que 0xAAAAAAAB é considerado como sendo dounsigned int
tipo, portanto, o resultado da multiplicação não é assinado.Python,
32 tokensSolução de força bruta, mas funciona.
Obrigado a Howard pela redução de 1 token.
fonte
0x9......>>x&1
.Fichas C -
54 (?)Funciona para qualquer número de 32 bits não assinado .
Este código utiliza o módulo inverso multiplicativo 2 32 de um divisor para converter a operação de divisão em operação de multiplicação.
Editar
Minha solução (publicada 2 minutos depois) tem o mesmo espírito da solução da aditsu. O crédito a ele pelo uso
==
disso melhora minha solução em 1 token.Referência
fonte
Bull
: PFichas C - 15 (?)
Desde 4 ≡ 1 (mod 3), temos 4 n ≡ 1 (mod 3). A regra de soma de dígitos não se limita à soma dos dígitos, mas também nos permite dividir arbitrariamente o número em seqüências de dígitos e somar todos eles, mantendo a congruência.
Um exemplo na base 10, divisor = 9:
1234 ≡ 12 + 34 ≡ 1 + 2 + 3 + 4 ≡ 123 + 4 ≡ 1 (mod 9)
Todas as instruções no programa fazem uso dessa propriedade. Na verdade, pode ser simplificado para um loop que executa a instrução
n = (n & 0x3) + (n >> 2);
atén < 4
, pois a instrução simplesmente quebra o número na base-4 no dígito menos significativo e soma as duas partes.fonte
n = (n & 0x3) + (n >> 2);
o resultado é reduzido para 3 bits e a repetição faz com que permaneça apenas 2 bits. stackoverflow.com/a/3421654/995714Python (2 tokens?)
Ou
Ou
fonte
JavaScript - 3 tokens
Isso abusa do fato de que o uso de operadores bit a bit em um número o trunca para um número inteiro em JavaScript.
fonte
=
,*
,|
,==
C - 4 fichas
Funciona até 383.
Versão anterior (constantes maiores):
Funciona até 1535
fonte
bash - ???
Não sei como pontuar isso.
por exemplo
fonte
Befunge 93 - 5 fichas
Divisão fixa removida.
Obtém entrada, continua subtraindo 3 até que seja menor que 0, direcione o ponteiro para cima ('|') e adicione 3. Se o valor for 0, o ponteiro se moverá para a direita (" 1. @" gera '1') e se move para a esquerda ("@. " gera '0'). '@' finaliza o programa.
fonte
Lote - 7 fichas
eu acho que
Retorna
1
se o número fornecido (como stdin) é divisível por três.fonte
Ruby, 6 (?) Tokens
Realmente não sei como contar tokens. OP, você pode me marcar?
Eu acho que é 6 ...
1
,0
,0
,*
,255
,x
Observe que a
*
multiplicação não é inteira.fonte
Python 0
Postei eariler, mas usei condicionais. Aqui é para usar sem condicionais e sem tokens, apenas palavras-chave
usa o truque que múltiplos de 3s têm dígitos que somam 3
Edit: Removido lambda desnecessário
Edit: Golfe adicional (117 caracteres) ainda sem tokens
Matou o acesso direto ao getitem bacana do python Longer at 132 char
http://www.codeskulptor.org/#user34_uUl7SwOBJb_0.py
fonte
[]
Entretanto, o acesso à matriz não é permitido.only
.Python - 25 fichas
Para começar, tenho uma solução longa que é a implementação de uma das respostas no link no meu primeiro post.
n
é entrada.or
é equivalente a||
.fonte
JavaScript - 3 tokens
Teste-o no console do seu navegador:
fonte
JavaScript
não tem certeza sobre o token #
function mod3 (i) { return {'undefined':'100','0':'0'}[[0][i]][i.toString (3).split('').pop ()]}
ou se a saída para 0 puder ser 1;
function mod3 (i) { return '100'[i.toString (3).split('').pop ()]}
fonte
Tcl , 83 bytes
Experimente online!
fonte
proc T n {set n [expr [join [split [expr [join [split $n ""] +]] ""] +]];expr {$n in {0 3 6 9}}}
Experimente online!proc T n {expr {[expr [join [split [expr [join [split $n ""] +]] ""] +]] in {0 3 6 9}}}
Experimente online!