J'essaie de jouer au golf en C ++. Est-il possible de raccourcir cette condition?
X > 3 & X - Y > 1
(En plus de supprimer les espaces, bien sûr.)
Donc, X
c'est au moins 4
mais X >= Y + 2
.
X
et Y
sont des entiers dans l'intervalle [0,5].
J'ai essayé de trouver une formule au niveau du bit mais j'ai échoué.
code-golf
number
tips
c++
code-golf
popularity-contest
obfuscation
code-golf
c
code-golf
board-game
hexagonal-grid
code-golf
game
grid
code-golf
number
permutations
popularity-contest
math
graphical-output
number-theory
king-of-the-hill
code-challenge
compression
code-challenge
fastest-code
code-golf
math
ascii-art
animation
code-golf
popularity-contest
generation
counting
fastest-code
fastest-code
popularity-contest
image-processing
king-of-the-hill
code-golf
conversion
binary-tree
code-golf
math
number
rational-numbers
division
code-golf
restricted-source
hashing
atomic-code-golf
logic-gates
code-golf
function
code-challenge
puzzle-solver
ai-player
test-battery
popularity-contest
music
compression
code-golf
number
stack
atomic-code-golf
logic-gates
ascii-art
popularity-contest
code-golf
date
grid
code-challenge
game
code-golf
parsing
code-golf
math
geometry
sequence
popularity-contest
code-trolling
code-golf
string
restricted-source
code-golf
quine
king-of-the-hill
code-golf
math
code-golf
simulation
code-golf
ascii-art
code-challenge
sorting
optimization
Cristy
la source
la source
x*x-y*y>9
. C'est le même nombre de caractères, mais vous pourrez peut-être trouver un raccourci / une alternative à cette approche. Juste une autre façon de voir les choses.3<x>y+1
y+3<2^x
, mais la priorité d'opérateur de C est différente. Je parie qu'il existe une solution à 7 caractères, il suffit de modifier mon script pour gérer la priorité de l'opérateur C à la placeRéponses:
Après avoir forcé brutalement toutes les combinaisons utiles de symboles de moins de 9 caractères, j'ai trouvé qu'il n'y avait pas de solution plus petite que
x>3&x-y>1
.Pour le plaisir, voici quelques solutions géniales à 9 caractères trouvées par le forceur brut:
Le forçage brutal a été effectué en Python, créant des arbres de syntaxe descendants où aucun enfant ne peut avoir un opérateur de priorité inférieure à son parent selon les règles de C. Pour réduire les possibilités, je n'autorisais que des littéraux à un chiffre, et aucun opérateur binaire ne peut avoir deux enfants constants. Je ne pouvais pas penser à une solution qui aurait un littéral à deux chiffres, ou une qui construit une constante à l'aide d'un opérateur binaire. Ensuite, chaque expression a été évaluée pour [0, 5] et si elle correspond, elle est imprimée.
la source
x*x-y*y>9
. Peut-être devriez-vous également essayer des constantes à plusieurs chiffres? (aussi, parenthèses)xy
et 2 doivent être les parenthèses, ne laissant que 4 caractères de logique. Je vais essayer d'exécuter le forceur brut avec des constantes à 2 chiffres, mais je ne pense vraiment pas que cela donnera un résultat.(a#b)$c
c'est le format. Surabc
deux doivent êtrex
ety
, laissant 3 emplacements possibles pour[0-9xy]
, et un seul flip dexy
. Seuls les opérateurs intéressants le sont+-*/&|^<>
, donc 9 possibilités. Ainsi, les possibilités totales sont inférieures à 3 * 12 * 2 * 9 * 9 <5832.En réponse aux (super) golfs
orlp
:La correction doit venir en premier
int16_t
- donc il y a l'hypothèse. Probablement, les décalages de bits auraient besoin de +16 pour les entiers 32 bits (c'est à peu près partout ces jours-ci). Cela en fait un personnage plus grand ...La seule façon "correcte" de l'écrire, c'est l'OMI
(x>3) && (x > y+1)
, qui peut être jouée jusqu'àx>3&x>y+1
(9 caractères).(Vous devez vraiment prendre en compte la possibilité de types non signés (plus grands), d'autant plus que unsigned-ness est "contagieux" dans les expressions C ++. Je suppose que "réparer" qu'avec les
static_cast<>
s appropriés irait à l'encontre du but ...)METTRE À JOUR
Avec les tests suivants, j'ai pu déterminer quelles expressions fonctionnent réellement de manière fiable:
Live On Coliru
Sortie sur coliru, ici pour référence:
Résumé
Étant donné qu'il s'agit du «coût» de la répétition des éléments de code source, vous pouvez utiliser une table de recherche. Vous pouvez "masquer" la table de recherche, il est donc possible
ou
Bien sûr, vous pouvez être pédant et obtus et renommer la LUT
Donc ma "version" est ... 7 caractères . (Ou faites si c'est une fonction et
L(x,y)
est encore plus courte).Ou, plus important encore: correct, testable et maintenable.
la source