Tarefa
Dado um número inteiro positivo n
, a saída n+1
se n
é ímpar e a saída n-1
se n
é par.
Entrada
Um número inteiro positivo. Você pode assumir que o número inteiro está dentro da capacidade de manipulação do idioma.
Saída
Um número inteiro positivo, especificado acima.
Casos de teste
input output
1 2
2 1
3 4
4 3
5 6
6 5
7 8
8 7
313 314
314 313
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
Aplicam-se brechas padrão .
Respostas:
C, 20 bytes
Experimente online .
fonte
Stack Cats , 3 + 3 (
-n
) = 6 bytesExperimente online!
Precisa do
-n
sinalizador para trabalhar com entrada e saída numéricas.Explicação
O Stack Cats geralmente está longe de ser competitivo, por causa de seu conjunto limitado de comandos (todos eles são injeções e a maioria são involuções) e porque todo programa precisa ter simetria de espelho. No entanto, uma das involuções é alternar o bit menos significativo de um número, e podemos compensar o valor com negação unária que também existe. Felizmente, isso nos dá um programa simétrico, portanto não precisamos nos preocupar com mais nada:
Entrada e saída estão implícitas no início e no final do programa, porque receber e produzir saída não é uma operação reversível, portanto, não podem ser comandos.
fonte
perl -nle 'stuff'
tem mais 2 caracteres do queperl -e 'stuff'
, portanto, conta com mais 2 caracteres ". O mesmo(space)-n
acontece com 3 bytes a mais do que sem a bandeira.-e "code"
e depois inserir sinalizadores adicionais antes doe
, por exemplo-pe "code"
. Em seguida, o-p
sinalizador é de apenas um byte. No entanto, o Stack Cats não possui esse-e
argumento; portanto, você sempre precisa adicionar o total<sp>-n
ao comando e, portanto, tem três bytes.Montagem x86, 9 bytes (para entrada concorrente)
Todo mundo que está tentando esse desafio em idiomas de alto nível está perdendo a verdadeira diversão de manipular bits brutos. Há tantas variações sutis nas maneiras de fazer isso, é insano - e muito divertido de se pensar. Aqui estão algumas soluções que eu criei na linguagem assembly x86 de 32 bits.
Peço desculpas antecipadamente por não ser a resposta típica do código-golfe. Vou falar muito sobre o processo de otimização iterativa (por tamanho). Espero que seja interessante e educativo para um público maior, mas se você é do tipo TL; DR, não ficarei ofendido se você pular para o final.
A solução óbvia e eficiente é testar se o valor é ímpar ou par (o que pode ser feito com eficiência observando o bit menos significativo) e depois selecionar entre n + 1 ou n-1 de acordo. Supondo que a entrada seja passada como um parâmetro no
ECX
registro e o resultado seja retornado noEAX
registro, obtemos a seguinte função:(13 bytes)
Mas, para fins de código-golfe, essas
LEA
instruções não são boas, pois levam 3 bytes para codificar. Um simplesDEC
arranjo deECX
seria muito menor (apenas um byte), mas isso afeta os sinalizadores, por isso temos que ser um pouco inteligentes na maneira como organizamos o código. Podemos fazer o decremento primeiro e o teste impar / par em segundo , mas depois temos que inverter o resultado do teste ímpar / par.Além disso, podemos alterar a instrução de movimentação condicional para uma ramificação, o que pode tornar o código mais lento (dependendo da previsibilidade da ramificação - se a entrada alternar inconsistentemente entre ímpar e par, uma ramificação será mais lenta; se houver uma padrão, será mais rápido), o que nos salvará outro byte.
De fato, com esta revisão, toda a operação pode ser realizada no local, usando apenas um único registro. Isso é ótimo se você estiver incorporando esse código em algum lugar (e as chances são de que você seria, pois é muito curto).
(embutido: 7 bytes; como uma função: 10 bytes)
Mas e se você quisesse tornar isso uma função? Nenhuma convenção de chamada padrão usa o mesmo registro para passar parâmetros como para o valor de retorno; portanto, você precisa adicionar uma
MOV
instrução de registro no início ou no final da função. Isso praticamente não tem custo em velocidade, mas adiciona 2 bytes. (ARET
instrução também adiciona um byte e há alguma sobrecarga introduzida pela necessidade de fazer e retornar de uma chamada de função, o que significa que este é um exemplo em que o inlining produz um benefício de velocidade e tamanho, em vez de ser apenas uma velocidade clássica - no comércio). No total, escrito como uma função, esse código aumenta para 10 bytes.O que mais podemos fazer em 10 bytes? Se nos preocupamos com o desempenho (pelo menos, o desempenho previsível ), seria bom nos livrar desse ramo. Aqui está uma solução sem ramificação, com variação de bits do mesmo tamanho em bytes. A premissa básica é simples: usamos um XOR bit a bit para virar o último bit, convertendo um valor ímpar em um par e vice-versa. Mas há uma niggle - para entradas ímpares, que nos dá n-1 , enquanto para entradas pares, nos dá n + 1 - exatamente o oposto do que queremos. Portanto, para corrigir isso, executamos a operação com um valor negativo, lançando efetivamente o sinal.
(embutido: 7 bytes; como uma função: 10 bytes)
Muito liso; é difícil ver como isso pode ser melhorado. Uma coisa me chama a atenção, no entanto: essas duas
NEG
instruções de 2 bytes . Francamente, dois bytes parecem um byte a mais para codificar uma simples negação, mas é com esse conjunto de instruções que temos que trabalhar. Existem soluções alternativas? Certo! SeXOR
por -2, podemos substituir a segundaNEG
ação por umINC
rement:(embutido: 6 bytes; em função de 9 bytes)
Outra das peculiaridades do conjunto de instruções x86 é a
LEA
instrução multiuso , que pode executar um movimento de registro e registro, uma adição de registro e registro, compensando uma constante e dimensionando tudo em uma única instrução!(10 bytes)
A
AND
instrução é como aTEST
instrução que usamos anteriormente, em que ambos fazem AND e bit a bit de acordo, masAND
na verdade atualizam o operando de destino. ALEA
instrução então dimensiona isso em 2, adiciona o valor original de entrada e diminui em 1. Se o valor de entrada for ímpar, isso subtrai 1 (2 × 0 - 1 = -1) dele; se o valor de entrada for par, isso adiciona 1 (2 × 1 - 1 = 1) a ele.Essa é uma maneira muito rápida e eficiente de escrever o código, já que grande parte da execução pode ser feita no front-end, mas não nos compra muito na forma de bytes, pois são necessárias muitas para codificar um complexo
LEA
instrução. Esta versão também não funciona tão bem para fins de inclusão, pois requer que o valor da entrada original seja preservado como uma entrada daLEA
instrução. Portanto, com essa última tentativa de otimização, voltamos ao passado, sugerindo que talvez seja hora de parar.Portanto, para a entrada final competitiva, temos uma função de 9 bytes que pega o valor de entrada no
ECX
registro (uma convenção de chamada semi-padrão baseada em registro em x86 de 32 bits) e retorna o resultado noEAX
registro (como em todas as convenções de chamada x86):Pronto para montar com MASM; chamada de C como:
fonte
dec eax; xor eax, 1; inc eax
funcionaria e economizaria mais um byte?Geléia , 3 bytes
Experimente online!
Pseudo-código:
abs((-1)**n - n)
fonte
-1
.Python3,
2018 bytesBem simples. Primeiro calculamos n-1 e decidimos se devemos adicionar 2 ou não.
Se n for par -> n mod 2 será 0, adicionaremos 2 * 0 a n-1 , resultando em n-1 .
Se n for ímpar -> n mod 2 será 1, adicionaremos 2 * 1 a n-1 , resultando em n + 1 .
Prefiro uma explicação que fiz com o MS paint e um touchpad para laptop ...
fonte
Python, 16 bytes
Experimente online!
fonte
"x+-012~|&^()*/%"
.-(1^-x)
.MATL , 7 bytes
Isso evita qualquer operação aritmética. Experimente online!
Explicação
Considere a entrada
4
como um exemplo.fonte
Braingolf v0.1 ,
1110 bytesExperimente online! (O segundo argumento é o código de Braingolf, o terceiro argumento é a entrada)
Guardou um byte graças a Neil
Primeira resposta braingolf:
Explicação:
Braingolf v0.2 , 9 bytes [não concorrente]
Experimente online! (O segundo argumento é o código de Braingolf, o terceiro argumento é a entrada)
Veja acima a explicação. A única diferença está no Braingolf v0.2, o comportamento padrão dos operadores diádicos e a função do
,
modificador são revertidos, o que significa que as 2 vírgulas na resposta da v0.1 não são mais necessárias.No entanto, a v0.2 foi lançada após o desafio, portanto esta não é competitiva
fonte
.1<2,%?+:-
que eu acho que faz?-
para torná-lo executar a operação a maneira correta ao redor, caso em que ele ainda seria o mesmo comprimento que a minha resposta<
rodar1
abaixo da entrada, para que ele já estivesse no lugar correto.-
pilha, fica assim: os[n,1]
operadores braingolf são revertidos, portanto, eles executariam1 - n
, o que resultaria em-(n-1)
, onde o resultado desejado é simplesmenten-1
Cubix ,
109 bytesExperimente online
Explicação
Versão líquida
Os caracteres executados são
fonte
Python, 68 bytes
No espírito de uma abordagem única. O gráfico a seguir mostra a função (com pontos roxos representando os 10 primeiros casos). Em teoria, seria possível construir uma solução para essa questão com base na maioria (todas?) Das funções periódicas (por exemplo, sin, tan, sec). De fato, substituir cos por sec no código como está deve funcionar.
fonte
PHP, 15 bytes
fonte
;
é necessário e tentei usar um.php
arquivo e também ecoar diretamente no php (php7 cli.) Cada vez que me dizem que$argn
é uma variável indefinida.F
bandeira e um gasoduto:echo 42 | php -F script.php
.Javascript,
1712 bytesOutra abordagem, 10 bytes
roubados da resposta C (sssshhh)fonte
x=>x-(-1)**x
|0
? As duas soluções parecem converter automaticamente seqüências de caracteres em números. (Para a primeira solução, se você quiser decimais evitar, uso<input type=number>
.)JavaScript (ES6),
14131210 bytesTente
Original, 12 bytes
fonte
Python, 20 bytes
n%2or-1
retornará 1 se for ímpar, mas se for par,n%2
for "false" (0); portanto, retornará -1. Então simplesmente adicionamos isso an
.Solução anterior, 23 bytes
n%2
calcula o restante quandon
é dividido por 2. Se for par, isso retornará 0 e o elemento 0 nesta lista serán-1
. Se for ímpar, isso retornará 1 e o elemento 1 nesta lista serán+1
.fonte
lambda n:[n-1,n+1][n%2]
Retina , 21 bytes
Experimente online! Minha primeira resposta Retina com duas novas linhas à direita! Explicação: As duas primeiras linhas convertem de decimal em unário. A terceira e quarta linhas subtraem duas dos números pares. A última linha é convertida novamente em decimal, mas adiciona uma também.
fonte
05AB1E , 4 bytes
Experimente online!
fonte
Èi>ë<
é tão bonito;_;
.Cubix , 11 bytes
Experimente online!
Explicação
Versão líquida:
Os caracteres são executados na seguinte ordem:
fonte
Brain-Flak , 36 bytes
Experimente online!
Pessoalmente, estou muito feliz com esta resposta, porque é muito mais curta do que eu consideraria um método tradicional de resolver esse problema.
Explicação
O primeiro bit de código
converte a pilha de apenas
n
paraEntão, enquanto o topo da pilha é diferente de zero, diminuímos e mostramos o sinal do número abaixo
Nós removemos o zero e adicionamos os dois números restantes
fonte
Mathematica,
2219 bytesEconomizou 3 bytes graças a Greg Martin!
Resposta anterior, 22 bytes
Explicação (para resposta anterior)
O Mathematica possui o recurso interessante de que operações como aritmética passam automaticamente por listas.
Nesse caso, consideramos
Mod[#,2]
que retornará 0 ou 1, mas precisamos adicionar 1 porque as listas do Mathematica são indexadas em 1. Se for par , isso sai para 1, então#-1
é retornado. Se for estranho , esse valor é 2, então#+1
é retornado.fonte
[[0]]
capacidade:#-1[-1][[#~Mod~2]]&
.Sábio , 8 bytes
Experimente online!
Explicação
Se fosse o contrário, (decréscimo se ímpar, incremento se par), seria bem fácil fazer isso.
Nós viraríamos a última parte.
A correção aqui é que lançamos o último bit enquanto negativo. Os números negativos estão 1 fora da negação dos números,
~
portanto, isso cria um deslocamento para resolver o problema.Então, nós apenas pegamos o programa e o envolvemos
-
.fonte
Java 8,
1610 bytesJava 7,
3428 bytesBoring ports of @feersum's amazing C answer.
Try it here.
Old answers:
Java 8, 16 bytes
Java 7, 34 bytes
Explanation (of old Java 7 answer):
Try it here.
The answer above is a shorter variant of
int c(int n){return n%2<1?n-1:n+1;}
by getting rid of the space.fonte
Japt, 6 bytes
Try it online!
fonte
Python, 20 bytes
fonte
Befunge 93, 18 bytes
I am not done golfing this yet (I hope).
fonte
kv
(orjv
if it is strictly 1 or 0) instead of#v_
. Also, if you are using Try it online (and I recommend it), you can end the program with another&
(although it will take 60 seconds), so you can get rid of the@
on the first line if you use that. here is the full list of commands for Befunge-98, although they might not all be correctly implemented in TIO, like&
ending the program instead of reversing on EOF.Ruby, 12 bytes
fonte
R, 17 bytes
where
n=scan()
takes the digit value.fonte
-(-1)^n
rather than+(-1)^n
since we need to returnn-1
ifn
is evenCasio-Basic, 27 bytes
26 bytes for the function, +1 to enter
n
in the parameters box.fonte
C, 29 bytes
fonte
Jelly, 4 bytes
Try it online!
fonte
Batch, 20 bytes
Independently rediscovered @feersum's algorithm, honest!
fonte