Я повертаю вихідний код, ви заперечуєте введення!


36

Відверта плагіат з рип-офф . Ідіть, піднявши ці пропозиції!

Ваше завдання, якщо ви бажаєте прийняти це, - написати програму / функцію, яка виводить / повертає цілий цілий вхід / аргумент. Складна частина полягає в тому, що якщо я поверну ваш вихідний код, вихід повинен бути заперечним вихідним цілим числом.

Приклади

Скажімо, ваш вихідний код є, ABCа його введено 4. Якщо я напишу CBAзамість цього і запускаю його, вихід повинен бути -4.

Скажімо, ваш вихідний код є, ABCа його введено -2. Якщо я напишу CBAзамість цього і запускаю його, вихід повинен бути 2.

Вхід 0може дати 0або -0, тим НЕ менш, якщо ви зробите підтримку знакового нуля, -0повинен дати 0.


5
Навіщо нам потрібна копія того ж запитання?
Крістіан

5
@ Християн Це виводить постійне число (і його заперечення), тоді як цей повинен приймати введення та повертати / відміняти його. Зовсім інша робота на багатьох мовах.
Адам

5
Так, зараз я бачу різницю. Потрібно ДУЖЕ читати уважно
Крістіан

Якщо ви використовуєте структуровану мову на зразок C #, ви просто змінюєте рядки?
PerpetualJ

@PerpetualJ Ні, подивіться на джерело, як список символів, деякі з яких є розривами рядків.
Адам

Відповіді:





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щоб дотримуватися конвенції виклику System V, що зазвичай використовується в * nix системах), заперечуємо його і повертаємо в звичайний 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


7

Haskell , 8 байт

Функція анонімної ідентичності, перетворюючись на віднімання, 0коли повертається назад.

id--)-0(

Спробуйте в Інтернеті!

Відмінено:

(0-)--di

Спробуйте в Інтернеті!


2
Вам вдалося зламати виділення коду за допомогою перевернутої версії!
Тім

@Tim Цікаво. Тестування дозволяє припустити, що коментар починається відразу після правої дужки.
Ørjan Johansen

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(новий рядок) додаються лише як підкреслення.

Незначна модифікація моєї відповіді Whitespace для повернення вихідного коду, ви заперечуєте вихід! виклик .

Спробуйте в Інтернеті або спробуйте перевернути його в режимі он-лайн (лише із пробілами, вкладками та новими рядками).

Пояснення:

Використовуючи програму виходу, побудовану як короткий паліндром 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

Мозок-Флак , 7 байт

#)]}{[(

Спробуйте в Інтернеті!

Відмінено:

([{}])#

Спробуйте в Інтернеті!

Примітка. Працює лише в інтерпретаторах, які підтримують коментарі (наприклад, роботи в Rain-Flak, але не в BrainHack)


Якщо ми також поміняємо дужки, що відкриваються / закриваються, а не просто обертати байти, ми можемо це зробити в 8 байт, не використовуючи коментарів:

({}[{}])

Спробуйте в Інтернеті!
Спробуйте це перевернути!


Це невизначене зловживання поведінкою? Я не думаю, що специфікація Brain-Flak дозволяє такі дужки.
HighlyRadioactive

@TwilightSparkle #Починає коментар, тому круглі дужки в оригінальній версії ігноруються.
Райлі

О так, я забув! Але він працює лише тоді у Rain-Flak (Хоча це офіційний інтепретер). Вам, напевно, потрібно буде це згадати?
ВисокоРадіоактивне

@TwilightSparkle додав примітку для роз'яснення. Спасибі.
Райлі

Невеликий цікавий виклик: чи можете ви це зробити без коментарів, якщо ви також поміняєте кронштейни, що відкриваються / закриваються, а не просто заднім ходом?
DJMcMayhem




4

R , 23 байти

Я вирішив дати йому відгук без фокусу з коментарями.

Вперед

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

Спробуйте в Інтернеті!

Зворотний

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

Спробуйте в Інтернеті!

У прямому варіанті +діє двійковий оператор і -є одинарним оператором.

У зворотному стані воно +стає одинарним, а значення -є двійковим. Отже, функція сканування приймає аргументи: file=""що означає stdin і what=0, які також є типовими. Отже, коли параметр +unry, перший аргумент знаходиться праворуч, коли він є двійковим, перший аргумент - зліва.

The

;nacs=`+`

частина коду нічого не корисна, тому в деякому сенсі мій код насправді не дуже вірний, ніж використання трюку коментарів.


1
Це дуже розумно (+1). Ми часто переосмислюємо операторів R для байтів для гольфу, але я думаю, що це перший раз, коли я бачив +переосмислений, щоб його використовувати як одинарне, так і бінарне. Мені знадобилася хвилина, щоб зрозуміти, як це було проаналізовано ... Жодне інше ім’я оператора не зробило б цю роботу.
Робін Райдер


4

Perl 5 ( -p), 7 6 байт

-1 завдяки @primo

$_*=$#

ТІО

Коментар не змінює введення даних

#1-=*_$

Негатуйте введення

$_*=-1#

ТІО


-1: $_*=$# ТІО . Зауважте, що #повинен бути самим останнім байтом програми, інакше він буде інтерпретуватися як змінна $#, а не останній індекс масиву з ім'ям <empty>.
прима

1
однак я не розумію, як це працює, тому що спроба друку $#видає або помилку (якщо # не є останнім символом), ні нічого
Nahuel Fouilleul

Здається, працює лише з -pабо -n. Я підозрюю, що котельня має з цим щось
спільне

2
@primo Це працює, тому що -p/-nдодає ;код після. Що означає, що $#насправді є $#;: розмір масиву @;. Якщо розмір @;зміниться, результат більше не є правильним ( TIO ). У всякому разі, це супер розумно, молодець! :)
Дада

це пояснення можна побачити perl -MO=Deparse -p <(echo -n '$_*=$#'), оскільки, здається, perl -MO=Deparse -pe '$_*=$#'додається новий рядок
Nahuel Fouilleul


4

Назад , 6 5 байт

I@-Ov

Спробуйте в Інтернеті! Спробуйте вдвічі!

Зроблено трохи складним через характер вказівника в Backhand. Я не думаю, що можливо отримати коротший ха-ха, виявляється, я помилявся. Це дублює жодних інструкцій і повторно використовує як введення, виведення та завершення команд між двома програмами. Тепер я думаю, що це оптимально, оскільки для роботи вам потрібні всі IO-@команди, а в програмі на 4 байти ви можете виконати лише дві з цих команд.

Пояснення:

Вказівник у Backhand переміщує на три комірки галочку і відскакує від меж комірки, а це означає, що загальна логіка перекривається. Однак ви можете керувати цією швидкістю за допомогою команд vі ^.

Оригінальна програма виконує інструкції IO-@, які вводяться як число, виводяться як число, віднімають, завершують. Очевидно, віднімання зайве. У коді це:

I@-Ov
^  ^    Reflect
  ^     Reflect again
 ^

Звернута програма виконується v-I-vO-@. vЗменшує кроки покажчика між кліщами і -віднімає в нижній частині стека, яка неявно дорівнює нулю. Додаткові -команди нічого не роблять. Програма виконує як

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



3

R , 14 байт

scan()#)(nacs-

Спробуйте в Інтернеті!

Повна програма, яка читає число або читає і відміняє число. Зворотна функціональність захищена вбудованим коментарем


Ваші дужки - це неправильний шлях у коментованій частині.
Аарон Гейман

@AaronHayman дякую!
Нік Кеннеді

3

Python 3 , 22 14 байт

int#__bus__. 0

Спробуйте в Інтернеті!

Використовується intконструктор класу та вбудований псевдо-приватний метод.


Ага. Чому простір перед атрибутом є обов'язковим?
Джо Кінг,

2
@JoKing 0.трактуватиметься як число, яке супроводжується символом
attinat

2

05AB1E , 2 байти

(I

Спробуйте в Інтернеті!

Зворотний

(    negates nothing
  I  pushes input

I    pushes input
  (  negates input

Він повинен лише заперечувати вхід в одному напрямку, залишаючи його таким, як є, в іншому. Очевидно, що рішення з 1 символом не може бути дійсним.
Адам

Мій поганий, я неправильно зрозумів
jasanborn


2

APL (Dyalog Unicode) , 13 3 байти

-∘0

Спробуйте в Інтернеті!

Тривіальна відповідь. Повертається argабо ¯arg.

Збережено 10 байт, не будучи німим (спасибі Adám).

Змінив отриманий 3-байт на більш підходящу функцію.


О, це можна зробити тривіально в три байти!
Адам

Цікаво, що у вас вже є вбудована 3-байтна відповідь як підрядка цього.
Адам

@ Adám так, я знав, що там десь є проста відповідь. Спасибі.
J. Sallé


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

Спробуйте в Інтернеті!

Спробуйте навпаки!

Пояснення

Виявляється, це насправді набагато простіше, ніж попередній виклик у Stack Cats. Повна програма (після подачі заявки -m) тут є -X-. Xвикористовується для заміни стеків ліворуч та праворуч від головки стрічки, тобто вона взагалі не впливає на початковий стек, тому ми можемо її ігнорувати. Але тоді програма ефективно просто --(заперечуйте верхню частину стека двічі), що нічого не робить.

Для зворотної програми подання -mподає X-X. Знову ж таки, Xнічого не робить, тому програма ефективно справедлива -, що заперечує верхню частину стека.

Єдине інше 2-байтове рішення є -=, але воно практично те саме. Єдина відмінність полягає в тому, що =підміняються тільки вершини сусідніх стеків, а не всі стеки.

Але знову ж таки, використання -mвиглядає трохи схожим на обман, тому нижче - рішення, яке використовує повністю дзеркальну програму.


Стек котів -n , 7 байт

:I<->I:

Спробуйте в Інтернеті!

Спробуйте навпаки!

Пояснення

Міркування з попередньої відповіді все ще застосовуються : будь-яке дійсне рішення потребує використання парних символів та I. Шість можливих рішень (включених у посилання TIO) практично однакові. -і _еквівалентні в цій програмі, і :може бути замінено |або T(що те ж саме для ненульових входів і по збігу також робота для нульових входів). Я щойно вибрав це для пояснення, тому що це найпростіше.

Тому пам’ятайте, що початковий стек утримує вкладку зверху -1(зверху нескінченно багато нулів), тоді як усі інші стеки уздовж стрічки містять нулі. 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) від невизначеної змінної ( a), що еквівалентно 0 - input. Знову ж таки, решта першого рядка технічно переспрямовується STDERRна файл, який називається MER@, але це не впливає.
Другий рядок коментується ( REM...).


Це виглядає цікаво. Хочете пояснити?
Адам

@ Adám додав пояснення, а також зрозумів, що у мене програми навколо назад.
Οurous

2

Брахілог , 2 байти

&ṅ

Брахілог неявно вводиться зліва і виводиться справа.
&ігнорує що-небудь зліва і передає вхід до функції вправо.
обмежує кожну його сторону заперечувати версії один одного.

Спробуйте в Інтернеті


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.