記号を出力する


67

数値Nが与えられた場合、Nの符号を出力します。

  • Nが正の場合、出力1
  • Nが負の場合、出力-1
  • Nが0の場合、0を出力します

Nは、選択した言語で表現可能な整数範囲内の整数になります。


45
これは、多くの些細な解決策を伴う些細な課題です。ただし、いくつかの重要なソリューションもあります。投票者へ:組み込み関数を支持する前に、このメタ投稿の最初の文を読んでください。
スチューイーグリフィン

8
これにはおそらくリーダーボードを使用できます。
マーティンエンダー

2
@MrListerはあなたが望む方法を支持しますが、実際にはコードの長さではなく創造性を探すべきです。
FlipTack

3
@FlipTackああ、それはコードゴルフだと思った。
リスター氏

3
@MrListerは、客観的な勝利基準です。しかしs、ビルトインサインを入力するのに本当に手間がかかりますか、それとも巧妙なビットシフト/数学を使用して解決しますか?見ていこのメタポスト
FlipTack

回答:


46

網膜、9バイト

[1-9].*
1

オンラインでお試しください!

ゼロ以外の数字とその後のすべてをで置き換えます1。これにより、潜在的な先頭が-そのまま残り、0それ自体を除くすべての数値が絶対値に変更されます1


これは非常に賢いです:)
Mego

整数の科学表記法(など0.42e2)で動作しますか?
エゴールスクリプチュノフ16

@EgorSkriptunoffいいえ、しかしそれは要件ではありません。
マーティンエンダー

9
@EgorSkriptunoffは、ローマ数字もサポートしていません。サポートが必要な特定の非標準形式に課題が明示的に言及していない限り、一般的な仮定は、選択した言語で自然な単一の形式を扱うのが良いことです。
マーティンエンダー

3
@EgorSkriptunoff Retinaには、数字の概念は一切ありません。純粋に文字列ベースの言語です。
マーティンエンダー

42

C(GCC)、24 23 22 18バイト

バイトを保存してくれた@arossと@Steadyboxに感謝します!

f(n){n=!!n|n>>31;}

すべてのシステムまたはコンパイラで動作することを保証するものではなく、TIOで動作します。


7
@betsegこれは、ビルトインへの賛成票が眉をひそめているためです。
エリックアウトゴルファー16

4
これで1つのバイトを保存するreturn n>>16|!!n;
aross

5
intの@GBサイズはおそらく2(16、x86)または4(32、x86_64)ですが必要なのはそれが有効なアーキテクチャだけです。これはStack Overlflowではなく、移植性は重要ではありません。

2
f(n){n=n>>31|!!n;}も動作します。しかし、これは単なるコンパイラの癖であり、言語の機能ではありません。
GB

2
@GBコンパイラの癖は、その癖が機能するコンパイラがあることを証明できる限り、完全に有効です。幸いなことに、gccには癖があります。
メゴ

34

Mathematica、4バイト

Clip

組み込みを使用せずにSign、まだ4バイトのスコアを付けてみませんか?;)

Clip単一の引数では-1、との間の入力値をクリップ(またはクランプ)します1。入力は整数のみであるため、これはを使用するのと同じSignです。


29

COW、225の 213 201バイト

oomMOOmoOmoOmoOmoOMoOMoOmOomOomOoMoOMMMmoOMMMMOOMOomOo
mOoMOomoOmoOmoomOomOoMMMmoOmoOmoOMMMMOOOOOmoOMOoMOomOo
mOomOoMoOMMMmoOMMMMOOMOomOomOoMoOmoOmoOmoomoOmoomOomOo
mOomoomoOMOOmoOmoOmoOMOoMMMOOOmooMMMOOM

オンラインでお試しください!

このコードが機能する方法は、大きな数字の加算と減算を交互に行うことで符号を決定し、どれが最後に動作したかを確認することです。ゼロ以外の整数の場合、最初に1を減算し、次に2を減算し、3を減算するなどして、最終的に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
そして、「MOO」があります- ?言語が...
Mukulクマー

1
@MukulKumar bfができないいくつかのことを可能にするCOWと呼ばれるブレインファック派生物です
ガブリエルベナミー

これを「悪い魔術師」言語と呼ぶこともできます。OUT OF MANA!!!
魔法のタコUr

18

Cubix、10バイト

(W0^I?>O2@

オンラインでテストしてください!

このコードは、次のキューブネットにラップされます。

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

コードは、IPを使用して実行されます(命令ポインター)IISTDINから符号付き整数を入力し、スタックにプッシュします。

次のコマンドはで?、これは最上位項目の符号に応じてIPの方向を変更します。入力が0の場合、次のコードを実行して同じ方向に移動し続けます。

  • >-IPを東に向けます。(すでに東に向かっているので、何もしません。)
  • O -最上位のアイテムを整数として出力します。
  • 2-2をスタックにプッシュします。これは実質的に無操作です。なぜなら...
  • @ -プログラムを終了します。

入力が負の場合、IPはで左に曲がり?ます。これはキューブであるため、IP 0は2番目の行に移動し、東に向かいます。0リテラル0をプッシュすると、次のコードが実行されます。

  • ^ -IPを北に向けます。
  • W -IPを左に1スポット「サイドステップ」します。
  • ( -最上位のアイテムを減らします。

TOSは-1になり、IPはに到達する.まで、多数のノーオペレーションを介してキューブを包み込み>ます。これは、上記と同じ出力コードを実行し、を出力し-1ます。

入力が正の場合、負の入力と同じことが起こりますが、例外が1つあります。IPはで左ではなく右に曲がり?、キューブをにラップして2、リテラル2をプッシュします。これは1に減少し、出力に送信されました。


4
プログラムフローのアニメーションはとても素晴らしいです!
ルイスメンドー

いい言葉。もっと短くできますか?4つのフロー制御が多いようです。operation-countでは、別の?を導入することで8バイトにすることができますが、今ではキューブの下半分を使用します。..1nI?..> O @ .........?
BlackShift 16

最初の後に出力を無視する場合、6が可能です。/ I?nO1ところで、これは、仕様に従って0ではなく-1をオンラインインタープリターで返すためにのみ機能します。
ブラックシフト16

@BlackShiftご関心をお寄せいただきありがとうございます!私はあなたの提案が好きですが、私はそれらを改善する方法がわかりません。より少ない命令を使用することは間違いなく可能です。トリッキーな部分はキューブの使用量を減らしています... ;-)そして、-1バグを指摘してくれてありがとう、すぐに修正します。
ETHproductions 16

@ETHproductions IMOこれはバグではなく、I入力が小文字の場合と同様に終了するときに-1を返すのが理にかなってiいます。
FlipTack 16

16

JavaScript(ES6)、9バイト

Math.sign

簡単です。

最短の非組み込みは13バイトです:

n=>n>0|-(n<0)

@Neilのおかげで、これは1バイト単位で実行できますが、32ビット整数でしか処理できません。

n=>n>0|n>>31

それともできます

n=>n>0?1:!n-1

これはよりゴルフに適しているように見えますが、どうすればよいかわかりません。


2
32ビット符号付き整数用の12バイトの非組み込みnn=>n>>31|!!n
ニール

@Neil n>>31は本当に賢いです、ありがとう!
ETHproductions 16

Javascriptは数値に倍精度浮動小数点数を使用するため、3番目の解決策は有効ではないと思います。しかし、私は間違っている可能性があります。
メゴ

@Megoあなたは正しいです。投稿でこれを明確にしました。
ETHproductions

1
@Mego申し訳ありませんが、コメントを逃しました。ビット演算子を使用する場合、JSは、暗黙的に第三の溶液が働くので、符号付き32ビット整数にそのオペランドをキャストするが、数字のみで-2147483648からの2147483647
ETHproductions

15

APL(Dyalog APL)、1 バイト

1∠戻って、あまりにも複素数のための作品θを

×

TryAPLオンライン!


組み込みの場合、整数の場合(OPによる):

¯11⌊⊢

¯1⌈ 負の最大値と

1⌊ 最小の1つと

引数

TryAPLオンライン!

...そして一般的なもの:

>∘0-<∘0

>∘0 ゼロ以上

- マイナス

<∘0 ゼロ未満

TryAPLオンライン!


1
あなたは実際に1バイトでそれをやった ...あなたは、伝説です。ジョン・スキートは誇りに思うだろう。

@Mango冗談だよね?この課題に対するいくつかのシングルバイトの回答があります。
アダム16

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:)
エリックアウトゴルファー

@EriktheOutgolfer とにかく0x01プッシュする必要があり1ます。
マーティンエンダー

2
ああ、私は私の提案だけをテストしたよう123です。教訓:より多くのケースでテストする。
エリックアウトゴルファー

14

Vim、22バイト

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

@DJMcMayhemのおかげで1バイト節約できました

これ^Mは、リテラルの改行です。

以下のようnmjcman101 @コメントで指摘した、単一の正規表現を使用することができます(:s/\v(-)=[^0].*/\11^M20バイト)の代わりに、しかし、網膜の答えは次のようになり、これは基本的に同じであるため、私は自分の方法にこだわっています。

説明:

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.

負の数で実行されているgif(古いバージョン)は次のとおりです。

負で実行

0で実行しています。

ゼロで実行

ポジティブで実行:

ポジティブに走る


1
私はあなたの方法が本当に好きですが、単一の正規表現で可能です::s/\v(-)=[^0].*/\11
nmjcman101

ディザリングされたコンソールGIF ... ??
Desty

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つのフェーズがあります。

  • 数字の出現をすべて置き換え2- 9することにより1、例えば1230405- >1110101
  • 11またはのペア101繰り返し減らします。例1110101->1

-最初に前にあった場合、それは残り、出力はになります-1。シングル0は決して置き換えられないため、結果としてそれ自体になります。

更新: Martin Enderのおかげ//1/a、でエイリアスを作成してさらに16バイトを節約できます。

テストケースを使用してオンラインで試す


2
これは非常に巧妙です!
メゴ

11

5
ああ、あなたは私を忍者だ。
ジョナサンアラン

1
おっと。申し訳ありません...
デニス

5
あまりにも悪いあなたが行うことはできません(0).__rcmp__...
SP3000

1
でもでき-(0).__cmp__ます。
nyuszika7h 16

1
@ nyuszika7hまったくそうではありません。関数として使用しようとすると、TypeErrorが発生します。
デニス

11

ラビリンス、10バイト

?:+:)%:(%!

オンラインでお試しください!

説明

Labyrinthの制御フローセマンティクスは、実際に数字の符号を決定する「自由な」方法を提供します。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.              []              []              []

次に、命令ポインタは行き止まりに当たり、向きを変えて、%ゼロによる除算を試みると終了します。

入力とを使用してこの作業を行うには、入力を2倍にする必要が1あります-1。そうしないと、2つのモジュロ演算のいずれかがゼロによる除算をすでに試行します。


1
あなたのコードは幸せで、悲しいターン:D
ステファン・

2
@Stefan必要に応じて順序を変更できます。;)
マーティン・エンダー

9

PHP、16バイト

新しい宇宙船オペレーターを使用します。

<?=$argv[1]<=>0;

これはPHP7の回答のみであることを忘れないでください。また、を<?=使用$_GET[n]しているので、これ以上バイトを使用しないを使用する必要があります。を使用する<?=には、Webサーバー(Apacheなど)内にいる必要があり、そこにアクセスすることはできません$argv<?php var_dump($argv);ApacheからアクセスしたPHPファイルから実行しようとすると、が表示されNULLます。
イスマエルミゲル

1
「<?=を使用するには、Webサーバー(Apacheなど)内にいる必要があります。」いいえ。<?=オペレーターはコマンドラインから問題なく動作します。
アレックスハワンスキー16

実行しphp -r '<?=1'ますPHP Parse error: syntax error, unexpected '<' in Command line code on line 1。しかし、ファイルからはうまく動作するようです。あなたが正しいと思います。
イスマエルミゲル

-rフラグは、コードスニペットを実行することです。これは完全なソースです。ファイルに保存して実行しますphp file.php
アレックスハワンスキー

私はすでにそれを理解しました。(暗黙の)-fパラメーターを使用して、ファイルから機能することを本当に知りませんでした。
イスマエルミゲル

9

Brain-Flak 74 42 40バイト

1000000000のおかげで2バイト節約

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

オンラインでお試しください!

説明:

{                                }       # 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 '


8

C、24 20 19 18バイト

私はこれをゴルフするために2つのCエクスプロイトを悪用しています。これは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:未定義の結果が条件付きの結果を返す場合の3項の振る舞い(これが、3項の真の戻り値がnil である理由です

リビジョン4:リビジョン2 !!nil参照される3項条件置換からブールキャスト()を減算します。


7

ルビー、10バイト

->x{x<=>0}

思い0.<=>も動作する、またはあなたは、Rubyでそのようなメソッドを参照することはできませんか?
ニックハートリー

.<=>は1つの引数を想定しているため、最終的0.<=> xにはになりますが、これは長くなります。
Seims

0.method:<=>ルビーでのメソッド呼び出しは括弧を使用せず0.<=>、引数が少なすぎるメソッド呼び出しとして解釈されるため、必要な@QPaysTaxes 。
チョイス

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 16

@ nyuszika7hは確かに、viaによるテストが機能しないという推測を必要とします-eが、ではなく-Eとして受け入れられてい-eます。メタに関するコンセンサスに従って。これが少し役立つことを願っています!
ドムヘイスティングス

ええ、そのスクリプトがファイルから正常に実行されたときにうまく機能するので、追加のコストを要求することを提案していませんでした。
nyuszika7h 16

7

スタック猫、6 + 4 = 10バイト

_[:I!:

​ -nmフラグ用に+4バイト。n数値I / O用であり、Stack Catsではプログラムが回文m的である必要があるため、ソースコードを暗黙的にミラーリングして元のソースを提供します

_[:I!:!I:]_

オンラインでお試しください!基本的にすべての良いStack Catsゴルフと同様に、これはブルートフォースによって発見され、手動の試みをロングショットで打ち負かし、より大きなプログラムに簡単に組み込むことはできません。

Dステップごとのプログラムトレースを表示する場合、つまり-nmDSTDERR / debugで実行して確認する場合は、フラグを追加します。


Stack Catsは、スタックのテープを使用します。このテープには、暗黙的に下部がゼロで埋められます。プログラムの開始時に、すべての入力が入力スタックにプッシュさ-1れ、暗黙のゼロから入力を分離するためにベースにa があります。プログラムの最後に、現在のスタックが出力されます(-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、および[結果は1つのスタックを左に移動します。

           v
       -1-n   -1
...  0    0    0    0    0  ...

:Iスタックのトップがゼロになったため、トップ2をスワップし、何もしません。!その後、ビット単位はにトップにゼロを否定-1し、:上位2つのバックを交換します。!その後、ビット単位でトップを否定し、再び-1-n元にn戻ります:

          v
          n
         -1   -1
...  0    0    0    0    0  ...

に基づいてブランチを作成しますI。これは、オリジナルに適用されますn

  • n負の場合、1つのスタックを左に移動-nし、暗黙的なゼロで終了します。:スワップして、ゼロを上に置き、]移動した-1ばかりのゼロの上にゼロを移動します。_次に減算し、最終スタックをのよう[-1 -1]にします。-1ベース-1が無視されるため、1つだけが出力されます。

  • 場合はnゼロであり、我々は移動しません:入れて、スワップ-1上。]次に、この左-1を右の上に移動し-1_減算[-1 0]して、ゼロを出力し、baseを無視して最終スタックを残します-1

  • 場合はn正であり、我々は正しいつのスタックを移動し、で終わり-n-1:スワップして、-1上に置き、]これを-1暗黙のゼロの上に移動します。_次に、減算して、の0 - (-1) = 1ような最終スタックを[1]出力します。


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

どう~なるの?
コナーオブライエン

@ ConorO'Brien負の記号。TI-Basicの減算記号を区別します。Cemetech SCが~このトークンを表すためにも使用していることを知っています。
ティムテック16

かっこいい、イケてる。私は今まで知らなかった。
コナーオブライエン

@ ConorO'Brienさて、あなたは知っています。質問してくれてありがとう:)
ティムテック

1
これは無効です- 入力として使用Ansすると、有効なデフォルトI / Oメソッドであるための基準を満たしません(ダウン投票の2倍のアップ投票はありません-現在は+ 19 / -12です)。
メゴ

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よりも長い?!
アダム16

4
彼はまたZS、答えにあるように、ビルトインを使用することもできました。
スチューイーグリフィン



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よりも大きい任意の数。それの実部をとることはできますでそれをして除います1pi/2pi/2pi/21

ケースnegative

asin(-1)収量-pi/2。+複素数を与えるasinよりも小さい任意の数。それの実部をとることはできますでそれをして除います-1-pi/2-pi/2pi/2-1


@LuisMendo幸いN will be an integerなことに、質問でそれを言う:)
Kritixi Lithos

ああ、私はその部分を読んでいませんでした:)
ルイスメンドー

1
C Lの電子のV電子のR!!
flawr

f=残りが有効な非再帰関数式である場合は必要ありません。
チョイス16

@Cyoce申し訳ありませんが、私は無名関数好まない
KritixiのLithos

6

実際には、1バイト

s

オンラインでお試しください!

それがブリキで正確に言う別のケース- s符号関数です。

組み込みなし(4バイト):

;A\+

オンラインでお試しください!

;A\入力の絶対値を入力で除算します。これは-1、負の入力と1正の入力に対して発生します。残念ながら、Actuallyのエラー処理(何か問題が発生した場合、コマンドは無視されます)により0、入力が0スタックに2を残すためです。+それらを追加することでこれを修正します(それは他のものでエラーを引き起こすので、無視されます)。


6

Piet、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]

ファイルサイズをさらに小さくするには、これまでのようにファイルを圧縮するだけでなく、実際にプログラム(gasp)を変更する必要があります。実際にコードを小さくしてコードを変更することはコードゴルフの目的ではないので、はるかに小さい入力形式を持つ独自のインタープリターを開発することもできます。

modは、全体的なファイルサイズがPietコードにとって重要であると教えてくれました。インタプリタはテキストを有効な入力として受け入れ、生のテキストはどの画像よりもバイト数がはるかに少ないため、テキストは当然の選択です。私はこれについて生意気になったことをおaびしますが、私はルールを作りません。これについてメタディスカッションは、問題に関する私の意見を明確にします。

それがPietの精神に反すると思うか、何らかの理由でこれについてさらに議論したい場合は、meta議論をチェックしてください。


2
Pietの慣習はすべてのコーデルを数えることだと思います。
SuperJedi224 16

@ SuperJedi224それはメタ投稿で決定されたものではなく、画像のバイト数が私がしようとしているもののようです。
マイクブファルデチ16

6

Pushy、7バイト

これはおそらく私が今まで書いた中で最も奇妙に見えるプログラムです...

&?&|/;#

オンラインでお試しください!

を使用しますがsign(x) = abs(x) / xsign(0) = 0ゼロ除算エラーを避けるために明示的に使用します。

          \ Take implicit input
&?   ;    \ If the input is True (not 0):
  &|      \  Push its absolute value
    /     \  Divide
      #   \ Output TOS (the sign)

これx / abs(x)は、xが正の場合は1xが負の場合は-1であるため機能します。入力が0の場合、プログラムは出力コマンドにジャンプします。


4バイト(非競合)

休日と時間がかかりすぎるため、Pushyインタープリターの完全な書き直しを行いました。上記のプログラムは引き続き動作し0 / 0ますが、現在はデフォルトで0になっているため、次のコードは短くなります。

&|/#

オンラインでお試しください!


1
私も使うabsことを考えていましたが、どうしたらいいのか分かりませんでした0。よくやった!
Kritixi Lithos

5

R、25バイト

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

STDINに番号を取ります。次に、それがゼロであるかどうかをチェックし、そうでない場合x/|x|はのどちらか1を返し、の場合は-10を出力しますx=0

signもちろん、これはビルトインを使用しません。


1
ビルトインの使用はもちろん短くなりますが、面白くありません:sign(scan())
ビリーウォブ16

申し訳ありませんが、組み込みを避けることを明示的に言及すべきでした
JAD

5

V 14 12バイト

@DJMcMayhemに2バイトをありがとう。reg-exを使用して置換を行います。それは組み込みではないので、一種の楽しみ。私はもっ​​と楽しい機能を持っていますが、期待どおりに機能していません。

ͨ-©½0]/±1

テストケースを検証する

これは、:%s/\v(-)=[^0].*/\111つ以上の-後に0以外が続き、その後に何回でも何が続くかに一致するだけに変換されます。最初の一致(-つまりa またはnone)とaに置き換えられ1ます。正規表現は0と一致しないため、そのままです。

より楽しい方法(21バイト)

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

TryItOnline

これは、バッファーではなく引数として入力を受け入れます。

é<CR> 新しい行を挿入します。

À引数をVコードとして実行します。a -はカーソルを前の行に移動し、任意の数が次のコマンドのカウントになります

é1挿入(カウント)1

2| 2列目に移動する

D 2列目以降のすべてを削除します(1文字のみを残します)

kJ 2つの線を結合します。

òhé-òhé-壊れるまで実行」に変換されます。1が2行目にある場合、これはhの直後に中断します。最初の行にあった場合、-ブレークする前にaを挿入します。

ó^$/aこれは事実修正-101空白のままにしておきますが、引数のレジスタで、空白に置き換えられます。


私はそのページをもっと読むべきだと思っていました。それは実際には短くはありません-私は0を忘れていましたが、引数として番号を取り込もうとしていましたÀé1。正の数は1の文字列を与え、負の数は1行上の1の文字列を与えるべきであり、0は何も与えません。負の数のビットはでは動作しませんでしたÀではなく、やったd$@"
nmjcman101

あ。うまくいかない理由は、進むべき行がないためです。追加é<cr>すると、空の行が2行になり、それが機能します。私はあなたが完全な答えを得るためにそれを使用できるかどうかわからない
DJMcMayhem

私は別の行を持っていましたが、私のコメントでそれを明示的に言っていませんでした。--追加した引数は何ですか?
nmjcman101 16

1
「オプションの終わり」を意味します。-6フラグで始まるため、docopt(コマンドラインオプション用のPythonライブラリ)は、引数ではなくコマンドラインフラグであると見なします。追加する--だけで、オプションではなく引数であることを示します。そうしないと、無効なコマンドライン呼び出しのためにまったく実行されません。
DJMcMayhem

5

C#、16 15バイト

Neilのおかげで改善されたソリューション

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));
    }
}

2
n>>31代わりに試してくださいn<0?-1:0
ニール

1
組み込みが最短の解決策でさえないとき、それは少し悲しいです。
メゴ

...のは、C#はかなり冗長であることが知られているとしましょう
adrianmp

1
A);ラムダは式であり、ステートメントではないため、末尾は必要ないと思います。B)Math.SignまたはMath::Signそれと同様のものが有効な提出物ですか?特にC#がメソッドをどのように処理するかはわかりません。基本的に、正しい型で初期化されたx = Math.Sign;場合、有効なC#ステートメントxになりますか?
チョイス16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.