Este é um CMC (mini desafio de bate-papo) que eu publiquei em nossa sala de chat, The Ninteenth Byte , um pouco atrás.
O desafio
Dado um número inteiro positivo x
, dependendo dos últimos 2 bits de x
, faça o seguinte:
x & 3 == 0: 0
x & 3 == 1: x + x
x & 3 == 2: x * x
x & 3 == 3: x ^ x (exponentiation)
Entrada / Saída
Single Integer -> Single Integer
Uma nova linha à direita é permitida na saída. Nenhum outro espaço em branco é permitido.
Casos de teste
input output
1 2
2 4
3 27
4 0
5 10
6 36
7 823543
8 0
9 18
10 100
11 285311670611
12 0
Este é um desafio do código-golfe , portanto o código mais curto vence!
0
caso sejax + 2
, vendo como os outros sãox * 2
,x ^ 2
ex ^^ 2
(tetração)? : Px ^ x
)? 32 bits já não é suficiente para o caso de teste11
e 64 bits não é suficiente para o caso de teste19
.Respostas:
Geléia , 8 bytes
Experimente online!
Como funciona
Em primeiro lugar, observe que
x&3
é equivalente ax%4
, onde%
está o módulo. Então, como o Jelly usa indexação modular (a[n] == a[n+len(a)]
), não precisamos nem lidar com isso.Então:
x%4==0
, retornarx_x
(subtração) (por consistência);x%4==1
retornarx+x
;x%4==2
, retornarx×x
(multiplicação);x%4==3
retornarx*x
(exponenciação)Observe que o Jelly usa a indexação 1, então a subtração
"_"
é movida para o final.fonte
wc --bytes
).Python , 30 bytes
Experimente online!
fonte
CJam , 12 bytes
Experimente online!
Explicação
Executa uma das seguintes operações, dependendo
x
do valor do mod 4 (o mod 4 é equivalente a AND 3).fonte
Mathematica 25 Bytes
Guardado 4 bytes graças a @MartinEnder
fonte
Pitão, 8 bytes
Intérprete
fonte
v
vez de.v
..v
que não podia acessarQ
... Aparentemente, fui derrotado em Pyth. +1 para você.v
que tem escopo local,.v
apenas avalia uma expressão."0y*^
poderia ser"-+*^
.Ruby , 26 bytes
Experimente online!
fonte
PHP, 37 bytes
Versão Online
PHP, 47 bytes
Versão Online
Funções BC Math
fonte
Haskell,
2827 bytesExperimente online!
Editar: Obrigado a Ørjan Johansen por 1 byte.
fonte
cycle
.JavaScript, 24 bytes
Experimente online!
fonte
Bytes C, 63 ou 62
-1 byte se macros são permitidas, assumindo que
x
não seja uma expressão como3+5
(já que isso atrapalharia a precedência):fonte
cast to incomplete array type "int[]" is not allowed
Compiler disseerror C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
; ALÉM DISSO! onde está int f (int x)? o código é realmente pelo menos 8 bytes mais longo; Também é muito lento e ineficiente, como ele avalia everytning - não repita isso IRL)(int[])
sintaxe para esta situação. 2)f(x)
é perfeitamente legal C89. Eu não especifiquei o padrão. 3) Trata-se do tamanho do código, não da eficiência. E 4) Se você vai ser condescendente, pelo menos use um compilador real e / ou verifique seus fatos.Java 7, 75 bytes
Embora seja válido de acordo com as regras,
long
tenha 64 bits, falha nos casos de teste de exponenciação19^19
acima e acima. Para corrigir isso, podemos usar umaBigDecimal
abordagem:148146 bytesExplicação (da abordagem BigDecimal):
Código do teste:
Experimente aqui.
Saída:
fonte
Montador x86, sintaxe Intel, 192 bytes
O exemplo pretende obter a velocidade de trabalho mais rápida. Is é um programa ou parte do programa que utiliza a convenção de chamada rápida. Ele assume a variável de entrada
x
no registroeax
e retorna o resultado também emeax
. A idéia básica é evitar o uso de saltos condicionais, como em alguns exemplos aqui. Além disso, não é para avaliar tudo (como no exemplo C com matrizes), mas para usar matriz de ponteiros para funções e fazer saltos incondicionais mais rápidos (jmp / call) como um analógico otimizado "Alternar linguagem C () - caso ..". Essa técnica também pode ser útil em tipos de autômatos finita - como emuladores de processadores, executores e assim por diante.Upd: para x64, use "r" nos nomes dos registradores, em vez de "e" (por exemplo, em
rax
vez deeax
, emrcx
vez deecx
). O tamanho não será alterado e usará palavras não assinadas de 64 bits.fonte
C #, 39 bytes
Explicação
Observe aquilo:
(xx, x + x, x * x, x ^ x) == (0, 2, x, x ^ (x-1)) * x
A solução cria uma matriz, indexa-a e multiplica o resultado por
x
:Versões alternativas:
(39B, toda multiplicação feita na matriz,
x%4
substituix&3
)(39B, o mesmo que a resposta da @ MetaColon, mas
x%2*2*x
substituindox*x%4<1?0:2
)fonte
Na verdade , 12 bytes
Experimente online!
Explicação:
fonte
05AB1E , 10 bytes
Usa a codificação 05AB1E . Experimente online!
fonte
J , 14 bytes
Experimente online!
fonte
(4&|{-,+,*,^)~
funciona bem, mas é a mesma contagem de bytes devido a parens, embora seja um pouco mais óbvio o que faz.Oásis , 25 bytes
Experimente online!
Como funciona
Observe que
x&3
é equivalente ax%4
, onde%
está o módulo.Oasis é uma linguagem baseada em pilha em que cada caractere é um comando.
fonte
Cubix , 29 bytes
Experimente online!
A explicação será adicionada em breve ...
fonte
C #, 42 bytes
Na verdade, é C # normal, mas como você não pode executá-lo como um programa inteiro e precisa digitá-lo no interativo, acho que você pode chamá-lo de C # interativo .
Explicação :
Não sei dizer se é a variante mais curta, todas as sugestões são bem-vindas.
fonte
x
não está definido. Isso faz dele um trecho, não um programa completo.x
" significa que você está recebendox
um método de entrada padrão (ou seja, função ou programa).PHP, 36 bytes
fonte
dc, 27
Eu nunca tive a oportunidade de usar matrizes em DC antes:
Experimente online .
fonte
Groovy, 26 bytes
Experimente online!
fonte
C, 115 bytes
Exemplo é uma função
int f(int x)
Pretende obter a velocidade de trabalho mais rápida, pois mantém a CPU longe de saltos condicionais. E esta é apenas a maneira correta de otimização de velocidade para esta tarefa. Além disso, ele tenta não avaliar tudo, como no exemplo da matriz C,
return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
mas usar sabiamente a matriz de ponteiros para funções, a fim de fazer saltos incondicionais muito mais rápidos (jmp / call) com aritmética de endereços muito mais rápida, como uma versão otimizada de " switch () - caso .. ". Essa técnica também pode ser útil em vários tipos de autômatos finita - como emuladores de processadores, executores, analisadores de fluxo de comando e assim por diante - onde a velocidade importa e o código comoswitch(x%4) case(0):... case(1):...
é inadequado porque produz várias instruções cmp / jnz; e essas são operações caras para a CPUO programa de teste mais simples e mais curto (em condições padrão) para o caso será o seguinte:
Ele adicionará apenas 12 bytes de carga útil e totalizará nosso tamanho para 127 bytes;
Mas é melhor dizer ao vinculador para usar a
f
função como um ponto de entrada, em vez demain
. É assim que, se pretendermos obter o binário de trabalho mais rápido possível para esta tarefa a partir do código mais curto ;-) Isso acontece porque a biblioteca C adiciona código extra de inicialização / desligamento antes de chamar sua função main ().O código é compilado no MSVS Community 2015 sem truques e problemas e produz resultados corretos. Não testei com o gcc, mas tenho certeza de que também funcionará bem.
fonte
R,
4742 bytesAplica-se a função de
-
,+
,*
, ou^
com base no módulo dex
ax
ex
.-
é a única coisa (um pouco) inteligente, poisx-x
sempre é 0.R, 33 bytes
O mesmo método que outras pessoas usam. Embora seja mais curto, não gosto tanto.
fonte
Pyth , 12 bytes
Experimente online!
Como funciona
Em primeiro lugar, observe que
x&3
é equivalente ax%4
, onde%
está o módulo. Então, como Pyth usa indexação modular (a[n] == a[n+len(a)]
), não precisamos nem lidar com isso.Então:
x%4==0
retornarx-x
(por consistência);x%4==1
retornarx+x
;x%4==2
retornarx*x
;x%4==3
retornarx^x
.Mais sobre notação polonesa: Wikipedia (muito ruim se você estiver na Turquia).
fonte
Japonês , 13 bytes
Experimente online!
Ele usa o mesmo método que as outras respostas de avaliação, exceto que o programa
-U
simplesmente negaU
, então usamos^
(XOR bit a bit).fonte
Vim, 50 bytes
Aqui,
^V
representa aCtrl+V
,^R
representaCtrl-R
e^[
representa oesc
chaveFunciona construindo primeiro a expressão e depois deixando
bc
avaliá-la. Espera a entrada na primeira linha em um buffer vazio.Explicação:
fonte
^V
apenas cola o que eu tenho na minha área de transferência, em vez do número ...D
vez ded$
Pitão, 9 bytes
Suíte de teste
Nada de especial está acontecendo aqui, apenas calcule os quatro valores e selecione um com indexação modular.
fonte
Lote, 135 bytes
Eu esperava criar a exponenciação construindo e avaliando uma cadeia de caracteres do formulário,
[0+...+0, 2+...+2, x+...+x, x*...*x]
dependendo dos dois últimos bits,x
mas infelizmente o código para selecionar a operação demorou muito para ser expresso, porque eu não poderia usar*
comofor
parâmetro, mas estava pelo menos, capaz de usar alguns truques de queda para jogar fora alguns bytes.fonte
Retina , 87 bytes
Experimente online! (O link inclui o conjunto de testes.)
Explicação: As duas primeiras linhas convertem a entrada em unária e a duplicam (então agora temos
x;x
). As próximas duas linhas procuram umx&3
de um0
ou1
e mudamx;x
parax;0
oux;2
apropriadamente. As próximas duas linhas procuramx&3==3
e mudamx;x
para ox;x;x;...;x;1;x
(x
x
s). Isto significa que temos oux;0
,x;2
,x;x
oux;...;x
e permanece a tudo multiplicar juntos e converter de volta para decimal. (O código de multiplicação é baseado no wiki da Retina, mas foi alterado para lidar com a multiplicação por zero.)fonte