Estoy tratando de jugar golf en C ++. ¿Es posible acortar esta condición?
X > 3 & X - Y > 1
(Además de eliminar espacios en blanco, por supuesto).
Entonces, X
es al menos 4
pero X >= Y + 2
.
X
y Y
son enteros en el intervalo [0,5].
He tratado de encontrar alguna fórmula bit a bit pero fallé.
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
fuente
fuente
x*x-y*y>9
. Es la misma cantidad de caracteres, pero es posible que pueda encontrar un atajo / alternativa a ese enfoque. Solo otra forma de verlo.3<x>y+1
y+3<2^x
, pero la precedencia del operador de C es diferente. Apuesto a que hay una solución de 7 caracteres, solo tengo que modificar mi script para lidiar con la precedencia del operador CRespuestas:
Después de forzar de forma bruta cada combinación útil de símbolos de menos de 9 caracteres, descubrí que no hay una solución más pequeña que
x>3&x-y>1
.Por diversión, aquí hay algunas soluciones funky de 9 personajes que encontró el forzador bruto:
El forzamiento bruto se realizó en Python, construyendo árboles de sintaxis de arriba hacia abajo donde ningún niño puede tener un operador con una prioridad inferior a su padre de acuerdo con las reglas de C. Para reducir las posibilidades, solo permití literales de un solo dígito, y ningún operador binario puede tener dos hijos constantes. No podría pensar en ninguna solución que tuviera un literal de dos dígitos, o una que construya una constante usando un operador binario. Luego, cada expresión se evaluó para [0, 5] y si coincide se imprime.
fuente
x*x-y*y>9
. ¿Quizás deberías probar también las constantes de varios dígitos? (también, paréntesis)xy
y 2 deben ser paréntesis, dejando solo 4 caracteres de lógica. Intentaré ejecutar el forzador bruto con constantes de 2 dígitos, pero realmente no creo que dé un resultado.(a#b)$c
es el formato. Deabc
dos deben serx
yy
, dejando 3 ubicaciones posibles para[0-9xy]
, y solo una vuelta dexy
. Solo los operadores interesantes son+-*/&|^<>
, entonces 9 posibilidades. Por lo tanto, las posibilidades totales son inferiores a 3 * 12 * 2 * 9 * 9 <5832.En respuesta a los (impresionantes) campos de golf por
orlp
:La corrección debe ser lo primero
int16_t
- por lo que no es el supuesto. Probablemente los cambios de bits necesitarían +16 para entradas de 32 bits (eso es prácticamente en todas partes en estos días). Esto los convierte en un personaje más grande ...La única forma "correcta" de escribirlo, IMO es
(x>3) && (x > y+1)
, que puede reducirse ax>3&x>y+1
(9 caracteres).(Realmente debe tener en cuenta la posibilidad de tipos sin signo (más grandes), especialmente porque la falta de firma es "contagiosa" en las expresiones de C ++. Supongo que "arreglar" eso con los
static_cast<>
s apropiados sería un poco frustrante para el propósito ...)ACTUALIZAR
Con las siguientes pruebas he podido averiguar qué expresiones funcionan realmente de manera confiable:
Live On Coliru
Salida en coliru, aquí para referencia:
Resumen
Dado que se trata del "costo" de repetir elementos de código fuente, puede usar una tabla de búsqueda. Puede "ocultar" la tabla de búsqueda, por lo que es
o
Por supuesto, puedes ser pedante y obtuso y renombrar el LUT
Entonces mi "versión" es ... 7 caracteres . (O hacer si es una función y
L(x,y)
es aún más corta).O, lo que es más importante: correcto, comprobable y mantenible.
fuente