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.