Tâche
Étant donné un entier positif n
, la sortie n+1
if n
est impaire et la sortie n-1
if n
est paire.
Contribution
Un entier positif. Vous pouvez supposer que l'entier est dans la capacité de traitement de la langue.
Sortie
Un entier positif, spécifié ci-dessus.
Cas de test
input output
1 2
2 1
3 4
4 3
5 6
6 5
7 8
8 7
313 314
314 313
Notation
C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Des échappatoires standard s'appliquent.
Réponses:
C, 20 octets
Essayez-le en ligne .
la source
Chats empilés , 3 + 3 (
-n
) = 6 octetsEssayez-le en ligne!
A besoin de
-n
indicateur pour fonctionner avec l'entrée et la sortie numériques.Explication
Stack Cats est généralement loin d'être compétitif, en raison de son ensemble limité de commandes (qui sont toutes des injections, et la plupart sont des involutions) et parce que chaque programme doit avoir une symétrie miroir. Cependant, l'une des involutions est de basculer le bit le moins significatif d'un nombre, et nous pouvons compenser la valeur avec une négation unaire qui existe également. Heureusement, cela nous donne un programme symétrique, nous n'avons donc pas à nous soucier d'autre chose:
L'entrée et la sortie sont implicites au début et à la fin du programme, car prendre des entrées et produire des sorties n'est pas une opération réversible, donc elles ne peuvent pas être des commandes.
la source
perl -nle 'stuff'
est 2 caractères de plus queperl -e 'stuff'
, donc il compte pour 2 caractères supplémentaires ".(space)-n
Est donc 3 octets de plus que sans le drapeau.-e "code"
puis insérer des drapeaux supplémentaires avante
, par exemple-pe "code"
. Ensuite, le-p
drapeau n'est qu'un octet. Cependant, Stack Cats n'a pas un tel-e
argument, vous devez donc toujours ajouter le plein<sp>-n
à la commande, et donc c'est trois octets.Assemblage x86, 9 octets (pour entrée concurrente)
Tous ceux qui tentent ce défi dans des langages de haut niveau passent à côté du vrai plaisir de manipuler des bits bruts. Il y a tellement de variations subtiles sur les façons de le faire, c'est fou - et beaucoup de plaisir à penser. Voici quelques solutions que j'ai conçues en langage d'assemblage x86 32 bits.
Je m'excuse à l'avance que ce n'est pas la réponse typique de code-golf. Je vais beaucoup divaguer sur le processus de réflexion de l'optimisation itérative (pour la taille). J'espère que c'est intéressant et éducatif pour un public plus large, mais si vous êtes du type TL; DR, je ne serai pas offensé si vous sautez à la fin.
La solution évidente et efficace consiste à tester si la valeur est impaire ou paire (ce qui peut être fait efficacement en regardant le bit le moins significatif), puis à choisir entre n + 1 ou n − 1 en conséquence. En supposant que l'entrée est passée en tant que paramètre dans le
ECX
registre et que le résultat est retourné dans leEAX
registre, nous obtenons la fonction suivante:(13 octets)
Mais à des fins de code-golf, ces
LEA
instructions ne sont pas géniales, car elles nécessitent 3 octets pour être codées. Un simpleDEC
élément deECX
serait beaucoup plus court (un seul octet), mais cela affecte les indicateurs, nous devons donc être un peu intelligents dans la façon dont nous organisons le code. Nous pouvons faire le décrément en premier et le test impair / pair en second , mais ensuite nous devons inverser le résultat du test impair / pair.De plus, nous pouvons changer l'instruction de déplacement conditionnel en une branche, ce qui peut ralentir le code (selon la prévisibilité de la branche - si l'entrée alterne de manière incohérente entre impair et pair, une branche sera plus lente; s'il y a un modèle, il sera plus rapide), ce qui nous fera économiser un autre octet.
En fait, avec cette révision, toute l'opération peut être effectuée sur place, en utilisant un seul registre. C'est génial si vous insérez ce code quelque part (et les chances sont, vous le seriez, car il est si court).
(en ligne: 7 octets; en fonction: 10 octets)
Et si vous vouliez en faire une fonction? Aucune convention d'appel standard n'utilise le même registre pour transmettre les paramètres que pour la valeur de retour, vous devez donc ajouter une
MOV
instruction registre-registre au début ou à la fin de la fonction. Cela n'a pratiquement aucun coût en vitesse, mais cela ajoute 2 octets. (L'RET
instruction ajoute également un octet, et il y a un certain surcoût introduit par la nécessité de faire et de revenir à partir d'un appel de fonction, ce qui signifie que c'est un exemple où l'inline produit à la fois un avantage de vitesse et de taille, plutôt que d'être simplement une vitesse classique -pour l'espace.) En tout, écrit en fonction, ce code gonfle à 10 octets.Que pouvons-nous faire d'autre en 10 octets? Si nous nous soucions des performances (au moins, des performances prévisibles ), ce serait bien de se débarrasser de cette branche. Voici une solution de branchement de bits sans branche qui a la même taille en octets. Le principe de base est simple: nous utilisons un XOR au niveau du bit pour inverser le dernier bit, en convertissant une valeur impaire en paire, et vice versa. Mais il y a un inconvénient - pour les entrées impaires, qui nous donne n-1 , tandis que pour les entrées paires, il nous donne n + 1 - exactement à l'opposé de ce que nous voulons. Donc, pour résoudre ce problème, nous effectuons l'opération sur une valeur négative, inversant efficacement le signe.
(en ligne: 7 octets; en fonction: 10 octets)
Assez lisse; il est difficile de voir comment cela peut être amélioré. Une chose attire mon attention, cependant: ces deux
NEG
instructions de 2 octets . Franchement, deux octets semblent être un octet de trop pour encoder une simple négation, mais c'est l'ensemble d'instructions avec lequel nous devons travailler. Existe-t-il des solutions de contournement? Sûr! Si onXOR
par -2, on peut remplacer la deuxièmeNEG
ation par unINC
rement:(en ligne: 6 octets; en fonction: 9 octets)
Une autre des bizarreries du jeu d'instructions x86 est l'
LEA
instruction polyvalente , qui peut effectuer un déplacement registre-registre, une addition registre-registre, un décalage par une constante et une mise à l'échelle en une seule instruction!(10 octets)
L'
AND
instruction est semblable à l'TEST
instruction que nous avons utilisée précédemment, dans la mesure où les deux effectuent un ET au niveau du bit et définissent les indicateurs en conséquence, maisAND
mettent à jour l'opérande de destination. L'LEA
instruction les met ensuite à l'échelle 2, ajoute la valeur d'entrée d'origine et diminue de 1. Si la valeur d'entrée était impaire, cela en soustrait 1 (2 × 0 - 1 = -1); si la valeur d'entrée était paire, cela ajoute 1 (2 × 1 - 1 = 1).C'est un moyen très rapide et efficace d'écrire le code, car une grande partie de l'exécution peut être effectuée dans le front-end, mais cela n'achète pas beaucoup d'octets, car il en faut tellement pour coder un complexe
LEA
instruction. Cette version ne fonctionne pas aussi bien à des fins d'inline, car elle nécessite que la valeur d'entrée d'origine soit préservée en tant qu'entrée de l'LEA
instruction. Donc, avec cette dernière tentative d'optimisation, nous avons en fait reculé, ce qui suggère qu'il pourrait être temps de s'arrêter.Ainsi, pour l'entrée finale en compétition, nous avons une fonction de 9 octets qui prend la valeur d'entrée dans le
ECX
registre (une convention d'appel basée sur un registre semi-standard sur 32 bits x86), et renvoie le résultat dans leEAX
registre (comme avec toutes les conventions d'appel x86):Prêt à assembler avec MASM; appeler de C comme:
la source
dec eax; xor eax, 1; inc eax
et économiserait-il un octet de plus?Gelée , 3 octets
Essayez-le en ligne!
Pseudocode:
abs((-1)**n - n)
la source
-1
.Python3,
2018 octetsAssez simple. Nous calculons d'abord n-1 et décidons d'ajouter ou non 2.
Si n est pair -> n mod 2 sera 0, donc nous ajouterons 2 * 0 à n-1 , résultant en n-1 .
Si n est impair -> n mod 2 sera 1, donc nous ajouterons 2 * 1 à n-1 , résultant en n + 1 .
Je préfère une explication que j'ai faite avec de la peinture MS et un pavé tactile d'ordinateur portable ...
la source
Python, 16 octets
Essayez-le en ligne!
la source
"x+-012~|&^()*/%"
.-(1^-x)
.MATL , 7 octets
Cela évite toute opération arithmétique. Essayez-le en ligne!
Explication
Considérez la saisie
4
comme exemple.la source
Braingolf v0.1 ,
1110 octetsEssayez-le en ligne! (Le deuxième argument est le code Braingolf, le troisième argument est l'entrée)
Un octet enregistré grâce à Neil
Première réponse de braingolf en compétition: D
Explication:
Braingolf v0.2 , 9 octets [non concurrent]
Essayez-le en ligne! (Le deuxième argument est le code Braingolf, le troisième argument est l'entrée)
Voir ci-dessus pour l'explication. Seule différence dans Braingolf v0.2, le comportement par défaut des opérateurs diadiques et la fonction du
,
modificateur sont inversés, ce qui signifie que les 2 virgules dans la réponse v0.1 ne sont plus nécessaires.Cependant la v0.2 a été publiée après le défi, donc celui-ci n'est pas en compétition
la source
.1<2,%?+:-
ce que je pense qu'il fait?-
pour que l'opération soit effectuée dans le bon sens, auquel cas ce serait toujours la même longueur que ma réponse<
à1
ce que le fasse pivoter sous l'entrée, de sorte qu'il soit déjà au bon endroit.-
pile, cela ressemble à ceci: les[n,1]
opérateurs braingolf sont inversés, donc cela fonctionnerait1 - n
, ce qui se traduirait par-(n-1)
, alors que le résultat souhaité est simplementn-1
Cubix ,
109 octetsEssayez-le en ligne
Explication
Version nette
Les caractères exécutés sont
la source
Python, 68 octets
Dans l'esprit d'une approche unique. Le graphique suivant montre la fonction (avec des points violets représentant les 10 premiers cas). Il devrait en théorie être possible de construire une solution pour cette question basée sur la plupart (toutes?) Des fonctions périodiques (par exemple sin, tan, sec). En fait, remplacer cos pour sec dans le code tel quel devrait fonctionner.
la source
PHP, 15 octets
la source
;
est requis, et j'ai essayé d'utiliser un.php
fichier et aussi d'écho directement dans php (php7 cli.) Chaque fois, on me dit que$argn
c'est une variable non définie.F
drapeau et d' un pipeline:echo 42 | php -F script.php
.Javascript,
1712 octetsUne autre approche, 10 octets
volés de la réponse C (sssshhh)la source
x=>x-(-1)**x
|0
? Les deux solutions semblent devoir convertir automatiquement les chaînes en nombres. (Pour la première solution, si vous voulez éviter les décimales, utilisez<input type=number>
.)JavaScript (ES6),
14131210 octetsEssayez-le
Original, 12 octets
la source
Python, 20 octets
n%2or-1
renverra 1 s'il est impair, mais s'il est pair,n%2
est "faux" (0), donc il renvoie plutôt -1. Ensuite, nous ajoutons simplement cela àn
.Solution précédente, 23 octets
n%2
calcule le reste lorsquen
est divisé par 2. S'il est pair, cela renvoie 0, et l'élément 0 dans cette liste estn-1
. Si c'est impair, cela renvoie 1, et l'élément 1 de cette liste estn+1
.la source
lambda n:[n-1,n+1][n%2]
Rétine , 21 octets
Essayez-le en ligne! Ma première réponse Retina avec deux nouvelles lignes de queue! Explication: Les deux premières lignes sont converties de décimales en unaires. Les troisième et quatrième lignes soustraient deux des nombres pairs. La dernière ligne redevient décimale, mais en ajoute une aussi.
la source
05AB1E , 4 octets
Essayez-le en ligne!
la source
Èi>ë<
c'est tellement joli;_;
.Cubix , 11 octets
Essayez-le en ligne!
Explication
Version nette:
Les caractères sont exécutés dans l'ordre suivant:
la source
Brain-Flak , 36 octets
Essayez-le en ligne!
Personnellement, je suis vraiment satisfait de cette réponse car elle est beaucoup plus courte que ce que je considérerais comme une méthode traditionnelle pour résoudre ce problème.
Explication
Le premier morceau de code
convertit la pile de juste
n
enEnsuite, alors que le haut de la pile est non nul, nous le décrémentons et retournons le signe du nombre en dessous
Nous supprimons le zéro et ajoutons les deux nombres restants
la source
Mathematica,
2219 octetsEnregistré 3 octets grâce à Greg Martin!
Réponse précédente, 22 octets
Explication (pour la réponse précédente)
Mathematica a la fonctionnalité intéressante que les opérations telles que l'arithmétique passent automatiquement sur les listes.
Dans ce cas, nous prenons
Mod[#,2]
qui retournera 0 ou 1, mais nous devons ajouter 1 car les listes Mathematica sont indexées sur 1. Si c'est pair , cela revient à 1, donc#-1
est retourné. Si c'est étrange , cela revient à 2, donc#+1
est retourné.la source
[[0]]
capacité:#-1[-1][[#~Mod~2]]&
.Sage , 8 octets
Essayez-le en ligne!
Explication
Si c'était l'inverse, (décrémenter si impair, incrémenter si pair), ce serait assez facile à faire.
Nous retournerions simplement le dernier morceau.
Le correctif ici est que nous inversons le dernier bit tout en étant négatif. Les nombres négatifs sont à 1 de la négation des nombres
~
, ce qui crée un décalage résolvant le problème.Nous retirons donc le programme et l'enveloppons
-
.la source
Java 8,
1610 octetsJava 7,
3428 octetsPorts ennuyeux de la réponse C étonnante de @feersum .
Essayez-le ici.
Anciennes réponses:
Java 8, 16 octets
Java 7, 34 octets
Explication (de l'ancienne réponse Java 7):
Essayez-le ici.
La réponse ci-dessus est une variante plus courte de
int c(int n){return n%2<1?n-1:n+1;}
l'élimination de l'espace.la source
Japt , 6 octets
Essayez-le en ligne!
la source
Python, 20 octets
la source
Befunge 93 , 18 octets
Je n'ai pas encore fini de jouer au golf (j'espère).
la source
kv
(oujv
s'il est strictement 1 ou 0) au lieu de#v_
. De plus, si vous utilisez Try it online (et je le recommande), vous pouvez terminer le programme avec un autre&
(bien que cela prenne 60 secondes), vous pouvez donc vous débarrasser de la@
sur la première ligne si vous l'utilisez. voici la liste complète des commandes pour Befunge-98 , bien qu'elles ne soient pas toutes correctement implémentées dans TIO, comme&
mettre fin au programme au lieu d'inverser sur EOF.Rubis, 12 octets
la source
R, 17 octets
où
n=scan()
prend la valeur numérique.la source
-(-1)^n
plutôt que+(-1)^n
puisque nous devons revenirn-1
sin
c'est pairCasio-Basic, 27 octets
26 octets pour la fonction, +1 à saisir
n
dans la case des paramètres.la source
C, 29 octets
la source
Gelée , 4 octets
Essayez-le en ligne!
la source
Lot, 20 octets
Redécouvert indépendamment l'algorithme de @ feersum, honnête!
la source