2 + 2 = 5 [kapalı] yapan bir program yaz


393

Görünüşe göre 2 ve 2 sayılarını ekleyen ve 5 çıktısı veren bir program yazın. Bu, yetersiz bir yarışmadır.

Programınız herhangi bir hatayla sonuçlanamıyor. Hafıza delikleri için dikkat! Giriş isteğe bağlıdır.

2 + 2'yi 5 olarak yeniden tanımlamak çok yaratıcı değildir ! Düşünme, başka bir şey dene.


48
Bu, George Orwelll'in "1984" kitabındaki soru.
bacchusbeale 30:14

97
Bu neden destekleniyor? İki artı iki olan beş.
Geobits

79
ORADA! ARE! DÖRT! IŞIKLAR!
Nick T,

105
@Geobits - Katılıyorum: 2 + 2 = 5 bu hesap makinesinde görebilirsiniz .
MT0

47
echo "2+2=5";
user3459110

Yanıtlar:


669

Java

Yansıma gerçekten, Java'yı kötüye kullanmanın doğru yoludur ... ama bazı değerleri düzeltmekten daha derine gitmeniz gerekir .

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

Çıktı:

5

Açıklama:

Normalde erişebileceğinizden daha da derinlemesine değiştirmeniz gerekir. Bunun, Java 6 için JVM'de hiçbir şekilde IntegerCache'i değiştirecek hiçbir funky parametresi olmadan tasarlandığını unutmayın .

Tamsayı sınıfının derinliklerinde bir tamsayı sinekliği bulunur. Bu, −128 ila +127 arasında bir Tamsayı dizisidir. cache[132]normalde 4 olacağı nokta. 5'e ayarla.

Uyarı: Bunu gerçek kodla yapmak, insanları çok mutsuz edecektir .

İdeone hakkında kod demosu .


5
Soruyu görür görmez bunu
düşünmüştüm

306
Yani. Dır-dir. Evil. Kesinlikle kötülük. +1
John Dvorak

75
Sohbet sırasında @JanDvorak önerildiInteger[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Sadece kaç şeyin kırılacağını hayal edin ...

30
Bunun gibi cevaplar beni bu siteyi SO'dan daha çok seviyor.
Songo,

35
zomg, java cevapları asla en yüksek oyu alamaz!
Cruncher

297

Haskell

Sadece ghci'ye nasıl bir şey atabildiğine bayılıyorum ve bu tamamen yuvarlanıyor.

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

36
Ne yapar let 2+2=5 in 5+5? ಠ_ಠ
John Dvorak

22
@JanDvorak Non-exhaustive patterns in function +- Burada yeni bir işlev (+) tanımlıyorum ve bu olmayan bir şeyi takarsam 2+2hata çıkacaktır çünkü bu durumda ne olacağını asla tanımlamam.
Flonk

27
@SHiNKiROU gölge, yeniden tanımlanma
John Dvorak

96
Neredeyse şöyle geliyor: "Ve Tanrı dedi ki 2 + 2 = 2 + 2 = 5 olsun"))
OutFall

11
@ user3217013 Haskell'i öğrenin, kalbiniz için iyidir.
Ayakkabı

294

C

Oldukça ucuz bir numara ama çoğunuzu tuzağa düşüreceğimden eminim.

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

Burada dene

Kodu sağa kaydırın.
Windows / Linux'ta emin değilim ama OSX'te kaydırma çubuğu görünmüyor.
Her neyse, bu, favori kod editörünüzde "alan görselleştirme" özelliğini etkinleştirmek için iyi bir nedendir.


96
Kaydırma çubuğu Chromium'da görünür, ancak ilk başta buna kim dikkat ediyor? :)
Ruslan

172
İnsanları şaşırtmak için, kaydırma çubuğunun varlığını "açıklayacak" kadar uzun, ama kimsenin okuması için kaymayacak kadar donuk olacak bir yorum satırı ekleyebilirsiniz.
Hagen von Eitzen

22
OS X'te, kaydırma çubuğu görünürlüğü varsayılan olarak farenin bağlı olup olmamasına bağlıdır. Sadece bir dokunmatik yüzey varsa, kaydırma çubukları üst üste bindirilir ve kullanılmadığı zaman kaybolur. Bağlı bir fare varsa, kaydırma çubukları içerik kutusundan alan çalır ve her zaman görünür durumdadır. Bunu bir USB fareyi bir MacBook'a takıp takarak test edebilirsiniz. Elbette bu, Sistem Tercihleri'nde yapılandırılabilir.
Andrea,

49
Zeki, ama mobil cihazda sadece wordwraps :)
Logan

31
Bu kaydırma SE kod pencereleri tek zaman yok beni birinin parmaklarını kırmak istiyorum olun.
ObscureRobot

184

GolfScript

4:echo(2+2);

Yazdırır 5.

Elbette GolfScript, diğer dillerden belirgin bir şekilde farklı bir sözdizimine sahiptir, bu program sadece Basic veya C-ish gibi görünüyor.

4  - 4 numarayı yığına koyun. Yığın içeriği: 4
:echo- Yığının üstündeki değeri echo değişkenine kaydedin. Yığın içeriği: 4
(  - Yığının üstündeki değeri 1 ile azaltın. Yığın içeriği: 3
2  - Yığının üstüne 2 sayısını koyun. Yığın içeriği: 3 2
+  - Yığının üstüne iki sayı ekleyin. Yığın içeriği: 5
2  - Yığının üstüne 2 sayısını koyun. Yığın içeriği: 5 2
)  - Yığın üstündeki değeri 1 ile artırın Yığın içeriği: 5 3
;  - Üst elemanı yığından çıkarın. Yığın içeriği: 5

GolfScript, yürütme tamamlandıktan sonra varsayılan olarak yığında kalan her şeyi yazdırır.


3
Bunu GolfScript konuşmayan insanlar için lütfen açıklayabilir misiniz?
MadTux

1
@MadTux İşte başlıyorsunuz.
aaaaaaaaaaaa

1
Teşekkürler. (Sonradan oylayacağım, çünkü günlük limitime ulaştım, işte bir bira.)
MadTux

5
Basit ve hile, onu seviyorum. +1
seequ

9
seni matematik ya da anlambilim ile
kandırıyor

145

Java

Daima çiftlerinizi yuvarlamak zorundasınız millet.

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

Çıktı:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Açıklama:

Hayır, cidden, daima çiftlerini yuvarlamak zorundasın. 15, two()yöntemin gerçekte ürettiğini göstermek için yeterli rakam değildir 2.0000000000000004(16, yine de yeterlidir).

Sayıların işlenmemiş Hex gösterimlerinde, sadece 1 bitlik bir fark ( 4000000000000001ve arasında 4000000000000000) ... ki bu Math.ceilyöntem 4 değil, 5 döndürür.


61
Math.ceil(two + two); // round just in caseOrada ne yaptığını anlıyorum
Tim S.

17
Hem fonksiyon hem de aynı isimde bir değişken yapmak ... Vay.
konfigüratör

107
@configurator hiçbir şey değil, hatta bir sınıf bile yok two. Üretim sınıfı java, Two two = Two.two.two();Two.two tipi TwoFactory'dir.
Jannis Froese

36
Two.Infinity.And.Beyond ()
CincauHangus

7
@TimS Orada ne yaptım
tavana

135

BBC TEMEL

EDIT: Andrea Faulds ve Squeamish Ossifrage için farklı bir tercüman kullanan daha inandırıcı bir versiyon: 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

görüntü tanımını buraya girin

Bu aslında 4 sayısını yazdırır ancak VDU 23ASCII 52 için fontu yeniden tanımlar, böylece 4 yerine 5 gibi görünür. Estetik nedenlerden dolayı ekran modu 6 seçilmiştir (makul boyutta karakterler).

Http://bbcbasic.co.uk/bbcwin/bbcwin.html adresindeki öykünücüyü kullanan orijinal resim . (biraz farklı kodlarla) düzenleme geçmişinde görülebilir.


8
Bu yazı tipleri olsa farklı görünüyor. Doğru fontu kullanabileceğini düşünüyor musun?
Andrea,

@AndreaFaulds Ben emülatörü kullanıyorum bbcbasic.co.uk/bbcwin/bbcwin.html . Orijinal BBC Basic'in 8x8 ızgara üzerinde yeniden tanımlanmasını destekler. Ancak öykünücünün varsayılan yazı tipi açıkça 8x8'den yüksek. Bu yüzden muhtemelen daha iyi bir iş yapabilirdim, ama mükemmel olmazdı. Sanırım yazı tipini 4 ve 5 için yeniden tanımlayabilirim, sonra aynı görünürler.
Seviye River St

5
@AndreaFaulds Soru, sonucun diğer 5'lerden ayırt edilemez olması gerektiğini söylemedi. Bence bu aslında bir özellik. 2+3=5ve2+2=5'
Ben Jackson

1
Bu, BBC Micro'daki orijinal yazı tipiyle eşleşir:VDU 23,52,126,96,124,6,6,102,60,0
squeamish ossifrage

@squeamishossifrage bilgi için teşekkürler. Yine de öykünücüsündeki yazı tipiyle eşleşmiyor. Örneğiniz 7 piksel yüksekliğinde, tıpkı benimki gibi. Ayrıca dipte sıfır var, tıpkı benimki gibi, oysa biraz aşağı kaydırmam gerekiyor gibi gözüküyor (yani, sıfır yerine üstte sıfır var.) Önemli bir fark, 126.64 Oysa 126,96'nız var ve benim 2'lerimin yerine 6'larınız var. Bunun nedeni, orijinal BBC yazı tipinin kalın dikey çizgilere sahip olmasıydı, böylece standart bir TV ekranında 80 sütun biçiminde kolayca okunabiliyordu.
Seviye Nehri St

134

brainfuck

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

Çıktı:

5

Burada dene .

Bunun kulağa biraz basit gelebileceğini biliyorum, ancak orijinal postada önerildiği gibi yaratıcı olmaya çalıştım.


1
Beynimi tanımıyorum, bunu çözmem birkaç dakika sürdü. ASCII 53, değil mi?
Level River St

4
Sahip olduğunuz sürece +++++.her şeyi boyayabilirsiniz.
Eduard Florinescu

1
@ steveverrill: evet haklısın. (ve bu, BF'deki ascii karakterleri çıkarmanın tek yoludur).
tigrou


105

darbe

Bu bir olduğu için sanırım uzun soluklu bir yöntem kullanmalıyım ...

Bash'i tanımıyor insanlar için: $((...expr...))aritmetik ifadeleri değerlendirmek için bir sözdizimidir. komut satırı hesap makinesini $(bc<<<...expr...)kullanarak da aynı şeyi yapar bc.

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

Çıktı

2+2= 5

açıklama

İkinci satır 22 yapmak için bunları eklemek yerine v ve 2'yi birleştirir.
Gerçek açıklama:
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
Orada güzel matematik hilesi!
tomsmeding

5
@tomsmeding Çok eğlenceliydi, her ne kadar yarı yolda olsa da 4. sıra 15yerine koyduğumu fark ettim 16. Neyse ki hala bcyuvarlama nedeniyle çalıştı

2
Ayrıca geçerli Bash bu tarz görünümünü isterseniz bakın (dolar işaretleri ortadan kaldırır eşittir işareti etrafında boşluk verir ve kombine atama operatörleri sağlar): ((v = v * 5))ya((v *= 5))
Dennis Williamson

2
Güzel bir +=şey , ama hemen bir şey tespit ettim .
nyuszika7h

2
@ardnew evet var. ilk iki satır ( v=2ve v+=2): Bash değişken işleme alışkın olmayan biri için 2+2, buna eşdeğer olurdu , ama aslında "2"+"2", yani "22". Koddaki diğer yorumlar sadece bu nedenle yanlıştır. Biliyorum, herkes bunu komik

101

piton

Java cevabından ilham alındı:

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

Java gibi, CPython da ilk birkaç küçük tamsayının herhangi bir kopyası için aynı bellek konumunu kullanır (bellek çalışıyorsa 0-255). Bu gider ve doğrudan bu hafıza konumunu düzenler ctypes. patchsadece bir şaşkınlık "12-7", len4 ile 5 arasında bir dizedir eval.

Daha karışık bir sürüm

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

2 + 2 Ötesinde

OP'nin dediği gibi 2 + 2 çok sıkıcı olabilir; bu yüzden işte kötü amaçlı suistimal için bazı temizleyici, çoklu platform, çoklu genişlik kodu.

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

Python 2.7 ile çalıştırmak ... sonunda bu çizgiyi görmezden gelin. Windows 64-bit ve Ubuntu 32-bit ile çalışır, kolayca erişebileceğim iki sistemdir.

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

Şaşırtıcı olmayan bir şekilde, toplama, (birleştirici özelliği kırabilir bir + b ) + c = a + ( B + C ), 1. ve 2. görüldüğü gibi 1+2+3çizgiler, ancak açıklanamaz da değişmeli özelliği kırmak ( bir + b = b + a ; 2. ve 3. satırlar). Python yorumlayıcısının sadece toplama ifadelerinin etrafındaki gereksiz parantezleri görmezden gelip gelmediğini merak ediyorum.


96
Evet, kesinlikle hepimiz kayıtsız şekilde segfaults'ları görmezden

10
Bunun gerçekten bir Python numarası olmadığını ve yalnızca Python'un C uygulamasına özgü olduğunu söylemeye değer.
xApple

1
@NickT Ah! Tamam. Orijinali aynı 64-bit pencereler altında, 32-bit ubuntu ayarıyla
denediğiniz izlenimini edindim

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')Değiştirilmiş bir ilk sürümüdür. Bunu, hack yarışmalarında kırmızı takım olarak / etc / profile $ PYTHONSTARTUP'a bırakabildim.
DavidJFelix

2
Evet. Görünüşe göre, 1, 0 ve -1, python'un derhal bölümlendirdiği sayıların bazıları gibi görünüyor. Bunların python programlarının davranışını mahvetmenin en kötü olacağını düşünüyordum. Bu hataları içermek için fuckitpy kullanmak mümkün olabilir .
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())

Http://jsfiddle.net/qhRJY/ adresinden kontrol edin.

Hem H (Latin harf büyüklüğü h) hem de Greek (Yunanca büyük harf eta), genel anahtar kelimeye ayarlanmıştır çünkü var anahtar kelimesiyle işlevler için yerel olarak tanımlanmamışlardır. Benzer görünseler de aslında 2 farklı değere sahip 2 farklı değişkendir. Tarayıcınızda Ctrl + F tuşlarını kullanarak Η (eta) sayfasının H (h) değerinden daha az göründüğünü göreceksiniz.


4
@Sam iki 'H aynı görünse de, aslında tamamen farklı 2 karakter. Unicode'da aynı görünen ancak farklı kod noktalarına sahip farklı karakterler olabilir. Bu özel durumda; diğer "H" aslında yunan harfi Eta'dır .
d3dave

79
Okuyucuları "karıştırmak" için homojen harfleri kullanmak artık resmen eğlenceli değil .
John Dvorak

29
Homoglifler, javascript'in saçma global değişkenleriyle birlikte komik oluyor.
Konstantin Weitz

3
"Unicode Η karakter" değil, Latin H ve Yunanca Eta (Η).
phyzome

4
@Vortico hmm ... SSS sorusu yeterli olmadığında ne istersin? Yardım merkezinden bağlı bir SSS sorusu mu var? SSS etiketini yalnızca denetleyicilerin uygulayabileceğini unutmayın . Cevabı gelince - soru "puan +5 veya daha fazla ve en az iki kez en az iki oy" olarak ifade eder. Cevap 27, oy yok, oy yok. Bu bana cevapta belirtilen kriterleri yerine getirmek gibi geliyor ve sadece oy alanların 124 kişiden daha fazla oy alan bir sitenin meta sitesinde yer alan bir sorudaki ikinci en eski cevap için en fazla oy miktarı oldukça etkileyici. Kaç olur sen mi? Herkes?
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) );

Desteklenen bit, aslında desteklenmemiş olmasıdır - başka bir 2dB ses kaynağına 2dB ses kaynağı eklerseniz, ortaya çıkan birleşik gürültü 5dB olacaktır (ve eğer iki 30dB kaynak eklerseniz, 33dB) bir günlük ölçeğinde ölçülür.

Sen bunu görebilirsin Burada farklı hesap makinesi .


Aslında 5.01 desibel gibi, ama 4'ten saymak için yeterince uzakta.
Joe Z.

68

PHP

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

Hangi üretir:

2 + 2 = 5

Bunun sebebi PHP'de üçlemelerin soldan sağa hesaplanmasıdır, yani aslında
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';


35
zorunlu phpsadness
wchargin

1
Başka bir PHPörnek daha var :$a=2;echo "2+2=".$a++ + $a++;
avall

$ A ++ 'nın 3 yaptığı ve sonucun 6 olacağı açıktır. Ne düşündüğünü anlamadım.
Ozh

1
@Janus PHPsadness # 30 bunu iyi açıklıyor
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
=Bunun yerine, ==görmek kolay ve açıkçası oldukça sönük.
Yaklaşan yaklaşanlıkFish

19
Zaten bir oy hakkım var, bu hatayı çok

6
Ben hala bu cevabı seviyorum
Sam Creamer

5
Ben de severim. Her dil =yalnızca bir atama olarak değil, bir karşılaştırma işleci (örneğin, Pascal, SQL, VB) kullanır
avall

Çok açık buluyorum
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, haydut karakterlerle güzel eski numara. Bu yüzden her yerde 1TBS kullanmalısın.
John Dvorak

11
@JanDvorak Bu if ifadesinden sonra noktalı virgül nedeniyle çalışır mı? C # bilmiyorum ama C ++ kullandım

5
@professorfish, varsaydığım şey bu. Ayrıca, rastgele kıvrımlı kaşlı ayraçlar FTW eklemenize izin vermeyen diller.
John Dvorak

12
";" Olmadan, if ifadesi kod bloğunun yürütülüp yürütülmeyeceğini kontrol eder. İle ";" orada ise if değerlendirilir ancak sonuçla ilgili hiçbir şey yapılmaz. Daha sonra, kod bloğu ne olursa olsun, her seferinde yürütülür. C # 'da, rasgele kod bloklarına sahip olmak tamamen kabul edilebilir.
Grax32

2
Geçen gün kendimi bununla aldım. ;Bir imleci ilerletmek için boş döngüyü kullandığım için kasıtlı olarak bittikten sonra for döngüsüne sahiptim. Yanlışlıkla yarı kolonu kaldırdım, her şey patladı ve nedenini bulamadım.
mpen

56

Javascript'inizi ASCII sanatı ile süslemek tehlikelidir.

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

     (2 + 2)

Yorumlar kaldırıldığında, kalan semboller ve operatörler
-~~--~(2 + 2) , Şunu değerlendirir: JS'deki Bitwise Not operatörünü (~) ve yol boyunca değerleri olumsuz yönde etkileyebilecek bir avuç eksi işareti kullanır.


3
--Operatörün hata vermesi gerektiği için nasıl kabul edilebilir olduğunu merak ediyordum Invalid left-hand side expression in prefix operation; ancak aralarında bir boşluk karakteri olduğunu fark ettim.
usandfriends

53

darbe

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

Çıktı:

2 + 2 = 5

Her birinin çıktısının catüstü kapalı bir satırsonu olacaktır, ancak son satırsonu komutun yerine koyulmasıyla sıyrılır$( )


İşte başka:

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

Bash dizileri sıfır dizinli


3
Aslında birincisini yakaladım, çünkü Bash'de golf oynarken böyle bir şeyle ilgili bir sürü sorun yaşadım. İkincisi ise, diziler sıfır dizinli değil nerede ?

3
@professorfish Applescript, örneğin:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Dijital Travma

12
@DigitalTrauma Applescript çok garip

5
zsh1-indeksli dizileri kullanır (ve $arr[0]sadece ayarlanmamış veya tanımsız veya başka bir şey), KSH_ARRAYSseçenek belirtilmediği sürece, bu durumda diziler 0-indekslidir.
chepner

4
@professorfush: Lua ve Fortran 1 dizinlidir. Ne zaman 10'a kadar
saysam

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

Acme :: NewMath adlı CPAN modülüne bağlıdır . Modüldeki yanlış dosya adları nedeniyle, bu yalnızca büyük / küçük harf duyarlı dosya sistemlerinde (Windows veya Mac OS X'te olduğu gibi) çalışır, ancak orijinal modülün yazarını burada suçluyorum. Acme :: NewMath, Ingsoc ideolojisine göre matematiği uygular.


16
Bu oldukça sinsi. Hiç kimse ithalatınıza / içerdiklerinize bakmıyor.

44

R,

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

çıktı:

5

kod aslında [1] ortalamasını [4] ortalamasına ekler. Olacaktır R, ortalama işlevi kullanmak için doğru bir şekilde: mean(c(1,3)) + mean(c(4,0))Bu gibi R başka bir matematiksel fonksiyonlar, farklı olarak sum, maxve min; nerede sum(1,3), max(1,3)ve min(3,1)hepsi beklenen cevabı verecek.


7
Fena değil, beni biraz kandırdı.
qwr

37

Java

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

çıktı:

512.0000000000005

Muhtemelen aynı tür çiftleri kullanan herhangi bir dilde çalışmaktadır.


7
Bu çok garip bir ana imza.
Bertie Wheen

10
Java, başlık altındaki diziler olarak değişken değişkenler uygular.
CodaFi

4
Bana muhtemelen çiftlerdeki son rakamlardan bahsettiğinizi farketmek için bir dakika sürdü. İlk hanelerin doğru eklendiğini gördüm ( _2_56 + _2_56 = _5_12), ancak demek istemeniz daha muhtemel görünüyor 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(not: basamakları "kalınlaştırmak için kullanılan alt çizgiler"
Justin

35

Befunge

Bu Befunge'de yazılmıştır, ancak Python'a benzemek için tasarlanmıştır.

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

Çalıştırıldığında (doğru yorumlayıcıyla) program yazdırılır 5.

Açıklama:

Bir Befunge programı, tek karakterli komutlardan oluşan bir ızgaradan oluşur. İlk komut sol üst köşedeki komuttur ve komutların okunması sağa doğru ilerler. Ancak program yürütme sırasında yön değişebilir.

Yalnızca ilk karakter satırı ve ilk satırda başlayan karakter sütunu vçalıştırılır. Söz konusu karakterler şunları yapar:

#- bir sonraki komutu atla
>- Şu andan itibaren, komutlar geçerli komutun sağında okunur
v- Şu andan itibaren, komutlar geçerli komutun altında okunur
5- Yığına 5 itme
.- Pop ve numarayı yazdır yığının en üstünde
@- Programı sonlandır
<space>- Hiçbir şey yapma

Befunge'de programlama yaptığını bilseydin, bu gerçekten kimseyi kandırmazdı. Ama bununla karşılaştıysanız ve bunun Befunge olduğunu anlamadıysanız, büyük olasılıkla olur.


11
+1, Bu çok sapkın, çünkü hata ayıklama sırasında kaynak kodunu çalıştıran programa kim bakıyor?
MrLore

33

JavaScript

Kod:

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

Çıktı:

5

Konsolunuzda kendiniz test edebilir veya bu Fiddle'ı kontrol edebilirsiniz.


6
Beni bir kaynağa yönlendirir veya bunun neden işe yaradığını açıklar mısınız? İşe yaradığını biliyorum çünkü Fiddle'ı araştırdım ama nedenini anlamadım.
Aile,

29
"a" değişkeni iki kere aynı değildir (bunu bozduğumda üzgünüm). Gerçekten sinsi unicode
Sam Creamer

6
Sıradaki karakterin nasıl olduğunu seviyorum U+0431.
wchargin

73
Okuyucuları "karıştırmak" için homojen harfleri kullanmak artık resmen eğlenceli değil .
John Dvorak

40
@JanDvorak Bu cevap bundan sonra gönderildi; burada geçerli değil.
Doorknob

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

2 + 2 = 5 yazdırır

Yani a = 2, değil mi?

gcc-4.7.3, fonksiyon parametrelerini sağdan sola değerlendirir. A + b değerlendirildiğinde, a hala 3'tür.


16
Belirtilmemiş davranışların güzel kullanımı
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

commonBlokların standart olarak kötüye kullanımı : sipariş konuları; Ben alt rutinde bloktaki sırasını değiştirdim, bu yüzden gerçekten ekliyorum 1 + 2 + 2.


6
@JanDvorak: Haha, FORTRAN IV'ü, 2=3
edebi

1
@KyleKanos, bu yazının FORTRAN'da yazıldığını gördüğümde olacağını düşündüm.
danmcardle

@KyleKanos Yap!
ClickRick

1
@KyleKanos: Bu, tamsayı değişmezleri ile mi çalışıyor, yoksa sadece yüzüyor mu? O dönemin bir makinesinde, bir tamsayı değişmezi ile bir adresin aynı boyutta olacağını, ancak bir yüzgecinden daha küçük olacağını, bu yüzden yüzer değişmezleri bir araya getirmenin yer kazanacağını ancak iç gerçekleri biriktirmeyeceğini düşünürdüm.
supercat,

2
@KyleKanos: Anladığım kadarıyla derleyiciler bir değişmeze doğrudan bir atamaya izin vermeyeceklerdi, ancak kullanılan işlev çağrıları başvuruya göre geçiyor ve bir işleve bir değişken noktası değişmezi iletmek genellikle bir yüzen havuzdaki değerin adresini geçiyor puan değişmezleri. Bir tamsayı değerini bir işleve iletmek havuza alınmasına neden olur, ancak kullanılan tamsayıların çoğu doğrudan değerleri içerir.
supercat

24

piton

Kod, bu görev için doğru olan 5 yanıtı yazdırır.

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

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

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

Düzenleme: İşte ikiye bölünmüş değil tamsayı ekleyen alternatif sürüm.

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

Tilde geri dönen -x-1, tek bir ters operatördür , bu nedenle ilk adım almak -6ve sonra printişlevde başka bir operatörle çalışmaktır.5


Neden ~eval(`a`)sadece ~a?
Andrea Corbellini

2
int()İşlevsellikten bir kısmını bırakmak istedim ve eval()eğer girdi bir dize edilmiş tamsayıysa işi yapar :)
avall

24

Yakut

class Fixnum
    alias plus +

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

puts 2 + 2

Bu, ilk argümanı bir Fixnum olan (2 tanesi en azından MRG olan) tüm eklemelerin sonucunu 1'e çıkarır.

Bunun yan etkileri Java sürümünden bile daha kötü.


23

Yakut

Ruby birinci sınıf ortamlara sahiptir. Bu çok şey anlamına gelir. Ayrıca, belki de yapılmaması gereken birçok şey yapılabileceği anlamına gelir.

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

Bunun çıktısı:

2 + 2 = 
4
2 + 4 = 
6
Ama 1984 yılında ...
2 + 2 = 
5
2 + 4 = 
6

Bunun zevkleri ve tehlikeleri hakkında daha fazla bilgi edinmek istiyorsanız, Ruby Conf 2011 Ruby'nin Makul Olmasını Sağlayın ve Birinci Sınıf ortamlarını Özet Heresies blogundan okuyun.


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

1
Sadece belirli bir durumda yapmak için: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

düzen

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

9
Hey! 2+2lisp'ta ekleme yaptığınız gibi değil!
John Dvorak

1
Ne olmuş yani? Görüldüğü gibi görevde olduğu gibi 2 ila 2 ekleyin.
Hauleth,

119
@JanDvorak Hiç lisp kullanmadım, ama anladığım kadarıyla böyle bir şey ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
undergroundmonorail

2
“2 + 2'yi 5 olarak yeniden tanımlamak çok yaratıcı değil! Şüphe duyma, başka bir şey dene.” --- Eh, R5RS'de 2 + 2 veya 2 yerine + değerini yeniden tanımlayabilirim. Cevap burada: pastebin.com/KHtm9Jmv
Felipe

1
@FelipeMicaroniLalli bu ek açıklama benim cevabımdan sonra yapıldığı için sayılmaz.
Hauleth,

20

C #

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

Tanıdık olmayan biri için bu, 2 ile başlayan ve biten bir menzil elde ediyorum gibi görünecektir. Gerçekte, 2 ile başlar ve iki sayı için de geçerlidir. Yani 2 + 3 = 5.


6
2'de başlayan ve biten bir aralık adil olur { 2 }, değil mi?
Paŭlo Ebermann

1
@ PaŭloEbermann Enumerable.Rangebir başlangıç ​​ve bir son almaz, bir başlangıç ​​ve bir sayma alır (numaralandırılacak öğelerin).
MasterMastic

14
@MasterMastic Bunu cevabın açıklamasından anladım. Ama "familar olmayan birine" anlamının böyle bir aralık olduğu varsayılır (cevabın açıklamasından itibaren) ve benim
iddiam

1
@ PaŭloEbermann, evet, aynı zamanda bakmanın bir yolu. Eklenecek sayıları verdiğimden daha fazla görünebileceğini düşünüyordum. Böylece Enumerable.Range (1,2,3,4) 1'de başlayacak, 4'te bitecek ve 10'a kadar
Paul


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

5Çok iyi gizlenmiş değildir, maalesef. Optimizasyon ile çalışmıyor.


1
Güzel; Tanımsız davranışa izin verilmiyorsa, oyu yükseltemem.
bu

2
@self., UB'ye güvenmenin nerede yasaklandığını anlamıyorum. Çoğu kod golf yanıtı UB'ye dayanıyor ve sürekli olarak makul bir platformda gerçekleştiği sürece sorun değil.
ugoren

2
UB'ye güvenmenin yasak olduğu yeri göremiyorum. Bu konuda da hiçbir kural bulamadım. Bu açıklığa kavuşturulursa iyi olurdu. Birçok kod golf yanıtı UB'ye dayanıyor ve tutarlı bir şekilde bazı makul platformlarda gerçekleştiği sürece sorun değil . Bu konuda bazı özel kurallar iyi olurdu.
bu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.