Вывести знак

67

Учитывая число N, выведите знак N:

  • Если N положительно, выведите 1
  • Если N отрицательно, выведите -1
  • Если N равно 0, выведите 0

N будет целым числом в пределах представимого диапазона целых чисел в выбранном вами языке.

Мего
источник
45
Это тривиальная задача с множеством тривиальных решений. Однако есть и некоторые нетривиальные решения. Избирателям: Пожалуйста, прочитайте первое предложение этого мета-поста, прежде чем опускать встроенные функции.
Стьюи Гриффин
8
Это может, вероятно, использовать таблицу лидеров.
Мартин Эндер
2
@MrLister поднимайте, как вы хотите, но на самом деле вы должны искать креативность, а не длину кода.
FlipTack
3
@FlipTack О, я думал, что это был Codegolf.
Мистер Листер
3
@MrLister это объективный критерий выигрыша. но действительно ли требуется больше усилий, чтобы напечатать sдля встроенного знака или использовать некоторые умные биты / математика, чтобы решить это? Взгляните на этот мета пост
FlipTack

Ответы:

46

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

[1-9].*
1

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

Заменяет ненулевую цифру и все после нее на 1. Это оставляет потенциальный ведущий -нетронутым и меняет все числа, кроме 0себя, на абсолютное значение 1.

Мартин Эндер
источник
Это очень умно :)
Mego
Работает ли это с научными обозначениями целых чисел (например, 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
источник
7
@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.

Мартин Эндер
источник
29

COW, 225 213 201 байт

oomMOOmoOmoOmoOmoOMoOMoOmOomOomOoMoOMMMmoOMMMMOOMOomOo
mOoMOomoOmoOmoomOomOoMMMmoOmoOmoOMMMMOOOOOmoOMOoMOomOo
mOomOoMoOMMMmoOMMMMOOMOomOomOoMoOmoOmoOmoomoOmoomOomOo
mOomoomoOMOOmoOmoOmoOMOoMMMOOOmooMMMOOM

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

Способ работы этого кода заключается в том, что он определяет знак, чередуя сложение и вычитание больших чисел и выясняя, какой из них работал последним. Для любого ненулевого целого числа сначала вычтите 1, затем добавьте 2, затем вычтите 3 и т. Д., И вы в конечном итоге достигнете 0. Отслеживайте свое состояние, чередуя сложение и вычитание 2 со значением, которое начинается с 0. Для пример:

-5  - 1  = -6  (current state: 0 + 2 = 2)
-6  + 2  = -4  (current state: 2 - 2 = 0)
-4  - 3  = -7  (current state: 0 + 2 = 2)
-7  + 4  = -3  (current state: 2 - 2 = 0)
-3  - 5  = -8  (current state: 0 + 2 = 2)
-8  + 6  = -2  (current state: 2 - 2 = 0)
-2  - 7  = -9  (current state: 0 + 2 = 2)
-9  + 8  = -1  (current state: 2 - 2 = 0)
-1  - 9  = -10 (current state: 0 + 2 = 2)
-10 + 10 =  0  (current state: 2 - 2 = 0)
value is now at 0.  state - 1 = 0 - 1 = -1
sign of original number is -1

Когда вы закончите, вычтите 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 довольно сложно), так что в будущем это может сократиться еще на несколько байтов.

Габриэль Бенами
источник
1
И есть «му» язык? ...
Мукул Кумар
1
@MukulKumar Это производная мозга, называемая COW, которая допускает пару вещей, которых не делает bf
Габриэль Бенами
Можно также назвать этот язык "плохим магом". OUT OF MANA!!!
Волшебная Урна Осьминога
18

Cubix , 10 байт

(W0^I?>O2@

Проверьте это онлайн!

Этот код переносится в следующую сеть кубов:

    ( W
    0 ^
I ? > O 2 @ . .
. . . . . . . .
    . .
    . .

Затем код запускается с 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 и отправлено на выход.

ETHproductions
источник
4
Анимация потока программы очень хорошая!
Луис Мендо
Хороший язык. Может ли быть короче? 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

который кажется более пригодным для игры в гольф, но я не уверен, как.

ETHproductions
источник
2
Номера встроенная_команда_оболочка в 12 байт для 32-битового целого числа n: n=>n>>31|!!n.
Нил
@ Нил n>>31действительно умный, спасибо!
ETHproductions
Я не думаю, что третье решение является действительным, так как Javascript использует числа с плавающей запятой двойной точности. Но я могу ошибаться.
Mego
@ Мего Ты прав. Я уточнил это в посте.
ETHproductions
1
@Mego Извините, я пропустил ваш комментарий. При использовании побитовых операторов JS неявно преобразует свои операнды в 32-разрядные целые числа со знаком, поэтому третье решение работает, но только для чисел от -2147483648 до 2147483647.
ETHproductions
15

APL (Dyalog APL) , 1 байт

Работает и для комплексных чисел, возвращая 1∠ θ :

×

Попробуй APL онлайн!


Без этого встроенного, для целых чисел (согласно OP):

¯11⌊⊢

¯1⌈ самый большой из отрицательных и

1⌊ самый маленький из одного и

Аргумент

Попробуй APL онлайн!

... и общий:

>∘0-<∘0

>∘0 больше, чем ноль

- минус

<∘0 меньше, чем ноль

Попробуй APL онлайн!

Адам
источник
1
Вы действительно сделали это в ОДНОМ байте ... Вы, сэр, легенда. Я уверен, что Джон Скит будет горд.
@ Манго Вы шутите, верно? Есть несколько однобайтовых ответов на этот вызов.
Адам
1
Я был саркастичен, также я сказал это, потому что это первый однобайтовый ответ, который я увидел.
14

> <> , 9 8 байт

Спасибо Sp3000 за сохранение байта.

'i$-%n/

Там есть непечатный 0x01перед /.

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

объяснение

Это порт моего лабиринтного ответа на основе кодировки символов .

'     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.
Мартин Эндер
источник
Я думаю, что вы можете просто использовать легальные ;вместо непечатных, 0x01чтобы правильно завершить программу :)
Эрик Outgolfer
@EriktheOutgolfer Мне нужно, 0x01чтобы толкнуть в 1любом случае.
Мартин Эндер
2
О, кажется, я только проверил свое предложение с 123. Извлеченный урок: тест с большим количеством дел.
Эрик Outgolfer
14

Vim, 22 байта

xVp:s/-/-1^M:s/[1-9]/1^M

Сохраненный один байт благодаря @DJMcMayhem !

Здесь ^Mбуквальный перевод строки.

Как отметил @ 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.

Вот гифка с отрицательным числом (старая версия):

Бег с негативом

Вот это работает с 0:

Работает с нуля

Бег с позитивом:

Бег с позитивом

Loovjo
источник
1
Мне очень нравится ваш метод, но это возможно в одном регулярном выражении::s/\v(-)=[^0].*/\11
nmjcman101
Git-файлы с консолью ... ??
Дести
12

///, 52 36 байт

/a/\/1\/\///2a3a4a5a6a7a8a9a10a11/1/

Ungolfed, объяснение:

/2/1/
/3/1/
/4/1/
/5/1/
/6/1/
/7/1/
/8/1/
/9/1/
/10/1/
/11/1/

Это в основном реализация MapReduce, то есть есть две фазы:

  • Заменить все вхождения цифр 2- 9от 1, например , 1230405->1110101
  • Уменьшите пары 11или 10до 1нескольких раз, например 1110101->1

Если -изначально было впереди, оно останется и будет вывод -1. Сингл 0никогда не заменяется, что приводит к самому себе.

Обновление: Сохранить дополнительные 16 байт альясингом //1/с a, благодаря Мартин Эндер.

Попробуйте онлайн с тестовыми примерами

Седрик Райхенбах
источник
2
Это очень умно!
Mego
11

Python 2 , 17 байт

lambda n:cmp(n,0)

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

Деннис
источник
5
О, ты ниндзя
Джонатан Аллан
1
Упс. Извините ...
Деннис
5
Жаль, что вы не можете сделать (0).__rcmp__...
Sp3000
1
Вы можете сделать, -(0).__cmp__хотя
nyuszika7h
1
@ nyuszika7h Не совсем. Попытка использовать его как функцию вызывает ошибку TypeError .
Деннис
11

Лабиринт , 10 байт

?:+:)%:(%!

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

объяснение

Семантика потока управления Лабиринта фактически дает вам «свободный» способ определения знака числа, потому что выбранный путь на 3-сторонней развилке зависит от того, является ли знак отрицательным, нулевым или положительным. Однако до сих пор я не смог уместить программу с переходами менее чем в 12 байтов (хотя это возможно).

Вместо этого, вот решение в закрытой форме, которое не требует ветвей:

Code    Comment             Example -5      Example 0       Example 5
?       Read input.         [-5]            [0]             [5]
:+      Double.             [-10]           [0]             [10]
:)      Copy, increment.    [-10 -9]        [0 1]           [10 11]
%       Modulo.             [-1]            [0]             [10]
:(      Copy, decrement.    [-1 -2]         [0 -1]          [10 9]
%       Modulo.             [-1]            [0]             [1]
!       Print.              []              []              []

Указатель команды затем попадает в тупик, оборачивается и завершается, когда %теперь пытается делить на ноль.

Удвоение входных данных необходимо для выполнения этой работы с входными данными, 1а в -1противном случае одна из двух операций по модулю уже предпримет попытку деления на ноль.

Мартин Эндер
источник
1
Ваш код счастлив и становится грустным:D
Стефан
2
@Stefan Вы можете изменить порядок, если хотите. ;)
Мартин Эндер
9

PHP, 16 байт

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

<?=$argv[1]<=>0;
Алекс Хованский
источник
Не забудьте упомянуть, что это только ответ 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параметр.
Исмаэль Мигель
9

Brain-Flak 74 42 40 Bytes

Сохранено 2 байта благодаря 1000000000

{([({}<([()])>)]<>(())){({}())<>}}{}({})

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

Объяснение:

{                                }       # 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 байта, удалив нулевую монаду вокруг(())
0 '23
8

C 24 20 19 18 байт

Я злоупотребляю двумя подвигами С, чтобы играть в гольф; Это в C (GCC).

f(a){a=a>0?:-!!a;}

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


Лист регистраций изменений:

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.

Альберт Реншоу
источник
7

Рубин, 10 байт

->x{x<=>0}
гигабайт
источник
Будет 0.<=>также работать, или вы можете не ссылаться на методы , как , что в Ruby?
Ник Хартли
.<=>ожидает 1 аргумент, так что это будет в конечном итоге 0.<=> x, что дольше.
Seims
@QPaysTaxes вам понадобится, 0.method:<=>потому что вызовы методов в ruby ​​не используют круглые скобки и 0.<=>будут интерпретироваться как вызов метода со слишком малым количеством аргументов.
Cyoce
7

Perl, 9 байт

Требуется -Eбез каких-либо дополнительных затрат.

say<><=>0

использование

perl -E 'say<><=>0' <<< -9999
-1
perl -E 'say<><=>0' <<< 9999
1
perl -E 'say<><=>0' <<< -0
0

Я доволен рыбным оператором!

Дом Гастингс
источник
1
Это на самом деле не «требует» -E, это только если вы вызываете его из CLI вместо файла, поэтому я думаю, вы сказали, что никаких дополнительных затрат.
nyuszika7h
@ nyuszika7h, действительно, требует, я думаю, таким образом, что тестирование через -eне будет работать, но -Eпринимается как не более -e. Согласно консенсусу по мета. Надеюсь, это немного поможет!
Дом Гастингс
Да, я не предлагал требовать каких-либо дополнительных затрат для этого, так как он прекрасно работает, когда этот скрипт обычно выполняется из файла.
nyuszika7h
7

Стека кошек , 6 + 4 = 10 байт

_[:I!:

+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], который выводится.

Sp3000
источник
7

TI-Basic, 8 байтов

median({1,Ans,~1

Альтернативные решения (не стесняйтесь предлагать больше):

max(~1,min(Ans,1               8  bytes
0:If Ans:Ans/abs(Ans           9  bytes
(Ans>0)-(Ans<0                 10 bytes
Timtech
источник
Что ~должно быть?
Конор О'Брайен
@ ConorO'Brien Отрицательный символ, чтобы различать символ вычитания TI-Basic. Я знаю, что Cemetech SC использует ~для представления этого токена.
Timtech
О, круто. У меня не было идей.
Конор О'Брайен
@ ConorO'Brien Ну, теперь ты знаешь. Спасибо за вопрос :)
Timtech
1
Это недопустимо - использование в Ansкачестве входных данных не соответствует критериям для того, чтобы быть допустимым методом ввода-вывода по умолчанию (он не имеет вдвое больше голосов, чем голосов - в настоящее время он равен + 19 / -12).
Mego
7

MATL , 6 байтов

0>EGg-

Входные данные могут быть числом или массивом. Результатом является число или массив с соответствующими значениями.

Попробуйте онлайн! Или протестируйте несколько случаев с использованием массива.

объяснение

Это позволяет избежать использования встроенной функции знака ( ZS).

0>   % Take input implicitly. Push 1 if positive, 0 otherwise
E    % Multiply by 2
Gg   % Push input converted to logical: 1 if nonzero, 0 otherwise
-    % Subtract. Implicitly display
Луис Мендо
источник
MATL длиннее чем Matlab и Octave ?!
Адам
4
Он также мог бы использовать встроенный, ZSкак говорится в ответе.
Стьюи Гриффин
6

Желе , 1 байт

TryItOnline!

Монадическая знак атом , , делает именно то, что указано для целого ввода, либо в качестве полной программы или как монадическая связь (функция принимает один аргумент).

Джонатан Аллан
источник
6

Mathematica, 4 байта

Sign

Именно то, что написано на банке

Грег Мартин
источник
Сохранить байт сsgn
Adám
3
WolframAlpha - это не то же самое, что Mathematica; это включает автоматическую интерпретацию неоднозначного / естественного языка ввода.
Грег Мартин
Так я должен представить это отдельным ответом?
Адам
мне кажется разумным ...
Грег Мартин
6

Октава, 26 24 байта

f=@(x)real(asin(x))/pi*2

Это мой первый ответ на октавский , любые советы по игре в гольф приветствуются!

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

Идея взять что-то 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

Kritixi Lithos
источник
@ LuisMendo N will be an integerМне повезло, что это говорит об этом в вопросе :)
Kritixi Lithos
О, я не читал эту часть :)
Луис Мендо
1
С л е v е р!
flawr
Вам не нужно, f=если остальное является допустимым, нерекурсивным выражением функции.
Cyoce
@Cyoce Извините, но я не предпочитаю анонимные функции
Kritixi Lithos
6

На самом деле , 1 байт

s

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

Еще один случай того, что именно написано на банке - sэто функция знака.

Без встроенного (4 байта):

;A\+

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

;A\делит абсолютное значение ввода на вход. Это приводит -1к отрицательным входам и 1для положительных входов. К сожалению, из-за фактической обработки ошибок (если что-то идет не так, команда игнорируется), так 0как ввод оставляет два 0s в стеке. +исправляет это, добавляя их (что приводит к ошибке с чем-либо еще, поэтому игнорируется).

Мего
источник
6

Пит, 188 53 46 41 байт

5bpjhbttttfttatraaearfjearoaearbcatsdcclq

Онлайн переводчик доступен здесь.

Этот код соответствует стандарту (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. Поскольку интерпретатор принимает текст в качестве допустимого ввода, а необработанный текст имеет намного меньшее количество байтов, чем любое изображение, текст является очевидным выбором. Я прошу прощения за то, что был дерзким по этому поводу, но я не делаю правила. Мета обсуждение по этому поводу делает мое мнение по этому вопросу ясно.

Если вы считаете, что это идет вразрез с духом Пита или хотели бы обсудить это по какой-либо причине, пожалуйста, ознакомьтесь с обсуждением мета .

Майк Буфардечи
источник
2
Я полагаю, что конвенция для Пита состоит в подсчете всех кодов.
SuperJedi224
@ SuperJedi224 Это не то, что было решено в мета-посте, похоже, что количество байтов в изображении - это то, с чем я буду работать.
Майк Буфардечи
6

Напористый , 7 байтов

Это, наверное, самая странная программа, которую я когда-либо писал ...

&?&|/;#

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

Он использует 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, следующее короче:

&|/#

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

FlipTack
источник
1
Я тоже думал об использовании abs, но понятия не имел, что делать с 0. Отлично сработано!
Критичи Литос
5

R, 25 байт

'if'(x<-scan(),x/abs(x),0)

Принимает номер к STDIN. Затем проверяет, равен ли он нулю, если нет, возвращает значение, равное x/|x|любому 1из -1, и выдает 0, если x=0.

Это без использования встроенного signконечно.

JAD
источник
1
Использование встроенного кода, конечно, короче, но менее весело sign(scan()).
Billywob
Извините, должен был явно упомянуть, избегая встроенных
JAD
5

V 14 12 байт

Спасибо @DJMcMayhem за 2 байта. Использует reg-ex для замены. Это весело, потому что это не встроенный. У меня есть более веселая функция, но она работает не так, как я ожидал.

ͨ-©½0]/±1

Проверьте тестовые случаи

Это просто означает, :%s/\v(-)=[^0].*/\11что соответствует одному или нескольким, -за которым следует что угодно, кроме 0, а затем любое количество раз. Он заменяется первым соответствием (так что либо a, -либо ничего) и a 1. Регулярное выражение не соответствует 0, так что оно остается само собой.

Более веселый путь (21 байт)

é
Àé12|DkJòhé-òó^$/a

TryItOnline

Это принимает входные данные в качестве аргумента, а не в буфере.

é<CR> Вставьте новую строку.

Àзапустить аргумент как V-код. a -переместит курсор на предыдущую строку, и любое число станет счетчиком для следующей команды

é1вставки (счет) 1«ы

2| перейти ко второму столбцу

D удалить все, начиная со второго столбца (оставив только один символ)

kJ Соедините две линии вместе.

òhé-òпереводится как: «беги hé-до взлома». Если 1 был на второй строке, это прерывается сразу после h. Если он был в первой строке, он вставит -перед разрывом.

ó^$/aЭто фиксирует тот факт , что -1, 0, 1оставит пустое, и заменяет пробел с реестром аргумента.

nmjcman101
источник
Я знал, что должен был прочитать эту страницу лучше. Это на самом деле не короче - я забыл 0, но я пытался принять число в качестве аргумента, а затем Àé1. Положительное число дает строку единиц, отрицательное число ДОЛЖНО давать строку единиц на одну строку вверх, а 0 ничего не даст. Бит с отрицательным числом не работал À, но работал сd$@"
nmjcman101
Ах. Ну, причина, по которой это не работает, состоит в том, что нет другого ряда для этого. Если вы добавите, у é<cr>него будет две пустые строки, и тогда это сработает . Я не уверен, что вы можете использовать это, чтобы получить полный ответ
DJMcMayhem
У меня была еще одна строка до, просто не сказал этого явно в своем комментарии. Какой --аргумент вы добавили?
nmjcman101
1
Это означает «конец опций». Поскольку -6начинается с флага, docopt (библиотека python для параметров командной строки) считает, что это флаг командной строки, а не аргумент. Добавление --только сигналов, что это аргумент, а не вариант. В противном случае он вообще не будет работать из-за неверного вызова командной строки.
DJMcMayhem
5

C #, 16 15 байт

Улучшенное решение благодаря Нилу

n=>n>0?1:n>>31;

Кроме того, встроенный метод на 1 байт длиннее:

n=>Math.Sign(n);

Полная программа с тестовыми примерами:

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));
    }
}
adrianmp
источник
2
Попробуй n>>31вместо n<0?-1:0.
Нил
1
Немного грустно, когда встроенное не самое короткое решение.
Mego
Допустим, известно, что C # довольно многословен ...
adrianmp
1
А) Я не думаю, что вам нужен трейлинг, ;потому что лямбда - это выражение, а не утверждение. Б) будет Math.Signили Math::Signили что-то подобное будет действительным представлением? Не уверен, как C # в частности обрабатывает методы. В принципе, будет x = Math.Sign;ли действительный оператор C #, если он xбыл инициализирован с правильным типом?
Cyoce