Это тривиальная задача с множеством тривиальных решений. Однако есть и некоторые нетривиальные решения. Избирателям: Пожалуйста, прочитайте первое предложение этого мета-поста, прежде чем опускать встроенные функции.
Стьюи Гриффин
8
Это может, вероятно, использовать таблицу лидеров.
Мартин Эндер
2
@MrLister поднимайте, как вы хотите, но на самом деле вы должны искать креативность, а не длину кода.
FlipTack
3
@FlipTack О, я думал, что это был Codegolf.
Мистер Листер
3
@MrLister это объективный критерий выигрыша. но действительно ли требуется больше усилий, чтобы напечатать sдля встроенного знака или использовать некоторые умные биты / математика, чтобы решить это? Взгляните на этот мета пост
Заменяет ненулевую цифру и все после нее на 1. Это оставляет потенциальный ведущий -нетронутым и меняет все числа, кроме 0себя, на абсолютное значение 1.
Работает ли это с научными обозначениями целых чисел (например, 0.42e2)?
Егор Скриптунов
@EgorSkriptunoff Нет, но это не обязательно.
Мартин Эндер
9
@EgorSkriptunoff также не поддерживает римские цифры. Если в задаче явно не указан определенный нестандартный формат, который необходимо поддерживать, общее предположение состоит в том, что можно работать с одним форматом, естественным для вашего языка.
Мартин Эндер,
3
@EgorSkriptunoff Retina не имеет понятия о числах вообще. Это чисто строковый язык.
Мартин Эндер
42
C (GCC), 24 23 22 18 байт
Спасибо @aross и @Steadybox за сохранение байта!
f(n){n=!!n|n>>31;}
Не гарантируется работа на всех системах или компиляторах, работает на TIO .
@betseg Это потому, что теперь недовольство встроенными модулями вызывает недовольство.
Эрик Outgolfer
4
Сохранение 1 байт с этимreturn n>>16|!!n;
aross
5
@GB Размер int, вероятно, равен 2 (16, x86) или 4 (32, x86_64), но помните, все, что нужно, это архитектура, на которой он действителен. Это не переполнение стека, переносимость не важна.
кот
2
f(n){n=n>>31|!!n;}тоже работает Но это всего лишь причуда компилятора, а не языковая особенность.
GB
2
Причуды @GB-компилятора совершенно верны, если можно доказать, что есть компилятор, в котором работает причуда. К счастью, GCC имеет причуду.
Mego
34
Mathematica, 4 байта
Clip
Как насчет того, чтобы не использовать встроенный Signи все еще выиграть 4 байта? ;)
Clipс одним аргументом обрезает (или зажимает) входное значение между -1и 1. Поскольку входные данные будут только целыми числами, это то же самое, что и использование Sign.
Способ работы этого кода заключается в том, что он определяет знак, чередуя сложение и вычитание больших чисел и выясняя, какой из них работал последним. Для любого ненулевого целого числа сначала вычтите 1, затем добавьте 2, затем вычтите 3 и т. Д., И вы в конечном итоге достигнете 0. Отслеживайте свое состояние, чередуя сложение и вычитание 2 со значением, которое начинается с 0. Для пример:
Когда вы закончите, вычтите 1 из вашего состояния, и вы получите знак, положительный или отрицательный. Если исходное число равно 0, не беспокойтесь об этом и просто выведите 0.
Детальное объяснение:
oom ;Read an integer into [0]
MOO ;Loop while [0] is non-empty
moOmoOmoOmoOMoOMoOmOomOomOo ; Decrement [4] twice
MoOMMMmoOMMM ; Increment [1], then copy [1] to [2]
MOO ; Loop while [2] is non-empty
MOomOomOoMOomoOmoO ; Decrement [0] and [2]
moo ; End loop now that [2] is empty
mOomOoMMMmoOmoOmoOMMM ; Navigate to [0], and copy to [3]
MOO ; Perform the next steps only if [3] is non-zero
OOOmoOMOoMOomOomOomOoMoOMMMmoOMMM ; Clear [3], increment [4] twice, increment [1], and copy it to [2]
MOO ; Loop while [2] is non-empty
MOomOomOoMoOmoOmoO ; Decrement [2] and increment [0]
moo ; End loop now that [2] is empty
moO ; Navigate back to [3]
moo ; End the condition
mOomOomOo ; Navigate back to [0]
moo ;End loop once [0] is empty.
moO ;Navigate to [1]. If [1] is 0, then input was 0. Otherwise, [4] contains (sign of [0] + 1)
MOO ;Perform the next steps only if [1] is non-zero
moOmoOmoOMOoMMMOOO ; Navigate to [4], copy it to the register, and clear [4].
moo ;End condition
MMMOOM ;If the register contains something (which is true iff the condition ran), paste it and print it. Otherwise, no-op and print 0.
Я все еще экспериментирую с игрой в гольф (вы будете шокированы, обнаружив, что играть в гольф в COW довольно сложно), так что в будущем это может сократиться еще на несколько байтов.
Затем код запускается с IP (указатель инструкции), начиная Iс восточной стороны. Iвводит целое число со знаком из STDIN, помещая его в стек.
Следующая команда ?, которая изменяет направление IP в зависимости от знака верхнего элемента. Если ввод 0, он продолжает двигаться в том же направлении, пропуская следующий код:
>- Укажите IP на восток. (Нет, так как мы уже идем на восток.)
O - Вывести верхний элемент в виде целого числа.
2- Нажмите 2 в стек. Это практически не работает, потому что ...
@ - Завершает программу.
Если вход отрицательный, IP поворачивается налево на ?; поскольку это куб, IP перемещается 0во второй ряд и направляется на восток. 0толкает литерал 0, затем запускается этот код:
^ - Направь IP на север.
W - «Sidestep» IP на одну точку слева.
( - Уменьшить верхний элемент.
TOS теперь -1, и IP обволакивает куб через кучу неактивных операций, .пока не достигнет >. Это запускает тот же код вывода, упомянутый выше, вывод -1.
Если вход положительный, то же самое происходит и с отрицательными входами, за одним исключением: IP-адрес поворачивается направо, а не налево на ?, и оборачивается вокруг куба на 2, что толкает литерал 2. Затем оно уменьшается до 1 и отправлено на выход.
Хороший язык. Может ли быть короче? 4 управления потоком кажется много. В счетчике операций это может быть 8 байт, если ввести другой?, Но теперь он использует нижнюю половину куба: ..1nI? ..> O @ .........?
BlackShift
Шесть возможно, если мы игнорируем выходные данные после первого: / I? NO1 Кстати, это работает только потому, что я возвращаю -1 в онлайн-интерпретаторе вместо 0 в соответствии со спецификацией.
BlackShift
@ BlackShift Спасибо за ваш интерес! Мне нравятся ваши предложения, но я не уверен, как их улучшить. Определенно возможно использовать меньше инструкций; хитрая часть использует меньше куба ... ;-) И спасибо за указание на эту ошибку -1, я скоро исправлю.
ETHproductions
@ETHproductions IMO Это не ошибка, имеет смысл Iвозвращать -1, когда ввод заканчивается, как строчные буквы i.
FlipTack
16
JavaScript (ES6), 9 байт
Math.sign
Непосредственная.
Самый короткий не встроенный составляет 13 байтов:
n=>n>0|-(n<0)
Благодаря @Neil, это может быть обработано байтом, но за счет работы только с 32-битными целыми числами:
n=>n>0|n>>31
Или вы могли бы сделать
n=>n>0?1:!n-1
который кажется более пригодным для игры в гольф, но я не уверен, как.
Номера встроенная_команда_оболочка в 12 байт для 32-битового целого числа n: n=>n>>31|!!n.
Нил
@ Нил n>>31действительно умный, спасибо!
ETHproductions
Я не думаю, что третье решение является действительным, так как Javascript использует числа с плавающей запятой двойной точности. Но я могу ошибаться.
Mego
@ Мего Ты прав. Я уточнил это в посте.
ETHproductions
1
@Mego Извините, я пропустил ваш комментарий. При использовании побитовых операторов JS неявно преобразует свои операнды в 32-разрядные целые числа со знаком, поэтому третье решение работает, но только для чисел от -2147483648 до 2147483647.
' Push the entire program (except ' itself) onto the stack, which ends
with [... 1 47].
i Read the first character of the input.
$- Subtract the 47.
% Take the 1 modulo this value.
n Output the result as an integer.
0x01 Unknown command, terminates the program.
Как отметил @ nmjcman101 в комментариях, :s/\v(-)=[^0].*/\11^Mвместо этого можно использовать одно регулярное выражение ( 20 байт), но, поскольку это в основном то же, что и ответ Retina, я придерживаюсь своего собственного метода.
Объяснение:
xVp Delete everything except the first character. If the number is negative, this leaves a -, a positive leaves any number between 1 and 9, and 0 leaves 0.
:s/-/-1^M Replace a - with a -1
:s/[1-9]/1^M Replace any number between 1 and 9 with 1.
Семантика потока управления Лабиринта фактически дает вам «свободный» способ определения знака числа, потому что выбранный путь на 3-сторонней развилке зависит от того, является ли знак отрицательным, нулевым или положительным. Однако до сих пор я не смог уместить программу с переходами менее чем в 12 байтов (хотя это возможно).
Вместо этого, вот решение в закрытой форме, которое не требует ветвей:
Указатель команды затем попадает в тупик, оборачивается и завершается, когда %теперь пытается делить на ноль.
Удвоение входных данных необходимо для выполнения этой работы с входными данными, 1а в -1противном случае одна из двух операций по модулю уже предпримет попытку деления на ноль.
Не забудьте упомянуть, что это только ответ PHP7. И так как вы используете <?=, вы должны использовать $_GET[n], который не занимает больше байтов. Чтобы использовать <?=, вы должны быть внутри веб-сервера (например, Apache), и там у вас не будет доступа $argv. Вы можете попробовать запустить <?php var_dump($argv);из файла PHP, доступ к которому осуществляется через Apache, и он покажет NULL.
Исмаэль Мигель
1
«Чтобы использовать <? =, Вам нужно быть внутри веб-сервера (например, Apache)». Нет. <?=Оператор работает отлично из командной строки.
Алекс Хованский
Бег php -r '<?=1'я получаю PHP Parse error: syntax error, unexpected '<' in Command line code on line 1. Но, похоже, отлично работает из файла. Мне кажется, ты прав.
Исмаэль Мигель
-rФлаг запустить фрагмент кода. Это полный источник. Сохраните его в файл, а затем запуститеphp file.php
Alex Howansky
Я понял это уже. Я действительно не знал, что это работает из файла, используя (неявный) -fпараметр.
{ } # if 0 do nothing
( ) # push:
{}< > # the input, after
( ) # pushing:
[ ] # negative:
() # 1
( ) # Then push:
[ ] # the negative of the input
<> # on the other stack with:
() # a 1
( ) # pushed under it
{ } # while 1:
({}()) # increment this stack and...
<> # switch stacks
{} # pop the top (the counter or 0 from input)
( ) # push:
{} # the top (this is a no-op, or pushes a 0)
Редакция 2: Злоупотребляет ошибкой памяти / стека в GCC, где, насколько я могу судить, невозвратная функция в некоторых случаях возвращает последнюю переменную набора.
Редакция 3: злоупотребляет троичным поведением, когда неопределенный результат будет возвращать условный результат (именно поэтому истинное возвращение для моей троичной переменной равно нулю)
Редакция 4: Вычтите приведение типа bool ( !!) из троичной условной замены для nilссылки в ревизии 2.
Будет 0.<=>также работать, или вы можете не ссылаться на методы , как , что в Ruby?
Ник Хартли
.<=>ожидает 1 аргумент, так что это будет в конечном итоге 0.<=> x, что дольше.
Seims
@QPaysTaxes вам понадобится, 0.method:<=>потому что вызовы методов в ruby не используют круглые скобки и 0.<=>будут интерпретироваться как вызов метода со слишком малым количеством аргументов.
Это на самом деле не «требует» -E, это только если вы вызываете его из CLI вместо файла, поэтому я думаю, вы сказали, что никаких дополнительных затрат.
nyuszika7h
@ nyuszika7h, действительно, требует, я думаю, таким образом, что тестирование через -eне будет работать, но -Eпринимается как не более -e. Согласно консенсусу по мета. Надеюсь, это немного поможет!
Дом Гастингс
Да, я не предлагал требовать каких-либо дополнительных затрат для этого, так как он прекрасно работает, когда этот скрипт обычно выполняется из файла.
+4 байта для -nmфлагов. nпредназначен для числового ввода-вывода, и поскольку Stack Cats требует, чтобы программы были палиндромными, mнеявно отражает исходный код, чтобы дать исходный исходный код
_[:I!:!I:]_
Попробуйте онлайн! Как и в случае со всеми хорошими гольфами Stack Cats, это было обнаружено грубой силой, превзошло любые ручные попытки длинным выстрелом и не может быть легко включено в большую программу.
Добавьте Dфлаг, если вы хотите увидеть пошаговую трассировку программы, т. -nmDЕ. Запустить с и проверить STDERR / debug.
Stack Cats использует ленту стеков, которые неявно заполнены нулями внизу. В начале программы все входные данные помещаются в стек ввода, а -1в основе находится символ «а», чтобы отделить входные данные от неявных нулей. В конце программы выводится текущий стек, кроме базы, -1если она есть.
Соответствующие команды здесь:
_ Perform subtraction [... y x] -> [... y y-x], where x is top of stack
[ Move left one stack, taking top of stack with you
] Move right one stack, taking top of stack with you
: Swap top two of stack
I Perform [ if top is negative, ] if positive or don't move if zero. Then
negate the top of stack.
! Bitwise negate top of stack (n -> -n-1)
Обратите внимание, что все эти команды являются обратимыми, а обратная сторона является зеркалом команды. Это предпосылка Stack Cats - все нетривиальные завершающие программы имеют нечетную длину, так как программы четной длины самоуничтожаются.
Начнем с
v
n
-1
... 0 0 0 0 0 ...
_вычитает, делая вершину -1-n, и [перемещает результат влево на одну стопку:
v
-1-n -1
... 0 0 0 0 0 ...
:меняет две верхние и Iничего не делает, так как вершина стека теперь равна нулю. !затем поразрядно обнуляет верхний ноль в a -1и :меняет два верхних обратно. !затем поразрядно отменяет вершину, -1-nснова превращаясь в n:
v
n
-1 -1
... 0 0 0 0 0 ...
Теперь мы разветвляемся на основе I, который применяется к нашему оригиналу n:
Если nоно отрицательное, мы перемещаемся влево на один стек и заканчиваем -nнеявным нулем. :переставляет, ставит ноль на вершину, и ]перемещает ноль на вершину, которую -1мы только что съехали _затем вычитает, оставляя последний стек подобным [-1 -1], и -1выводится только один, так как база -1игнорируется.
Если nноль, мы не двигаемся и :меняемся местами -1. ]затем перемещает это влево -1на вершину справа -1и _вычитает, оставляя последний стек подобным [-1 0], выводя ноль и игнорируя основание -1.
Если nположительно, мы перемещаемся вправо на один стек и заканчиваем -nна -1. :переставляет, помещая -1сверху, и ]перемещает это -1вправо, поверх неявного нуля. _затем вычитает, давая 0 - (-1) = 1и оставляя окончательный стек как [1], который выводится.
@ ConorO'Brien Отрицательный символ, чтобы различать символ вычитания TI-Basic. Я знаю, что Cemetech SC использует ~для представления этого токена.
Timtech
О, круто. У меня не было идей.
Конор О'Брайен
@ ConorO'Brien Ну, теперь ты знаешь. Спасибо за вопрос :)
Timtech
1
Это недопустимо - использование в Ansкачестве входных данных не соответствует критериям для того, чтобы быть допустимым методом ввода-вывода по умолчанию (он не имеет вдвое больше голосов, чем голосов - в настоящее время он равен + 19 / -12).
Монадическая знак атом , Ṡ, делает именно то, что указано для целого ввода, либо в качестве полной программы или как монадическая связь (функция принимает один аргумент).
;A\делит абсолютное значение ввода на вход. Это приводит -1к отрицательным входам и 1для положительных входов. К сожалению, из-за фактической обработки ошибок (если что-то идет не так, команда игнорируется), так 0как ввод оставляет два 0s в стеке. +исправляет это, добавляя их (что приводит к ошибке с чем-либо еще, поэтому игнорируется).
Этот код соответствует стандарту (n>0)-(n<0), так как нет встроенной проверки знака. На самом деле, есть не что иное, как встроенный, так что более точное описание этого метода будет (n>0)-(0>n).
Текст выше представляет изображение. Вы можете создать изображение, вставив его в текстовое поле на странице переводчика. Для удобства я предоставил изображение ниже, где размер кодека составляет 31 пиксель. Сетка предназначена для удобства чтения и не является частью программы. Также обратите внимание, что эта программа не пересекает какие-либо белые кодеки; следуйте цветным кодам вокруг границы изображения, чтобы следить за ходом программы.
объяснение
Instruction Δ Hue Δ Lightness Stack
------------ ----- ----------- --------------------
In (Number) 4 2 n
Duplicate 4 0 n, n
Push [1] 0 1 1, n, n
Duplicate 4 0 1, 1, in, in
Subtract 1 1 0, in, in
Duplicate 4 0 0, 0, in, in
Push [4] 0 1 4, 0, 0, in, in
Push [1] 0 1 1, 4, 0, 0, in, in
Roll 4 1 0, in, in, 0
Greater 3 0 greater, in, 0
Push [3] 0 1 3, greater, in, 0
Push [1] 0 1 1, 3, greater, in, 0
Roll 4 1 in, 0, greater
Greater 3 0 less, greater
Subtract 1 1 sign
Out (Number) 5 1 [Empty]
[Exit] [N/A] [N/A] [Empty]
Чтобы еще больше уменьшить размер файла, мне нужно было бы изменить программу (вздох), а не просто сжать файл, как я это делал. Я хотел бы убрать одну строку, которая бы увеличила это до 36. Я также мог бы разработать свой собственный интерпретатор, который имел бы намного меньший формат ввода, так как изменение кода для его уменьшения - это не то, о чем говорит гольф.
Моды сказали мне, что общий размер файла - это то, что имеет значение для кода Piet. Поскольку интерпретатор принимает текст в качестве допустимого ввода, а необработанный текст имеет намного меньшее количество байтов, чем любое изображение, текст является очевидным выбором. Я прошу прощения за то, что был дерзким по этому поводу, но я не делаю правила. Мета обсуждение по этому поводу делает мое мнение по этому вопросу ясно.
Если вы считаете, что это идет вразрез с духом Пита или хотели бы обсудить это по какой-либо причине, пожалуйста, ознакомьтесь с обсуждением мета .
Он использует sign(x) = abs(x) / x, но с явным, sign(0) = 0чтобы избежать ошибки деления на ноль.
\ Take implicit input
&? ; \ If the input is True (not 0):
&| \ Push its absolute value
/ \ Divide
# \ Output TOS (the sign)
Это работает , потому что x / abs(x)это 1 , если х положительна и -1 , если х является отрицательным. Если вход равен 0, программа переходит к выходной команде.
4 байта (не конкурирующие)
Из-за праздников и слишком большого количества времени я полностью переписал переводчика Pushy. Вышеприведенная программа все еще работает, но поскольку 0 / 0теперь по умолчанию 0, следующее короче:
Использование встроенного кода, конечно, короче, но менее весело sign(scan()).
Billywob
Извините, должен был явно упомянуть, избегая встроенных
JAD
5
V 14 12 байт
Спасибо @DJMcMayhem за 2 байта. Использует reg-ex для замены. Это весело, потому что это не встроенный. У меня есть более веселая функция, но она работает не так, как я ожидал.
Это просто означает, :%s/\v(-)=[^0].*/\11что соответствует одному или нескольким, -за которым следует что угодно, кроме 0, а затем любое количество раз. Он заменяется первым соответствием (так что либо a, -либо ничего) и a 1. Регулярное выражение не соответствует 0, так что оно остается само собой.
Это принимает входные данные в качестве аргумента, а не в буфере.
é<CR> Вставьте новую строку.
Àзапустить аргумент как V-код. a -переместит курсор на предыдущую строку, и любое число станет счетчиком для следующей команды
é1вставки (счет) 1«ы
2| перейти ко второму столбцу
D удалить все, начиная со второго столбца (оставив только один символ)
kJ Соедините две линии вместе.
òhé-òпереводится как: «беги hé-до взлома». Если 1 был на второй строке, это прерывается сразу после h. Если он был в первой строке, он вставит -перед разрывом.
ó^$/aЭто фиксирует тот факт , что -1, 0, 1оставит пустое, и заменяет пробел с реестром аргумента.
Я знал, что должен был прочитать эту страницу лучше. Это на самом деле не короче - я забыл 0, но я пытался принять число в качестве аргумента, а затем Àé1. Положительное число дает строку единиц, отрицательное число ДОЛЖНО давать строку единиц на одну строку вверх, а 0 ничего не даст. Бит с отрицательным числом не работал À, но работал сd$@"
nmjcman101
Ах. Ну, причина, по которой это не работает, состоит в том, что нет другого ряда для этого. Если вы добавите, у é<cr>него будет две пустые строки, и тогда это сработает . Я не уверен, что вы можете использовать это, чтобы получить полный ответ
DJMcMayhem
У меня была еще одна строка до, просто не сказал этого явно в своем комментарии. Какой --аргумент вы добавили?
nmjcman101
1
Это означает «конец опций». Поскольку -6начинается с флага, docopt (библиотека python для параметров командной строки) считает, что это флаг командной строки, а не аргумент. Добавление --только сигналов, что это аргумент, а не вариант. В противном случае он вообще не будет работать из-за неверного вызова командной строки.
using System;
public class P
{
public static void Main()
{
Func<int,int> f =
n=>n>0?1:n>>31;
// test cases:
for (int i=-5; i<= 5; i++)
Console.WriteLine(i + " -> " + f(i));
}
}
Немного грустно, когда встроенное не самое короткое решение.
Mego
Допустим, известно, что C # довольно многословен ...
adrianmp
1
А) Я не думаю, что вам нужен трейлинг, ;потому что лямбда - это выражение, а не утверждение. Б) будет Math.Signили Math::Signили что-то подобное будет действительным представлением? Не уверен, как C # в частности обрабатывает методы. В принципе, будет x = Math.Sign;ли действительный оператор C #, если он xбыл инициализирован с правильным типом?
s
для встроенного знака или использовать некоторые умные биты / математика, чтобы решить это? Взгляните на этот мета постОтветы:
Сетчатка , 9 байт
Попробуйте онлайн!
Заменяет ненулевую цифру и все после нее на
1
. Это оставляет потенциальный ведущий-
нетронутым и меняет все числа, кроме0
себя, на абсолютное значение1
.источник
0.42e2
)?C (GCC),
24232218 байтСпасибо @aross и @Steadybox за сохранение байта!
Не гарантируется работа на всех системах или компиляторах, работает на TIO .
источник
return n>>16|!!n;
f(n){n=n>>31|!!n;}
тоже работает Но это всего лишь причуда компилятора, а не языковая особенность.Mathematica, 4 байта
Как насчет того, чтобы не использовать встроенный
Sign
и все еще выиграть 4 байта? ;)Clip
с одним аргументом обрезает (или зажимает) входное значение между-1
и1
. Поскольку входные данные будут только целыми числами, это то же самое, что и использованиеSign
.источник
COW,
225213201 байтПопробуйте онлайн!
Способ работы этого кода заключается в том, что он определяет знак, чередуя сложение и вычитание больших чисел и выясняя, какой из них работал последним. Для любого ненулевого целого числа сначала вычтите 1, затем добавьте 2, затем вычтите 3 и т. Д., И вы в конечном итоге достигнете 0. Отслеживайте свое состояние, чередуя сложение и вычитание 2 со значением, которое начинается с 0. Для пример:
Когда вы закончите, вычтите 1 из вашего состояния, и вы получите знак, положительный или отрицательный. Если исходное число равно 0, не беспокойтесь об этом и просто выведите 0.
Детальное объяснение:
Я все еще экспериментирую с игрой в гольф (вы будете шокированы, обнаружив, что играть в гольф в COW довольно сложно), так что в будущем это может сократиться еще на несколько байтов.
источник
OUT OF MANA!!!
Cubix , 10 байт
Проверьте это онлайн!
Этот код переносится в следующую сеть кубов:
Затем код запускается с IP (указатель инструкции), начиная
I
с восточной стороны.I
вводит целое число со знаком из STDIN, помещая его в стек.Следующая команда
?
, которая изменяет направление IP в зависимости от знака верхнего элемента. Если ввод 0, он продолжает двигаться в том же направлении, пропуская следующий код:>
- Укажите IP на восток. (Нет, так как мы уже идем на восток.)O
- Вывести верхний элемент в виде целого числа.2
- Нажмите 2 в стек. Это практически не работает, потому что ...@
- Завершает программу.Если вход отрицательный, IP поворачивается налево на
?
; поскольку это куб, IP перемещается0
во второй ряд и направляется на восток.0
толкает литерал 0, затем запускается этот код:^
- Направь IP на север.W
- «Sidestep» IP на одну точку слева.(
- Уменьшить верхний элемент.TOS теперь
-1
, и IP обволакивает куб через кучу неактивных операций,.
пока не достигнет>
. Это запускает тот же код вывода, упомянутый выше, вывод-1
.Если вход положительный, то же самое происходит и с отрицательными входами, за одним исключением: IP-адрес поворачивается направо, а не налево на
?
, и оборачивается вокруг куба на2
, что толкает литерал 2. Затем оно уменьшается до 1 и отправлено на выход.источник
I
возвращать -1, когда ввод заканчивается, как строчные буквыi
.JavaScript (ES6), 9 байт
Непосредственная.
Самый короткий не встроенный составляет 13 байтов:
Благодаря @Neil, это может быть обработано байтом, но за счет работы только с 32-битными целыми числами:
Или вы могли бы сделать
который кажется более пригодным для игры в гольф, но я не уверен, как.
источник
n
:n=>n>>31|!!n
.n>>31
действительно умный, спасибо!APL (Dyalog APL) , 1 байт
Работает и для комплексных чисел, возвращая 1∠ θ :
Попробуй APL онлайн!
Без этого встроенного, для целых чисел (согласно OP):
¯1⌈
самый большой из отрицательных и1⌊
самый маленький из одного и⊢
АргументПопробуй APL онлайн!
... и общий:
>∘0
больше, чем ноль-
минус<∘0
меньше, чем нольПопробуй APL онлайн!
источник
> <> ,
98 байтСпасибо Sp3000 за сохранение байта.
Там есть непечатный
0x01
перед/
.Попробуйте онлайн!
объяснение
Это порт моего лабиринтного ответа на основе кодировки символов .
источник
;
вместо непечатных,0x01
чтобы правильно завершить программу :)0x01
чтобы толкнуть в1
любом случае.123
. Извлеченный урок: тест с большим количеством дел.Vim, 22 байта
Сохраненный один байт благодаря @DJMcMayhem !
Здесь
^M
буквальный перевод строки.Как отметил @ nmjcman101 в комментариях,
:s/\v(-)=[^0].*/\11^M
вместо этого можно использовать одно регулярное выражение ( 20 байт), но, поскольку это в основном то же, что и ответ Retina, я придерживаюсь своего собственного метода.Объяснение:
Вот гифка с отрицательным числом (старая версия):
Вот это работает с 0:
Бег с позитивом:
источник
:s/\v(-)=[^0].*/\11
///,
5236 байтUngolfed, объяснение:
Это в основном реализация MapReduce, то есть есть две фазы:
2
-9
от1
, например ,1230405
->1110101
11
или10
до1
нескольких раз, например1110101
->1
Если
-
изначально было впереди, оно останется и будет вывод-1
. Сингл0
никогда не заменяется, что приводит к самому себе.Обновление: Сохранить дополнительные 16 байт альясингом
//1/
сa
, благодаря Мартин Эндер.Попробуйте онлайн с тестовыми примерами
источник
Python 2 , 17 байт
Попробуйте онлайн!
источник
(0).__rcmp__
...-(0).__cmp__
хотяЛабиринт , 10 байт
Попробуйте онлайн!
объяснение
Семантика потока управления Лабиринта фактически дает вам «свободный» способ определения знака числа, потому что выбранный путь на 3-сторонней развилке зависит от того, является ли знак отрицательным, нулевым или положительным. Однако до сих пор я не смог уместить программу с переходами менее чем в 12 байтов (хотя это возможно).
Вместо этого, вот решение в закрытой форме, которое не требует ветвей:
Указатель команды затем попадает в тупик, оборачивается и завершается, когда
%
теперь пытается делить на ноль.Удвоение входных данных необходимо для выполнения этой работы с входными данными,
1
а в-1
противном случае одна из двух операций по модулю уже предпримет попытку деления на ноль.источник
:D
PHP, 16 байт
Использует новый оператор космического корабля.
источник
<?=
, вы должны использовать$_GET[n]
, который не занимает больше байтов. Чтобы использовать<?=
, вы должны быть внутри веб-сервера (например, Apache), и там у вас не будет доступа$argv
. Вы можете попробовать запустить<?php var_dump($argv);
из файла PHP, доступ к которому осуществляется через Apache, и он покажетNULL
.<?=
Оператор работает отлично из командной строки.php -r '<?=1'
я получаюPHP Parse error: syntax error, unexpected '<' in Command line code on line 1
. Но, похоже, отлично работает из файла. Мне кажется, ты прав.-r
Флаг запустить фрагмент кода. Это полный источник. Сохраните его в файл, а затем запуститеphp file.php
-f
параметр.Brain-Flak
74 4240 BytesСохранено 2 байта благодаря 1000000000
Попробуйте онлайн!
Объяснение:
источник
(())
J , 1 байт
Попробуйте онлайн (с тестовыми примерами)!
источник
C
24201918 байтЯ злоупотребляю двумя подвигами С, чтобы играть в гольф; Это в C (GCC).
Попробуйте онлайн!
Лист регистраций изменений:
1)
f(a){return(a>0)-(a<0);}
// 24 байта2)
f(a){a=(a>0)-(a<0);}
// 20 байт3)
f(a){a=a>0?:-1+!a;}
// 19 байт4)
f(a){a=a>0?:-!!a;}
// 18 байтРедакция 1: Первая попытка. Простая логика
Редакция 2: Злоупотребляет ошибкой памяти / стека в GCC, где, насколько я могу судить, невозвратная функция в некоторых случаях возвращает последнюю переменную набора.
Редакция 3: злоупотребляет троичным поведением, когда неопределенный результат будет возвращать условный результат (именно поэтому истинное возвращение для моей троичной переменной равно нулю)
Редакция 4: Вычтите приведение типа bool (
!!
) из троичной условной замены дляnil
ссылки в ревизии 2.источник
Рубин, 10 байт
источник
0.<=>
также работать, или вы можете не ссылаться на методы , как , что в Ruby?.<=>
ожидает 1 аргумент, так что это будет в конечном итоге0.<=> x
, что дольше.0.method:<=>
потому что вызовы методов в ruby не используют круглые скобки и0.<=>
будут интерпретироваться как вызов метода со слишком малым количеством аргументов.Perl, 9 байт
Требуется
-E
без каких-либо дополнительных затрат.использование
Я доволен рыбным оператором!
источник
-E
, это только если вы вызываете его из CLI вместо файла, поэтому я думаю, вы сказали, что никаких дополнительных затрат.-e
не будет работать, но-E
принимается как не более-e
. Согласно консенсусу по мета. Надеюсь, это немного поможет!Стека кошек , 6 + 4 = 10 байт
+4 байта для
-nm
флагов.n
предназначен для числового ввода-вывода, и поскольку Stack Cats требует, чтобы программы были палиндромными,m
неявно отражает исходный код, чтобы дать исходный исходный кодПопробуйте онлайн! Как и в случае со всеми хорошими гольфами Stack Cats, это было обнаружено грубой силой, превзошло любые ручные попытки длинным выстрелом и не может быть легко включено в большую программу.
Добавьте
D
флаг, если вы хотите увидеть пошаговую трассировку программы, т.-nmD
Е. Запустить с и проверить STDERR / debug.Stack Cats использует ленту стеков, которые неявно заполнены нулями внизу. В начале программы все входные данные помещаются в стек ввода, а
-1
в основе находится символ «а», чтобы отделить входные данные от неявных нулей. В конце программы выводится текущий стек, кроме базы,-1
если она есть.Соответствующие команды здесь:
Обратите внимание, что все эти команды являются обратимыми, а обратная сторона является зеркалом команды. Это предпосылка Stack Cats - все нетривиальные завершающие программы имеют нечетную длину, так как программы четной длины самоуничтожаются.
Начнем с
_
вычитает, делая вершину-1-n
, и[
перемещает результат влево на одну стопку::
меняет две верхние иI
ничего не делает, так как вершина стека теперь равна нулю.!
затем поразрядно обнуляет верхний ноль в a-1
и:
меняет два верхних обратно.!
затем поразрядно отменяет вершину,-1-n
снова превращаясь вn
:Теперь мы разветвляемся на основе
I
, который применяется к нашему оригиналуn
:Если
n
оно отрицательное, мы перемещаемся влево на один стек и заканчиваем-n
неявным нулем.:
переставляет, ставит ноль на вершину, и]
перемещает ноль на вершину, которую-1
мы только что съехали_
затем вычитает, оставляя последний стек подобным[-1 -1]
, и-1
выводится только один, так как база-1
игнорируется.Если
n
ноль, мы не двигаемся и:
меняемся местами-1
.]
затем перемещает это влево-1
на вершину справа-1
и_
вычитает, оставляя последний стек подобным[-1 0]
, выводя ноль и игнорируя основание-1
.Если
n
положительно, мы перемещаемся вправо на один стек и заканчиваем-n
на-1
.:
переставляет, помещая-1
сверху, и]
перемещает это-1
вправо, поверх неявного нуля._
затем вычитает, давая0 - (-1) = 1
и оставляя окончательный стек как[1]
, который выводится.источник
TI-Basic, 8 байтов
Альтернативные решения (не стесняйтесь предлагать больше):
источник
~
должно быть?~
для представления этого токена.Ans
качестве входных данных не соответствует критериям для того, чтобы быть допустимым методом ввода-вывода по умолчанию (он не имеет вдвое больше голосов, чем голосов - в настоящее время он равен + 19 / -12).MATL , 6 байтов
Входные данные могут быть числом или массивом. Результатом является число или массив с соответствующими значениями.
Попробуйте онлайн! Или протестируйте несколько случаев с использованием массива.
объяснение
Это позволяет избежать использования встроенной функции знака (
ZS
).источник
ZS
как говорится в ответе.Желе , 1 байт
TryItOnline!
Монадическая знак атом ,
Ṡ
, делает именно то, что указано для целого ввода, либо в качестве полной программы или как монадическая связь (функция принимает один аргумент).источник
Mathematica, 4 байта
Именно то, что написано на банке
источник
sgn
Октава,
2624 байтаЭто мой первый ответ на октавский код-гольф , любые советы по игре в гольф приветствуются!
Попробуйте онлайн!
Идея взять что-то
asin
происходит от вопроса, где говоритсяoutput the sign
:)объяснение
Примечание: деление числа на
pi
и умножение его2
эквивалентно делению всего числа наpi/2
Дело
0
:asin(0)
доходность0
. Взяв реальную часть и разделив ее,pi/2
не имеет значения для результата.Дело
positive
:asin(1)
доходностьpi/2
.asin
любого числа больше, чем1
дастpi/2
+ комплексное число. Взяв реальную часть этого даетpi/2
и делит этоpi/2
дает1
Дело
negative
:asin(-1)
доходность-pi/2
.asin
любого числа меньше, чем-1
даст-pi/2
+ комплексное число. Взяв реальную часть этого дает-pi/2
и делит этоpi/2
дает-1
источник
N will be an integer
Мне повезло, что это говорит об этом в вопросе :)f=
если остальное является допустимым, нерекурсивным выражением функции.На самом деле , 1 байт
Попробуйте онлайн!
Еще один случай того, что именно написано на банке -
s
это функция знака.Без встроенного (4 байта):
Попробуйте онлайн!
;A\
делит абсолютное значение ввода на вход. Это приводит-1
к отрицательным входам и1
для положительных входов. К сожалению, из-за фактической обработки ошибок (если что-то идет не так, команда игнорируется), так0
как ввод оставляет два0
s в стеке.+
исправляет это, добавляя их (что приводит к ошибке с чем-либо еще, поэтому игнорируется).источник
Пит,
188534641 байтОнлайн переводчик доступен здесь.
Этот код соответствует стандарту
(n>0)-(n<0)
, так как нет встроенной проверки знака. На самом деле, есть не что иное, как встроенный, так что более точное описание этого метода будет(n>0)-(0>n)
.Текст выше представляет изображение. Вы можете создать изображение, вставив его в текстовое поле на странице переводчика. Для удобства я предоставил изображение ниже, где размер кодека составляет 31 пиксель. Сетка предназначена для удобства чтения и не является частью программы. Также обратите внимание, что эта программа не пересекает какие-либо белые кодеки; следуйте цветным кодам вокруг границы изображения, чтобы следить за ходом программы.
объяснение
Чтобы еще больше уменьшить размер файла, мне нужно было бы изменить программу (вздох), а не просто сжать файл, как я это делал. Я хотел бы убрать одну строку, которая бы увеличила это до 36. Я также мог бы разработать свой собственный интерпретатор, который имел бы намного меньший формат ввода, так как изменение кода для его уменьшения - это не то, о чем говорит гольф.
Моды сказали мне, что общий размер файла - это то, что имеет значение для кода Piet. Поскольку интерпретатор принимает текст в качестве допустимого ввода, а необработанный текст имеет намного меньшее количество байтов, чем любое изображение, текст является очевидным выбором. Я прошу прощения за то, что был дерзким по этому поводу, но я не делаю правила. Мета обсуждение по этому поводу делает мое мнение по этому вопросу ясно.
Если вы считаете, что это идет вразрез с духом Пита или хотели бы обсудить это по какой-либо причине, пожалуйста, ознакомьтесь с обсуждением мета .
источник
Напористый , 7 байтов
Это, наверное, самая странная программа, которую я когда-либо писал ...
Попробуйте онлайн!
Он использует
sign(x) = abs(x) / x
, но с явным,sign(0) = 0
чтобы избежать ошибки деления на ноль.Это работает , потому что
x / abs(x)
это 1 , если х положительна и -1 , если х является отрицательным. Если вход равен 0, программа переходит к выходной команде.4 байта (не конкурирующие)
Из-за праздников и слишком большого количества времени я полностью переписал переводчика Pushy. Вышеприведенная программа все еще работает, но поскольку
0 / 0
теперь по умолчанию 0, следующее короче:Попробуйте онлайн!
источник
abs
, но понятия не имел, что делать с0
. Отлично сработано!R, 25 байт
Принимает номер к STDIN. Затем проверяет, равен ли он нулю, если нет, возвращает значение, равное
x/|x|
любому1
из-1
, и выдает 0, еслиx=0
.Это без использования встроенного
sign
конечно.источник
sign(scan())
.V
1412 байтСпасибо @DJMcMayhem за 2 байта. Использует reg-ex для замены. Это весело, потому что это не встроенный. У меня есть более веселая функция, но она работает не так, как я ожидал.
Проверьте тестовые случаи
Это просто означает,
:%s/\v(-)=[^0].*/\11
что соответствует одному или нескольким,-
за которым следует что угодно, кроме 0, а затем любое количество раз. Он заменяется первым соответствием (так что либо a,-
либо ничего) и a1
. Регулярное выражение не соответствует 0, так что оно остается само собой.Более веселый путь (21 байт)
TryItOnline
Это принимает входные данные в качестве аргумента, а не в буфере.
é<CR>
Вставьте новую строку.À
запустить аргумент как V-код. a-
переместит курсор на предыдущую строку, и любое число станет счетчиком для следующей командыé1
вставки (счет)1
«ы2|
перейти ко второму столбцуD
удалить все, начиная со второго столбца (оставив только один символ)kJ
Соедините две линии вместе.òhé-ò
переводится как: «бегиhé-
до взлома». Если 1 был на второй строке, это прерывается сразу после h. Если он был в первой строке, он вставит-
перед разрывом.ó^$/a
Это фиксирует тот факт , что-1
,0
,1
оставит пустое, и заменяет пробел с реестром аргумента.источник
Àé1
. Положительное число дает строку единиц, отрицательное число ДОЛЖНО давать строку единиц на одну строку вверх, а 0 ничего не даст. Бит с отрицательным числом не работалÀ
, но работал сd$@"
é<cr>
него будет две пустые строки, и тогда это сработает . Я не уверен, что вы можете использовать это, чтобы получить полный ответ--
аргумент вы добавили?-6
начинается с флага, docopt (библиотека python для параметров командной строки) считает, что это флаг командной строки, а не аргумент. Добавление--
только сигналов, что это аргумент, а не вариант. В противном случае он вообще не будет работать из-за неверного вызова командной строки.C #,
1615 байтУлучшенное решение благодаря Нилу
Кроме того, встроенный метод на 1 байт длиннее:
Полная программа с тестовыми примерами:
источник
n>>31
вместоn<0?-1:0
.;
потому что лямбда - это выражение, а не утверждение. Б) будетMath.Sign
илиMath::Sign
или что-то подобное будет действительным представлением? Не уверен, как C # в частности обрабатывает методы. В принципе, будетx = Math.Sign;
ли действительный оператор C #, если онx
был инициализирован с правильным типом?