Я перевернуть исходный код, вы отрицаете вывод!


39

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

правила

  • Вы должны построить полную программу . То есть ваш вывод должен быть распечатан на STDOUT.

  • Оба числа должны быть в базе 10 (вывод их в любую другую базу или с научными обозначениями запрещен).

  • Вывод чисел с пробелами / пробелами разрешен.

  • Это код-гольф, поэтому выигрывает самый короткий (оригинальный) код на каждом языке!

  • Применяются стандартные лазейки.

пример

Допустим, ваш исходный код ABCи соответствующий вывод 4. Если я пишу CBAвместо этого и запускаю, вывод должен быть -4.


6
Если бы мы могли обращаться на уровне битов, а не на уровне байтов, то один байт -(0x45 = 0b00101101) работает в Jelly - -дает -1, поскольку он определяет литерал -1, тогда как (0xB4 = 0b10110100) выдает 1, поскольку он выполняет логическое неявного ввода нуля. (Конечно, работает так же хорошо: p)
Джонатан Аллан

@TwilightSparkle Имеет ли "неиспользуемый, пустой ввод" означает, что мы можем положиться на функции ввода, непосредственно достигающие EOF?
Borka223

1
@ Borka223 Нет, нельзя.
ВысокоРадиоактивный

@ JoKing Копирование. Я удалю это.
ВысокоРадиоактивный

Ответы:



28

JavaScript (V8) , 19 байт

print(1)//)1-(tnirp

Попробуйте онлайн!


почти идентичен ...

C # (интерактивный компилятор Visual C #) , 19 байт

Print(1)//)1-(tnirP

Попробуйте онлайн!

(спасибо @someone за указание на это)


все еще в значительной степени то же самое в ...

Луа , 19 байт

print(1)--)1-(tnirp

Попробуйте онлайн!


но короче ...

Python 2 , 15 байт

print 1#1-tnirp

Попробуйте онлайн!


Еще короче в PHP, потому что у него есть этот волшебный инструмент печати: <?=...

PHP , 12 байт

<?=1;#;1-=?<

Попробуйте онлайн!


Еще меньше в Ruby, потому что вы можете, inspectа не печатать

Рубин , 8 байт

p 1#1- p

Попробуйте онлайн!


Также C # Интерактивный Print(1)//)-1(tnirP. ( Попробуйте онлайн! )
мое местоимение monicareinstate

Для C # самая короткая программа, вероятно, также тривиальная:class A{static void Main(){System.Console.Write(1);}}//}};)1-(etirW.elosnoC.metsyS{)(niaM diov citats{A ssalc
LegionMammal978

Не язык программирования, но вы можете сделать 1<!--!<1-(9 байт) с HTML, который будет -1<!--!<1при обращении. Это точно так же, как ваш ответ.
Исмаэль Мигель

По большей части то же самое в Lua:print(1)--)1-(tnirp
Вэл говорит: восстанови Монику



12

/// , 4 байта

9/9-

Выходы 9.

Попробуйте онлайн!

Перевернутый:

-9/9

Выходы -9.

Попробуйте онлайн!

Все до того, /как напечатано, в то время как остальное игнорируется (не очень часто используется косая черта, поэтому я точно не знаю, что происходит, но ничего не выводится).


2
+1 за использование слэша. /Начинается процесс шаблона чтения, и , таким образом, символы после того , как прочитанный в шаблон, не выводимый.
ВысокоРадиоактивный

2
Я придумал /\-//1-и подумал, что я умен. : D
Таннер Светт


10

Пробел , 21 байт

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

Буквы S(пробел), T(табуляция) и N(новая строка) добавляются только как подсветка.

Выходы 1/ -1.

Попробуйте онлайн или попробуйте онлайн в обратном порядке (только с необработанными пробелами, вкладками и новыми строками).

Объяснение:

Использование программы выхода, встроенной в короткий палиндром NNN.
Обычная программа будет:

SSSTN  # Push 1 to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

Обратная программа будет:

SSTTN  # Push -1 to the stack
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.



7

Japt , 2 байта

Любое целое число , одна цифра >0может быть использована вместо , 2как может A-G, H, I, Jили L( 10-16, 32, 64, -1и 100, соответственно).

n2

Проверьте это | Перевернутый

nМетод , когда применяется к целому числу, вычитает , что целое число от аргумента передается к нему, который по умолчанию 0. При запуске вперед nметод выполняется на неявном первом входе, который также по умолчанию равен 0.

В качестве альтернативы, gметод может быть использован вместо n, что дает знак результата вычитания его аргумента из целого числа, к которому он применяется.


7

Haskell без комментариев, 41 байт

Вперед печатает 1+ перевод строки:

main=print$!1
niam=main
"1-"!$rtStup=niam

Попробуйте онлайн!

Обратная печать -1без перевода строки (которая может быть добавлена ​​по цене 2 байта):

main=putStr$!"-1"
niam=main
1!$tnirp=niam

Попробуйте онлайн!

  • Первая строка каждой программы печатает номер.
    • Для -1вывода строки используется, чтобы избежать скобок.
    • Использование $!(строгое применение) вместо пробела позволяет перевернутой строке быть допустимым определением оператора !$(просто $не будет делать, так как переопределение нарушит использование).
  • Средняя линия гарантирует, что niamэто определено для последней строки.
  • Последняя строка - это определение оператора !$, который не используется, но нуждается в правильном разборе и проверке типов.

7

PHP , 15 13 байт

Версия PHP без комментариев. ohceявляется неопределенной константой, поэтому она будет равна строковому значению ее имени. В результате это попытается напечатать +1-'ohce'или -1+'ohce'когда полностью изменено. Так 'ohce'как это не числовое значение, 0 будет использоваться вместо арифметических операций и только 1или -1будет напечатано.

;echo+1-ohce;

Попробуйте онлайн!

Попробуйте онлайн!


Это умно. Ницца!
AdmBorkBork

1
Чувак, мне грустно, что я пришел к тому же ответу, что и ты, с опозданием на 3 часа :( У меня есть голос.
Исмаэль Мигель




6

Cubix , 7 6 5 байт

@)O(@

Попробуйте здесь
Обратное

объяснение

Cubified:

  @
) O ( @
  .

Развернув поток управления, мы выполняем )O(@, который увеличивает, выводит, уменьшает и выходит.

Перевернутое и кубизированное:

  @
( O ) @
  .

Развернув поток управления, мы выполняем (O)@, который уменьшает, выводит, увеличивает и завершает работу.

Предыдущая версия

@O(.)O@

Попробуйте здесь
Обратное

Не так коротко, но эстетично.


здорово, способ поставить его на куб размером 1!
Джузеппе

3
@)O(@на 5 байт и восстановление симметрии :)
MickyT

5

Рунические чары , 4 байта

1@Z1

Попробуйте онлайн! Попробуйте наоборот!

Я не мог найти способ повторно использовать 1команду, даже за счет байта или двух.

1@ɩ тоже работает, но такое же количество байтов.


Почему вход? В вопросе сказано, что ваша программа не должна принимать никаких данных.
ВысокоРадиоактивный

@TwilightSparkle Я неправильно прочитал и уже исправил это
Draco18s

О да, я понял. Умная.
Сильно радиоактивный


5

Стека кошек -mn , 4 байта

:-:_

Попробуйте онлайн! В нижний колонтитул я включил все остальные 4-байтовые решения. (Stack Cats игнорирует все после первого перевода строки.)

Попробуйте наоборот!

объяснение

В -nфлаг очереди на цифровой выход (и вход, но мы не имеем какой - либо), и -mфлаг , как правило , только для удобства игры в гольф , который позволяет избежать избыточной части исходного кода. Это потому, что каждая программа Stack Cats должна иметь зеркальную симметрию. С -mфлагом вы даете ему только первую половину (плюс центральный символ). Таким образом, фактическая программа здесь:

:-:_:-:

Как вы можете видеть из первой ссылки TIO, существует множество 4-байтовых решений, но я выбрал эту для простоты. Stack Cats основан на стеке, и эта программа использует только начальный стек. Поскольку у нас нет входных данных, он содержит один -1(маркер EOF) поверх бесконечной ямы нулей. Три команды в программе имеют следующее значение:

:   Swap the top two stack elements.
-   Negate the top stack element (i.e. multiply by -1).
_   Pop a. Peek b. Push b-a.

Итак, вот как программа модифицирует стек (состояния и команды расположены в шахматном порядке, чтобы указать, как каждая команда меняет стек из одного состояния в другое):

   :   -   :   _   :   -   :

-1   0   0  -1   1   0   0   1
 0  -1  -1   0   0   1   1   0
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

Оказывается, единственная команда, которая действительно что-то здесь делает, - _это превращает наш маркер EOF в a 1. Вывод в конце программы неявный, а маркер EOF является необязательным, так что это просто выводит полученное 1нами.

Теперь, если мы перевернем исходный код из-за неявного зеркалирования, реальная программа станет:

_:-:-:_

Это делает что-то совсем другое:

   _   :   -   :   -   :   _

-1   1   0   0   1  -1   0  -1
 0   0   1   1   0   0  -1  -1
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

На этот раз в нижней части стека находится еще -1так оно действует как EOF маркер и только -1на нем печатается.

...

Теперь, после всего сказанного, поскольку у Stack Cats такие уникальные отношения с обращением кода, я чувствую, что использование -m- это немного обман. Обычно он предназначен только для сохранения байтов, пропуская избыточную часть исходного кода, но здесь это фактически облегчает задачу и даже сокращает всю программу. Это связано с тем, что изменение полной программы изменит программу только в том случае, если она содержит какой-либо из них <>[], что также означает, что программа заканчивает тем, что использует несколько стеков (на самом деле Stack Cats имеет ленту стеков, где все, кроме исходного, заполнены только с нулями для начала). Кроме того, реверсивный его затем просто обменивает <>и []пары, которые до сих пор делают выполнение симметричным. Единственный способ нарушить эту симметрию - это использоватьI , которое делает -]или-[или ничего в зависимости от знака вершины стека. Так...


Стека кошек -n , 11 байт

*|]I*:*I[|*

Попробуйте онлайн! Нижний колонтитул снова включает все другие альтернативы с тем же количеством байтов. Некоторые из них выводят 1 / -1, а некоторые выводят 2 / -2, как указано после каждой программы. Я выбрал это, чтобы объяснить случайным образом как один из тех, которые выводят 2.

Попробуйте наоборот!

объяснение

Как я уже сказал, этот немного длиннее. Даже если бы мы использовали-m для этого обозначение, оно весило бы 6 байтов вместо вышеуказанных 4.

Команды, используемые на этот раз:

*   Toggle the least significant bit of the top of the stack.
|   Reverse the longest non-zero of prefix on this stack.
[]  Move one stack to the left/right and take the top of the current stack with you.
I   If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
:   Swap the top two stack elements.

Первая программа использует только два стека. Это немного грязно в искусстве ASCII, но я буду стараться изо всех сил. Квадратные скобки указывают, в каком стеке находится головка ленты, и я буду помещать команды между каждой парой состояний стека.

  [-1]
…   0   0   …
    0   0
    …   …

      *

  [-2]
…   0   0   …
    0   0
    …   …

      | (does nothing)
      ]

      [-2]
…   0   0   …
    0   0
    …   …

      I

   [2]
…   0   0   …
    0   0
    …   …

      *

   [3]
…   0   0   …
    0   0
    …   …

      :

   [0]
…   3   0   …
    0   0
    …   …

      *

   [1]
…   3   0   …
    0   0
    …   …

      I

      [-1]
…   3   0   …
    0   0
    …   …

      [

  [-1]
…   3   0   …
    0   0
    …   …

      |

  [ 3]
…  -1   0   …
    0   0
    …   …

      *

  [ 2]
…  -1   0   …
    0   0
    …   …

Теперь -1действует как маркер EOF и2 печатается.

Другая программа остается неизменной до [. До второго практически не меняется I. Технически мы будем в другом стеке, но без значений на них все они неразличимы. Но тогда разница между I[и в I]конечном итоге имеет значение:

    *|[I*:*I

      [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        ]

          [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        | (does nothing)
        *

          [-2]
…   3   0   0   …
    0   0   0
    …   …   …

И на этот раз у нас нет маркера EOF, но программа все еще выводит -2.


4

Зш , 12 байт

<<<2 # 2-<<<

Попробуйте онлайн!

Основной форвард, комментарий, обратный метод.


Если ввод / вывод менее строг, то возможно более интересное 11-байтовое решение благодаря Zsh, поддерживающему отрицательные коды возврата:

return -127

В обратном порядке 721- nruterвыходит с кодом 127(команда не найдена). exit -127не может быть использован, он будет приведен к u8. Попробуйте онлайн!



4

MATL , 3 байта

Nqv

Попробуйте онлайн!

Как они работают

Обычный:

N   % Push number of elements in the stack: 0
q   % Subtract 1: gives -1
v   % Concatenate stack contents vertically: leaves -1 as is
    % Implicit display stack contents

Перевернутый:

v   % Concatenate stack contents vertically: gives the empty array, []
q   % Subtract 1: leaves [] as is
N   % Push number of elements in the stack: 1
    % Implicit display. [] is not displayed


4

Гексагония , 5 байт

1!@!(

Попробуйте онлайн!

Любая действующая программа должна:

  • Есть команда завершения ( @или: ). Последний отличается только для первого, когда есть команда перемещения указателя памяти. Также эта команда не должна быть в первом или последнем байте.
  • Есть выходная команда. ( !,; Также возможно , но, вероятно , займет больше байт)
  • Есть команда манипулирования памятью.

Поэтому двухбайтовая программа, очевидно, невозможна. 3-байтовая программа невозможна, поскольку второй байт должен быть командой завершения, а первый байт не должен быть командой манипулирования зеркалом / IP, поэтому может быть выполнен только 1 байт.

Я думаю, что 4-байтовая программа не возможна. Такая программа должна иметь форму a@bcс гексагональной сеткой

 Forward:       | Backward:
                | 
  c b           |   a @
 @ a .          |  b c .
  . .           |   . .

Следовательно, aдолжна быть команда перенаправления IP. Однако невозможно сгенерировать как положительное, так и отрицательное число только одной командой манипулирования памятью.


+1 за доказательство оптимальности в другом тривиальном ответе
Джо Кинг,



3

Java 5 или 6, 127 67 байт

enum A{A;{System.out.print(9);}}//}};)9-(tnirp.tuo.metsyS{;A{A mune

Выходы 9/-9.

Нет онлайн-компилятора, потому что Java 5 или 6 нигде не доступен.

Однако вы можете попробовать этот 127-байтовый эквивалент Java 8:
попробуйте онлайн или попробуйте в обратном порядке .

Объяснение:

enum A{                              // Create an enum
 A;                                  //  With a mandatory value
 {                                   //  And in a separate instance code-block:
  System.out.print(9);}}             //   Print 9 to STDOUT
//}};)9-(tnirp.tuo.metsyS{;A{A mune  // Comment and thus a no-op

В Java 5 и 6 была ошибка, позволяющая вам создать блок кода внутри перечисления, чтобы что-то сделать, несмотря на отсутствие обязательного основного метода программы. Это приведет к ошибке:

java.lang.NoSuchMethodError: main
Исключение в потоке "main"

Но все равно сначала выдаст то, что мы хотели бы вывести, поэтому мы можем игнорировать это .


3

Голанг , 109 байт

package main;import "fmt";func main(){fmt.Println(1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

И его обратное:

package main;import "fmt";func main(){fmt.Println(-1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

Попробуйте онлайн!


2
Я не знаю Go, но, кажется, вы можете удалить несколько байтов. PrintlnМожет быть Print, и import "fmt";не нужно пространство: import"fmt";. :)
Кевин Круйссен

3

Perl 5 (-p), 12 байт

\$--{}}{++$\

Попробуйте онлайн!

! Enilno TY YRT

}{Псевдо-оператор действительно пригодится.


Perl 5 (-M5.010), 9 байт

Предоставлено Науэлем Фуйе в комментарии

say+1-yas

Попробуйте онлайн!

! Enilno TY YRT


2
должно бытьsay 1#1-yas
Nahuel Fouilleul

@NahuelFouilleul yas действительно
Grimmy

1
9 байтов: say+1-yasиsay-1+yas
Науэль Фуйе

3

Сетчатка , 6 байт

-`<
-

Печать 1.

Попробуйте онлайн!



-
<`-

Печать -1.

Попробуйте онлайн!

Объяснение: 1

-`<
-

Это ... ничего не делает. Из-за `этого это замена на <to -(с конфигурацией -, которая ничего не делает), но вход пуст, поэтому вывод также пуст.


И этот второй этап сопоставляет пустое регулярное выражение с пустым входом и подсчитывает количество совпадений, которое равно 1. Выходные данные неявны.

Объяснение: -1


-

На этот раз мы заменим пустое регулярное выражение на -. Это действительно превращает пустой вход в единый -.

<`-

Здесь конфигурация действительно что-то делает: <печатает входные данные этапа перед выполнением этапа, поэтому мы печатаем -. Затем -подсчитывает дефисы на входе сцены, который снова равен 1. Из-за неявного вывода, он печатает 1после после -, давая нам по -1мере необходимости.


3

TЕИкс(MathJax), 4байтов

1%1-

КодРезультатВперед:1% 1-1назад:-1% 1-1


3

брейкфук , 156 байт

+++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++<+++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++

Попробуйте онлайн! / Вперед / назад верификатор в Bash

Печать -1вперед и \n1назад.

Несмотря на то, что это почти тривиально, я считаю, что это оптимальное решение для этого конкретного фиксированного выхода.

Доказательство:

  • Программа не может иметь [или ].

    Поэтому программа должна иметь форму <A> . <B> . <C>.

  • Каждый ,может быть заменен на достаточное количество <без увеличения количества +или -.

  • Каждый из +них полезен только в прямой или обратной программе, но не в обеих.

    Доказательство: +в части А, очевидно, полезно только в программе вперед, и+ в части C, очевидно, полезна только в обратной программе.

    Обозначение shift(P)= число <в P - число >в P. Рассмотрим программу <B> = <D> + <E>, +посередине полезно в программе вперед shift(E) = 0Точно так же полезно в отсталой программе shift(D) = 0, Однако, если shift(D) = shift(E) = 0затем программа, Bвыполняемая либо вперед, либо назад, добавит фиксированное значение в текущую ячейку перед печатью во второй раз, чего не может быть, потому что ord('1') - ord('\n') != ord('1') - ord('-').

Следовательно, программе нужно как минимум ord('-')+ord('1')+ord('\n')+ord('1') = 153 +s, 2 .s и хотя бы a < >или ,потому что shift(B) != 0.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.