Escribe un programa que haga 2 + 2 = 5 [cerrado]

393

Escriba un programa que aparentemente agregue los números 2 y 2 y produzca 5. Este es un concurso oculto.

Su programa no puede generar ningún error. ¡Cuidado con los agujeros de memoria! La entrada es opcional.

¡Redefinir 2 + 2 como 5 no es muy creativo! No lo pienses dos veces, prueba con otra cosa.

qwr
fuente
48
Esta es una pregunta en el libro "1984" de George Orwelll.
bacchusbeale
97
¿Por qué es esto sencillo? Dos más dos son cinco.
Geobits
79
¡AHÍ! ¡SON! CUATRO! ¡LUCES!
Nick T
105
@Geobits - Estoy de acuerdo: 2 + 2 = 5 puedes verlo en esta calculadora .
MT0
47
echo "2+2=5";
user3459110

Respuestas:

669

Java

La reflexión es, de hecho, la forma correcta de abusar de Java ... pero necesita profundizar más que simplemente ajustar algunos valores.

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] array = (Integer[]) c.get(cache);
        array[132] = array[133];

        System.out.printf("%d",2 + 2);
    }
}

Salida:

5

Explicación:

Debe cambiarlo aún más de lo que normalmente puede acceder. Tenga en cuenta que esto está diseñado para Java 6 sin que se pasen parámetros originales en la JVM que de otro modo cambiarían IntegerCache .

En lo profundo de la clase Integer hay un Flyweight of Integers. Esta es una matriz de enteros de −128 a +127. cache[132]es el lugar donde normalmente estaría 4. Ajústelo a 5.

Advertencia: Hacer esto en código real hará que la gente sea muy infeliz.

Código de demostración en ideone .

Dennis
fuente
55
Pensé en esto tan pronto como vi la pregunta :)
Octavia Togami
306
Ese. Es. Mal. Absolutamente malvado. +1
John Dvorak
75
@JanDvorak en el chat se sugirió Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Solo imagine cuántas cosas se romperían ...
30
Respuestas como esta me hacen amar este sitio más que SO.
Songo
35
¡Zomg, las respuestas de Java nunca obtienen los mejores votos! +1 por llevar a Java a la cima :)
Cruncher
297

Haskell

Me encanta cómo puedes arrojarle algo a ghci y todo funciona.

λ> let 2+2=5 in 2+2
5
Flonk
fuente
36
¿Qué let 2+2=5 in 5+5hacer? ಠ_ಠ
John Dvorak
22
@ JanDvorak Non-exhaustive patterns in function +: estoy definiendo una nueva función (+) aquí, y si conecto algo que no 2+2sea, se producirá un error porque nunca definí lo que debería suceder en ese caso.
Flonk
27
@SHiNKiROU sombra, no redefinir
John Dvorak
96
eso casi suena como: "Y Dios dijo que dejemos 2 + 2 = 5 en 2 + 2"))
OutFall
11
@ user3217013 Aprenda Haskell, es bueno para su corazón.
Zapato
294

C

Truco bastante barato, pero estoy seguro de que atraparé a la mayoría de ustedes.

int main() {
    int a = 2 + 2;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     a++;
    printf("%d",a);
    return 0;
}

Pruébalo aquí

Desplaza el código a la derecha.
No estoy seguro en Windows / Linux pero en OSX, la barra de desplazamiento no está visible.
De todos modos, esta es una buena razón para habilitar la "visualización del espacio" en su editor de código favorito.

Michael M.
fuente
96
La barra de desplazamiento es visible en Chromium, pero ¿quién le presta atención al principio? :)
Ruslan
172
Para confundir a la gente, puede agregar una línea de comentarios que sea lo suficientemente larga como para "explicar" la existencia de una barra de desplazamiento, pero lo suficientemente aburrida para que a nadie le importe (desplazarse para) leerla.
Hagen von Eitzen
22
En OS X, la visibilidad de la barra de desplazamiento por defecto depende de si un mouse está conectado. Si solo hay un panel táctil, las barras de desplazamiento se superponen y desaparecen cuando no se usan. Si hay un mouse conectado, las barras de desplazamiento roban espacio del cuadro de contexto y siempre están visibles. Puede probar esto desenchufando y conectando un mouse USB a una MacBook. Esto se puede configurar en Preferencias del sistema, por supuesto.
Andrea
49
Inteligente, pero en el móvil es solo wordwraps :)
Logan
31
Esta es la única vez que el desplazamiento de las ventanas de código SE no me dan ganas de romper los dedos de alguien.
ObscureRobot 01 de
184

GolfScript

4:echo(2+2);

Impresiones 5.

Por supuesto, GolfScript tiene una sintaxis que es marcadamente diferente a la de otros lenguajes, este programa simplemente parece algo Básico o C-ish.

4  - Pon el número 4 en la pila. Contenido de la pila: 4
:echo: guarde el valor en la parte superior de la pila en el eco variable. Contenido de la pila: 4
(  - Disminuya el valor en la parte superior de la pila en 1. Contenido de la pila: 3
2  - Ponga el número 2 en la parte superior de la pila. Contenido de la pila: 3 2
+  - Agregue los dos números en la parte superior de la pila. Contenido de la pila: 5
2  - Pon el número 2 en la parte superior de la pila. Contenido de la pila: 5 2
)  - Incremente el valor en la parte superior de la pila en 1. Contenido de la pila: 5 3
;  - Retire el elemento superior de la pila. Contenido de la pila: 5

GolfScript imprimirá por defecto todo lo que quede en la pila una vez que haya finalizado la ejecución.

aaaaaaaaaaaa
fuente
3
¿Puede explicar eso para las personas que no hablan GolfScript por favor?
MadTux
1
@MadTux Aquí tienes.
aaaaaaaaaaaa
1
Gracias. (Voy a votar más tarde porque llegué a mi límite diario, aquí hay una cerveza.)
MadTux
55
Simple y tramposo, me encanta. +1
seequ
99
me gusta porque no parece que te esté engañando con matemáticas o semántica, parece tan sencillo y, sin embargo, 5 ^^
dwana
145

Java

Siempre tienen que redondear sus dobles, amigos

public class TwoPlusTwo {
  public static void main(String... args) {
    double two = two();
    System.out.format("Variable two = %.15f%n", two);
    double four = Math.ceil(two + two); // round just in case
    System.out.format("two + two = %.15f%n", four);
  }

  // 20 * .1 = 2
  private static double two() {
    double two = 0;
    for(int i = 0; i < 20; i++) {
      two += .1;
    }
    return two;
  }
}

Salida:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Explicación:

No, en serio, siempre tienes que redondear tus dobles. 15 no son suficientes dígitos para mostrar que el two()método realmente produce 2.0000000000000004(16 es suficiente, sin embargo).

En las representaciones hexadecimales sin procesar de los números, es solo una diferencia de 1 bit (entre 4000000000000001y 4000000000000000) ... que es suficiente para hacer que el Math.ceilmétodo devuelva 5, no 4.

durron597
fuente
61
Math.ceil(two + two); // round just in caseVeo lo que hiciste allí
Tim S.
17
Haciendo una función y una variable con el mismo nombre ... Wow.
Configurador
107
@configurator eso no es nada, ni siquiera hay una clase llamada two. Java de grado de producción es Two two = Two.two.two();con Two.two siendo del tipo TwoFactory.
Jannis Froese
36
Two.Infinity.And.Beyond ()
CincauHangus
77
@TimS Dejo lo que hiciste allí
thenaglecode
135

BBC BASIC

EDITAR: Para Andrea Faulds y Squeamish Ossifrage, una versión más convincente con un intérprete diferente: http://sourceforge.net/projects/napoleonbrandy/

  MODE 6
  VDU 23,52,254,192,252,6,6,198,124,0
  PRINT
  PRINT "2+2=";2+2
  PRINT "2+3=";2+3

ingrese la descripción de la imagen aquí

Esto realmente imprime el número 4, pero VDU 23redefine la fuente para ASCII 52 para que parezca un 5 en lugar de un 4. Se seleccionó el modo de pantalla 6 por razones estéticas (caracteres de un tamaño razonable).

La imagen original con el emulador en http://bbcbasic.co.uk/bbcwin/bbcwin.html . (con un código ligeramente diferente) se puede ver en el historial de edición.

Level River St
fuente
8
Sin embargo, esas fuentes se ven diferentes. ¿Crees que podrías hacer que use la fuente correcta?
Andrea
@AndreaFaulds Estoy usando el emulador de bbcbasic.co.uk/bbcwin/bbcwin.html . Admite la redefinición de la fuente de BBC Basic original en una cuadrícula de 8x8. Pero la fuente predeterminada del emulador es claramente más alta que 8x8. Así que probablemente podría hacer un mejor trabajo, pero no sería perfecto. Supongo que podría redefinir la fuente para todos los 5 y 4, entonces se verían iguales.
Level River St
55
@AndreaFaulds La pregunta no decía que el resultado debería ser indistinguible de otros 5s. Creo que esto es realmente una característica. 2+3=5y2+2=5'
Ben Jackson
1
Esto coincide con la fuente original en la BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
aprensivo ossifrage
@squeamishossifrage gracias por la información. Sin embargo, no coincidirá con la fuente en el emulador. Su ejemplo tiene 7 píxeles de altura, al igual que el mío. También tiene un cero en la parte inferior, al igual que el mío, mientras que parece que necesito moverlo un poco hacia abajo (es decir, tener el cero en la parte superior en lugar de la parte inferior). Una diferencia clave es que tengo 126,64 mientras que tienes 126,96, y tienes unos 6 en lugar de mis 2. Esto se debe a que la fuente original de la BBC tenía líneas verticales gruesas, por lo que se podía leer fácilmente en formato de 80 columnas en una pantalla de TV estándar.
Level River St
134

Brainfuck

+++++           +++++
    +               +    
    +     +         +     +++++
+++++    +++    +++++     
+         +     +         +++++
+               +
+++++           +++++.

Salida:

5

Probarlo aquí .

Sé que esto puede sonar un poco simple, pero traté de ser creativo, como se sugiere en la publicación original.

tigrou
fuente
1
No lo sé, me tomó un par de minutos resolver esto. ASCII 53, ¿verdad?
Level River St
44
Mientras tengas el +++++.puedes pintar cualquier cosa.
Eduard Florinescu
1
@steveverrill: sí, tienes razón. (y esta es la única forma de generar caracteres ascii en BF).
tigrou
1
No entiendo
Leif Willerts
105

Golpetazo

Dado que este es un , creo que debería usar un método de largo aliento ...

Para las personas que no conocen Bash: $((...expr...))es una sintaxis para evaluar expresiones aritméticas. $(bc<<<...expr...)hace lo mismo usando la bccalculadora de línea de comandos.

v=2                     #v is 2
v+=2                    #v is 4
v=$(($v*5))             #v is 20
v=$(($v-16))            #v is 4
v=$(bc<<<"sqrt($v)+2")  #v is 4 (sqrt(4) is 2)
v=$(bc<<<"$v/4+3")      #v is 4 (4/4 = 1)
echo '2+2=' $v          #So v is 4...?

Salida

2+2= 5

Explicación

La segunda línea concatena v y 2 en lugar de agregarlos, para hacer 22.
Explicación real:
v=2 #v is 2 v+=2 #v is 22 v=$(($v*5)) #v is 110 v=$(($v-16)) #v is 94 v=$(bc<<<"sqrt($v)+2") #v is 11 (by default, bc rounds to integers) v=$(bc<<<"$v/4+3") #v is 5 (11/4 is 2 with rounding) echo '2+2=' $v #TADAAAM


fuente
8
¡Buen truco de matemáticas!
tomsmeding
55
@tomsmeding Fue bastante divertido, aunque a mitad de camino me di cuenta de que había puesto en 15lugar de 16en la línea 4. Afortunadamente, todavía funcionó debido al bcredondeo
2
Vea si le gusta el aspecto de este estilo que también es válido Bash (elimina los signos de dólar, permite espacios alrededor del signo igual y permite operadores de asignación combinados): ((v = v * 5))o((v *= 5))
Dennis Williamson
2
Buena, pero vi la +=cosa de inmediato.
nyuszika7h
2
@ardnew sí hay. las dos primeras líneas ( v=2y v+=2): para alguien que no esté familiarizado con el manejo de variables Bash, eso sería equivalente a 2+2, pero de hecho "2"+"2", es decir "22". los otros comentarios en el código solo son incorrectos debido a esto. Lo sé, no todo el mundo encuentra este divertido
101

Pitón

Inspirado por la respuesta de Java:

>>> patch = '\x312\x2D7'
>>> import ctypes;ctypes.c_int8.from_address(id(len(patch))+8).value=eval(patch)
>>> 2 + 2
5

Al igual que Java, CPython usa la misma ubicación de memoria para cualquier copia de los primeros enteros pequeños (0-255 si la memoria sirve). Esto entra y edita directamente esa ubicación de memoria a través de ctypes. patches solo un ofuscado "12-7", una cadena con len4, que evales 5.

Una versión más ofuscada

exec("\x66\x72\x6f\x6d\x20c\x74\x79\x70e\x73\x20\x69\x6d\x70\
\x6f\x72\x74\x20c\x5f\x69\x6e\x748\x20a\x73\x20x\x3bf\x72\x6f\
\x6d\x20\x73\x74\x72\x75c\x74\x20\x69\x6d\x70\x6f\x72\x74\x20\
ca\x6cc\x73\x69\x7ae\x20a\x73\x20x0\x3bx\x2ef\x72\x6f\x6d\x5f\
a\x64\x64\x72e\x73\x73\x28\x69\x64\x284\x29\x2bx0\x28\x27\x50\
\x50\x27\x29\x29\x2e\x76a\x6c\x75e\x3d5")

Más allá de 2 + 2

Como OP mencionó, 2 + 2 puede ser un poco aburrido; Así que aquí hay un código más limpio, multiplataforma y de ancho múltiple para el abuso sin sentido.

from __future__ import division, print_function
import struct
import ctypes
import random

# Py 2.7 PyIntObject:
# - PyObject_HEAD
#     - PyObject_HEAD_EXTRA [usually nothing unless compiled with DEBUG]
#     - (Py_ssize_t) ob_refcnt
#     - (_typeobject) *ob_type
# - (long) ob_ival

# two platform-sized (32/64-bit) ints (ob_refcnt and *ob_type from above)
offset = struct.calcsize('PP')

num = 60
nums = list(range(num))
addresses = [id(x) + offset for x in nums]
random.shuffle(nums)

for a, n in zip(addresses, nums):
    ctypes.c_ssize_t.from_address(a).value = n

print('2 + 2 =', 2+2)
print('9 - 4 =', 9-4)
print('5 * 6 =', 5*6)
print('1 / 0 =\n', 1/0)
print('(1 + 2) + 3 = ', (1+2)+3)
print('1 + (2 + 3) = ', 1+(2+3))
print('(2 + 3) + 1 = ', (2+3)+1)
print('2 + (3 + 1) = ', 2+(3+1))

Ejecutando con Python 2.7 ... ignore esa línea al final. Funciona en Windows de 64 bits y Ubuntu de 32 bits, los dos sistemas a los que tengo fácil acceso.

$ python awful.py 
2 + 2 = 24
9 - 4 = 49
5 * 6 = 55
1 / 0 = 0.76

(1 + 2) + 3 =  50
1 + (2 + 3) =  68
(2 + 3) + 1 =  50
2 + (3 + 1) =  61
Segmentation fault (core dumped)

Como era de esperar, podemos romper la propiedad asociativa de la suma, donde ( a + b ) + c = a + ( b + c ), como se ve en las 1+2+3líneas 1 y 2 , pero inexplicablemente también rompemos la propiedad conmutativa (donde a + b = b + a ; 2da y 3ra líneas). Me pregunto si el intérprete de Python ignora los paréntesis superfluos alrededor de las expresiones de suma.

Nick T
fuente
96
Sí, definitivamente todos ignoramos casualmente las fallas seguras ...
10
Vale la pena mencionar que esto no es realmente un truco de Python y solo es específico de la implementación C de Python.
xApple
1
@NickT ¡Ah! bueno. Tenía la impresión de que había probado el original en las mismas ventanas de 64 bits, configuración de ubuntu de 32 bits
DavidJFelix
22
exec('\x66\x72\x6f\x6d\x20\x63\x74\x79\ \x70\x65\x73\x20\x69\x6d\x70\x6f\ \x72\x74\x20\x63\x5f\x69\x6e\x74\ \x38\x3b\x20\x69\x6d\x70\x6f\x72\ \x74\x20\x73\x74\x72\x75\x63\x74\ \x3b\x20\x63\x5f\x69\x6e\x74\x38\ \x2e\x66\x72\x6f\x6d\x5f\x61\x64\ \x64\x72\x65\x73\x73\x28\x69\x64\ \x28\x34\x29\x20\x2b\x20\x73\x74\ \x72\x75\x63\x74\x2e\x63\x61\x6c\ \x63\x73\x69\x7a\x65\x28\x27\x50\ \x50\x27\x29\x29\x2e\x76\x61\x6c\ \x75\x65\x3d\x35')Es una primera versión modificada. Hice esto para poder colocarlo en $ PYTHONSTARTUP en / etc / profile como equipo rojo en las competiciones de pirateo.
DavidJFelix
2
Sí. Nota al margen, parece que 1, 0 y -1 son algunos de los números con los que python segfaults inmediatamente. Estaba pensando que eso sería lo peor para arruinar el comportamiento de los programas de Python. Es posible utilizar fuckitpy para contener estos errores.
DavidJFelix
86

JavaScript:

g = function () {
  H = 3
  return H + H
}

f = function () {
  Η = 2
  return Η + H
}

// 3 + 3 = 6
alert(g())
// 2 + 2 = 5
alert(f())

Compruébelo en http://jsfiddle.net/qhRJY/

Tanto H (letra latina mayúscula h) como Η (letra mayúscula griega eta) se establecen en el ámbito global porque no se definieron como locales para las funciones con la palabra clave var. Si bien se ven similares, en realidad son 2 variables diferentes con 2 valores diferentes. Usando Ctrl + F en su navegador, encontrará que Η (eta) aparece significativamente menos que H (h) en esta página.

Konstantin Weitz
fuente
44
@Sam a pesar de que las dos 'H' se ven iguales, de hecho son 2 personajes completamente diferentes. En Unicode puede haber diferentes caracteres que se vean iguales pero que tengan puntos de código diferentes. En este caso específico; la otra "H" es en realidad la letra griega Eta .
d3dave
79
Usar homoglifos para "confundir" a los lectores ahora oficialmente no es divertido .
John Dvorak
29
Los homoglifos se vuelven divertidos en combinación con las ridículas variables globales de javascript.
Konstantin Weitz
3
No es el "carácter Unicode Η", es latino H y griego Eta (Η).
trata bien tus modificaciones el
44
@Vortico hmm ... ¿qué deseas cuando una pregunta frecuente no es suficiente? ¿Una pregunta frecuente vinculada desde el centro de ayuda? Tenga en cuenta que solo los moderadores pueden aplicar la etiqueta de preguntas frecuentes. En cuanto a la respuesta, la pregunta dice "puntaje +5 o más y al menos el doble de votos positivos que negativos". La respuesta tiene 27 votos a favor y sin voto a favor. Eso me parece que cumple con los criterios establecidos en la respuesta, y la cantidad de votos positivos es bastante impresionante para la segunda respuesta más antigua en una pregunta en el meta sitio de un sitio donde solo 124 personas han votado más de 10 veces. Cuantas te gustaria ¿Todos?
John Dvorak
72

JavaScript

function addDecibels(){return (10*Math.log10([].reduce.call(arguments,(p,c)=>p+Math.pow(10,c/10),0))).toFixed(1);}

alert( addDecibels(2,2) );

El bit oculto es que no está realmente oculto: si agrega una fuente de sonido de 2dB a otra fuente de sonido de 2dB, el ruido combinado resultante será de 5dB (y si agrega dos fuentes de 30dB, entonces es de 33dB) ya que se miden en una escala de registro.

Puedes verlo en una calculadora diferente aquí .

MT0
fuente
Bueno, en realidad es más como 5.01 decibelios, pero lo suficientemente lejos de 4 para contar.
Joe Z.
68

PHP

echo '2 + 2 = ' . (2 + 2 === 4 ? 4 : 2 + 2 === 5 ? 5 : 'dunno');

Que produce:

2 + 2 = 5

Esto se debe a que en PHP, los ternaries se calculan de izquierda a derecha, por lo que en realidad es
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';

MrLore
fuente
35
phpsadness
wchargin 01 de
1
Tengo otro PHPejemplo:$a=2;echo "2+2=".$a++ + $a++;
Avall
Es obvio que $ a ++ hace 3 y el resultado será 6. No entiendo lo que estás pensando.
Ozh
1
@Janus PHPsadness # 30 lo explica bien
wchargin
66

JavaScript

var total = 2 + 2;

if(total = 5)
{
    alert('I guess 2 + 2 = 5');
}
else
{
    alert('The universe is sane, 2 + 2 = 4');
}
usuario1886419
fuente
73
=en lugar de ==, fácil de ver y, francamente, poco inspirado.
ApproachingDarknessFish
19
Tengo un voto positivo de todos modos,
66
Todavía me gusta esta respuesta
Sam Creamer
55
A mí también me gusta. No todos los idiomas utiliza =sólo como un assigment pero un operador de comparación (por ejemplo, Pascal, SQL, VB)
Avall
Me parece muy obvio
Oliver Ni
57

C#

    static void Main(string[] args)
    {
        var x = 2;
        var y = 2;

        if (1 == 0) ;
        {
            ++x;
        }

        Console.WriteLine(x + y);
    }
Grax32
fuente
77
Ah, el viejo y buen truco con personajes deshonestos. Es por eso que debes usar 1TBS en todas partes.
John Dvorak,
11
@ JanDvorak ¿Funciona esto por el punto y coma después de la instrucción if? No sé C # pero he usado C ++
55
@professorfish, eso es lo que supongo. Además, los idiomas que no le permiten insertar llaves rizadas al azar FTW.
John Dvorak,
12
Sin ";", la instrucción if controla si se ejecutará el bloque de código. Con el ";" allí, se evalúa el if pero no se hace nada con el resultado. Luego, el bloque de código se ejecuta cada vez, independientemente. En C #, es perfectamente aceptable tener bloques de código aleatorio.
Grax32
2
Me compré con este el otro día. Tuve un bucle for con un ;after, que fue perfectamente intencional ya que estaba usando el bucle vacío para avanzar un cursor. Accidentalmente eliminé el punto y coma, todo explotó y no pude entender por qué.
mpen
56

Es peligroso decorar tu Javascript con arte ASCII.

  -~// JS  \\~-
 ~-// Maths \\-~
-~// Madness \\~-

     (2 + 2)

Cuando se eliminan los comentarios, los símbolos y operadores restantes se evalúan como
-~~--~(2 + 2) Esto hace uso del operador Bitwise Not (~) en JS, junto con un puñado de signos Menos que negarán los valores en el camino.

Dan Prince
fuente
3
Me preguntaba cómo el --operador era aceptable, ya que debería equivocarse Invalid left-hand side expression in prefix operation; Sin embargo, me di cuenta de que hay un espacio en blanco entre ellos.
usandfriends
53

Golpetazo

#!/bin/bash

# strings of length 2
x="ab"
y="cd"

# add lengths by concatenation
c="$(cat<<<$x; cat<<<$y)"

# display the lengths of the parts and the sum
echo "${#x} + ${#y} = ${#c}"

Salida:

2 + 2 = 5

La salida de cada uno cattendrá una nueva línea implícita, pero la nueva línea final se elimina mediante la sustitución del comando$( )


Aquí está otro:

#!/bin/bash

# Create an array of ascending integers
a=({1..10})

# Use the sum to index into the array
s="2 + 2"
i=$(($s))
echo "$s = ${a[$i]}"

Las matrices de bash están indexadas a cero

Trauma digital
fuente
3
De hecho, atrapé el primero, ya que he tenido muchos problemas con cosas así al jugar al golf en Bash. En cuanto a la segunda, ¿dónde no están las matrices indexadas a cero?
3
@professorfish Applescript, por ejemplo:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Trauma digital
12
@DigitalTrauma Applescript es raro
55
zshusa matrices indexadas en 1 (y $arr[0]simplemente no está definido o no está definido o algo así), a menos que se establezca la KSH_ARRAYSopción, en cuyo caso las matrices están indexadas en 0.
chepner
44
@professorfush: Lua y Fortran están indexados. Cada vez que cuento hasta 10, siempre comienzo en 1, no en 0.: D
Kyle Kanos
49

Perl

# Generic includes
use strict;
use warnings;
use 5.010;
use Acme::NewMath;

# Ok, time to begin the real program.
if (2 + 2 == 5) {
    say 5;
}
else {
    say "Dunno...";
}

Depende del módulo CPAN llamado Acme :: NewMath . Debido a nombres de archivo incorrectos en el módulo, esto solo funcionará en sistemas de archivos que no distinguen entre mayúsculas y minúsculas (como en Windows o Mac OS X), pero culpo al autor del módulo original aquí. Acme :: NewMath implementa las matemáticas de acuerdo con la ideología Ingsoc.

Konrad Borowski
fuente
16
Esto es bastante astuto. Nadie mira tus importaciones / incluye.
44

R

# add the mean of [1,3] to the mean of [4,0] (2 + 2)
mean(1,3) + mean(4,0)

salida:

5

el código en realidad agrega la media de [1] a la media de [4]. La forma correcta de utilizar la función de media en R sería: mean(c(1,3)) + mean(c(4,0))Esto es a diferencia de algunas otras funciones matemáticas en I, tales como sum, max, y min; donde sum(1,3), max(1,3)y min(3,1)todos darían la respuesta esperada.

silbido
fuente
77
No está mal, me engañó un poco.
qwr
37

Java

public class Five {
    public static void main(final String... args) {
        System.out.println(256.0000000000002 + 256.0000000000002);
    }
}

salida:

512.0000000000005

Probablemente funciona en cualquier idioma que use el mismo tipo de dobles.

aditsu
fuente
77
Esa es una firma principal muy extraña.
Bertie Wheen
10
Java implementa argumentos variados como matrices bajo el capó.
CodaFi
44
Me tomó un momento darme cuenta de que probablemente estás hablando de los últimos dígitos en los dobles. Vi que los primeros dígitos se agregaron correctamente ( _2_56 + _2_56 = _5_12), pero parece más probable que quiera decir 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(nota: los subrayados solían "poner en negrita" los dígitos.)
Justin
35

Befunge

Esto está escrito en Befunge, pero está diseñado para parecerse a Python.

#>>>>>>>>>>>>>>>>>v
# Calculate 2 + 2 v
#>>>>>>>>>>>>>>>>>v
def add(v,w):
    return v+w
 # I rewrote this 5 times and it still doesn't work

print add(2,2) #... Still not working

# email: [email protected]

Cuando se ejecuta (con el intérprete correcto) se imprimirá el programa 5.

Explicación:

Un programa Befunge se compone de una cuadrícula de comandos de un solo carácter. El primer comando es el que está en la esquina superior izquierda, y la lectura de los comandos continúa a la derecha. Pero la dirección puede cambiar durante la ejecución del programa.

Solo vse ejecutan la primera fila de caracteres y la columna de caracteres que comienza con la primera fila. Los caracteres en cuestión lo hacen:

#- omita el siguiente comando
>- De ahora en adelante, los comandos se leen a la derecha del comando actual
v- De ahora en adelante, los comandos se leen debajo del comando actual
5- Presione 5 en la pila
.- Pop e imprima el número en la parte superior de la pila
@- Finalice el programa
<space>- No haga nada

Si supieras que estás programando en Befunge, esto realmente no engañaría a nadie. Pero si te encuentras con esto y no te das cuenta de que era Befunge, lo más probable es que lo haga.

Mate
fuente
11
+1, esto es muy tortuoso, porque ¿quién demonios mira el programa que ejecuta el código fuente al depurar?
MrLore
33

JavaScript

Código:

var a = 3;
а = 2;
a + а;

Salida:

5

Puede probarlo usted mismo en su consola o consultar este Fiddle

William Barbosa
fuente
66
¿Puede señalarme un recurso o explicarme por qué funciona? Sé que funciona porque revisé el violín, pero no entiendo por qué.
Familia
29
la variable "a" no es la misma las dos veces (perdón si estoy estropeando esto). Unicode astuto de hecho
Sam Creamer
66
Me encanta cómo el próximo personaje U+0431es б, ¡casi 6!
wchargin 01 de
73
Usar homoglifos para "confundir" a los lectores ahora oficialmente no es divertido .
John Dvorak
40
@ JanDvorak Esa respuesta se publicó después de esta; No se aplica aquí.
Pomo de la puerta
30

C (Linux, gcc 4.7.3)

#include <stdio.h>

int main(void)
{
    int a=3, b=2;

    printf("%d + %d = %d", --a, b, a+b);  
}

Imprime 2 + 2 = 5

Entonces a = 2, ¿verdad?

gcc-4.7.3 evalúa los parámetros de la función de derecha a izquierda. Cuando se evalúa a + b, a sigue siendo 3.

cpri
fuente
16
Buen uso de comportamiento no especificado
chbaker0
24

FORTRAN 77

       program BadSum
       integer i,a,j
       common i,a
       a = 1
       i = 2
       call addtwo(j) 
       print *,j
       end

       subroutine addtwo(j)
       integer a,i,j
       common a,i
c since a = 1 & i = 2, then 2 + 1 + 1 = 2 + 2 = 4
       j = i + a + a
       end

Abuso estándar de commonbloques: el orden importa; Cambié el orden en el bloque en la subrutina, así que realmente estoy agregando 1 + 2 + 2.

Kyle Kanos
fuente
66
@ JanDvorak: Jaja, podría haber usado FORTRAN IV en el que podría redefinir los literales, por ejemplo2=3
Kyle Kanos
1
@KyleKanos, eso es lo que pensé que iba a ser cuando vi que tu publicación estaba escrita en FORTRAN.
danmcardle
@KyleKanos ¡Hazlo!
ClickRick
1
@KyleKanos: ¿Funcionó eso con literales enteros o solo flotantes? Creo que en una máquina de esa época, un literal entero y una dirección habrían sido del mismo tamaño, pero más pequeños que un flotante, por lo que agrupar los literales flotantes ahorraría espacio, pero agrupar los literales int no lo haría.
supercat
2
@KyleKanos: Entiendo que los compiladores no permitirían una asignación directa a un literal, pero las llamadas de función utilizadas pasan por referencia, y pasar un literal de coma flotante a una función generalmente pasaría la dirección de un valor en un grupo de flotantes -puntos literales. Al pasar un valor entero a una función, se agruparía, pero la mayoría del código que usaba enteros incluiría los valores directamente.
supercat
24

Pitón

El código imprime 5, que es la respuesta correcta para esta tarea.

def int(a):
    return ~eval(a)

def add(a,b):
    return int(a)+int(b)

print ~add("2","2")

Editar: Aquí hay una versión alternativa que agrega enteros, no dos en cadena.

def int(a): return ~eval(`a`)
def add(a,b): return int(a)+int(b)
print ~add(2,2)

Tilde es un operador inverso unario que regresa -x-1, por lo que el primer paso es obtener -6y luego con otro operador en la printfunción obtener5

avall
fuente
¿Por qué en ~eval(`a`)lugar de solo ~a?
Andrea Corbellini
2
Yo quería dejar algo de la int()funcionalidad y eval()hace el trabajo si la entrada es un número entero stringified :)
Avall
24

Rubí

class Fixnum
    alias plus +

    def + (other)
        plus(other).succ
    end
end

puts 2 + 2

Esto aumenta el resultado de todas las adiciones cuyo primer argumento es un Fixnum (que 2 es, al menos en MRI) en 1.

Los efectos secundarios de esto son incluso peores que la versión de Java.

Lowjacker
fuente
23

Rubí

Ruby tiene ambientes de primera clase. Esto significa muchas cosas. También significa que se pueden hacer muchas cosas que ... tal vez no deberían.

def mal(&block)
    block.call
    for v in block.binding.eval("local_variables");
      block.binding.eval('if ' + v.to_s + ' == 4 then ' + v.to_s + ' = 5 end')
    end 
end

a = 2 + 2;
b = 2 + 4;
puts "2 + 2 = ", a
puts "2 + 4 = ", b

mal do
  puts "But in 1984..."
end

puts "2 + 2 = ", a
puts "2 + 4 = ", b

El resultado de esto es:

2 + 2 = 
4 4
2 + 4 = 
6 6
Pero en 1984 ...
2 + 2 = 
5 5
2 + 4 = 
6 6

Si desea comprender más sobre las alegrías y los peligros de esto, Ruby Conf 2011 Mantener a Ruby Razonable y lea entornos de primera clase del blog Abstract Heresies.


fuente
También:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42
1
Para hacer solo para el caso específico:class Fixnum; alias_method :orig_plus, :+; protected :orig_plus; def +(n) self == 2 && n == 2 ? 5 : self.orig_plus(n) end end
Gary S. Weaver
21

Esquema

(define 2+2 5)
2+2 ;=> 5
Hauleth
fuente
99
¡Oye! 2+2¡no es cómo haces la suma en lisp!
John Dvorak,
1
¿Y qué? Aparentemente agrega 2 a 2 como está en la tarea.
Hauleth
119
@ JanDvorak Nunca he usado lisp, pero según tengo entendido es algo así ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
metro subterráneo
2
"¡Redefinir 2 + 2 como 5 no es muy creativo! No lo pienses dos veces, prueba con otra cosa". --- Bueno, en R5RS puedo redefinir + en lugar de 2 + 2 o 2. La respuesta está aquí: pastebin.com/KHtm9Jmv
Felipe
1
@FelipeMicaroniLalli esa anotación se hizo después de mi respuesta, por lo que no cuenta.
Hauleth
20

C#

var c = Enumerable.Range(2, 2).Sum();

Para alguien no familiar, esto parecerá que estoy obteniendo un rango que comienza y termina en 2. En realidad, comienza en 2 y va por dos números. Entonces 2 + 3 = 5.

Pablo
fuente
66
Un rango que comienza y termina en 2 sería justo { 2 }, ¿no?
Paŭlo Ebermann
1
@ PaŭloEbermann Enumerable.Rangeno toma un inicio y un final, toma un inicio y un recuento (de elementos que se enumerarán).
MasterMastic 01 de
14
@MasterMastic Entendí esto por la explicación en la respuesta. Pero se supone que el significado de "a alguien que no está familiarizado" es tal rango (de la explicación en la respuesta), y mi argumento es que el resultado esperado sería 2, no 4.
Paŭlo Ebermann
1
@ PaŭloEbermann, sí, esa es una forma de verlo también. Estaba pensando que podría parecer más como si estuviera proporcionando los números para sumar. Entonces Enumerable.Range (1,2,3,4) comenzaría en 1, terminaría en 4 y sumaría hasta 10.
Paul
19

F#

Pongamos en fsi la siguiente declaración:

let ``2+2``= 5

Salida:

val ( 2+2 ) : int = 5
Krzysztof Cieslak
fuente
18

C

int main() {
        char __func_version__[] = "5";  // For source control
        char b[]="2", a=2;
        printf("%d + %s = %s\n", a, b, a+b);
        return 0;
}

El 5no está muy bien escondido, me temo. No funciona con optimización.

Ugoren
fuente
1
Agradable; No puedo votar si no se permite un comportamiento indefinido.
este
2
@self., no veo dónde está prohibido confiar en UB. Muchas respuestas de código de golf se basan en UB, y creo que está bien siempre que suceda de manera consistente en alguna plataforma razonable.
ugoren 01 de
2
No veo dónde está prohibido confiar en UB. Tampoco encontré ninguna regla al respecto. Sería bueno si eso pudiera aclararse. Muchas respuestas de código de golf se basan en UB, y creo que está bien, siempre y cuando suceda consistentemente en alguna plataforma razonable. Algunas reglas específicas sobre eso serían buenas.
este