Escreva um programa que produz 2 + 2 = 5 [fechado]


393

Escreva um programa que aparentemente adicione os números 2 e 2 e produz 5. Este é um concurso secreto.

Seu programa não pode gerar erros. Cuidado com os buracos da memória! A entrada é opcional.

Redefinir 2 + 2 como 5 não é muito criativo! Não pense duas vezes, tente outra coisa.


48
Esta é a pergunta do livro "1984", de George Orwelll.
— bacchusbeale

97
Por que isso é oculto? Dois mais dois são cinco.
— Geobits

79
LÁ! ESTÃO! QUATRO! LUZES!
— Nick T

105
@ Geobits - Eu concordo: 2 + 2 = 5 você pode vê-lo nesta calculadora .
— MT0

47
echo "2+2=5";
— User3459110

Respostas:


669

Java

A reflexão é realmente o caminho certo para abusar do Java ... mas você precisa ir mais fundo do que apenas ajustar alguns 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);
    }
}

Resultado:

5

Explicação:

Você precisa alterá-lo ainda mais do que normalmente pode acessar. Observe que isso foi projetado para Java 6 sem parâmetros descolados transmitidos na JVM que, de outra forma, alterariam o IntegerCache .

Dentro da classe Inteiro, há um Flyweight de Inteiros. Essa é uma matriz de números inteiros de -128 a +127. cache[132]é o local onde normalmente seria 4. Defina para 5.

Aviso: fazer isso em código real deixará as pessoas muito infelizes.

Demonstração de código em ideone .


5
Pensado nisso um logo que eu vi a questão :)
— Octavia Togami

306
Naquela. É. Mal. Absolutamente mau. +1
— John Dvorak

75
@JanDvorak no bate-papo foi sugerido Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Imaginem quantas coisas iria quebrar ...

30
Respostas como essa me fazem amar esse site mais do que SO.
— Songo 30/05

35
respostas zomg, java nunca recebem os melhores votos! +1 para trazer java ao topo :)
— Cruncher

297

Haskell

Eu simplesmente amo como você pode jogar qualquer coisa no ghci e ele rola totalmente com ele.

λ> let 2+2=5 in 2+2
5

36
O que let 2+2=5 in 5+5faz? #
— John Dvorak

22
@ JanDvorak Non-exhaustive patterns in function +- Estou definindo uma nova função (+) aqui, e se eu conectar algo que não 2+2seja, ocorrerá um erro porque nunca defini o que deve acontecer nesse caso.
— Flonk 30/05

27
@SHiNKiROU sombra, não redefinir
— John Dvorak

96
que quase soa como: "E Deus disse que vamos 2 + 2 = 5 em 2 + 2"))
— OutFall

11
@ user3217013 Aprenda Haskell, é bom para o seu coração.
— Shoe

294

C

Truque bem barato, mas tenho certeza de que vou prender a maioria de vocês.

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

Experimente aqui

Role o código para a direita.
Não tenho certeza no Windows / Linux, mas no OSX, a barra de rolagem não está visível.
De qualquer forma, esse é um bom motivo para ativar a "visualização de espaço" no seu editor de código favorito.


96
A barra de rolagem é visível no Chromium, mas quem presta atenção nela primeiro? :)
— Ruslan

172
Para confundir as pessoas, você pode adicionar uma linha de comentário longa o suficiente para "explicar" a existência de uma barra de rolagem, mas sem brilho o suficiente para que ninguém se preocupe em (rolar para ler).
— Hagen von Eitzen

22
No OS X, a visibilidade da barra de rolagem, por padrão, depende se um mouse está conectado. Se houver apenas um touchpad, as barras de rolagem são sobrepostas e desaparecem quando não estão em uso. Se houver um mouse conectado, as barras de rolagem roubam espaço da caixa de contexto e estão sempre visíveis. Você pode testar isso desconectando e conectando um mouse USB a um MacBook. Isso pode ser configurado nas Preferências do Sistema, é claro.
— Andrea

49
Inteligente, mas no celular apenas wordwraps :)
— Logan

31
Esta é a única vez que a rolagem das janelas de código SE não me faz querer quebrar os dedos de alguém.
— precisa saber é o seguinte

184

GolfScript

4:echo(2+2);

Imprime 5.

É claro que o GolfScript possui uma sintaxe muito diferente de outras linguagens; esse programa parece algo básico ou C-ish.

4  - Coloque o número 4 na pilha. Conteúdo da pilha: 4
:echo- Salve o valor na parte superior da pilha no eco variável. Conteúdo da pilha: 4
(  - Diminua o valor na parte superior da pilha por 1. Conteúdo da pilha: 3
2  - Coloque o número 2 na parte superior da pilha. Conteúdo da pilha: 3 2
+  - Adicione os dois números na parte superior da pilha. Conteúdo da pilha: 5
2  - Coloque o número 2 em cima da pilha. Conteúdo da pilha: 5 2
)  - Aumente o valor na parte superior da pilha em 1. Conteúdo da pilha: 5 3
;  - Remova o elemento superior da pilha. Conteúdo da pilha: 5

Por padrão, o GolfScript imprime tudo o que resta na pilha após a conclusão da execução.


3
Você pode explicar isso para pessoas que não falam o GolfScript, por favor?
— MadTux

1
@MadTux Aqui você vai.
— Aaaaaaaaaaa

1
Obrigado. (Eu vou upvote mais tarde porque eu alcancei meu limite diário, aqui está uma cerveja.)
— MadTux

5
Simples e barato, eu adoro isso. +1
— veja

9
i like it becaus não parece como ele está enganando vocês com a matemática ou semântica, parece tão simples e ainda 5 ^^
— Dwana

145

Java

Sempre tem que arredondar suas duplas, pessoal

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

Resultado:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Explicação:

Não, sério, você sempre tem que arredondar suas duplas. 15 não são dígitos suficientes para mostrar que o two()método realmente produz 2.0000000000000004(16 são suficientes).

Nas representações hexadecimais brutas dos números, é apenas uma diferença de 1 bit (entre 4000000000000001e 4000000000000000) ... o suficiente para fazer o Math.ceilmétodo retornar 5, não 4.


61
Math.ceil(two + two); // round just in caseEu vejo o que você fez lá #
— Tim S.

17
Fazendo uma função e uma variável com o mesmo nome ... Uau.
— Configurator

107
@ configurador isso não é nada, não existe nem uma classe chamada two. O nível de produção java é Two two = Two.two.two();com Two.two sendo do tipo TwoFactory.
— Jannis Froese

36
Two.Infinity.And.Beyond ()
— CincauHangus

7
@ TimS eu tecto o que você fez lá
— thenaglecode

135

BBC BASIC

EDIT: Para Andrea Faulds e Squeamish Ossifrage, uma versão mais convincente usando um 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

insira a descrição da imagem aqui

Na verdade, ele imprime o número 4, mas VDU 23redefine a fonte do ASCII 52 para que pareça um 5 em vez de um 4. O modo de tela 6 foi selecionado por razões estéticas (caracteres de tamanho razoável).

A imagem original usando o emulador em http://bbcbasic.co.uk/bbcwin/bbcwin.html . (com código ligeiramente diferente) pode ser visto no histórico de edições.


8
Essas fontes parecem diferentes. Você acha que poderia fazê-lo usar a fonte correta?
— Andrea

@AndreaFaulds Estou usando o emulador de bbcbasic.co.uk/bbcwin/bbcwin.html . Ele suporta a redefinição de fonte do BBC Basic original em uma grade 8x8. Mas a fonte padrão do emulador é claramente maior que 8x8. Então eu provavelmente poderia fazer um trabalho melhor, mas não seria perfeito. Suponho que eu poderia redefinir a fonte para todos os 5 e 4, para que parecessem os mesmos.
— Level River St

5
@AndreaFaulds A pergunta não dizia que o resultado deveria ser indistinguível dos outros 5s. Eu acho que isso é realmente um recurso. 2+3=5e2+2=5'
— Ben Jackson

1
Isso coincide com a fonte original no BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
— ossifrage escrúpulos

@squeamishossifrage obrigado pela informação. Porém, não corresponde à fonte no emulador. Seu exemplo tem 7 pixels de altura, assim como o meu. Além disso, ele tem um zero na parte inferior, assim como o meu, enquanto parece que eu preciso diminuí-lo um pouco (ou seja, ter o zero na parte superior em vez da parte inferior.) Uma diferença importante é que tenho 126,64 enquanto você tem 126,96, e você tem uns 6 em vez dos meus 2. Isso ocorre porque a fonte original da BBC tinha linhas verticais grossas, para que pudesse ser lida facilmente no formato de 80 colunas em uma tela de TV padrão.
— Level River St

134

Brainfuck

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

Resultado:

5

Experimente aqui .

Sei que isso pode parecer um pouco simples, mas tentei ser criativo, conforme sugerido na postagem original.


1
Eu não sei foder, demorei alguns minutos para descobrir isso. ASCII 53, certo?
— Level River St

4
Contanto que você tenha, +++++.pode pintar qualquer coisa.
— Eduard Florinescu 6/06/2014

1
@ steveverrill: sim, você está certo. (e esta é a única maneira de gerar caracteres ascii em BF).
— usar o seguinte


105

Bater

Uma vez que este é um , acho que devo usar um método muito complicado ...

Para pessoas que não conhecem o Bash: $((...expr...))é uma sintaxe para avaliar expressões aritméticas. $(bc<<<...expr...)faz o mesmo usando a bccalculadora da linha 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...?

Resultado

2+2= 5

Explicação

A segunda linha concatena v e 2 em vez de adicioná-los, para fazer 22.
Explicação 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


8
Bom truque de matemática acontecendo lá!
— tomsmeding 31/05

5
@tomsmeding Foi bastante divertido, embora a meio eu percebi que eu tinha colocado 15em vez de 16na linha 4. Felizmente, ele ainda trabalhou por causa de bc's arredondamento

2
Veja se você gosta do olhar deste estilo que é também Bash válido (elimina os cifrões, permite espaços em torno do sinal de igual e permite que operadores de atribuição combinado): ((v = v * 5))ou((v *= 5))
— Dennis Williamson

2
Legal, mas vi a +=coisa imediatamente.
— precisa saber é o seguinte

2
@ardnew sim existe. as duas primeiras linhas ( v=2e v+=2): para alguém não familiarizado com o tratamento de variáveis ​​do Bash, isso seria equivalente a 2+2, mas é de fato "2"+"2", ie "22". os outros comentários no código estão errados apenas por causa disso. Eu sei que nem todo mundo acha isso engraçado #

101

Pitão

Inspirado pela resposta Java:

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

Como Java, o CPython usa o mesmo local de memória para qualquer cópia dos primeiros números inteiros pequenos (0 a 255, se a memória servir). Isso entra e edita diretamente esse local de memória via ctypes. patché apenas um ofuscado "12-7", uma string com len4, que evalé 5.

Uma versão mais 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")

Além de 2 + 2

Como o OP mencionou, 2 + 2 pode ser meio chato; então aqui está um código mais limpo, multiplataforma e com várias larguras para abuso arbitrário.

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

Correndo com o Python 2.7 ... ignore essa linha no final. Funciona no Windows de 64 bits e no Ubuntu de 32 bits, os dois sistemas aos quais tenho acesso fácil.

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

Sem surpresa, podemos quebrar a propriedade associativa de adição, onde ( a + b ) + c = a + ( b + c ), como visto nas 1+2+3linhas 1 e 2 , mas inexplicavelmente também quebramos a propriedade comutativa (onde a + b = b + a ; 2ª e 3ª linhas). Gostaria de saber se o interpretador Python simplesmente ignora parênteses supérfluos em torno de expressões de adição.


96
Sim, nós definitivamente tudo apenas casualmente ignoram segfaults ...

10
Vale ressaltar que esse não é realmente um truque do Python e é apenas específico para a implementação C do Python.
— xApple

1
@NickT Ah! OK. Fiquei com a impressão de que você tinha tentado o original sob as mesmas janelas de 64 bits, 32 bits de configuração ubuntu
— 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')É uma primeira versão modificada. Eu fiz isso para poder colocá-lo em $ PYTHONSTARTUP no / etc / profile como equipe vermelha nas competições de hackers.
— precisa saber é o seguinte

2
Sim. Sidenote, parece que 1, 0 e -1 são alguns dos números com os quais o python se segmenta imediatamente. Eu estava pensando que esses seriam os piores por estragar o comportamento dos programas python. Pode ser possível utilizar o fuckitpy para conter esses erros.
— precisa saber é o seguinte

86

JavaScript:

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

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

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

Verifique em http://jsfiddle.net/qhRJY/

H (letra maiúscula em latim h) e Η (letra maiúscula em grego eta) são configurados para o escopo global porque não foram definidos como locais para as funções com a palavra-chave var. Embora pareçam semelhantes, na verdade são 2 variáveis ​​diferentes com 2 valores diferentes. Usando Ctrl + F no seu navegador, você verá que Η (eta) aparece significativamente menos que H (h) nesta página.


4
@ Sam Mesmo que os dois 'H's pareçam iguais, na verdade eles são dois personagens completamente diferentes. No Unicode, pode haver caracteres diferentes com a mesma aparência, mas com pontos de código diferentes. Neste caso específico; o outro "H" é na verdade a letra grega Eta .
— D3dave 31/05

79
Usar homóglifos para "confundir" os leitores agora não é oficialmente engraçado .
— John Dvorak

29
Os homoglifos se tornam engraçados em combinação com as ridículas variáveis ​​globais do javascript.
— Konstantin Weitz

3
Não é o "caractere Unicode Η", é o latim H e o grego Eta (Η).
— trate seus mods bem

4
@Vortico hmm ... o que você deseja quando uma pergunta do FAQ não é suficiente? Uma pergunta de FAQ vinculada ao centro de ajuda? Observe que apenas moderadores podem aplicar a tag faq . Quanto à resposta - a pergunta afirma "marcar +5 ou mais e pelo menos o dobro de votos positivos e negativos". A resposta tem 27 votos positivos e nenhum voto negativo. Isso me parece cumprir os critérios estabelecidos na resposta, e a quantidade de votos positivos é bastante impressionante para a segunda resposta mais antiga de uma pergunta no meta site de um site onde apenas 124 pessoas votaram mais de 10 vezes. Quantas você gostaria? 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) );

O bit secreto é que não é realmente secreto - se você adicionar uma fonte de som de 2dB a outra fonte de som de 2dB, o ruído combinado resultante será de 5dB (e se você adicionar duas fontes de 30dB, então seus 33dB), conforme são medidos em uma escala de log.

Você pode vê-lo em uma calculadora diferente aqui .


Bem, na verdade é mais como 5,01 decibéis, mas longe o suficiente de 4 para contar.
— Joe Z.

68

PHP

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

Qual produz:

2 + 2 = 5

Isso ocorre porque, no PHP, os ternários são calculados da esquerda para a direita, então é realmente
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';



1
Eu tenho outro PHPexemplo:$a=2;echo "2+2=".$a++ + $a++;
— avall

É óbvio que $ a ++ faz 3 e o resultado será 6. Não entendi o que você está pensando.
— Ozh

1
@Janus PHPsadness # 30 explica bem
— 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');
}

73
=em vez de ==fácil de ver e francamente sem inspiração.
— ApproachingDarknessFish

19
Tenha um

6
Eu ainda gosto de esta resposta
— Sam Creamer

5
Eu gosto disso também. Não cada linguagem usa =apenas como um assigment mas um operador de comparação (por exemplo, Pascal, SQL, VB)
— avall

Acho muito óbvio
— Oliver Ni

57

C #

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

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

        Console.WriteLine(x + y);
    }

7
ah, o bom e velho truque com personagens desonestos. É por isso que você deve usar 1 TB em qualquer lugar.
— John Dvorak

11
@JanDvorak Isso funciona por causa do ponto e vírgula após a instrução if? Eu não sei C #, mas eu tenho usado C ++

5
@professorfish é o que eu assumo. Além disso, idiomas que não permitem a inserção de chaves aleatórias FTW.
— John Dvorak

12
Sem o ";", a instrução if controla se o bloco de código será executado. Com o ";" lá, o if é avaliado, mas nada é feito com o resultado. Em seguida, o bloco de código é executado sempre, independentemente. Em C #, é perfeitamente aceitável ter blocos de código aleatórios.
— Grax32

2
Eu me peguei com esse outro dia. Eu tinha um loop for com um ;depois, o que era perfeitamente intencional, pois eu estava usando o loop vazio para avançar um cursor. Tirei acidentalmente o ponto-e-vírgula, tudo explodiu e não consegui descobrir o porquê.
— MPEN

56

É perigoso decorar seu Javascript com arte ASCII.

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

     (2 + 2)

Quando os comentários são removidos, os símbolos e operadores restantes avaliam como
-~~--~(2 + 2) Isso faz uso do operador Bitwise Not (~) em JS, junto com um punhado de sinais de menos que negarão os valores ao longo do caminho.


3
Fiquei me perguntando como o --operador era aceitável, pois deveria ter erro Invalid left-hand side expression in prefix operation; no entanto, percebi que há um caractere de espaço em branco entre eles.
— usandfriends

53

Bater

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

Resultado:

2 + 2 = 5

A saída de cada catum terá uma nova linha implícita, mas a nova linha final é removida pela substituição de comando$( )


Aqui está outro:

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

Matrizes Bash são zero indexadas


3
Na verdade, eu peguei o primeiro, pois tive muitos problemas com coisas assim quando jogava golfe no Bash. Quanto ao segundo, onde as matrizes não são indexadas com zero?

3
@professorfish Applescript, por exemplo:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
— Digital Trauma

12
@DigitalTrauma Applescript é estranho

5
zshusa matrizes indexadas a 1 (e $arr[0]é simplesmente não definido ou indefinido ou algo assim), a menos que a KSH_ARRAYSopção esteja definida; nesse caso, as matrizes são indexadas com 0.
— chepner 30/05

4
@professorfush: Lua e Fortran são 1 indexados. Sempre que conto até 10, sempre começo com 1, e não com 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 do módulo CPAN chamado Acme :: NewMath . Devido a nomes de arquivos incorretos no módulo, isso funcionará apenas em sistemas de arquivos que não diferenciam maiúsculas de minúsculas (como no Windows ou Mac OS X), mas eu culpo o autor do módulo original aqui. Acme :: NewMath implementa matemática de acordo com a ideologia Ingsoc.


16
Isso é bastante astuto. Ninguém nunca vê suas importações / inclusões.

44

R

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

resultado:

5

o código realmente adiciona a média de [1] à média de [4]. A maneira correta de usar a função de média em R seria: mean(c(1,3)) + mean(c(4,0))Isso é diferente de algumas outras funções matemáticas em R, tais como sum, max, e min; onde sum(1,3), max(1,3)e min(3,1)que todos dar a resposta esperada.


7
Nada mal, me enganou um pouco.
— QWR

37

Java

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

resultado:

512.0000000000005

Provavelmente funciona em qualquer idioma que use o mesmo tipo de duplas.


7
Essa é uma assinatura principal muito estranha.
— Bertie Wheen

10
Java implementa argumentos variados como matrizes sob o capô.
— CodaFi

4
Levei um momento para perceber que você provavelmente está falando sobre os últimos dígitos nos duplos. Vi que os primeiros dígitos adicionado correctamente ( _2_56 + _2_56 = _5_12), mas parece mais provável que você quer dizer 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(nota:. Sublinhados usado para "negrito" os dígitos
— Justin

35

Befunge

Isso está escrito no Befunge, mas foi projetado para se parecer com 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: MarkSmith@example.com

Quando executado (com o intérprete correto), o programa será impresso 5.

Explicação:

Um programa Befunge é composto de uma grade de comandos de caracteres únicos. O primeiro comando é aquele no canto superior esquerdo e a leitura dos comandos prossegue para a direita. Mas a direção pode mudar durante a execução do programa.

Somente a primeira linha de caracteres e a coluna de caracteres iniciando com o vna primeira linha são executadas. Os caracteres em questão:

#- pulam o próximo comando
>- A partir de agora, os comandos são lidos à direita do comando atual
v- A partir de agora, os comandos são lidos abaixo do comando atual
5- Pressione 5 na pilha
.- Pop e imprima o número no topo da pilha
@- Finalize o programa
<space>- Não faça nada

Se você soubesse que estava programando no Befunge, isso não enganaria ninguém. Mas se você se deparar com isso e não perceber que é o Befunge, provavelmente seria.


11
+1, isso é muito desonesto, porque quem diabos vê o programa que executa o código-fonte durante a depuração?
— MrLore

33

Javascript

Código:

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

Resultado:

5

Você pode testá-lo no seu console ou verificar este Fiddle


6
Você pode me indicar um recurso ou me explicar por que isso funciona? Sei que funciona porque verifiquei o Fiddle, mas não entendo o porquê.
— Família

29
a variável "a" não é a mesma nas duas vezes (desculpe se estou estragando isso). Unicode Sneaky na verdade
— Sam Creamer

6
Eu amo como o próximo personagem U+0431,, é quase 6!
— precisa saber é o seguinte

73
Usar homóglifos para "confundir" os leitores agora não é oficialmente engraçado .
— John Dvorak

40
@JanDvorak Essa resposta foi publicada depois desta; não se aplica aqui.
— Maçaneta

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

Então a = 2, certo?

O gcc-4.7.3 avalia os parâmetros de função da direita para a esquerda. Quando a + b é avaliado, a ainda é 3.


16
Utilização agradável de comportamento não 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 de commonblocos padrão : a ordem é importante; Troquei a ordem no bloco na sub-rotina, então estou realmente adicionando 1 + 2 + 2.


6
@JanDvorak: Haha, eu poderia ter usado Fortran IV na qual eu poderia redefinir literais, por exemplo2=3
— Kyle Kanos

1
@KyleKanos, era o que eu pensava que seria quando vi sua postagem escrita em FORTRAN.
— Danmcardle

@KyleKanos Do it!
— ClickRick

1
@KyleKanos: Isso funcionou com literais inteiros ou apenas floats? Eu pensaria que, em uma máquina daquela época, um literal inteiro e um endereço teriam o mesmo tamanho, mas menores que um float; portanto, o pooling literal de float economizaria espaço, mas o pool int literals não.
— Supercat 03/06

2
@KyleKanos: Meu entendimento é que os compiladores não permitiriam uma atribuição direta a um literal, mas as chamadas de função usadas passam por referência e a passagem de um literal de ponto flutuante para uma função geralmente passaria o endereço de um valor em um pool de variáveis literais de ponto. Passar um valor inteiro para uma função faria com que ele fosse agrupado, mas a maioria dos códigos que usavam números inteiros incluiria os valores diretamente.
— precisa

24

Pitão

O código imprime 5, que é a resposta correta para esta tarefa.

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

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

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

Edit: Aqui está a versão alternativa, que adiciona números inteiros, e não a dois.

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

Tilde é um operador inverso unário que retorna -x-1; portanto, o primeiro passo é obter -6e, em seguida, com outro operador na printfunção get5


Por que ao ~eval(`a`)invés de apenas ~a?
— Andrea Corbellini

2
Eu queria deixar alguma da int()funcionalidade e eval()faz o trabalho se a entrada for um número inteiro stringified :)
— avall

24

Rubi

class Fixnum
    alias plus +

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

puts 2 + 2

Isso aumenta o resultado de todas as adições cujo primeiro argumento é um Fixnum (que 2 é, pelo menos na RM) em 1.

Os efeitos colaterais disso são ainda piores que a versão Java.


23

Rubi

Ruby tem ambientes de primeira classe. Isso significa muitas coisas. Isso também significa que muitas coisas podem ser feitas que ... talvez não devam.

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

A saída disso é:

2 + 2 = 
4
2 + 4 = 
6
Mas em 1984 ...
2 + 2 = 
5
2 + 4 = 
6

Se você quiser entender mais sobre as alegrias e os perigos disso, Ruby Conf 2011 Mantendo o Ruby Razoável e leia Ambientes de primeira classe no blog Abstract Heresies.


Também:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
— film42

1
Para fazer apenas no 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

9
Ei! 2+2não é assim que você faz adição no lisp!
— John Dvorak

1
E daí? Aparentemente, adicione 2 a 2 como está na tarefa.
— Hauleth

119
@JanDvorak Eu nunca usei o lisp, mas pelo que entendi, é algo parecido ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
— undergroundmonorail

2
"Redefinir 2 + 2 como 5 não é muito criativo! Não pense duas vezes, tente outra coisa." --- Bem, em R5RS posso redefinir + em vez de 2 + 2 ou 2. A resposta está aqui: pastebin.com/KHtm9Jmv
— Felipe

1
@FelipeMicaroniLalli que a anotação foi feita após a minha resposta para que não conte.
— Hauleth

20

C #

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

Para alguém não familiar, parece que estou recebendo um intervalo começando e terminando em 2. Na realidade, ele começa em 2 e passa por dois números. Então 2 + 3 = 5.


6
Um intervalo começando e terminando em 2 seria justo { 2 }, não é?
— Paŭlo Ebermann

1
@ PaŭloEbermann Enumerable.Rangenão inicia nem termina, mas inicia e conta (de elementos que serão enumerados).
— MasterMastic

14
@ MasterMastic Eu entendi isso a partir da explicação na resposta. Mas o "a alguém que não familar" significado é suposto ser essa gama (a partir da explicação na resposta), e meu argumento é que o resultado esperado seria, então, 2, não 4.
— Paulo Ebermann

1
@ PaŭloEbermann, sim, essa é uma maneira de ver também. Eu estava pensando que poderia parecer mais como se eu estivesse fornecendo os números a serem adicionados. Então Enumerable.Range (1,2,3,4) iria começar em 1, final a 4, e resumiria a 10.
— Paul

19

F #

Vamos colocar na seguinte declaração fsi:

let ``2+2``= 5

Resultado:

val ( 2+2 ) : int = 5

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

O 5medo não está muito bem escondido. Não funciona com otimização.


1
Agradável; Não posso votar se não for permitido um comportamento indefinido.
— este

2
@self., não vejo onde é proibido confiar no UB. Muitas respostas ao código de golfe dependem do UB, e acho que tudo bem, desde que isso ocorra consistentemente em alguma plataforma razoável.
— ugoren

2
Não vejo onde é proibido confiar no UB. Também não encontrei nenhuma regra sobre isso. Seria bom se isso pudesse ser esclarecido. Muitas respostas ao código de golfe dependem do UB, e acho que tudo bem, desde que isso ocorra consistentemente em alguma plataforma razoável. Algumas regras específicas sobre isso seriam boas.
— este
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.