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.

qwr
fonte
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 .

Dennis
fonte
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
Flonk
fonte
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.

Michael M.
fonte
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.

aaaaaaaaaaaa
fonte
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.

durron597
fonte
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.

Level River St
fonte
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.

tigrou
fonte
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
1
Eu não understaaaand
Leif Willerts
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


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

Nick T
fonte
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.

Konstantin Weitz
fonte
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 .

MT0
fonte
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';

MrLore
fonte
35
phpsadness
wchargin,
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');
}
user1886419
fonte
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);
    }
Grax32
fonte
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.

Dan Prince
fonte
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

Trauma Digital
fonte
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.

Konrad Borowski
fonte
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.

ping
fonte
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.

aditsu
fonte
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: [email protected]

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.

Matt
fonte
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

William Barbosa
fonte
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.

cpri
fonte
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.

Kyle Kanos
fonte
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

avall
fonte
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.

Lowjacker
fonte
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.


fonte
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
Hauleth
fonte
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.

Paulo
fonte
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
Krzysztof Cieslak
fonte
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.

Ugoren
fonte
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