소스 코드를 바꾸면 입력을 부정합니다!


36

뻔뻔스러운 도둑 (A)의 완전 사기 . 그들을 찬성하라!

당신이 그것을 받아들이려면 당신의 임무는 정수 입력 / 인수를 출력 / 반환하는 프로그램 / 함수를 작성하는 것입니다. 까다로운 부분은 소스 코드를 뒤집 으면 출력이 원래의 정수를 무시해야한다는 것입니다.

소스 코드가 ABC있고 입력이 4입니다. CBA대신 쓰고 작성 하면 출력은이어야합니다 -4.

소스 코드가 ABC있고 입력이 -2입니다. CBA대신 쓰고 작성 하면 출력은이어야합니다 2.

의 입력을 0제공 할 수 있습니다 0또는 -0당신이 제로에 서명 지원을 할 경우, 그러나 -0주어야한다 0.


5
왜 같은 질문의 사본이 필요합니까?
기독교

5
@Christian 그것은 일정한 숫자 (그리고 그것의 부정)를 출력하는 반면, 이것은 입력을 받고 그것을 반환 / 부정해야합니다. 많은 언어에서 매우 다른 직업.
Adám

5
예, 이제 차이가 보입니다. 하나는 매우주의 깊게 읽을 필요
기독교

C #과 같은 구조화 된 언어를 사용하는 경우, 줄을 바꾸는 것입니까?
PerpetualJ

@PerpetualJ 아니요, 문자 목록처럼 소스를보십시오. 그 중 일부는 줄 바꿈입니다.
Adám

답변:





11

x86 기계 코드, 3 바이트

C3 D8 F7

위의 바이트 코드는 작동하지 않는 함수를 정의합니다. 단순히 호출자에게 제어를 반환합니다. 이 함수 뒤에는 두 개의 가비지 바이트가 있는데, 이는 반환 후에 발생하기 때문에 실행되지 않습니다. "사람의 땅이 없습니다". 어셈블러 니모닉에서 :

ret                     ; C3    
fdiv  st(0), st(7)      ; D8 F7

자, 이제 트롤이 바이트 순서를 반대로하고 있습니다.

F7 D8 C3

이 바이트는 이제 EAX레지스터 에서 정수 인수를 가져 와서 무효화하고 호출자에게 제어를 리턴 하는 함수를 정의 합니다. 어셈블러 니모닉에서 :

neg  eax     ; F7 D8
ret          ; C3

그래서 ... 그것은 간단했습니다. :-)

우리는 "부정"명령이있을 수 있습니다 아무것도 그것이 "앞으로"방향으로 실행되지 만 "반대"방향으로 실행 된 적이 있기 때문에, 우리가 원하는합니다. 따라서 동일한 패턴을 따라 임의로 더 복잡한 작업을 수행 할 수 있습니다. 예를 들어, 여기서 우리는 다른 레지스터에서 정수 인수 (예 : EDI* nix 시스템에서 일반적으로 사용되는 System V 호출 규칙을 따르기 위해)를 취하고이를 무시하고 기존 EAX레지스터 에서 반환합니다 .

C3      ret
D8 F7   fdiv  st(0), st(7)      ;  \ garbage bytes that
F8      clc                     ;  | never get executed,
89      .byte 0x89              ;  / so nobody cares

  ↓ ↓

89 F8   mov  eax, edi
F7 D8   neg  eax
C3      ret



6

공백 , 48 바이트

S S S N
S N
S T N
T   T   T   T   T   T   N
S T N
N
N
T   S N
T   N
S S T   N
T   T   S S T   T   T   T   T   N
T   S N
S N
S S S 

문자 S(공백), T(탭) 및 N(줄 바꾸기)가 강조 표시로만 추가되었습니다.

의 마이너 수정 내 공백 대답 나는 소스 코드를 리버스, 당신은 출력을 부정! 도전 .

온라인으로 시도 하거나 온라인에서 반대로 시도하십시오 (원시 공백, 탭 및 줄 바꾸기 만 사용).

설명:

이용 종료 프로그램을 짧은 회문있는 내장 NNN.
정규 프로그램은 :

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

리버스 프로그램은 :

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it to the stack
SSTTN  # Push -1 to the stack
TSSN   # Multiply the top two values on the stack together
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

숫자 푸시에 대한 작은 추가 설명 :

  • 첫 번째 S: 스택 조작 사용
  • 둘째 S: 스택에 숫자를 밀어 넣습니다.
  • S또는 T: 각각 양 / 음
  • 일부 S/ T뒤에 후행 N: 이진수의 숫자, 어디서 S=0그리고T=1

SSTTSTSN못살게 굴지 -10. 를 위해 0우리는 명시 적으로 필요하지 않으므로 S=0간단 SSSN하거나 SSTN충분합니다.




5

Brain-Flak , 7 바이트

#)]}{[(

온라인으로 사용해보십시오!

역전 :

([{}])#

온라인으로 사용해보십시오!

참고 : 주석을 지원하는 통역사에서만 작동합니다 (예 : Rain-Flak에서는 작동하지만 BrainHack에서는 작동하지 않음)


바이트를 뒤집는 대신 여는 / 닫는 대괄호도 바꾸면 주석을 사용하지 않고 8 바이트로이를 수행 할 수 있습니다.

({}[{}])

온라인으로 사용해보십시오!
반대로 해보십시오!


이 정의되지 않은 행동이 남용입니까? Brain-Flak 사양에 이러한 괄호가 허용되지 않는다고 생각합니다.
HighRadioactive

@TwilightSparkle #주석 이 시작되므로 원래 버전의 괄호는 무시됩니다.
라일리

네, 잊어 버렸습니다! 그러나 그것은 Rain-Flak에서만 작동합니다 (그러나 공식 통역가입니다). 당신은 아마 그것을 언급해야합니까?
HighRadioactive

@TwilightSparkle는 설명을위한 메모를 추가했습니다. 감사.
라일리

재미있는 작은 도전 : 역전 대신 개폐 대를 바꾸면 주석 없이이 작업을 수행 할 수 있습니까?
DJMcMayhem




4

R , 23 바이트

나는 논평 트릭없이 이동하기로 결정했습니다.

앞으로

`+`=scan;""+-0;nacs=`+`

온라인으로 사용해보십시오!

`+`=scan;0-+"";nacs=`+`

온라인으로 사용해보십시오!

정방향 버전에서는 +이진 연산자로 작동 -하고 단항 연산자입니다.

반대로 +단항이되고 -이항입니다. 따라서 scan 함수는 인수를 취합니다. file=""이는 stdin 및을 의미하며 what=0기본값이기도합니다. 따라서 단 +항일 때 첫 번째 인수는 오른쪽에 있고, 이항 일 때 첫 번째 인수는 왼쪽에 있습니다.

그만큼

;nacs=`+`

코드의 일부는 실제로 유용하지 않으므로 어떤 의미에서 내 코드는 주석 트릭을 사용하는 것보다 훨씬 더 유효하지 않습니다.


1
이것은 매우 영리합니다 (+1). 우리는 종종 R 연산자를 골프 바이트로 재정의하지만, 이것이 +단항 및 이진수로 사용되도록 재정의 된 것을 처음으로 본 것 같습니다 . 이것이 어떻게 구문 분석되었는지 이해하는 데 잠시 시간이 걸렸습니다… 다른 운영자 이름으로는 작업을 수행하지 않았을 것입니다.
로빈 라이더


4

펄 5 ( -p), 7 6 바이트

@primo 덕분에 -1

$_*=$#

TIO

주석은 입력을 변경하지 않습니다

#1-=*_$

입력을 무효화

$_*=-1#

TIO


-1 : $_*=$# TIO . 참고는 그 #그렇지 않으면이 변수로 해석됩니다, 프로그램의 맨 마지막 바이트해야 $#오히려 이름 <빈>으로 배열의 마지막 인덱스보다.
프리모

1
그러나 인쇄하려고 $#하면 오류 (#가 마지막 문자가 아닌 경우) 또는 아무것도 제공하지 않기 때문에 어떻게 작동하는지 이해할 수 없습니다.
Nahuel Fouilleul

-p또는 로만 작동하는 것 같습니다 -n. 상용구와 관련이있는 것 같습니다 ...
primo September

2
@primo 코드 뒤에 -p/-na ;를 추가 하기 때문에 작동 합니다. 즉, $#실제로 $#;는 배열의 크기입니다 @;. 크기가 @;변경되면 더 이상 결과가 올바르지 않습니다 ( TIO ). 어쨌든, 이것은 매우 영리하고 잘되었습니다! :)
Dada

것을 함께 볼 수 있었다 설명이다 perl -MO=Deparse -p <(echo -n '$_*=$#')는 것 때문에, perl -MO=Deparse -pe '$_*=$#'줄 바꿈을 추가
나우 Fouilleul


4

백핸드 , 6 5 바이트

I@-Ov

온라인으로 사용해보십시오! 두 배로 해보십시오!

백핸드의 포인터 특성으로 인해 약간 복잡해졌습니다. 더 짧은 하하 를 얻는 것이 가능하지 않다고 생각합니다 . 이것은 명령을 복제 하지 않고 두 프로그램 사이의 입력, 출력 및 종료 명령을 모두 재사용합니다. 이제 모든 IO-@명령이 작동 해야하기 때문에 최적이라고 생각합니다 .4 바이트 프로그램에서는 두 명령 만 실행할 수 있습니다.

설명:

백핸드의 포인터는 3 개의 셀에서 틱을 이동하고 셀의 경계에서 튀어 오릅니다. 이는 일반적인 논리가 겹치는 것을 의미합니다. 그러나 v^명령을 사용 하여이 속도를 조작 할 수 있습니다 .

원래 프로그램은 명령어를 실행하는데, 명령어 IO-@는 숫자로 입력되고, 숫자로 출력, 빼기, 종료됩니다. 분명히 빼기는 불필요한 것입니다. 코드에서 이들은 다음과 같습니다.

I@-Ov
^  ^    Reflect
  ^     Reflect again
 ^

반전 된 프로그램이 실행 v-I-vO-@됩니다. 이렇게 v하면 눈금 사이의 포인터 단계가 줄어들고 -스택 맨 아래 에서 빼기 (암시 적으로 0)가됩니다. 추가 -명령은 아무 것도 수행하지 않습니다. 프로그램은 다음과 같이 실행됩니다

vO-@I
v       Reduce pointer speed to 2
  -     Subtract zero from zero
    I   Get input as number and reflect off boundary
  -     Subtract input from zero
v       Reduce pointer speed to 1
 O      Output as number
  -     Subtract zero from zero
   @    Terminate







2

APL (Dyalog Unicode) , 13 3 바이트

-∘0

온라인으로 사용해보십시오!

사소한 대답. 반환 arg또는 ¯arg.

바보가 아니 어서 10 바이트를 절약했습니다 (Adám 덕분에).

결과 3 바이어를 더 적합한 기능으로 변경했습니다.


우와, 이것은 3 바이트로 간단하게 수행 할 수 있습니다!
Adám

흥미롭게도 이미 하위 문자열로 3 바이트 답변이 포함되어 있습니다.
Adám

@ Adám 예, 어딘가에 간단한 대답이 있다는 것을 알았습니다. 감사.
J. Sallé

2

튜링 머신 언어 , 39 바이트

긍정적

1 r - _ 0
0 l * * 0
0 - _ l 0
0 _ _ r 0

부정적인

0 r _ _ 0
0 l _ - 0
0 * * l 0
0 _ - r 1

이것은 내가 생각했던 것보다 조금 까다 롭습니다. 주로 '컴파일'오류로 실행되는 코드가 있다는 편견을 극복해야했기 때문입니다.


2

> <> , 5 4 바이트

n-r0

-v옵션으로 스택 초기화를 사용하고 입력 변수를 거기에 넣으십시오.

온라인으로 사용해보십시오!

아니면 반전을 시도

설명

n       Prints whatever is on the stack as a number
 -      Subtract the top 2 elements on the stack.
        There aren't 2 elements, so it crashes.
  r0    Never gets executed

or reversed:

0       Push a 0 onto the stack
 r      reverse the stack (now 0, -v)
  -     Subtract top 2 elements and push result (0-v, ie negated)
   n    Print as number
        The code wraps around and executes again. 
        It crashes on the - as there is only one
        item on the stack: 0.

2

스택 고양이 -mn , 2 바이트

-X

온라인으로 사용해보십시오!

반대로 시도하십시오!

설명

이것이 실제로 스택 캣츠의 이전 도전보다 훨씬 쉽다는 것이 밝혀졌습니다. 전체 프로그램 (신청 후 -m)은 다음과 같습니다 -X-. X테이프 헤드의 왼쪽과 오른쪽 스택을 바꾸는 데 사용됩니다. 즉, 초기 스택에 전혀 영향을 미치지 않으므로 무시할 수 있습니다. 그러나 프로그램은 사실상-- (스택의 상단을 두 번 무효화) 아무 효과가 없습니다.

역 프로그램의 경우 apply를 적용 -m합니다 X-X. 다시 말하지만 X아무것도하지 않으므로 프로그램은 효과적으로 단지 -스택의 최상위를 무효화합니다.

다른 2 바이트 솔루션은입니다 만 -=, 실제로는 동일합니다. 유일한 차이점은 =전체 스택이 아니라 인접한 스택의 상단 만 교체 한다는 것 입니다.

그러나 다시 사용 -m하는 것은 속임수처럼 느껴지므로 아래는 완전히 미러링 된 프로그램을 사용하는 솔루션입니다.


스택 고양이 -n , 7 바이트

:I<->I:

온라인으로 사용해보십시오!

반대로 시도하십시오!

설명

이전 답변 의 고려 사항 은 여전히 ​​적용됩니다 . 유효한 솔루션은 쌍으로 된 문자를 사용해야합니다 I. 가능한 여섯 가지 솔루션 (TIO 링크에 포함)은 모두 거의 동일합니다. -그리고 _이 프로그램에 상당하고, :대체 가능 |하거나 T(영 입력의 동시 작업도 비제 입력에 동일한 기능을 수행하고 있음). 가장 쉬운 방법으로 설명하기 위해 이것을 선택했습니다.

따라서 초기 스택은 -1(무한한 0의 맨 위에) 입력을 유지하는 반면 테이프를 따라 다른 모든 스택은 0 만 유지합니다. Stack Cats는 짝수 길이의 프로그램이 아무것도하지 않는 속성을 가지고 있습니다 (종료되면 제공하지만 어쨌든이 도전에는 루프를 사용할 수 없습니다). 중심 문자가 아무 것도 수행하지 않는 홀수 길이의 프로그램에 대해서도 마찬가지입니다.

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
<    Move another stack left (without taking the value).
-    Negate the zero on top of that stack (i.e. do nothing).

따라서 프로그램의 후반부는 전반부를 취소하고 결국 입력을 -1다시 끝 냅니다.

역 프로그램은 :I>-<I:입니다. 그것이 어떻게 변화하는지 봅시다 :

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
>    Move one stack right, i.e. back onto the initial stack which still holds the input.
-    Negate the input.
<    Move back to the left where we've parked the 1.
I    Move that 1 back onto the initial stack and turn it back into a -1.
:    Swap the -1 below the negated input to act as an EOF marker.

2

배치, 34 바이트

@ECHO.%1 2>MER@
@REM>2 1%=-aa/TES@

ECHO.입력 ( %1)을 에코 ( )합니다 . 첫 번째 줄의 나머지 부분은 기술적 STDERR으로라는 파일로 리디렉션 MER@되지만 영향을 미치지 않습니다.
두 번째 줄은 주석 처리되어 있습니다 ( REM...).

반전

@SET/aa-=%1 2>MER@
@REM>2 1%.OHCE@

set 명령 ( SET /a) 의 산술 모드를 사용하여 정의되지 않은 변수 ( ) 에서 -=입력 ( %1) 을 뺍니다 ( ) . 다시 말하지만 첫 번째 줄의 나머지 부분은 기술적 으로라는 파일로 리디렉션 되지만 영향을 미치지 않습니다. 두 번째 줄은 주석 처리되어 있습니다 ( ).a0 - inputSTDERRMER@
REM...


이것은 흥미로워 보인다. 설명 할까?
Adám

@ Adám 설명을 추가하고 프로그램이 거꾸로 있다는 것을 깨달았습니다.
Οurous

2

Brachylog , 2 바이트

&ṅ

Brachylog는 암시 적으로 왼쪽에서 입력하고 오른쪽에서 출력합니다.
&왼쪽에있는 것을 무시하고 입력을 함수에 오른쪽으로 전달합니다.
각면이 서로 반대되는 버전이되도록 제한합니다.

온라인으로 사용해보십시오


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.