回答:
0.42e2
)で動作しますか?
バイトを保存してくれた@arossと@Steadyboxに感謝します!
f(n){n=!!n|n>>31;}
すべてのシステムまたはコンパイラで動作することを保証するものではなく、TIOで動作します。
return n>>16|!!n;
f(n){n=n>>31|!!n;}
も動作します。しかし、これは単なるコンパイラの癖であり、言語の機能ではありません。
Clip
組み込みを使用せずにSign
、まだ4バイトのスコアを付けてみませんか?;)
Clip
単一の引数では-1
、との間の入力値をクリップ(またはクランプ)します1
。入力は整数のみであるため、これはを使用するのと同じSign
です。
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でのゴルフはかなり難しいことを知ってショックを受けるでしょう)ので、これは将来さらに数バイト下がるかもしれません。
OUT OF MANA!!!
(W0^I?>O2@
このコードは、次のキューブネットにラップされます。
( W
0 ^
I ? > O 2 @ . .
. . . . . . . .
. .
. .
コードは、IPを使用して実行されます(命令ポインター)I
。I
STDINから符号付き整数を入力し、スタックにプッシュします。
次のコマンドはで?
、これは最上位項目の符号に応じて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に減少し、出力に送信されました。
I
入力が小文字の場合と同様に終了するときに-1を返すのが理にかなってi
います。
Math.sign
簡単です。
最短の非組み込みは13バイトです:
n=>n>0|-(n<0)
@Neilのおかげで、これは1バイト単位で実行できますが、32ビット整数でしか処理できません。
n=>n>0|n>>31
それともできます
n=>n>0?1:!n-1
これはよりゴルフに適しているように見えますが、どうすればよいかわかりません。
n
:n=>n>>31|!!n
。
n>>31
は本当に賢いです、ありがとう!
1∠戻って、あまりにも複素数のための作品θを:
×
組み込みの場合、整数の場合(OPによる):
¯1⌈1⌊⊢
¯1⌈
負の最大値と
1⌊
最小の1つと
⊢
引数
...そして一般的なもの:
>∘0-<∘0
>∘0
ゼロ以上
-
マイナス
<∘0
ゼロ未満
バイトを保存してくれた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
:)
0x01
プッシュする必要があり1
ます。
123
です。教訓:より多くのケースでテストする。
xVp:s/-/-1^M:s/[1-9]/1^M
@DJMcMayhemのおかげで1バイト節約できました!
これ^M
は、リテラルの改行です。
以下のようnmjcman101 @コメントで指摘した、単一の正規表現を使用することができます(:s/\v(-)=[^0].*/\11^M
20バイト)の代わりに、しかし、網膜の答えは次のようになり、これは基本的に同じであるため、私は自分の方法にこだわっています。
説明:
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で実行しています。
ポジティブで実行:
:s/\v(-)=[^0].*/\11
/a/\/1\/\///2a3a4a5a6a7a8a9a10a11/1/
/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
またはのペア10
を1
繰り返し減らします。例1110101
->1
-
最初に前にあった場合、それは残り、出力はになります-1
。シングル0
は決して置き換えられないため、結果としてそれ自体になります。
更新: Martin Enderのおかげ//1/
でa
、でエイリアスを作成してさらに16バイトを節約できます。
(0).__rcmp__
...
-(0).__cmp__
ます。
?:+:)%:(%!
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つのモジュロ演算のいずれかがゼロによる除算をすでに試行します。
:D
新しい宇宙船オペレーターを使用します。
<?=$argv[1]<=>0;
<?=
使用$_GET[n]
しているので、これ以上バイトを使用しないを使用する必要があります。を使用する<?=
には、Webサーバー(Apacheなど)内にいる必要があり、そこにアクセスすることはできません$argv
。<?php var_dump($argv);
ApacheからアクセスしたPHPファイルから実行しようとすると、が表示されNULL
ます。
<?=
オペレーターはコマンドラインから問題なく動作します。
php -r '<?=1'
ますPHP Parse error: syntax error, unexpected '<' in Command line code on line 1
。しかし、ファイルからはうまく動作するようです。あなたが正しいと思います。
-r
フラグは、コードスニペットを実行することです。これは完全なソースです。ファイルに保存して実行しますphp file.php
-f
パラメーターを使用して、ファイルから機能することを本当に知りませんでした。
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つの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項条件置換からブールキャスト()を減算します。
-E
追加費用なしで必要です。
say<><=>0
perl -E 'say<><=>0' <<< -9999
-1
perl -E 'say<><=>0' <<< 9999
1
perl -E 'say<><=>0' <<< -0
0
魚のオペレーターに満足しています!
-E
ではありません。これは、ファイルではなくCLIから呼び出す場合のみです。そのため、追加費用は発生していません。
-e
が、ではなく-E
として受け入れられてい-e
ます。メタに関するコンセンサスに従って。これが少し役立つことを願っています!
_[:I!:
-nm
フラグ用に+4バイト。n
数値I / O用であり、Stack Catsではプログラムが回文m
的である必要があるため、ソースコードを暗黙的にミラーリングして元のソースを提供します
_[:I!:!I:]_
オンラインでお試しください!基本的にすべての良いStack Catsゴルフと同様に、これはブルートフォースによって発見され、手動の試みをロングショットで打ち負かし、より大きなプログラムに簡単に組み込むことはできません。
D
ステップごとのプログラムトレースを表示する場合、つまり-nmD
STDERR / 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]
出力します。
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
~
なるの?
~
このトークンを表すためにも使用していることを知っています。
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
ZS
、答えにあるように、ビルトインを使用することもできました。
Sign
正確にそれが錫に言うこと
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
N will be an integer
なことに、質問でそれを言う:)
f=
残りが有効な非再帰関数式である場合は必要ありません。
s
それがブリキで正確に言う別のケース- s
符号関数です。
組み込みなし(4バイト):
;A\+
;A\
入力の絶対値を入力で除算します。これは-1
、負の入力と1
正の入力に対して発生します。残念ながら、Actuallyのエラー処理(何か問題が発生した場合、コマンドは無視されます)により0
、入力が0
スタックに2を残すためです。+
それらを追加することでこれを修正します(それは他のものでエラーを引き起こすので、無視されます)。
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の議論をチェックしてください。
これはおそらく私が今まで書いた中で最も奇妙に見えるプログラムです...
&?&|/;#
を使用しますが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)
は、xが正の場合は1、xが負の場合は-1であるため機能します。入力が0の場合、プログラムは出力コマンドにジャンプします。
休日と時間がかかりすぎるため、Pushyインタープリターの完全な書き直しを行いました。上記のプログラムは引き続き動作し0 / 0
ますが、現在はデフォルトで0になっているため、次のコードは短くなります。
&|/#
abs
ことを考えていましたが、どうしたらいいのか分かりませんでした0
。よくやった!
@DJMcMayhemに2バイトをありがとう。reg-exを使用して置換を行います。それは組み込みではないので、一種の楽しみ。私はもっと楽しい機能を持っていますが、期待どおりに機能していません。
ͨ-©½0]/±1
これは、:%s/\v(-)=[^0].*/\11
1つ以上の-
後に0以外が続き、その後に何回でも何が続くかに一致するだけに変換されます。最初の一致(-
つまりa またはnone)とaに置き換えられ1
ます。正規表現は0と一致しないため、そのままです。
より楽しい方法(21バイト)
é
Àé12|DkJòhé-òó^$/a
これは、バッファーではなく引数として入力を受け入れます。
é<CR>
新しい行を挿入します。
À
引数をVコードとして実行します。a -
はカーソルを前の行に移動し、任意の数が次のコマンドのカウントになります
é1
挿入(カウント)1
の
2|
2列目に移動する
D
2列目以降のすべてを削除します(1文字のみを残します)
kJ
2つの線を結合します。
òhé-ò
「hé-
壊れるまで実行」に変換されます。1が2行目にある場合、これはhの直後に中断します。最初の行にあった場合、-
ブレークする前にaを挿入します。
ó^$/a
これは事実修正-1
、0
、1
空白のままにしておきますが、引数のレジスタで、空白に置き換えられます。
Àé1
。正の数は1の文字列を与え、負の数は1行上の1の文字列を与えるべきであり、0は何も与えません。負の数のビットはでは動作しませんでしたÀ
ではなく、やったd$@"
é<cr>
すると、空の行が2行になり、それが機能します。私はあなたが完全な答えを得るためにそれを使用できるかどうかわからない
--
追加した引数は何ですか?
-6
フラグで始まるため、docopt(コマンドラインオプション用のPythonライブラリ)は、引数ではなくコマンドラインフラグであると見なします。追加する--
だけで、オプションではなく引数であることを示します。そうしないと、無効なコマンドライン呼び出しのためにまったく実行されません。
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));
}
}
n>>31
代わりに試してくださいn<0?-1:0
。
;
ラムダは式であり、ステートメントではないため、末尾は必要ないと思います。B)Math.Sign
またはMath::Sign
それと同様のものが有効な提出物ですか?特にC#がメソッドをどのように処理するかはわかりません。基本的に、正しい型で初期化されたx = Math.Sign;
場合、有効なC#ステートメントx
になりますか?