2 + 2 = 5 [닫힌] 프로그램을 작성하십시오


393

숫자 2와 2를 추가하고 5를 출력하는 프로그램을 작성하십시오. 이것은 언더 컨테스트입니다.

프로그램이 오류를 출력 할 수 없습니다. 메모리 홀을 조심하십시오! 입력은 선택 사항입니다.

2 + 2를 5로 재정의하는 것은 그리 독창적 이지 않습니다 ! 다시 생각하지 말고 다른 것을 시도하십시오.


48
이것은 George Orwelll의 책 "1984"에있는 질문입니다.
bacchusbeale

97
이것이 왜 미미한가? 2 더하기 2 5입니다.
Geobits

79
그곳에! 아르! 네! 불!
Nick T

105
@Geobits-동의합니다 : 2 + 2 = 5 이 계산기 에서 볼 수 있습니다 .
MT0

47
echo "2+2=5";
user3459110

답변:


669

자바

리플렉션은 실제로 Java를 남용하는 올바른 방법이지만, 일부 값을 조정하는 것보다 더 깊이 들어가야 합니다.

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

산출:

5

설명:

일반적으로 액세스 할 수있는 것보다 더 깊게 변경해야합니다. 이는 IntegerCache를 변경하는 JVM에 펑키 매개 변수가 전달되지 않은 Java 6 용으로 설계되었습니다 .

Integer 클래스 내에는 Flyweight of Integer가 있습니다. 이것은 -128에서 +127까지의 정수 배열입니다. cache[132]4가 보통있는 지점입니다. 5로 설정하십시오.

경고 : 실제 코드에서이 작업을 수행하면 사람들이 매우 불행 해집니다.

ideone의 코드 데모 .


5
내가 질문을 보자 마자 이것에 대한 생각 :)
Octavia Togami

306
그. 입니다. 악. 절대적으로 악하다. +1
John Dvorak

75
@JanDvorak은 채팅에서 제안되었습니다 Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); 그냥 얼마나 많은 것들이 깨질 지 상상해보십시오 ...

30
이와 같은 답변을 통해이 사이트를 SO보다 더 좋아하게됩니다.
Songo

35
zomg, java 답변은 절대로 최고 투표권을 얻지 못했습니다! java를 맨 위로 가져 오는 +1 :)
Cruncher

297

하스켈

나는 당신이 ghci에 무엇이든 던질 수있는 방법을 좋아합니다.

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

36
무엇을 let 2+2=5 in 5+5합니까? ಠ_ಠ
John Dvorak

22
@ JanDvorak- Non-exhaustive patterns in function +나는 여기에 새로운 기능 (+)을 정의하고 있으며, 그렇지 않은 것을 연결하면 2+2그 경우에 일어날 일을 정의하지 않았기 때문에 오류가 발생합니다.
Flonk

27
@SHiNKiROU 그림자, 재정의하지 않음
John Dvorak

96
"하나님께서는 2 + 2 = 5에서 2 + 2 = 5라고하셨습니다"))
OutFall

11
하스켈을 배우십시오, 그것은 당신의 마음에 좋습니다.
구두

294

꽤 싸구려 트릭이지만 대부분의 사람들을 사로 잡을 것이라고 확신합니다.

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

여기 사용해보십시오

코드를 오른쪽으로 스크롤하십시오.
Windows / Linux에서는 확실하지 않지만 OSX에서는 스크롤 막대가 보이지 않습니다.
어쨌든, 이것이 좋아하는 코드 편집기에서 "공간 시각화"를 가능하게하는 좋은 이유입니다.


96
스크롤바는 Chromium에서 볼 수 있지만 처음에는 누가 스크롤합니까? :)
Ruslan

172
사람들을 혼동시키기 위해, 스크롤바의 존재를 "설명"하기에 충분히 긴 주석 행을 추가 할 수 있습니다.
Hagen von Eitzen

22
OS X에서 기본적으로 스크롤 막대의 가시성은 마우스 연결 여부에 따라 다릅니다. 터치 패드 만 있으면 스크롤바가 겹쳐 져서 사용하지 않을 때 사라집니다. 마우스가 연결되어 있으면 스크롤바는 컨텍스트 상자에서 공간을 훔쳐서 항상 표시됩니다. USB 마우스를 뽑고 MacBook에 꽂아서이를 테스트 할 수 있습니다. 물론 시스템 환경 설정에서 구성 할 수 있습니다.
Andrea

49
영리하지만 모바일에서는 그냥 줄 바꿈 :)
Logan

31
SE 코드 창을 스크롤 해도 다른 사람의 손가락을 깰 필요는 없습니다 .
ObscureRobot 2018 년

184

GolfScript

4:echo(2+2);

인쇄 5합니다.

물론 GolfScript는 다른 언어와 현저히 다른 구문을 가지고 있습니다.이 프로그램은 Basic 또는 C-ish처럼 보입니다.

4  -스택에 숫자 4를 넣습니다. 스택 내용 : 4-스택
:echo상단의 값을 변수 에코에 저장합니다. 스택 내용 : 4-스택
(  맨 위의 값을 1 씩 줄입니다. 스택 내용 : 3-
2  스택 맨 위에 2를 넣습니다. 스택 내용 : 3 2-
+  스택 위에 두 숫자를 더합니다. 스택 내용 :
2  5-2 번을 스택 위에 놓습니다. 스택 내용 : 5 2-
)  스택 상단의 값을 1 씩 증가시킵니다. 스택 내용 : 5 3-
;  스택에서 상단 요소를 제거합니다. 스택 내용 : 5

GolfScript는 기본적으로 실행이 완료된 후 스택에 남아있는 모든 것을 인쇄합니다.


3
GolfScript를 사용하지 않는 사람들을 위해 설명해 주시겠습니까?
MadTux

1
@MadTux 여기 있습니다.
aaaaaaaaaaaa

1
감사. (매일 한도에 도달했기 때문에 나중에
투표 할 예정

5
단순하고 건전한, 나는 그것을 좋아합니다. +1
seequ

9
나는 그것이 수학이나 의미론으로 당신을 속이는 것처럼 보이지 않기 때문에 너무 간단하고 5 ^^
dwana

145

자바

항상 복식을 둥글게해야 해

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

산출:

Variable two = 2.000000000000000
two + two = 5.000000000000000

설명:

아니, 진지하게, 당신은 항상 복식을 반올림해야합니다. 15는 숫자가 충분하지 않아 two()메서드가 실제로 생성 한다는 것을 보여줄 수 없습니다 2.0000000000000004(그러나 16이면 충분합니다).

숫자의 원시 16 진수 표현에서 1 비트 차이 ( 4000000000000001와 사이 4000000000000000)입니다 ... Math.ceil4를 반환하지 않고 5를 반환 하기에 충분합니다 .


61
Math.ceil(two + two); // round just in case난 당신이 무슨 짓을했는지 볼
팀 S.에게

17
같은 이름을 가진 함수와 변수를 만드는 중 ... 와우.
구성자

107
아무것도 아닌 @configurator라는 클래스조차 없습니다 two. 생산 등급 java는 Two two = Two.two.two();TwoFactory 유형이 Two.two입니다.
Jannis Froese 2012 년

36
Two.Infinity.and.Beyond ()
CincauHangus

7
@TimS 나는 당신이 한 일을
그만 둔다

135

BBC 기본

편집 : Andrea Faulds 및 Squeamish Ossifrage의 경우 다른 통역사를 사용하는 더 확실한 버전 : 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

여기에 이미지 설명을 입력하십시오

이것은 실제로 숫자 4를 인쇄하지만 VDU 23ASCII 52의 글꼴을 재정 의하여 4 대신 5처럼 보이도록 재정의합니다. 미학적 이유로 합리적인 크기의 문자로 화면 모드 6이 선택되었습니다.

http://bbcbasic.co.uk/bbcwin/bbcwin.html 의 에뮬레이터를 사용한 원본 이미지 . (이력이 약간 다른) 편집 기록에서 볼 수 있습니다.


8
그 글꼴은 다르게 보입니다. 올바른 글꼴을 사용할 수 있다고 생각하십니까?
Andrea

@AndreaFaulds 전에서 에뮬레이터를 사용하고 bbcbasic.co.uk/bbcwin/bbcwin.html을 . 8x8 그리드에서 원본 BBC Basic의 글꼴 재정의를 지원합니다. 그러나 에뮬레이터의 기본 글꼴은 8x8보다 분명히 더 높습니다. 아마 더 나은 일을 할 수는 있지만 완벽하지는 않습니다. 5뿐만 아니라 4의 글꼴을 모두 재정의 할 수 있다고 가정하면 동일하게 보입니다.
Level River St

5
@AndreaFaulds이 질문은 결과가 다른 5 대와 구분할 수 없다고 말하지 않았습니다. 이것이 실제로 기능이라고 생각합니다. 2+3=52+2=5'
벤 잭슨

1
이것은 BBC Micro의 원래 글꼴과 일치합니다.VDU 23,52,126,96,124,6,6,102,60,0
squeamish ossifrage

정보 감사합니다 @squeamishossifrage 감사합니다. 그래도 에뮬레이터의 글꼴과 일치하지 않습니다. 귀하의 예는 내 것과 마찬가지로 높이가 7 픽셀입니다. 또한 저와 마찬가지로 바닥에 0이있는 반면 조금 아래로 이동 해야하는 것처럼 보입니다 (즉, 바닥 대신 상단에 0이 있어야 함). 가장 큰 차이점은 126,64입니다. 반면에 당신은 126,96을 가지고 있고 당신은 내 2 대신 6을 가지고 있습니다. 원래 BBC 글꼴은 세로 선이 두껍기 때문에 표준 TV 화면에서 80 열 형식으로 쉽게 읽을 수 있기 때문입니다.
레벨 리버 St

134

Brainfuck

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

산출:

5

여기서 사용해보십시오 .

나는 이것이 조금 단순하게 들릴지도 모른다는 것을 알고 있지만 원래 게시물에서 제안한 것처럼 창의력을 발휘하려고했습니다.


1
나는 brainfuck를 모른다. 이것을 알아내는 데 몇 분이 걸렸다. ASCII 53, 그렇지?
레벨 리버 St

4
당신이 가지고있는 한 +++++.아무것도 페인트 할 수 있습니다.
Eduard Florinescu

1
@steveverrill : 네 맞습니다. (그리고 이것은 BF에서 ASCII 문자를 출력하는 유일한 방법입니다).
tigrou


105

세게 때리다

이것은 이므로 오래 걸리는 방법을 사용해야한다고 생각합니다 ...

Bash를 모르는 사람들을 위해 : $((...expr...))산술 연산 식을 평가하는 구문입니다. 명령 줄 계산기를 $(bc<<<...expr...)사용하여 동일한 작업을 수행합니다 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...?

산출

2+2= 5

설명

두 번째 줄은 v를 추가하지 않고 v와 2를 연결하여 22를 만듭니다.
실제 설명 :
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
거기에 좋은 수학 트릭!
tomsmeding

5
@tomsmeding 반 쯤쯤지나 가면서 나는 4 행 15대신에 넣었다는 것을 깨달았지만 꽤 재미 있었다 16. 운 좋게도, 그것은 bc반올림 때문에 여전히 작동했다

2
유효한 Bash 인이 스타일의 모양이 ((v = v * 5))((v *= 5))
Dennis Williamson

2
좋은 +=것이지만 즉시 그 사실을 발견했습니다 .
nyuszika7h

2
@ardnew 예가 있습니다. 처음 두 줄 ( v=2v+=2) : 배쉬 변수 처리에 익숙하지 않은 사람에게, 즉에 해당 될 것이다 2+2, 그러나 그것은 사실입니다 "2"+"2", 즉 "22". 코드의 다른 주석은 이것 때문에 잘못되었습니다. 모두가이 재미있는 것을 발견하지는 않습니다

101

파이썬

Java 답변에서 영감을 얻었습니다.

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

Java와 마찬가지로 CPython은 처음 몇 개의 작은 정수 (메모리가 제공되는 경우 0-255)의 사본에 동일한 메모리 위치를 사용합니다. 그러면를 통해 해당 메모리 위치를 직접 편집합니다 ctypes. patch난독 화 "12-7"된 문자열이며 len4 의 문자열은 eval5입니다.

더 난독 화 된 버전

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 넘어

OP가 언급했듯이 2 + 2는 다소 지루할 수 있습니다. 여기에 원치 않는 남용을위한 더 깨끗하고 멀티 플랫폼 멀티 폭 코드가 있습니다.

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

파이썬 2.7로 실행하면 ... 끝에 그 줄을 무시하십시오. 내가 액세스하기 쉬운 두 시스템 인 Windows 64 비트 및 Ubuntu 32 비트에서 작동합니다.

$ 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 + b ) + c = a + ( b + c )와 같은 덧셈의 ​​연관 속성을 깰 수 1+2+3있지만, 우리는 또한 정식 속성 ( a + b = b + a ; 두 번째 및 세 번째 줄). 파이썬 인터프리터가 추가 표현식 주위의 불필요한 괄호를 무시하는지 궁금합니다.


96
예, 우리는 모두 segfaults를 우연히 무시합니다.

10
이것은 실제로 파이썬 트릭이 아니며 C의 C 구현에만 적용된다는 점을 언급 할 가치가 있습니다.
xApple

1
@NickT 아! 괜찮아. 동일한 64 비트 창, 32 비트 우분투 설정에서 원본을 사용해 본 인상을
받았습니다

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')수정 된 첫 번째 버전입니다. 나는 이것을 해킹 경쟁에서 빨간색 팀으로 / etc / profile의 $ PYTHONSTARTUP에 넣을 수 있도록 만들었습니다.
DavidJFelix

2
네. Sidenote, 1, 0 및 -1은 파이썬이 즉시 segfaults하는 숫자 중 일부 인 것 같습니다. 나는 이것이 파이썬 프로그램 동작을 망칠 때 최악이라고 생각했다. fuckitpy 를 사용 하여 이러한 오류를 포함 할 수 있습니다.
DavidJFelix

86

자바 스크립트 :

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/ 에서 확인하십시오.

H (Latin letter capital h) 및 Η (Greek letter capital eta)는 var 키워드를 사용하여 함수에 대해 로컬로 정의되지 않았기 때문에 전역 범위로 설정됩니다. 그것들은 비슷해 보이지만 실제로는 2 개의 다른 값을 가진 2 개의 다른 변수입니다. 브라우저에서 Ctrl + F를 사용하면이 페이지에서 Η (eta)가 H (h)보다 훨씬 적게 나타납니다.


4
@Sam은 두 개의 'H'가 동일하게 보이지만 실제로는 완전히 다른 문자입니다. 유니 코드에는 동일하게 보이지만 코드 포인트가 다른 문자가있을 수 있습니다. 이 특정한 경우에; 다른 "H"는 실제로 그리스 문자 Eta 입니다.
d3dave

79
독자들을 혼동시키기 위해 상형 문자를 사용하는 것은 이제 공식적으로 재미 있지 않습니다 .
John Dvorak

29
상형 문자는 자바 스크립트의 어리석은 전역 변수와 함께 재미있어집니다.
Konstantin Weitz 2016 년

3
"유니 코드 Η 문자"가 아니며 라틴 H 및 그리스 에타 (Η)입니다.
phyzome 2016 년

4
@Vortico 흠 ... FAQ 질문으로 충분하지 않을 때 무엇을 원하십니까? 도움말 센터와 연결된 FAQ 질문? 중재자 만 faq 태그를 적용 할 수 있습니다 . 대답에 관해서는-질문에 "공백 +5 이상 및 공감 율의 두 배 이상을 공감하십시오." 답은 27 개의 공감이 있고 공감이 없습니다. 그것은 답변에 명시된 기준을 충족시키는 것처럼 들리며, 투표율은 124 명만이 10 번 이상 투표 한 사이트의 메타 사이트에 대한 질문에서 두 번째로 오래된 답변에 매우 인상적입니다. 얼마나 많은 것이 당신이 좋아? 여러분?
John Dvorak

72

자바 스크립트

function addDecibels(){return (10*Math.log10([].reduce.call(arguments,(p,c)=>p+Math.pow(10,c/10),0))).toFixed(1);}

alert( addDecibels(2,2) );

언더 핸드 비트는 실제로 언더 핸드가 아니라는 것입니다. 2dB 음원을 다른 2dB 음원에 추가하면 결과적으로 결합 된 잡음은 로그 스케일로 측정 될 때 5dB (30dB 음원을 추가 한 경우 33dB)가됩니다.

여기서 다른 계산기로 볼 수 있습니다 .


실제로 5.01 데시벨과 비슷하지만 4에서 충분히 멀어집니다.
Joe Z.

68

PHP

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

어느 생산 :

2 + 2 = 5

PHP에서 삼항은 왼쪽에서 오른쪽으로 계산되기 때문에 실제로
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';


35
의무적 인 phpsadness
wchargin

1
다른 PHP예가 있습니다 :$a=2;echo "2+2=".$a++ + $a++;
avall

$ a ++가 3을 만들고 결과는 6이 될 것입니다. 나는 당신이 생각하는 것을 얻지 못합니다.
Ozh

1
@Janus PHPsadness # 30 이 잘 설명합니다
wchargin



57

씨#

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

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

        Console.WriteLine(x + y);
    }

7
아, 불량 캐릭터와 좋은 오래된 트릭. 그렇기 때문에 어디에서나 1TBS를 사용해야합니다.
John Dvorak

11
@JanDvorak if 문 뒤의 세미콜론으로 인해 작동합니까? C #을 모르지만 C ++을 사용했습니다

5
@professorfish 그것이 내가 생각하는 것입니다. 또한 임의의 중괄호 FTW를 삽입 할 수없는 언어도 있습니다.
John Dvorak

12
";"이 없으면 if 문은 코드 블록의 실행 여부를 제어합니다. 와 더불어 ";" 거기에서 if는 평가되지만 결과로 아무것도 수행되지 않습니다. 그런 다음 코드 블록은 매번 실행됩니다. C #에서는 임의의 코드 블록을 갖는 것이 완벽하게 허용됩니다.
Grax32

2
요 전날 이것으로 나 자신을 얻었다. 나는 그것을 가진 for 루프를 가지고 있었고, ;나는 빈 루프를 사용하여 커서를 진행할 때 완벽하게 의도적이었습니다. 실수로 세미콜론을 제거하고 모든 것이 터져서 이유를 알 수 없었습니다.
mpen

56

ASCII 아트로 Javascript를 장식하는 것은 위험합니다.

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

     (2 + 2)

주석이 제거되면 나머지 기호 및 연산자는 다음과 같이 평가됩니다
-~~--~(2 + 2) . JS에서 비트 단위 연산자 (~)를 사용하고 그 과정에서 값을 무시하는 소수의 빼기 부호를 사용합니다.


3
--오류가 발생 하여 연산자가 어떻게 수용 가능한지 궁금합니다 Invalid left-hand side expression in prefix operation. 그러나 나는 그들 사이에 공백 문자가 있음을 깨달았습니다.
usandfriends

53

세게 때리다

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

산출:

2 + 2 = 5

각각의 출력 cat에는 암시 적 줄 바꿈이 있지만 최종 줄 바꿈은 명령 대체로 제거됩니다.$( )


다른 하나는 다음과 같습니다.

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

배쉬 배열은 인덱스가 0이다


3
나는 Bash에서 골프를 칠 때 그런 것들에 많은 문제가 있었기 때문에 실제로 첫 번째 것을 잡았습니다. 두 번째 0으로 인덱스 되지 않은 배열 어디 입니까?

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

12
@DigitalTrauma Applescript는 이상합니다

5
zsh옵션이 설정되어 $arr[0]있지 않은 한 1 인덱싱 된 배열을 사용합니다 ( 단순히 설정되지 않거나 정의되지 않은 것 또는 다른 것임). KSH_ARRAYS이 경우 배열은 0 인덱싱됩니다.
chepner

4
@professorfush : Lua & Fortran은 1 색인입니다. 10으로 계산할 때마다 항상 0이 아닌 1부터 시작합니다. : D
Kyle Kanos

49

# 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 라는 CPAN 모듈에 따라 다릅니다 . 모듈의 파일 이름이 잘못되어 대소 문자를 구분하지 않는 파일 시스템 (Windows 또는 Mac OS X와 ​​같은)에서만 작동하지만 여기서는 원래 모듈의 저자를 비난합니다. Acme :: NewMath는 Ingsoc 이데올로기에 따라 수학을 구현합니다.


16
이것은 꽤 교활합니다. 아무도 당신의 수입품 / 포함 물을 보지 않습니다.

44

아르 자형

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

산출:

5

코드는 실제로 [1]의 평균을 [4]의 평균에 추가합니다. 것 R의 평균 기능을 사용하는 올바른 방법은 : mean(c(1,3)) + mean(c(4,0))이 같은 R에서 다른 수학 함수, 달리 sum, max그리고 min; where sum(1,3), max(1,3)min(3,1)모두 예상되는 답변을 제공합니다.


7
나쁘지 않은데, 나를 조금 속였다.
qwr

37

자바

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

산출:

512.0000000000005

아마도 같은 종류의 복식을 사용하는 모든 언어에서 작동합니다.


7
그것은 매우 이상한 주된 서명입니다.
Bertie Wheen 2016 년

10
Java는 가변 인수를 배열로 배열로 구현합니다.
CodaFi

4
당신이 아마 복식의 마지막 숫자에 대해 이야기하고 있음을 깨닫기 위해 잠시 시간을 보냈습니다. 나는 첫 번째 숫자가 제대로 (추가 된 것을보고 _2_56 + _2_56 = _5_12), 그러나 당신이 의미하는 것이 더욱 것으로 보인다 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_노트 (:.에 "대담한"숫자를 사용하는 밑줄
저스틴

35

펀지

이것은 Befunge로 작성되었지만 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

(인터프리터로) 실행하면 프로그램이 인쇄 5됩니다.

설명:

Befunge 프로그램은 단일 문자 명령으로 구성된 그리드로 구성됩니다. 첫 번째 명령은 왼쪽 상단에있는 명령이며 명령 읽기는 오른쪽으로 진행됩니다. 그러나 프로그램 실행 중에 방향이 바뀔 수 있습니다.

첫 번째 문자 행과 첫 번째 행에서 시작하는 문자 열만 v실행됩니다. 문제의 문자를 수행합니다

#- 다음 명령을 건너
>- 지금부터를, 명령은 현재 명령의 오른쪽에 읽기
v- 지금부터, 명령은 현재 명령 아래 읽기
5- 푸시 (5) 스택에
.- 팝과 숫자를 인쇄 스택의 상단에
@-프로그램을 종료
<space>-아무것도하지 마십시오

당신이 Befunge에서 프로그래밍하고 있다는 것을 알고 있다면, 이것은 실제로 누군가를 속이지 않을 것입니다. 그러나 당신이 이것을 발견하고 그것이 Befunge라는 것을 몰랐다면, 아마도 그럴 것입니다.


11
+1, 누가 디버깅 할 때 소스 코드를 실행하는 프로그램을보고 있는가?
MrLore

33

자바 스크립트

암호:

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

산출:

5

콘솔에서 직접 테스트 하거나이 바이올린을 확인할 수 있습니다


6
리소스를 알려주거나 이것이 왜 작동하는지 설명해 주시겠습니까? 나는 그것의 바이올린을 확인했기 때문에 그것이 효과가 있다는 것을 알고 있지만 그 이유를 이해하지 못합니다.
가족

29
"a"변수는 두 번 동일하지 않습니다 (이를 망치면 미안합니다). 참 음흉 유니 코드
샘 크리머

6
나는 다음 캐릭터 U+0431가 б – 거의 6 인 방법을 좋아합니다 !
wchargin 2016 년

73
독자들을 혼동시키기 위해 상형 문자를 사용하는 것은 이제 공식적으로 재미 있지 않습니다 .
John Dvorak

40
@JanDvorak이 답변은 다음에 게시되었습니다. 여기에는 적용되지 않습니다.
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를 인쇄합니다

그래서 a = 2입니까?

gcc-4.7.3은 기능 매개 변수를 오른쪽에서 왼쪽으로 평가합니다. a + b가 평가 될 때 a는 여전히 3입니다.


16
지정되지 않은 동작의 좋은 사용
chbaker0

24

포트란 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

common블록의 표준 남용 : 주문 문제; 서브 루틴의 블록에서 순서를 바 꾸었으므로 실제로 추가하고 1 + 2 + 2있습니다.


6
@JanDvorak : 하하, FORTRAN IV를 사용하여 리터럴을 재정의 할 수 있습니다.2=3
Kyle Kanos

1
@KyleKanos, 이것이 귀하의 게시물이 FORTRAN으로 작성된 것을 보았을 때 이것이 될 것이라고 생각했습니다.
danmcardle

@KyleKanos 해!
ClickRick

1
@ KyleKanos : 정수 리터럴로 작동 했습니까? 그 시대의 컴퓨터에서 정수 리터럴과 주소는 같은 크기이지만 플로트보다 작을 수 있으므로 플로트 리터럴을 풀링하면 공간이 절약되지만 int 리터럴은 풀링하지 않습니다.
supercat

2
@KyleKanos : 컴파일러는 리터럴에 직접 할당을 허용하지 않지만 함수 호출은 참조로 전달하고 부동 소수점 리터럴을 함수에 전달하면 일반적으로 부동 풀의 값 주소를 전달한다는 것을 이해합니다. 포인트 리터럴. 정수 값을 함수에 전달하면 함수가 풀링되지만 정수를 사용한 대부분의 코드에는 값이 직접 포함됩니다.
supercat

24

파이썬

코드는이 작업에 대한 정답 인 5를 인쇄합니다.

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

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

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

편집 : 다음은 문자열이 아닌 정수를 추가하는 대체 버전입니다.

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

Tilde는를 반환하는 단항 역 연산자 -x-1이므로 첫 번째 단계는 get -6print함수 get의 다른 연산자를 얻는 것입니다.5


~eval(`a`)대신에 ~a?
Andrea Corbellini

2
나는 int()기능 중 일부를 남기고 싶었고 eval()입력이
문자열

24

루비

class Fixnum
    alias plus +

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

puts 2 + 2

이렇게하면 첫 번째 인수가 Fixnum (적어도 MRI에 2 이상) 인 모든 추가 결과가 1 씩 증가합니다.

이것의 부작용은 Java 버전보다 훨씬 나쁩니다.


23

루비

루비에는 일류 환경이 있습니다. 이것은 많은 것을 의미합니다. 또한 많은 일을 할 수 있다는 것을 의미합니다.

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

이것의 결과는 다음과 같습니다.

2 + 2 = 
4
2 + 4 = 
6
그러나 1984 년에 ...
2 + 2 = 
5
2 + 4 = 
6

이것의 기쁨과 위험에 대해 더 알고 싶다면 Ruby Conf 2011 Ruby를 합리적으로 유지 하고 Abstract Heresies 블로그에서 일류 환경 을 읽으십시오 .


class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
42 42

1
특정한 경우를 위해서 :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

계획

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

9
야! 2+2당신이 lisp에 추가하는 방법이 아닙니다!
John Dvorak

1
그래서 무엇? 그것은 작업에서와 같이 2 대 2를 추가하는 것 같습니다.
Hauleth

119
@ JanDvorak 나는 lisp를 사용한 적이 없지만 이해하지만 그것은 같은 것 ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(())))입니다.
undergroundmonorail

2
"2 + 2를 5로 재정의하는 것은 그리 독창적이지 않습니다. 다시 생각하지 말고 다른 것을 시도하십시오." --- 글쎄, R5RS에서 나는 2 + 2 또는 2 대신 +를 재정의 할 수있다. 답은 여기에있다 : pastebin.com/KHtm9Jmv
Felipe

1
@FelipeMicaroniLalli 내 대답 후에 주석이 작성되어 계산되지 않습니다.
Hauleth

20

씨#

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

익숙하지 않은 사람에게는 2에서 시작하여 끝나는 범위를 얻는 것처럼 보일 것입니다. 실제로 2에서 시작하여 두 숫자로갑니다. 따라서 2 + 3 = 5입니다.


6
2에서 시작하고 끝나는 범위는 그냥 { 2 }그렇지 않습니까?
Paŭlo Ebermann

1
@ PaŭloEbermann Enumerable.Range은 시작과 끝을하지 않으며 시작과 카운트 (열거되는 요소의 수)를 취합니다.
MasterMastic 2016 년

14
@MasterMastic 나는 대답의 설명에서 이것을 이해했습니다. 그러나 "가족이 아닌 사람에게"라는 의미는 (해답의 설명으로부터) 그러한 범위가되어야하며, 나의 주장은 예상 결과가 4가 아니라 2가 될 것이라는 것입니다.
Paŭlo Ebermann

1
@ PaŭloEbermann, 그렇습니다. 그것은 그것을 보는 한 가지 방법입니다. 추가 할 숫자를 제공하는 것처럼 보일 수 있다고 생각했습니다. 따라서 Enumerable.Range (1,2,3,4)는 1에서 시작하여 4에서 끝나고 10까지 합산합니다.
Paul


18

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너무 잘 숨겨지지, 난 두려워. 최적화와 함께 작동하지 않습니다.


1
좋은; 정의되지 않은 동작이 허용되지 않으면 공감할 수 없습니다.
이번

2
@self., UB에 대한 의존이 금지 된 곳을 볼 수 없습니다. 많은 코드 골프 답변은 UB에 의존하며 합리적인 플랫폼에서 일관되게 발생하는 한 괜찮습니다.
ugoren 2016 년

2
UB에 의존하는 것이 금지 된 곳을 알 수 없습니다. 나는 그것에 관한 규칙도 찾지 못했습니다. 그것이 명확해질 수 있다면 좋을 것입니다. 많은 코드 골프 답변은 UB에 의존하며 합리적인 플랫폼에서 일관되게 발생하는 한 괜찮다고 생각합니다 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.