El desafío: definir x
de tal manera que la expresión (x == x+2)
se evalúe como verdadera.
Etiqueté la pregunta con C, pero las respuestas en otros idiomas son bienvenidas, siempre que sean creativas o resalten un aspecto interesante del lenguaje.
Tengo la intención de aceptar una solución C, pero otros idiomas pueden obtener mi voto.
- Correcto: funciona en implementaciones que cumplen con los estándares. Excepción: asumir una implementación de los tipos básicos, si es una implementación común (por ejemplo, suponiendo que
int
es un complemento de 32 bits 2) está bien. - Simple: debe ser pequeño, usar funciones básicas del lenguaje.
- Interesante, es subjetivo, lo admito. Tengo algunos ejemplos de lo que considero interesante, pero no quiero dar pistas. Actualización : Evitar el preprocesador es interesante.
- Rápido: se aceptará la primera buena respuesta.
Después de obtener 60 respuestas (nunca esperé tal anticipación), puede ser bueno resumirlas.
Las 60 respuestas se dividen en 7 grupos, 3 de los cuales se pueden implementar en C, el resto en otros idiomas:
- El preprocesador C.
#define x 2|0
fue sugerido, pero hay muchas otras posibilidades. - Punto flotante. Grandes números, infinito
o NaN,todo funciona. Puntero aritmético. Un puntero a una estructura enorme hace que se agregue 2 para ajustarse.
El resto no funciona con C:
- Sobrecarga del operador: una
+
que no agrega o una==
que siempre devuelve verdadero. - Realizar
x
una llamada de función (algunos idiomas lo permiten sin lax()
sintaxis). Entonces puede devolver algo más cada vez. - Un tipo de datos de un bit. Entonces
x == x+2 (mod 2)
. - Cambio
2
: algunos idiomas le permiten asignarlo0
.
math
arithmetic
c
ugoren
fuente
fuente
4. Quick
? ¿Quiere decir "Quien conoce uno y tiene la suerte de leer esta pregunta primero"?add to Set
por la biblioteca estándar, sin redefinirse+
, no encaja en estas 7 categorías, en mi humilde opinión.Respuestas:
Salidas 1.
Enlace: http://ideone.com/dL6A5
fuente
float x=1./0
Es un poco más corto y quizás más elegante. Pero de todos modos, esta es seguramente la primera buena respuesta.float x=1e20
sería suficienteFortran IV:
Después de esto, cada constante 2 en el programa es cero. Confía en mí, he hecho esto (ok, hace 25 años)
fuente
Esto parece funcionar:
Básicamente, la expresión se expande a
(2|0 == 2|(0+2))
. Es un buen ejemplo de por qué uno debería usar paréntesis al definir macros.fuente
2|(0+2)
serlo1
?|
es bit a bit O ;||
es lógico OR.Brainfuck
Esto, por supuesto, estira un poco "evaluar a verdadero" un poco, porque en Brainfuck nada realmente se evalúa a nada, solo se manipula una cinta. Pero si ahora agregas tu expresión
el programa es equivalente a
(porque todo menos
<>+-[],.
es un comentario). Lo que no hace más que incrementar el valor donde estamos ahora. La cinta se inicializa con todos los ceros, por lo que terminamos con un 1 en la posición del cursor, lo que significa "verdadero": si ahora comenzamos una sección condicional[]
, entraría / loop.fuente
x
?x
así que aquíx
se define comox
.need
nada excepto el+
F#
fuente
=
?==
Ni siquiera está definido por defecto.C
Nota: puede no funcionar si
FLT_EVAL_METHOD != 0
(ver comentarios más abajo).fuente
INF + 2 == INF
, mientras que mi respuesta utiliza un único flotador de precisión que es lo suficientemente grande como para que 2 sea menos de un ULP.∞ + 2 = ∞
es algo que cualquiera podría entender y no depende de nada específico de la computadora, mientras que agregar 2 a un número concreto y no tener efecto es un poco más sorprendente y específico a la precisión limitada de computadoras, y más interesante en mi humilde opiniónFLT_EVAL_METHOD == 1
la matemática se realiza comodouble
. Recomiende un valor FP mayor que seguramente supere incluso lalong double
precisión como1.0e37f
C#
No es un shortie, pero algo elegante.
http://ideone.com/x56Ul
fuente
Scala:
{ val x = Set(2); (x == x + 2) }
Haskell: Define ℤ / 2ℤ en
Bool
eans:entonces para cualquiera
x :: Bool
tendremosx == x + 2
.Actualización: Gracias por las ideas en el comentario, actualicé la instancia en consecuencia.
fuente
fromInteger = odd
(+)
se puede definir como(/=)
creo.()
.Pitón
fuente
__cmp__
comoclass X(int):__cmp__=lambda*x:0
(o__eq__
aunque un poco más largoclass X(int):__eq__=lambda*x:True
class X:__add__=lambda s,o:s
__add__
que normalmente se le dan múltiples argumentos (lambda x,y:
), guardo algunos caracteres usando * para empaquetar todos los argumentos en una tupla (lambda *y:
). Vea los documentos para más información.GNU C admite estructuras sin miembros y tamaño 0:
fuente
PHP:
O:
Salida:
fuente
Es un error común pensar que en C, el espacio en blanco no importa. No puedo imaginar que a alguien no se le haya ocurrido esto en GNU C:
Impresiones
1
.fuente
x == x+2
sigue siendo falso). Pero una vez que planteas la idea, creo que#define x -2*__LINE__
es más elegante._CAT
es un identificador reservado. Todo lo que comienza con un guión bajo y una letra mayúscula está reservado en C.C
Es más interesante sin usar macros y sin abusar del infinito.
¡Pruébalo si no lo crees!
fuente
0
. No, todavía no lo creo.??\
??\
se convertirá en un solo\
, por lo que no hay??\
. Sin embargo, algunos compiladores modernos dan advertencias por defecto tanto a los trigrafos como a las concatenaciones de línea, incluso si están habilitados.Mathematica:
Creo que esta solución es nueva porque usa el concepto de valores ascendentes de Mathematica .
EDITAR:
Estoy ampliando mi respuesta para explicar qué significan los valores ascendentes en Mathematica .
La primera línea esencialmente redefine la suma del símbolo
x
. Podría almacenar directamente tal definición en la función global asociada con el+
símbolo, pero dicha redefinición sería peligrosa porque la redefinición puede propagarse de manera impredecible a través de los algoritmos integrados de Mathematica .En cambio, usando la etiqueta
x/:
, asocié la definición con el símbolox
. Ahora, cuando Mathematica ve el símbolox
, verifica si está siendo operado por el operador de suma+
en un patrón de la formax + 2 + ___
en que el símbolo___
significa una posible secuencia nula de otros símbolos.Esta redefinición es muy específica y utiliza las amplias capacidades de coincidencia de patrones de Mathematica . Por ejemplo, la expresión
x+y+2
regresax+y
, pero la expresiónx+3
regresax+3
; porque en el primer caso, el patrón podría coincidir, pero en el último caso, el patrón no podría coincidir sin una simplificación adicional.fuente
Javascript:
Violín de prueba
fuente
Infinity
, o-Infinity
, y debido a esto podría usar el acceso directo dex = 1/0
.(99999999999999999 == 99999999999999999+2)
porque creo que es un poco más interesante que(Infinity == Infinity+2)
, aunque, como dice el OP, "es subjetivo" :)-1
y recurrente . El lenguaje en sí era Python, pero eso realmente no importa en este caso.false
; donde sea que obtenga esa información sobre JS es incorrecta y no se debe confiar.esquema
fuente
(x == x + 2)
parece a C's, pero significa algo totalmente diferente.(= x 2)
.(define (x a b c d) #t)
:)Respuesta obvia:
Cuando esto termina:
fuente
while(!(x == x+2)) {}
sería más en espírituAquí es una solución para JavaScript que no explota a las
Infinity
y-Infinity
los bordes de los casos, además de coma flotante. Esto no funciona ni en Internet Explorer 8 ni en versiones posteriores, ni en el modo estricto opt-in ES5. No llamaría a lawith
declaración y a los captadores características particularmente "avanzadas".Editado para agregar: el truco anterior también es posible sin usar
with
yget
, como lo señaló Andy E en Consejos para jugar al golf en JavaScript y también por jncraton en esta página:fuente
x
sea una llamada de función, aunque parece una lectura variable. Asumo el orden de evaluación de izquierda a derecha, pero está bien ya que se especifica en JS (a diferencia de C).Lo siguiente no cumple con los estándares C , pero debería funcionar en casi cualquier plataforma de 64 bits:
fuente
x
se incrementaría en pasos de 2 ^ 61, porx + 8
lo que sería igualx
.int
.int
, nochar
.Sabio:
devuelve True
En general para GF (2 ** n) siempre es cierto que x = x + 2 para cualquier x
Esto no es un error o un problema con desbordamiento o infinito, en realidad es correcto
fuente
Lisp común
Es bastante fácil cuando
x
no tiene que ser un valor real.fuente
APL (Dyalog)
APL ni siquiera tiene infinito, es solo que los flotadores no son lo suficientemente precisos como para diferenciar entre
1.000.000.000.000.000
y1.000.000.000.000.002
. Esta es, hasta donde yo sé, la única forma de hacer esto en APL.fuente
Perl 6
Me sorprende no ver esta solución antes. De todos modos, la solución es: ¿qué
x
pasa si es0
y2
a la vez?my \x
En este ejemplo, se declara la variable sin sigilo: esta pregunta se refierex
al estilo Perl, no al estilo Perl$x
. El?? !!
operador es ternario.Pero...
x
son múltiples valores a la vez.x
es igual0
y2
a la vez.x + 2
es igual2
y4
a la vez. Entonces, lógicamente son iguales.fuente
Python 2.X (Usando la redefinición de enteros (en caché))
He notado que todas las respuestas de Python tienen clases definidas que redefinen el
+
operador. Contestaré con una demostración aún más baja de la flexibilidad de Python. (Este es un fragmento específico de python2)En python, los enteros se almacenan más o menos de esta manera en C:
Es decir, una estructura con una
size_t
,void *
ylong
objeto, en ese orden.Una vez que usamos, y por lo tanto almacenamos en caché un entero, podemos usar el
ctypes
módulo de Python para redefinir ese entero, de modo que no solo lo hagax == x+2
, sino2 == 0
Huellas dactilares
fuente
Perl
usando una subrutina con efectos secundarios en una variable de paquete:
Salida:
true!
fuente
sub x{}
"funciona" también ... (al menos en mi 5.10.1), pero no puedo entender por qué ...sub x{}
devuelve undef o una lista vacía, los cuales son un cero numérico. Y x + 2 se analiza como x (+2).perl -MO=Deparse
revelaprint "true\n" if x() == x(2);
Pitón
explotar la precisión de coma flotante lo hace muy simple.
Para hacerlo menos específico del sistema, se requiere una importación adicional
Esto también debería funcionar en otros idiomas. Esto funciona porque la representación de 100000000000000000.0 y 100000000000000002.0 son exactamente iguales para la máquina, debido a la forma en que se representan los puntos flotantes dentro de la máquina. ver http://en.wikipedia.org/wiki/IEEE_floating_point para más información.
Entonces, esto básicamente funcionará en cualquier idioma que le permita agregar enteros a flotantes y que el resultado sea flotante.
fuente
Aquí hay una solución para C ++ basada en la sobrecarga del operador. Se basa en la conversión implícita de an
enum
a anint
.fuente
std::boolalpha
lugar de?:
.Sé que es un desafío de código ... pero lo jugué. Lo siento.
Ruby - 13 caracteres - Solución infinita
devuelve verdadero
Ruby - 41 caracteres - Soluciones de sobrecarga de operaciones
o
fuente
Si está bien explotar un poco la pregunta, entonces agregaré algunos nuevos Java. El truco es seguro que no es nuevo, pero quizás sea interesante que esto sea posible en Java.
Y los resultados:
fuente
Esta solución VBScript funciona de manera similar a mi solución JavaScript. No utilicé un preprocesador pero la solución parece trivial.
fuente