Ecrivez un programme qui fait 2 + 2 = 5 [fermé]

393

Ecrivez un programme qui ajoute apparemment les nombres 2 et 2 et les sorties 5. Ceci est un concours sournois.

Votre programme ne peut générer aucune erreur. Attention aux trous de mémoire! La saisie est facultative.

Redéfinir 2 + 2 en tant que 5 n'est pas très créatif! Ne le double pas, essaie autre chose.

qwr
la source
48
C'est question dans le livre "1984" de George Orwelll.
bacchusbeale
97
Pourquoi est-ce sournois? Deux plus deux, c'est cinq.
Geobits
79
LÀ! SONT! QUATRE! LUMIÈRES!
Nick T
105
@ Geobits - Je suis d'accord: 2 + 2 = 5, vous pouvez le voir dans cette calculatrice .
MT0
47
echo "2+2=5";
user3459110

Réponses:

669

Java

La réflexion est en effet le bon choix pour abuser de Java ... mais vous devez aller plus loin que de peaufiner certaines valeurs.

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);
    }
}

Sortie:

5

Explication:

Vous devez le modifier encore plus profondément que ce à quoi vous pouvez généralement accéder. Notez que ceci est conçu pour Java 6 sans aucun paramètre génial transmis sur la machine virtuelle Java qui pourrait autrement changer IntegerCache .

Au cœur de la classe Integer se trouve un Flyweight of Integers. C'est un tableau d'entiers de −128 à +127. cache[132]est l'endroit où 4 serait normalement. Réglez-le sur 5.

Avertissement: Faire cela dans un code réel rendra les gens très malheureux.

Code démo sur ideone .

Dennis
la source
5
Pensée à celui-ci dès que j'ai vu la question :)
Octavia Togami
306
Cette. Est. Mal. Absolument maléfique. +1
John Dvorak
75
@JanDvorak dans le chat, il a été suggéré Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Imaginez juste combien de choses se briseraient ...
30
Des réponses comme celle-ci me font aimer ce site plus que SO.
Songo
35
zomg, java answers n'obtient jamais les meilleurs votes! +1 pour amener java au sommet :)
Cruncher
297

Haskell

J'adore la façon dont on peut jeter n'importe quoi sur ghci et ça roule totalement avec ça.

λ> let 2+2=5 in 2+2
5
Flonk
la source
36
Que fait let 2+2=5 in 5+5-il? _ಠ
John Dvorak
22
@JanDvorak Non-exhaustive patterns in function +- Je définis ici une nouvelle fonction (+), et si je branche tout ce qui ne l'est pas, 2+2cela provoquera une erreur car je n'ai jamais défini ce qui devrait se passer dans ce cas.
Flonk
27
@SHiNKiROU ombre, pas redéfinir
John Dvorak
96
cela ressemble presque à: "Et Dieu a dit soit 2 + 2 = 5 en 2 + 2"))
OutFall
11
@ user3217013 Apprenez Haskell, c'est bon pour votre cœur.
Chaussure
294

C

Très bon truc mais je suis sûr que je vais piéger la plupart d'entre vous.

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

Essayez-le ici

Faites défiler le code à droite.
Je ne suis pas sûr sous Windows / Linux mais sous OSX, la barre de défilement n'est pas visible.
Quoi qu'il en soit, c'est une bonne raison d'activer la "visualisation d'espace" sur votre éditeur de code préféré.

Michael M.
la source
96
La barre de défilement est visible en chrome, mais qui y fait attention au début? :)
Ruslan,
172
Pour dérouter les gens, vous pouvez ajouter une ligne de commentaire suffisamment longue pour "expliquer" l’existence d’une barre de défilement, mais assez ennuyeuse pour que personne ne se soucie de la lire.
Hagen von Eitzen
22
Sous OS X, la visibilité des barres de défilement dépend par défaut de la connexion d'une souris. S'il n'y a qu'un pavé tactile, les barres de défilement sont superposées et disparaissent si elles ne sont pas utilisées. Si une souris est connectée, les barres de défilement volent de l'espace dans la zone de contexte et sont toujours visibles. Vous pouvez tester cela en débranchant et en branchant une souris USB sur un MacBook. Cela peut être configuré dans les Préférences Système, bien sûr.
Andrea
49
Clever, mais sur mobile, il suffit de wordwraps :)
Logan
31
C'est la seule fois où les fenêtres de code SE qui défilent ne me donnent pas envie de casser les doigts de quelqu'un.
ObscureRobot
184

GolfScript

4:echo(2+2);

Impressions 5.

Bien sûr, la syntaxe de GolfScript est très différente de celle des autres langages. Ce programme a juste l’air de ressembler à quelque chose de fondamental ou de C-ish.

4  - Mettez le chiffre 4 sur la pile. Contenu de la pile: 4
:echo- Enregistrez la valeur située en haut de la pile dans la variable echo. Contenu de la pile: 4
(  - Décrémentez de 1 la valeur située en haut de la pile. Contenu de la pile: 3
2  - Placez le chiffre 2 au-dessus de la pile. Contenu de la pile: 3 2
+  - Ajoutez les deux nombres en haut de la pile. Contenu de la pile: 5
2  - Placez le chiffre 2 en haut de la pile. Contenu de la pile: 5 2
)  - Incrémentez la valeur du haut de la pile de 1. Contenu de la pile: 5 3
;  - Supprimez l’élément supérieur de la pile. Contenu de la pile: 5

Par défaut, GolfScript imprimera tout ce qui reste sur la pile à la fin de l'exécution.

aaaaaaaaaaaa
la source
3
Pouvez-vous expliquer cela pour les personnes qui ne parlent pas GolfScript s'il vous plaît?
MadTux
1
@MadTux Ici vous allez.
aaaaaaaaaaaa
1
Merci. (J'aurai un vote plus tard parce que j'ai atteint ma limite quotidienne, voici une bière.)
MadTux
5
Simple et triche, j'adore ça. +1
voir le
9
J'aime ça parce que ça ne semble pas vous tromper avec les mathématiques ou la sémantique, ça semble tellement simple et pourtant 5 ^^
dwana
145

Java

Il faut toujours arrondir les doubles

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;
  }
}

Sortie:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Explication:

Non, sérieusement, vous devez toujours arrondir vos doubles. 15 n'est pas suffisant pour indiquer que la two()méthode produit réellement 2.0000000000000004(16 suffisent cependant).

Dans les représentations hexadécimales brutes des nombres, il n'y a qu'une différence de 1 bit (entre 4000000000000001et 4000000000000000) ... ce qui suffit pour que la Math.ceilméthode retourne 5, pas 4.

durron597
la source
61
Math.ceil(two + two); // round just in caseJe vois ce que vous avez fait là-bas
Tim S.
17
Faire à la fois une fonction et une variable du même nom ... Wow.
configurateur
107
@configurator ce n'est rien, il n'y a même pas une classe nommée two. Le grade de production java est Two two = Two.two.two();avec Two.two étant du type TwoFactory.
Jannis Froese
36
Two.Infinity.And.Beyond ()
CincauHangus
7
@ Tims, ce que vous avez fait là-bas
thenaglecode
135

BBC BASIC

EDIT: Pour Andrea Faulds et Squeamish Ossifrage, une version plus convaincante utilisant un interprète différent: 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

entrez la description de l'image ici

Ceci affiche en fait le numéro 4, mais VDU 23redéfinit la police pour ASCII 52 de sorte qu’elle ressemble à un 5 au lieu de 4. Le mode d’écran 6 a été sélectionné pour des raisons esthétiques (caractères d’une taille raisonnable).

L'image originale utilisant l'émulateur à l' adresse http://bbcbasic.co.uk/bbcwin/bbcwin.html . (avec un code légèrement différent) peut être vu dans l'historique d'édition.

Level River St
la source
8
Ces polices ont cependant un aspect différent. Pensez-vous que vous pourriez lui faire utiliser la police correcte?
Andrea
@AndreaFaulds J'utilise l'émulateur de bbcbasic.co.uk/bbcwin/bbcwin.html . Il prend en charge la redéfinition des polices de BBC Basic d'origine sur une grille 8x8. Mais la police par défaut de l'émulateur est nettement supérieure à la résolution 8x8. Je pourrais donc probablement faire un meilleur travail, mais ce ne serait pas parfait. Je suppose que je pourrais redéfinir la police pour tous les 5 et 4, alors ils se ressembleraient.
Level River St
5
@AndreaFaulds La question n'a pas dit que le résultat devrait être impossible à distinguer des autres 5. Je pense que c'est en fait une fonctionnalité. 2+3=5et2+2=5'
Ben Jackson
1
Cela correspond à la police d'origine dans la BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
ossifrage
@squeamishossifrage merci pour l'info. Cependant, il ne correspondra pas à la police de l'émulateur. Votre exemple mesure 7 pixels de haut, tout comme le mien. En outre, il a un zéro en bas, tout comme le mien, alors qu'il semble que je doive le baisser un peu (c.-à-d. Que le zéro soit en haut au lieu du bas.) Une différence essentielle est que j'ai 126,64 alors que vous avez 126,96, et vous avez des 6 au lieu de mes 2. En effet, la police BBC d'origine comportait des lignes verticales épaisses, de sorte qu'elle pouvait être lue facilement au format 80 colonnes sur un écran de télévision standard.
Level River St
134

Brainfuck

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

Sortie:

5

Essayez ici .

Je sais que cela peut sembler un peu simple, mais j'ai essayé d'être créatif, comme suggéré dans le post original.

tigrou
la source
1
Je ne sais pas, je pense qu'il m'a fallu quelques minutes pour comprendre cela. ASCII 53, non?
Level River St
4
Tant que vous avez le, +++++.vous pouvez peindre n'importe quoi.
Eduard Florinescu
1
@steveverrill: oui vous avez raison. (et c’est le seul moyen de sortir des caractères ascii en BF).
Tigrou
1
Je ne comprends pas
Leif Willerts
105

Frapper

Comme il s’agit d’un , j’imagine que je devrais utiliser une méthode assez longue ...

Pour les personnes qui ne connaissent pas Bash: $((...expr...))est une syntaxe permettant d'évaluer les expressions arithmétiques. $(bc<<<...expr...)fait la même chose en utilisant la bccalculatrice en ligne de commande.

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...?

Sortie

2+2= 5

Explication

La deuxième ligne concatène v et 2 au lieu de les ajouter, ce qui donne 22.
Explication réelle:
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


la source
8
Bon truc de maths qui s'y passe!
tomsmeding
5
@tomsmeding C'était assez amusant, bien qu'à peu près à mi-parcours, j'ai réalisé que j'avais mis 15au lieu de la 16ligne 4. Heureusement, cela fonctionnait encore à cause de bcl'arrondi
2
Regardez si vous aimez le look de ce style qui est également valable Bash (élimine les signes dollar, permet les espaces autour du signe égal et permet les opérateurs d'affectation combinée): ((v = v * 5))ou((v *= 5))
Dennis Williamson
2
Bien, mais j'ai tout de suite remarqué la +=chose.
Nyuszika7h
2
@ardnew oui il y en a. les deux premières lignes ( v=2et v+=2): pour quelqu'un qui ne connaît pas bien la gestion des variables Bash, cela équivaudrait à 2+2, mais c'est en fait "2"+"2", c'est-à-dire "22". les autres commentaires du code ne sont erronés que pour cette raison. Je sais, tout le monde ne trouve pas ça drôle
101

Python

Inspiré par la réponse Java:

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

Comme Java, CPython utilise le même emplacement de mémoire pour toutes les copies des premiers petits nombres entiers (0 à 255 si la mémoire le permet). Cela entre et édite directement cet emplacement mémoire via ctypes. patchest simplement une "12-7"chaîne obscurcie , une chaîne de len4, qui evalest à 5.

Une version plus obscure

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")

Au-delà de 2 + 2

Comme OP mentionné, 2 + 2 peut être un peu ennuyeux; voici donc du code plus propre, multiplateforme et multi-largeurs pour abus abusif.

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))

Courir avec Python 2.7 ... ignore cette ligne à la fin. Fonctionne sous Windows 64 bits et Ubuntu 32 bits, les deux systèmes auxquels j'ai facilement accès.

$ 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)

Sans surprise, nous pouvons casser la propriété associative d’addition, où ( a + b ) + c = a + ( b + c ), comme on le voit dans les première et deuxième 1+2+3lignes, mais inexplicablement, nous cassons aussi la propriété commutative (où a + b = b + a ; 2e et 3e lignes). Je me demande si l'interpréteur Python ignore simplement les parenthèses superflues entourant les expressions d'addition.

Nick T
la source
96
Oui, nous ignorons définitivement tous les
10
Il est à noter que ce n'est pas vraiment une astuce Python mais uniquement spécifique à l'implémentation C de Python.
xApple
1
@NickT Ah! d'accord. J'avais l'impression que vous aviez essayé l'original sous les mêmes fenêtres 64 bits, configuration ubuntu 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')Est-ce une première version modifiée. Je l'ai fait pour pouvoir le déposer dans $ PYTHONSTARTUP dans / etc / profile en tant qu'équipe rouge lors de compétitions de piratage.
DavidJFelix
2
Ouais. Sidenote, il semble que 1, 0 et -1 sont quelques-uns des nombres avec lesquels Python segfaults immédiatement. Je pensais que ceux-ci seraient les pires pour bousiller le comportement des programmes Python. Il peut être possible d'utiliser fuckitpy pour contenir ces erreurs.
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())

Vérifiez-le à http://jsfiddle.net/qhRJY/

H (lettre latine majuscule h) et Η (lettre grecque capitale eta) sont définis sur la portée globale car ils n'étaient pas définis comme locaux par rapport aux fonctions avec le mot clé var. Bien qu'elles se ressemblent, ce sont en fait deux variables différentes avec deux valeurs différentes. En utilisant Ctrl + F dans votre navigateur, vous constaterez que Η (eta) apparaît nettement moins que H (h) sur cette page.

Konstantin Weitz
la source
4
@Sam même si les deux 'H sont identiques, ce sont en fait deux personnages totalement différents. En Unicode, il peut y avoir différents caractères qui se ressemblent mais ont des points de code différents. Dans ce cas précis; l'autre "H" est en fait la lettre grecque Eta .
d3dave
79
Utiliser des homoglyphes pour "confondre" les lecteurs est maintenant officiellement pas drôle .
John Dvorak
29
Les homoglyphes deviennent amusants avec les variables globales ridicules de javascript.
Konstantin Weitz
3
Ce n'est pas le "caractère Unicode", c'est du latin H et du grec Eta ().
Traitez bien vos mods
4
@Vortico hmm ... que voulez-vous quand une question de la FAQ ne suffit pas? Une question fréquemment posée à partir du centre d’aide? Notez que seuls les modérateurs peuvent appliquer la balise faq . En ce qui concerne la réponse, la question indique "marquer +5 ou plus et au moins deux fois plus de votes positifs que de votes négatifs". La réponse a 27 votes positifs et aucun vote négatif. Cela me semble répondre aux critères énoncés dans la réponse, et le nombre de votes positifs est assez impressionnant pour la deuxième réponse la plus ancienne posée sur une question du méta-site d’un site sur lequel seulement 124 personnes ont voté plus de 10 fois. Combien en voudriez- vous ? Toutes les personnes?
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) );

Le bit sous-jacent est qu’il n’est pas vraiment sous-jacent - si vous ajoutez une source sonore de 2 dB à une autre source sonore de 2 dB, le bruit résultant sera alors de 5 dB (et si vous ajoutez deux sources de 30 dB, puis de 33 dB), car elles sont mesurées sur une échelle logarithmique.

Vous pouvez le voir sur une autre calculatrice ici .

MT0
la source
En fait, cela ressemble plus à 5,01 décibels, mais suffisamment éloigné de 4 pour compter.
Joe Z.
68

PHP

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

Qui produit:

2 + 2 = 5

En effet, en PHP, les ternaires sont calculés de gauche à droite, il est donc réellement
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';

MrLore
la source
35
phpsadness
wchargin
1
J'ai un autre PHPexemple:$a=2;echo "2+2=".$a++ + $a++;
avall
Il est évident que $ a ++ fait 3 et que le résultat sera 6. Je ne comprends pas ce que vous pensez.
Ozh
1
@Janus PHPsadness # 30 explique bien
wchargin le
66

JavaScript

var total = 2 + 2;

if(total = 5)
{
    alert('I guess 2 + 2 = 5');
}
else
{
    alert('The universe is sane, 2 + 2 = 4');
}
utilisateur1886419
la source
73
=au lieu de ==, facile à voir et franchement plutôt sans inspiration.
ApproachingDarknessFish
19
Avoir un vote positif de toute façon, je fais beaucoup cette erreur
6
J'aime toujours cette réponse
Sam Creamer
5
J'aime ça aussi. Toutes les langues n'utilisent pas =uniquement comme assignation mais comme opérateur de comparaison (par exemple, Pascal, SQL, VB)
avril
Je trouve cela très évident
Oliver Ni
57

C #

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

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

        Console.WriteLine(x + y);
    }
Grax32
la source
7
ah, le bon vieux tour avec des personnages voyous. C'est pourquoi vous devriez utiliser 1TBS partout.
John Dvorak
11
@ JanDvorak Cela fonctionne-t-il à cause du point-virgule après l'instruction if? Je ne sais pas C # mais j'ai utilisé le C ++
5
@professorfish c'est ce que je suppose. En outre, les langues qui ne vous permettent pas d’insérer des accolades aléatoires FTW au hasard.
John Dvorak
12
Sans le ";", l'instruction if contrôle si le bloc de code sera exécuté. Avec le ";" là, le si est évalué mais rien n'est fait avec le résultat. Ensuite, le bloc de code est exécuté à chaque fois, peu importe. En C #, il est parfaitement acceptable d'avoir des blocs de code aléatoires.
Grax32
2
Je me suis avec celui-ci l'autre jour. J'avais une boucle for avec un ;après, ce qui était parfaitement intentionnel, car j'utilisais la boucle vide pour faire avancer un curseur. J'ai accidentellement enlevé le point-virgule, tout a explosé et je ne pouvais pas comprendre pourquoi.
mpen
56

Il est dangereux de décorer votre Javascript avec de l'art ASCII.

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

     (2 + 2)

Lorsque les commentaires sont supprimés, les symboles et les opérateurs restants sont évalués comme
-~~--~(2 + 2) suit: Cette option utilise l'opérateur Bitwise Not (~) dans JS, ainsi qu'une poignée de signes moins qui annuleront les valeurs en cours de route.

Dan Prince
la source
3
Je me demandais comment l’ --opérateur était acceptable car il devrait faire une erreur avec Invalid left-hand side expression in prefix operation; Cependant, j'ai réalisé qu'il y avait un espace entre eux.
usandfriends
53

Frapper

#!/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}"

Sortie:

2 + 2 = 5

La sortie de chacun cataura un retour à la ligne implicite, mais le retour à la ligne final est supprimé par la substitution de commande$( )


Voici un autre:

#!/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]}"

Les tableaux Bash sont indexés à zéro

Trauma numérique
la source
3
En fait, j’ai attrapé le premier, car j’ai eu beaucoup de problèmes avec ce genre de choses lors de la pratique du golf à Bash. En ce qui concerne le second, où les tableaux ne sont-ils pas indexés?
3
@professorfish Applescript, par exemple:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Digital Trauma,
12
@DigitalTrauma Applescript is weird
5
zshutilise des tableaux à 1 index (et $arr[0]est simplement non défini, non défini ou quelque chose), sauf si l' KSH_ARRAYSoption est définie, auquel cas les tableaux sont à 0 indexés.
Chepner
4
@professorfush: Lua et Fortran sont 1 indexés. Chaque fois que je compte jusqu'à 10, je commence toujours à 1, pas à 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...";
}

Cela dépend du module CPAN appelé Acme :: NewMath . En raison de noms de fichier incorrects dans le module, cela ne fonctionnera que sur des systèmes de fichiers insensibles à la casse (comme sous Windows ou Mac OS X), mais je blâme ici l'auteur du module d'origine. Acme :: NewMath implémente les mathématiques selon l'idéologie Ingsoc.

Konrad Borowski
la source
16
C'est assez sournois. Personne ne regarde jamais vos importations / inclus.
44

R

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

sortie:

5

le code ajoute en fait la moyenne de [1] à la moyenne de [4]. La bonne façon d'utiliser la fonction moyenne dans R serait la suivante: mean(c(1,3)) + mean(c(4,0))Ceci est différent des autres fonctions mathématiques dans R, tels que sum, maxet min; où sum(1,3), max(1,3)et min(3,1)donnerait tous la réponse attendue.

ping
la source
7
Pas mal, m'a dupé un peu.
qwr
37

Java

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

sortie:

512.0000000000005

Fonctionne probablement dans toutes les langues utilisant le même type de doublons.

Aditsu
la source
7
C'est une signature principale très étrange.
Bertie Wheen
10
Java implémente des arguments variadic en tant que tableaux sous le capot.
CodaFi
4
Il m'a fallu un moment pour comprendre que vous parliez probablement des derniers chiffres du double. J'ai vu que les premiers chiffres étaient ajoutés correctement ( _2_56 + _2_56 = _5_12), mais il semble plus probable que vous vouliez dire 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(note: les caractères de soulignement avaient l'habitude de "gras" les chiffres.
Justin
35

Befunge

Ceci est écrit en Befunge, mais est conçu pour ressembler à 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]

Lorsqu'il est exécuté (avec l'interprète correct), le programme sera imprimé 5.

Explication:

Un programme Befunge est constitué d'une grille de commandes à un seul caractère. La première commande est celle qui se trouve dans le coin supérieur gauche et la lecture des commandes se poursuit vers la droite. Mais la direction peut changer pendant l'exécution du programme.

Seules la première ligne de caractères et la colonne de caractères commençant par le vdans la première ligne sont exécutées. Les caractères en question font:

#- ignorer la commande suivante
>- Les commandes sont désormais lues à droite de la commande en cours
v- Les commandes sont désormais lues sous la commande en cours
5- Poussez 5 dans la pile
.- Pop et imprimez le numéro en haut de la pile
@- Terminez le programme
<space>- Ne faites rien

Si vous saviez que vous programmez à Befunge, cela ne trompera personne. Mais si vous rencontriez cela et ne réalisiez pas que c'était Befunge, ce serait probablement le cas.

Mat
la source
11
+1, c'est très sournois, car qui regarde le programme qui exécute le code source lors du débogage?
MrLore
33

JavaScript

Code:

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

Sortie:

5

Vous pouvez le tester vous-même sur votre console ou consulter ce violon

William Barbosa
la source
6
Pouvez-vous m'indiquer une ressource ou m'expliquer pourquoi cela fonctionne? Je sais que cela fonctionne parce que j'ai vérifié le violon, mais je ne comprends pas pourquoi.
Famille
29
la variable "a" n'est pas la même fois les deux fois (désolé si je gâte cela). Sneaky unicode en effet
Sam Creamer
6
J'adore le fait que le prochain personnage U+0431, soit - presque 6!
wchargin
73
Utiliser des homoglyphes pour "confondre" les lecteurs est maintenant officiellement pas drôle .
John Dvorak
40
@JanDvorak Cette réponse a été postée après celle-ci; cela ne s'applique pas ici.
Poignée de porte
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);  
}

Il imprime 2 + 2 = 5

Donc a = 2, non?

gcc-4.7.3 évalue les paramètres de la fonction de droite à gauche. Quand a + b est évalué, a est toujours 3.

Cpri
la source
16
Bonne
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

Abus standard de commonblocs: l'ordre compte; J'ai échangé la commande dans le bloc du sous-programme alors j'ajoute vraiment 1 + 2 + 2.

Kyle Kanos
la source
6
@JanDvorak: Haha, j'aurais pu utiliser FORTRAN IV pour redéfinir les littéraux, par exemple2=3
Kyle Kanos
1
@ KyleKanos, c'est ce que je pensais que cela allait être quand j'ai vu que votre message était écrit en FORTRAN.
danmcardle
@KyleKanos Faites-le!
ClickRick
1
@KyleKanos: Cela a-t-il fonctionné avec des littéraux entiers ou seulement des flottants? Je pense que sur une machine de cette époque, un littéral entier et une adresse auraient été de la même taille, mais inférieurs à un nombre flottant, de sorte que la mise en commun des littéraux de flotteurs permettrait de gagner de la place, mais pas en commun.
Supercat
2
@KyleKanos: À ma connaissance, les compilateurs ne permettraient pas une affectation directe à un littéral, mais les appels de fonction utilisés passent de référence à, et le passage d'un littéral à virgule flottante à une fonction transmettrait généralement l'adresse d'une valeur dans un pool de littéraux Passer une valeur entière à une fonction entraînerait sa mise en pool, mais la plupart du code utilisant des entiers inclurait directement les valeurs.
Supercat
24

Python

Le code affiche 5, ce qui est la réponse correcte pour cette tâche.

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

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

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

Edit: Voici une version alternative qui ajoute des entiers, pas des deux stringifiés.

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

Tilde est un opérateur inverse unaire qui revient -x-1, donc la première étape consiste à obtenir -6puis avec un autre opérateur dans la printfonction get5

avall
la source
Pourquoi ~eval(`a`)au lieu de juste ~a?
Andrea Corbellini
2
Je voulais laisser une partie de la int()fonctionnalité et eval()faire le travail si l'entrée est un entier stringifié :)
avall
24

Rubis

class Fixnum
    alias plus +

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

puts 2 + 2

Cela augmente de 1 le résultat de tous les ajouts dont le premier argument est un Fixnum (dont 2 correspond au moins à l'IRM).

Les effets secondaires sont encore pires que ceux de la version Java.

Lowjacker
la source
23

Rubis

Ruby a des environnements de première classe. Cela signifie beaucoup de choses. Cela signifie également que beaucoup de choses peuvent être faites ... peut-être que non.

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

La sortie de ceci est:

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

Si vous voulez en savoir plus sur les joies et les dangers de cette expérience , Ruby Conf 2011 Gardez Ruby raisonnable et lisez les environnements de première classe du blog Abstract Heresies.


la source
Aussi:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42
1
Pour faire juste pour le cas spécifique: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

Schème

(define 2+2 5)
2+2 ;=> 5
Hauleth
la source
9
Hey! 2+2n'est pas comment vous faites plus dans le lisp!
John Dvorak
1
Et alors? Il semble ajouter 2 à 2 tel qu'il est dans la tâche.
Hauleth
119
@ JanDvorak Je n'ai jamais utilisé lisp, mais si je comprends bien, c'est un peu comme ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
undergroundmonorail
2
"Redéfinir 2 + 2 en tant que 5 n'est pas très créatif! N'y réfléchissez pas, essayez autre chose." --- Eh bien, dans R5RS je peux redéfinir + au lieu de 2 + 2 ou 2. La réponse est ici: pastebin.com/KHtm9Jmv
Felipe
1
@FelipeMicaroniLalli cette annotation a été faite après ma réponse, elle ne compte donc pas.
Hauleth
20

C #

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

Pour ceux qui ne sont pas familiers, cela donne l’impression que la plage commence et se termine à 2. En réalité, elle commence à 2 et comprend deux chiffres. Donc 2 + 3 = 5.

Paul
la source
6
Une plage commençant et finissant à 2 serait juste { 2 }, n'est-ce pas?
Paŭlo Ebermann
1
@ PaŭloEbermann Enumerable.Rangene prend pas un début et une fin, mais un début et un nombre d'éléments (qui seront énumérés).
MasterMastic
14
@MasterMastic, j'ai compris cela grâce à l'explication fournie dans la réponse. Mais le sens du mot "à quelqu'un non familier" est supposé être une telle plage (d'après l'explication de la réponse), et mon argument est que le résultat attendu serait alors 2, pas 4.
Palo Ebermann
1
@ PaŭloEbermann, oui, c'est aussi une façon de voir les choses. Je pensais que cela pourrait ressembler davantage à la fourniture des chiffres à ajouter. Donc, Enumerable.Range (1,2,3,4) commencerait à 1, finirait à 4, et résumerait à 10.
Paul
19

F#

Mettons dans la déclaration suivante fsi:

let ``2+2``= 5

Sortie:

val ( 2+2 ) : int = 5
Krzysztof Cieslak
la source
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;
}

Le 5n'est pas trop bien caché, j'ai peur. Ne fonctionne pas avec l'optimisation.

Ugoren
la source
1
Agréable; Je ne peux pas voter si un comportement indéfini n'est pas autorisé.
Ce
2
@self., Je ne vois pas où le recours à l'UB est interdit. Beaucoup de codes de golf répondent à UB, et je pense que c'est correct tant que cela se produit régulièrement sur une plate-forme raisonnable.
Ugoren
2
Je ne vois pas où le recours à l'UB est interdit. Je n'ai trouvé aucune règle à ce sujet non plus. Ce serait bien si cela pouvait être clarifié. Beaucoup de codes de golf répondent à UB, et je pense que tout va bien tant que cela se produit régulièrement sur une plate-forme raisonnable. Certaines règles spécifiques à ce sujet seraient bien.
Ce