Scrivi un programma che fa 2 + 2 = 5 [chiuso]


393

Scrivi un programma che apparentemente aggiunge i numeri 2 e 2 e le uscite 5. Questo è un concorso subdolo.

Il tuo programma non può generare errori. Fai attenzione ai buchi della memoria! L'ingresso è facoltativo.

Ridefinire 2 + 2 come 5 non è molto creativo! Non pensarci due volte, prova qualcos'altro.


48
Questa è una domanda nel libro "1984" di George Orwelll.
bacchusbeale,

97
Perché questo è subdolo? Due più due sono cinque.
Geobits

79
LÀ! SIAMO! QUATTRO! LUCI!
Nick T,

105
@Geobits - Sono d'accordo: 2 + 2 = 5 lo puoi vedere in questo calcolatore .
MT0,

47
echo "2+2=5";
user3459110

Risposte:


669

Giava

La riflessione è davvero il modo giusto per abusare di Java ... ma devi andare più in profondità che modificare solo alcuni valori.

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

Produzione:

5

Spiegazione:

Devi cambiarlo ancora più in profondità di quanto puoi accedere in genere. Si noti che questo è progettato per Java 6 senza parametri funky passati sulla JVM che altrimenti cambierebbe IntegerCache .

Nel profondo della classe Integer è presente un Peso mosca di numeri interi. Questa è una matrice di numeri interi da -128 a +127. cache[132]è il punto in cui 4 sarebbe normalmente. Impostalo su 5.

Attenzione: farlo nel vero codice renderà le persone molto infelici.

Demo del codice su ideone .


5
Pensato a questo non appena ho visto la domanda :)
Octavia Togami

306
Quello. È. Il male. Assolutamente cattivo. +1
John Dvorak,

75
@JanDvorak in chat è stato suggerito Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Immagina quante cose si spezzerebbero ...

30
Risposte come questa mi fanno amare questo sito più di SO.
Songo,

35
zomg, le risposte di java non ottengono mai i voti migliori! +1 per portare java in cima :)
Cruncher

297

Haskell

Adoro il modo in cui puoi lanciare qualsiasi cosa su Ghci e tutto ruota con esso.

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

36
Cosa fa let 2+2=5 in 5+5? ಠ_ಠ
John Dvorak,

22
@JanDvorak Non-exhaustive patterns in function +- Sto definendo una nuova funzione (+) qui, e se inserisco qualcosa che non 2+2lo farà, sbaglierà perché non ho mai definito cosa dovrebbe accadere in quel caso.
Flonk,

27
@SHiNKiROU shadow, non ridefinire
John Dvorak

96
che suona quasi come: "E Dio disse che lascia 2 + 2 = 5 in 2 + 2"))
OutFall

11
@ user3217013 Impara Haskell, fa bene al tuo cuore.
Scarpa

294

C

Un trucco abbastanza economico ma sono sicuro che intrappolerò la maggior parte di voi.

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

Provalo qui

Scorri il codice verso destra.
Non sono sicuro su Windows / Linux ma su OSX, la barra di scorrimento non è visibile.
Comunque, questo è un buon motivo per abilitare la "visualizzazione dello spazio" sul tuo editor di codice preferito.


96
La barra di scorrimento è visibile in Chromium, ma all'inizio chi la presta attenzione? :)
Ruslan,

172
Per confondere la gente, potresti aggiungere una riga di commento che sia abbastanza lunga da "spiegare" l'esistenza di una barra di scorrimento, ma abbastanza noiosa in modo che nessuno si preoccupi di (scorrere per) leggerla.
Hagen von Eitzen,

22
In OS X, la visibilità della barra di scorrimento per impostazione predefinita dipende dalla connessione del mouse. Se è presente solo un touchpad, le barre di scorrimento vengono sovrapposte e sfumano quando non vengono utilizzate. Se è collegato un mouse, le barre di scorrimento rubano spazio dalla casella di contesto e sono sempre visibili. Puoi testarlo scollegando e collegando un mouse USB a un MacBook. Questo può essere configurato nelle Preferenze di Sistema, ovviamente.
Andrea

49
Intelligente, ma sul cellulare è solo un involucro di parole :)
Logan,

31
Questa è l'unica volta che lo scorrimento delle finestre del codice SE non mi fa venire voglia di rompere le dita di qualcuno.
ObscureRobot,

184

GolfScript

4:echo(2+2);

Stampe 5.

Naturalmente GolfScript ha una sintassi che è nettamente diversa dalle altre lingue, questo programma sembra essere qualcosa di semplice o di C-ish.

4  - Metti il ​​numero 4 in pila. Contenuto dello stack: 4
:echo- Salva il valore nella parte superiore dello stack nell'eco della variabile. Contenuto dello stack: 4
(  - Diminuisci il valore nella parte superiore dello stack di 1. Contenuto dello stack: 3
2  - Metti il ​​numero 2 in cima allo stack. Contenuto dello stack: 3 2
+  - Aggiungi i due numeri in cima allo stack. Contenuto dello stack: 5
2  - Metti il ​​numero 2 in cima allo stack. Contenuto dello stack: 5 2
)  - Incrementa il valore nella parte superiore dello stack di 1. Contenuto dello stack: 5 3
;  - Rimuovi l'elemento superiore dallo stack. Contenuto dello stack: 5

Per impostazione predefinita, GolfScript stamperà qualsiasi cosa rimasta nello stack al termine dell'esecuzione.


3
Puoi spiegarlo per le persone che non parlano GolfScript per favore?
MadTux,

1
@MadTux Ecco qua.
aaaaaaaaaaaa,

1
Grazie. (Sarò votato più tardi perché ho raggiunto il mio limite giornaliero, ecco una birra.)
MadTux,

5
Semplice e economico, lo adoro. +1
seequ

9
mi piace perché non sembra che ti stia ingannando con la matematica o la semantica, sembra così semplice eppure 5 ^^
dwana,

145

Giava

Devi sempre arrotondare il doppio, gente

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

Produzione:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Spiegazione:

No, sul serio, devi sempre arrotondare il doppio. 15 non sono abbastanza cifre per mostrare che il two()metodo produce effettivamente 2.0000000000000004(16 è abbastanza, però).

Nelle rappresentazioni esadecimali dei numeri, è solo una differenza di 1 bit (tra 4000000000000001e 4000000000000000) ... che è sufficiente per rendere il Math.ceilmetodo restituito 5, non 4.


61
Math.ceil(two + two); // round just in caseVedo cosa hai fatto lì
Tim S.

17
Rendere sia una funzione che una variabile con lo stesso nome ... Wow.
configuratore

107
@configurator non è niente, non esiste nemmeno una classe chiamata two. Il grado di produzione java è Two two = Two.two.two();con Two.two di tipo TwoFactory.
Jannis Froese,

36
Two.Infinity.And.Beyond ()
CincauHangus

7
@TimS Ho appreso ciò che hai fatto lì
codice

135

BBC BASIC

EDIT: per Andrea Faulds e Squeamish Ossifrage, una versione più convincente che utilizza un interprete diverso: 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

inserisci qui la descrizione dell'immagine

Questo in realtà stampa il numero 4, ma VDU 23ridefinisce il carattere per ASCII 52 in modo che appaia come un 5 anziché un 4. La modalità schermo 6 è stata selezionata per motivi estetici (caratteri di dimensioni ragionevoli).

L'immagine originale utilizzando l'emulatore su http://bbcbasic.co.uk/bbcwin/bbcwin.html . (con un codice leggermente diverso) può essere visto nella cronologia delle modifiche.


8
Quei caratteri sembrano però diversi. Pensi di poterlo utilizzare con il carattere corretto?
Andrea

@AndreaFaulds Sto usando l'emulatore da bbcbasic.co.uk/bbcwin/bbcwin.html . Supporta la ridefinizione dei caratteri della BBC Basic originale su una griglia 8x8. Ma il carattere predefinito dell'emulatore è chiaramente più alto di 8x8. Quindi probabilmente avrei potuto fare un lavoro migliore, ma non sarebbe perfetto. Suppongo che potrei ridefinire il carattere per tutti e 5 e 4, quindi sembrerebbero uguali.
Level River St

5
@AndreaFaulds La domanda non ha detto che il risultato dovrebbe essere indistinguibile dagli altri 5. Penso che questa sia in realtà una caratteristica. 2+3=5e2+2=5'
Ben Jackson,

1
Questo corrisponde al carattere originale nel BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
ossifrage squeamish

@squeamishossifrage grazie per le informazioni. Tuttavia, non corrisponderà al carattere nell'emulatore. Il tuo esempio è alto 7 pixel, proprio come il mio. Inoltre ha uno zero in fondo, proprio come il mio, mentre sembra che debba spostarlo un po 'verso il basso (cioè, avere lo zero in alto invece che in basso). Una differenza chiave è che ho 126,64 mentre tu hai 126,96, e hai dei 6 invece dei miei 2. Questo perché il carattere originale della BBC aveva spesse linee verticali, quindi poteva essere letto facilmente in formato 80 colonne su uno schermo TV standard.
Level River St

134

Brainfuck

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

Produzione:

5

Provalo qui .

So che potrebbe sembrare un po 'troppo semplice, ma ho cercato di essere creativo, come suggerito nel post originale.


1
Non conosco Brainfuck, mi ci sono voluti un paio di minuti per capirlo. ASCII 53, giusto?
Level River St,

4
Finché hai il +++++.puoi dipingere qualsiasi cosa.
Eduard Florinescu,

1
@steveverrill: sì, hai ragione. (e questo è l'unico modo per produrre caratteri ASCII in BF).
Tigrou,


105

bash

Dal momento che questo è un , suppongo che dovrei usare un metodo prolisso ...

Per le persone che non conoscono Bash: $((...expr...))è una sintassi per valutare le espressioni aritmetiche. $(bc<<<...expr...)fa lo stesso usando il bccalcolatore della riga di comando.

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

Produzione

2+2= 5

Spiegazione

La seconda riga concatena v e 2 invece di aggiungerli, per fare 22.
Spiegazione effettiva:
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
Bel trucco di matematica in corso lì!
tomsmeding

5
@tomsmeding È stato abbastanza divertente, anche se a metà strada mi sono reso conto che avevo messo 15invece 16nella riga 4. Fortunatamente, ha funzionato ancora a causa bcdell'arrotondamento

2
Vedi se ti piace l'aspetto di questo stile che è anche valido Bash (elimina i segni del dollaro, consente spazi attorno al segno uguale e consente operatori di assegnazione combinati): ((v = v * 5))oppure((v *= 5))
Dennis Williamson,

2
Bello, ma ho notato +=immediatamente la cosa.
nyuszika7h

2
@ardnew sì, c'è. le prime due righe ( v=2e v+=2): per qualcuno che non ha familiarità con la gestione delle variabili di Bash, ciò equivarrebbe a 2+2, ma in realtà è "2"+"2", cioè "22". gli altri commenti nel codice sono errati solo per questo. Lo so, non tutti lo trovano divertente

101

Pitone

Ispirato dalla risposta Java:

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

Come Java, CPython utilizza la stessa posizione di memoria per qualsiasi copia dei primi piccoli numeri interi (0-255 se la memoria serve). Questo accede e modifica direttamente la posizione della memoria tramite ctypes. patchè solo un offuscato "12-7", una stringa con len4, che evalè a 5.

Una versione più offuscata

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

Oltre 2 + 2

Come menzionato in OP, 2 + 2 può essere un po 'noioso; quindi ecco un codice più pulito, multipiattaforma e multi-larghezza per abuso sfrenato.

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

In esecuzione con Python 2.7 ... ignora quella riga alla fine. Funziona in Windows 64-bit e Ubuntu 32-bit, i due sistemi a cui ho un facile accesso.

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

Non sorprende che possiamo rompere la proprietà associativa di addizione, dove ( a + b ) + c = a + ( b + c ), come si vede nella 1a e 2a 1+2+3riga, ma inspiegabilmente rompiamo anche la proprietà commutativa (dove a + b = b + a ; 2a e 3a riga). Mi chiedo se l'interprete Python ignori semplicemente le parentesi superflue attorno alle espressioni di addizione.


96
Sì, sicuramente ignoriamo tutti casualmente i segfault ...

10
Vale la pena ricordare che questo non è davvero un trucco di Python ed è specifico solo per l'implementazione in C di Python.
xApple

1
@NickT Ah! va bene. Avevo l'impressione che tu avessi provato l'originale sotto le stesse finestre a 64 bit, installazione di Ubuntu a 32 bit
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')È una prima versione modificata. L'ho fatto in modo da poterlo inserire in $ PYTHONSTARTUP in / etc / profile come squadra rossa nelle competizioni di hacking.
DavidJFelix,

2
Si. Sidenote, sembra che 1, 0 e -1 siano alcuni dei numeri con cui Python segfa immediatamente. Pensavo che quelli sarebbero stati i peggiori per aver rovinato il comportamento dei programmi Python. Potrebbe essere possibile utilizzare fuckitpy per contenere questi errori.
DavidJFelix,

86

JavaScript:

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

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

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

Controllalo su http://jsfiddle.net/qhRJY/

Sia H (maiuscola latina h) che Η (maiuscola greca eta) sono impostati nell'ambito globale perché non sono stati definiti locali per le funzioni con la parola chiave var. Mentre sembrano simili, in realtà sono 2 variabili diverse con 2 valori diversi. Usando Ctrl + F nel tuo browser scoprirai che Η (eta) appare significativamente meno di H (h) in questa pagina.


4
@ Sam anche se le due 'H sembrano uguali, in realtà sono 2 personaggi completamente diversi. In Unicode possono esserci caratteri diversi che sembrano uguali ma hanno punti di codice diversi. In questo caso specifico; l'altra "H" è in realtà la lettera greca Eta .
d3dave,

79
L'uso degli omogli per "confondere" i lettori non è ufficialmente divertente .
John Dvorak,

29
Gli omogenei diventano divertenti in combinazione con le ridicole variabili globali di javascript.
Konstantin Weitz,

3
Non è il "carattere Unicode Η", è il latino H e il greco Eta (Η).
Tratta bene le tue mod dal

4
@Vortico hmm ... cosa desideri quando una domanda frequente non è sufficiente? Una domanda frequente collegata dal centro assistenza? Nota che solo i moderatori possono applicare il tag faq . Per quanto riguarda la risposta, la domanda indica "segna +5 o più e almeno il doppio di voti rispetto ai voti negativi". La risposta ha 27 voti positivi e nessun voto negativo. Mi sembra che soddisfi i criteri indicati nella risposta e la quantità di voti è piuttosto impressionante per la seconda risposta più antica su una domanda sul meta sito di un sito in cui solo 124 persone hanno votato più di 10 volte. Quanti ne vorresti ? Tutti?
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) );

Il bit subdolo è che in realtà non è subdolo - se aggiungi una sorgente sonora da 2 dB a un'altra sorgente sonora da 2 dB, il rumore combinato risultante sarà di 5 dB (e se aggiungi due sorgenti da 30 dB, quindi i suoi 33 dB) in quanto misurati su una scala logaritmica.

Puoi vederlo su un altro calcolatore qui .


Beh, in realtà è più simile a 5,01 decibel, ma abbastanza lontano da 4 per contare.
Joe Z.

68

PHP

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

Che produce:

2 + 2 = 5

Questo perché in PHP, i ternari sono calcolati da sinistra a destra, quindi in realtà lo è
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';



1
Ho un altro PHPesempio:$a=2;echo "2+2=".$a++ + $a++;
avall

È ovvio che $ a ++ fa 3 e il risultato sarà 6. Non capisco cosa stai pensando.
Ozh,

1
@Janus PHPsadness # 30 lo spiega bene
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
=invece di ==, facile da vedere e francamente piuttosto privo di ispirazione.
Approaching

19
Avere comunque un

6
Mi piace ancora questa risposta
Sam Creamer,

5
Piace anche a me. Non tutte le lingue usano =solo un'associazione ma un operatore di confronto (ad esempio Pascal, SQL, VB)
avall

Lo trovo molto ovvio
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, il buon vecchio trucco con personaggi canaglia. Ecco perché dovresti usare 1 TB ovunque.
John Dvorak,

11
@JanDvorak Funziona a causa del punto e virgola dopo l'istruzione if? Non conosco C # ma ho usato C ++

5
@professorfish è quello che presumo. Inoltre, le lingue che non ti consentono di inserire parentesi graffe casuali FTW.
John Dvorak,

12
Senza ";", l'istruzione if controlla se il blocco di codice verrà eseguito. Con il ";" lì dentro, l'if viene valutato ma non viene fatto nulla con il risultato. Quindi il blocco di codice viene eseguito ogni volta, indipendentemente. In C #, è perfettamente accettabile avere blocchi di codice casuali.
Grax32,

2
Mi sono procurato questo l'altro l'altro giorno. Avevo un ciclo for con un ;after, che era perfettamente intenzionale mentre stavo usando il loop vuoto per avanzare un cursore. Ho rimosso per errore il punto e virgola, tutto è esploso e non sono riuscito a capire il perché.
mpen

56

È pericoloso decorare il tuo Javascript con l'arte ASCII.

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

     (2 + 2)

Quando i commenti vengono rimossi, i simboli e gli operatori rimanenti valutano
-~~--~(2 + 2) Questo fa uso dell'operatore Bitwise Not (~) in JS, insieme a una manciata di segni Meno che annulleranno i valori lungo la strada.


3
Mi chiedevo come --fosse accettabile l' operatore che avrebbe dovuto sbagliare Invalid left-hand side expression in prefix operation; tuttavia mi sono reso conto che c'è un carattere di spazio tra loro.
usandfriends

53

bash

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

Produzione:

2 + 2 = 5

L'output di ciascuno catavrà una nuova riga implicita, ma la nuova riga finale viene rimossa dalla sostituzione del comando$( )


Eccone un altro:

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

Le matrici di Bash sono indicizzate zero


3
In realtà ho preso il primo, dato che ho avuto molti problemi con cose del genere quando giocavo a golf a Bash. Per quanto riguarda il secondo, dove non sono gli array indicizzati zero?

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

12
@DigitalTrauma Applescript è strano

5
zshusa array con 1 indice (ed $arr[0]è semplicemente non impostato o indefinito o qualcosa del genere), a meno che non KSH_ARRAYSsia impostata l' opzione, nel qual caso gli array sono con indice 0.
Chepner,

4
@professorfush: Lua e Fortran sono 1 indicizzati. Ogni volta che conto fino a 10, inizio sempre da 1, non da 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...";
}

Dipende dal modulo CPAN chiamato Acme :: NewMath . A causa di nomi di file errati nel modulo, questo funzionerà solo su file system senza distinzione tra maiuscole e minuscole (come su Windows o Mac OS X), ma qui biasimo l'autore del modulo originale. Acme :: NewMath implementa la matematica secondo l'ideologia Ingsoc.


16
Questo è abbastanza furbo. Nessuno guarda mai le tue importazioni / include.

44

R

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

produzione:

5

il codice aggiunge effettivamente la media di [1] alla media di [4]. Il modo corretto di utilizzare la funzione medio in R sarebbe: mean(c(1,3)) + mean(c(4,0))Questo è diverso da alcune altre funzioni matematiche in R, come sum, maxe min; dove sum(1,3), max(1,3)e min(3,1)darebbe tutti la risposta prevista.


7
Non male, mi ha ingannato per un po '.
qwr

37

Giava

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

produzione:

512.0000000000005

Probabilmente funziona in qualsiasi lingua che utilizza lo stesso tipo di doppio.


7
Questa è una firma principale molto strana.
Bertie Wheen,

10
Java implementa argomenti vari come matrici sotto il cofano.
CodaFi,

4
Mi ci è voluto un attimo per rendermi conto che probabilmente stai parlando delle ultime cifre nel doppio. Ho visto che le prime cifre sono state aggiunte correttamente ( _2_56 + _2_56 = _5_12), ma sembra più probabile che tu intenda 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(nota: i caratteri di sottolineatura usati per "mettere in grassetto" le cifre.
Giustino

35

Befunge

Questo è scritto in Befunge, ma è progettato per assomigliare a Python.

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

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

# email: MarkSmith@example.com

Quando eseguito (con l'interprete corretto) il programma stamperà 5.

Spiegazione:

Un programma Befunge è costituito da una griglia di comandi a carattere singolo. Il primo comando è quello nell'angolo in alto a sinistra e la lettura dei comandi procede verso destra. Ma la direzione può cambiare durante l'esecuzione del programma. Vengono eseguite

solo la prima riga di caratteri e la colonna di caratteri che iniziano con il vnella prima riga. I caratteri in questione fanno:

#- salta il comando successivo
>- D'ora in poi, i comandi vengono letti a destra del comando corrente
v- D'ora in poi, i comandi vengono letti sotto il comando corrente
5- Premi 5 nello stack
.- Pop e stampa il numero in cima alla pila
@- Termina il programma
<space>- Non fare nulla

Se sapessi che stavi programmando in Befunge, questo non avrebbe davvero ingannato nessuno. Ma se ti sei imbattuto in questo e non ti rendessi conto che era Befunge, molto probabilmente lo farebbe.


11
+1, Questo è molto subdolo, perché chi diavolo guarda il programma che esegue il codice sorgente durante il debug?
MrLore,

33

JavaScript

Codice:

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

Produzione:

5

Puoi provarlo tu stesso sulla tua console o controllare questo violino


6
Puoi indicarmi una risorsa o spiegarmi perché funziona. So che funziona perché ho controllato il violino, ma non capisco perché.
Famiglia,

29
la variabile "a" non è la stessa entrambe le volte (scusate se sto rovinando questo). Unicode subdolo davvero
Sam Creamer

6
Adoro come il prossimo personaggio U+0431, è б — quasi 6!
wchargin,

73
L'uso degli omogli per "confondere" i lettori non è ufficialmente divertente .
John Dvorak,

40
@JanDvorak Quella risposta è stata postata dopo questa; non si applica qui.
Maniglia della porta

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

Stampa 2 + 2 = 5

Quindi a = 2, giusto?

gcc-4.7.3 valuta i parametri della funzione da destra a sinistra. Quando viene valutato a + b, a è ancora 3.


16
Bel uso del comportamento non specificato
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 standard di commonblocchi: l'ordine conta; Ho scambiato l'ordine nel blocco nella subroutine, quindi sto davvero aggiungendo 1 + 2 + 2.


6
@JanDvorak: Haha, avrei potuto usare FORTRAN IV in cui avrei potuto ridefinire i valori letterali, ad esempio2=3
Kyle Kanos,

1
@KyleKanos, è quello che pensavo sarebbe stato quando ho visto che il tuo post era stato scritto in FORTRAN.
danmcardle,

@KyleKanos Fallo!
ClickRick

1
@KyleKanos: ha funzionato con valori letterali interi o solo float? Penserei che su una macchina di quell'epoca un letterale intero e un indirizzo avrebbero avuto le stesse dimensioni, ma più piccolo di un float, quindi il pooling dei letterali float avrebbe risparmiato spazio, ma il pooling dei letterali int no.
supercat

2
@KyleKanos: La mia comprensione è che i compilatori non consentirebbero un'assegnazione diretta a un valore letterale, ma le chiamate di funzione utilizzate passano per riferimento e il passaggio di un valore letterale in virgola mobile a una funzione in genere passerebbe l'indirizzo di un valore in un pool di floating letterali. Il passaggio di un valore intero a una funzione comporterebbe il suo pool, ma la maggior parte del codice che utilizzava numeri interi includeva direttamente i valori.
supercat

24

Pitone

Il codice stampa 5, che è la risposta corretta per questa attività.

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

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

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

Modifica: ecco una versione alternativa che aggiunge numeri interi, non a due stringenti.

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

Tilde è un operatore inverso unario che ritorna -x-1, quindi il primo passo è ottenere -6e poi con un altro operatore in printfunzione ottenere5


Perché ~eval(`a`)invece di solo ~a?
Andrea Corbellini,

2
Volevo lasciare alcune delle int()funzionalità e eval()fare il lavoro se l'input è un numero intero rigoroso :)
Avall

24

Rubino

class Fixnum
    alias plus +

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

puts 2 + 2

Ciò aumenta il risultato di tutte le aggiunte il cui primo argomento è Fixnum (che 2 è, almeno in MRI) di 1.

Gli effetti collaterali di questo sono persino peggiori della versione Java.


23

Rubino

Ruby ha ambienti di prima classe. Questo significa molte cose. Significa anche che si possono fare molte cose che ... forse non dovrebbero.

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

L'output di questo è:

2 + 2 = 
4
2 + 4 = 
6
Ma nel 1984 ...
2 + 2 = 
5
2 + 4 = 
6

Se vuoi saperne di più sulle gioie e sui pericoli di questo, Ruby Conf 2011 Mantenere Ruby ragionevole e leggere ambienti di prima classe dal blog di Abstract Heresies.


Inoltre:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42

1
Per fare solo per il caso specifico: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

schema

(define 2+2 5)
2+2 ;=> 5

9
Hey! 2+2non è come si fa l'aggiunta in lisp!
John Dvorak,

1
E allora? Apparentemente aggiunge 2 a 2 come è nel compito.
Hauleth,

119
@JanDvorak Non ho mai usato lisp, ma a quanto ho capito è qualcosa di simile ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
undergroundmonorail,

2
"Ridefinire 2 + 2 come 5 non è molto creativo! Non pensarci due volte, prova qualcos'altro." --- Bene, in R5RS posso ridefinire + invece 2 + 2 o 2. La risposta è qui: pastebin.com/KHtm9Jmv
Felipe

1
@FelipeMicaroniLalli che l'annotazione è stata fatta dopo la mia risposta, quindi non conta.
Hauleth

20

C #

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

A qualcuno che non ha familiarità, sembrerà che stia ottenendo un intervallo che inizia e termina a 2. In realtà, inizia a 2 e va per due numeri. Quindi 2 + 3 = 5.


6
Un intervallo che inizia e termina a 2 sarebbe giusto { 2 }, no?
Paŭlo Ebermann,

1
@ PaŭloEbermann Enumerable.Rangenon ha un inizio e una fine, ci vuole un inizio e un conteggio (degli elementi che verranno enumerati).
MasterMastic,

14
@MasterMastic L'ho capito dalla spiegazione nella risposta. Ma si suppone che il significato "per qualcuno non familiare" sia un tale intervallo (dalla spiegazione nella risposta), e la mia argomentazione è che il risultato atteso sarebbe quindi 2, non 4.
Pa Elo Ebermann

1
@ PaŭloEbermann, sì, è un modo per guardarlo anche. Stavo pensando che potrebbe sembrare più come se stessi fornendo i numeri da aggiungere. Quindi Enumerable.Range (1,2,3,4) inizierebbe all'1, terminerebbe alle 4 e si sommerebbe fino a 10.
Paul

19

F #

Mettiamo in fsi la seguente dichiarazione:

let ``2+2``= 5

Produzione:

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

Non 5è troppo ben nascosto, temo. Non funziona con l'ottimizzazione.


1
Bello; Non posso votare se non è consentito un comportamento indefinito.
questo

2
@self., non vedo dove è vietato affidarsi a UB. Molte risposte al codice golf si basano su UB e penso che sia OK purché ciò avvenga costantemente su una piattaforma ragionevole.
ugoren,

2
Non vedo dove è vietato affidarsi a UB. Non ho trovato alcuna regola nemmeno su questo. Sarebbe bello se ciò potesse essere chiarito. Molte risposte al codice golf si basano su UB e penso che sia OK fintanto che ciò accade in modo coerente su una piattaforma ragionevole Alcune regole specifiche su ciò sarebbero gradite.
questo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.