Eu gosto de jogar golfe dc
, mas às vezes fico frustrado porque dc
não tem operações bit a bit.
Desafio
Fornecer quatro funções nomeadas que implementam o equivalente das operações c bit a bit &
, |
, ~
e ^
(bit a bit AND, OR, NOT e XOR). Cada função aceita dois operandos ( ~
usa apenas um) que são, pelo menos, números inteiros não assinados de 32 bits. Cada função retornará um número inteiro não assinado da mesma largura de bit que os operandos.
Restrição
Você só pode usar operações suportadas por dc
. Esses são:
+
-
*
/
Adição, subtração, multiplicação e divisão aritmética~
módulo (ou divmod, se o seu idioma suportar)^
exponenciação|
exponenciação modularv
raiz quadrada>
>=
==
!=
<=
<
operadores padrão de igualdade / desigualdade>>
<<
operadores de troca de bits.dc
não os possui, mas, como eles são implementados trivialmente em termos de divisão / multiplicação por potências de 2, então permitirei.
Estruturas de controle no dc
meu ser desajeitadamente construídas usando macros (recursivas) e (in) operações de igualdade. Você pode usar qualquer estrutura de controle interna que seu idioma tiver.
Você também pode usar operadores lógicos &&
||
!
, mesmo que eles não estejam diretamente disponíveis no dc
.
Você não deve usar os operadores bit a bit &
, |
, ~
e ^
ou quaisquer funções que trivialmente implementá-las.
Além disso, você não deve usar operadores ou funções integradas de conversão de cadeia de caracteres.
Considere também fornecer um programa de teste ou um trecho do compilador on-line (não incluído na pontuação do golfe) para ajudar a verificar sua resposta.
fonte
Respostas:
C, 134
O pré-processador C é muito divertido de abusar. Basicamente esta macro define as funções 3,
a
,o
, ex
, paraand
,or
e,xor
respectivamente. A única diferença no algoritmo para essas operações é o critério para definir o bit no resultado.not
é a funçãon
.Programa testador (demora muito, eu não gastei muito tempo otimizando, mas ele testa todos os casos de teste possíveis, além dos MAX_INT relacionados):
fonte
ised 76 bytes
O ised também não possui operações bit a bit - geralmente irritantes, mas agora bem-vindas, porque realmente precisamos implementá-las.
As funções serão armazenadas em slots de memória numerados (sem nomes detalhados).
Conversão de e para binário:
NÃO poderia ser,
@1{:$6::{1-$5::x}:}
mas obviamente é mais fácil subtrair:OU:
E:
XOR:
Isso nos levaria a 156 bytes (com novas linhas e ponto e vírgula). Um código de teste seria apenas (NOT, OR, AND, XOR em sucessão, encontrado sob os nomes $ 1, $ 2, $ 3, $ 4):
Mas é claro que OR e NOT são tudo o que realmente precisamos e as coisas podem ser simplificadas:
São 109 caracteres. Quando novas linhas e ponto e vírgula são ignorados, e com um pouco mais de golfe, temos 76 caracteres:
fonte
Nim
(537)(490)Nim Compiler 0.10.2
Eu tenho procurado uma razão para aprender nim, então aqui vamos nós.
Para o código de golfe, utilizei parâmetros variáveis e retornos implícitos. Os parâmetros variáveis, de acordo com a documentação, são menos eficientes na pilha. Pessoalmente, acho os retornos implícitos mais difíceis de ler e provavelmente os usariam apenas em procedimentos triviais.
Quanto aos algoritmos, eles são bastante simples. Para todas as operações, exceto NOT, comparamos cada bit e os comparamos manualmente com nossa tabela de verdade esperada. Defina cada bit conforme necessário ao longo do caminho em nossa variável de saída. Em Nim, resultado é o valor de retorno implícito.
Eu não tinha certeza se poderíamos usar OR e AND integrados para afirmar duas condições booleanas, de modo que o procedimento notZero foi colocado no lugar deles.Ainda procurando um método melhor ...
Aqui está a versão não esmagada e o equipamento de teste completo para rodar em sua própria máquina.
Se você deseja apenas executar algumas entradas, aqui está o caso de teste .
fonte
CJam, 71 bytes
Explicação
Suíte de teste
Esse código testa a execução de cada uma das minhas funções, e, ou, não, e xor 100 vezes com entradas não assinadas de 64 bits distribuídas uniformemente e compara o resultado com o produzido pelo operador interno. Devido ao uso gratuito do operador eval, é bastante lento e pode levar até um minuto com o intérprete online. Mas se tudo correr bem, a execução deve terminar sem saída, porque quaisquer discrepâncias encontradas são impressas.
fonte
Javascript
294267Conseguiu cortar mais alguns bytes com as sugestões de @ AlexA. E @ kennytm.
Funções:
exemplo:
resultado:
fonte
for
e substituí-lofunction B(n,m,t)
porB=(n,m,t)=>
. Da mesma forma para as outras funções.4*(1<<30)
para 4294967296 e-1>>>0
4294967295. ② évar
realmente necessário aqui? ③ você poderia escrever em(n,m)=>B(n,m,'a')
vez de(n,m)=>{return B(n,m,'a')}