上限Divmodを計算する


13

仕事

2つの正の整数(divid e ndとdivis o r)が与えられた場合、q uotientとr emainderを計算します。
通常、e = o*q+rwhere q*o<=eおよびとして計算され0<=r<oます。
この挑戦のためにまだe = o*q+rそれがq*o>=e、そして-o<r<=0
たとえばe=20o=3、通常はそれは次のようになり20/3 -> 20=3*6+2、以来18<=200<=2<3。ここでそれは20/3 -> 20=3*7-1どこに21>=20なります-3<-1<=0

テストケース

Input -> Output
20, 3 -> 7, -1
10, 5 -> 2, 0
7, 20 -> 1, -13
100, 13 -> 8, -4

処理する必要はありませんo=0


3
通常のdivmodの些細なバリアントであると呼ばれます。
ニール

符号なしバイトを使用してデータを保存したりオーバーフローしたりする言語rの実数の否定として出力することは許容されますrか?(-11/ 255
ウリエル

@Urielはい、ただし答えにこれについてのメモを追加してください
Rod

回答:


8

Pythonの339の 26バイト

Martin Enderは13バイトを節約しました

lambda x,y:(-(x//-y),x%-y)

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

Python 2、25バイト

lambda x,y:(-(x/-y),x%-y)

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


x%-y残りを手に入れるためだけにできると思います。
マーティンエンダー

実際には、なぜ...すべての道を行かない(-(x//-y),x%-y)
マーティン・エンダー

@MartinEnder本当にいいね
ハルバード・

@ Mr.Xcoder両方を含む
ハルバード・

8

ゼリー、3バイト

NdN

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

使い方

再びdivmodを乱用します\ o /。まさかユニコードじゃない!

NdN-フルプログラム/ダイアディックチェーン。| 例:7、20

N-最初の入力を無効にします。| -7
 d-2番目の除算。| [-1、13]
  N-再度ネゲートします。| [1、-13]



5

05AB1E、4バイト

(s‰(

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

5バイト

(‰ćÄJ

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

仕組み

Pythonのモジュロを乱用します!\ o /

(s‰(|完全なプログラム。AとBを2つの入力とします。|例:100、13。

(| Compute -A。| -100
 s | スワップ(この場合、スタックを逆にします)。| 13、-100
  ‰| Divmod。| [-8、4]
   (|負(基本的にそれぞれ-1を乗算)。| [8、-4]

-------------------------------------------------- -

(‰ćÄJ|完全なプログラム。逆順で入力を取ります。

(|マイナス。プッシュ-A。
 ‰| Divmod
  ć| プッシュヘッド抽出divmod(スタック[商、[剰余]]を作成します。
   Ä| 絶対値(商で演算)。
    J | スタックに参加します。

はいああ、divmodは負の数で動作することを忘れてしまった:)
Emigna

また、それはの新しい機能ですJね。前に見たことがない。間違いなく役に立つかもしれません。
エミニャ

@Emigna Joinと呼ばれます。aがリストの場合、 ''。join(a)を押します。それ以外の場合は、 ''。join(stack)を押します。これは新しい機能だと思いますが、J以前は使用したことがありませんでした:P
Mr. Xcoder

それは間違いなく新しいです。8月から私の地元のバージョンにしようと、5)6与えます['5']6:)
Emigna

4

アリス、15バイト

/O.
\io/R%e,R:R

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

説明

Rubyの整数除算とモジュロ(Aliceの実装)は、負の除数を使用することで既に望んでいることを行うように定義されています。除数を否定すると、正しいモジュロが自動的に取得され、必要な商がマイナスになります。したがって、これを解決する最も簡単な方法は、多数の数字を無効にすることです。

/   Switch to Ordinal mode.
i   Read all input as a string "e o".
.   Duplicate the string.
/   Switch to Cardinal mode.
R   Implicitly convert the top string to the two integer values it
    contains and negate o.
%   Compute e%-o.
e,  Swap the remainder with the other copy of the input string. We can't
    use the usual ~ for swapping because that would convert the string 
    to the two numbers first and we'd swap e%-o in between e and o instead
    of to the bottom of the string.
R   Negate o again.
:   Compute e/-o.
R   Negate the result again.
\   Switch to Ordinal mode.
O   Output -(e/-o) with a trailing linefeed.
o   Output e%-o.

    The code now bounces through the code for a while, not doing much except
    printing a trailing linefeed when hitting O again. Eventually, the IP
    reaches : and attempts a division by zero which terminates the program.




2

J、16バイト

([-]*a),~a=.>.@%

これは基本的に、Jで書き直されたJenny_mathyのMathematicaソリューションです。

使い方:

a=.>.@% 左右の引数の除算の上限を見つけて、変数aに格納します

,~ 連結(反転)

([-]*a) 左引数からa * right引数を引きます

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



2

Common Lisp、7バイト

組み込み関数ceilingは、商の上限と一致する剰余の2つの値を返します。

$ clisp -q
[1]> (ceiling 20 7)
3 ;
-1

2

JavaScript(ES6)、37 31 29 27 25バイト

保存された2は@Rodのおかげでバイト
保存@ETHproductionsに2つのバイトのおかげで

カリー化構文の入力を受け取ります。[q、r]を返します。

a=>b=>[q=~-a/b+1|0,a-q*b]

テストケース


おそらくq=(a+b-1)/b+|0代わりにq=a/b+.9|0
ロッド

@ETHproductions計画のように聞こえます。;)
Arnauld










0

TXR:8バイト

組み込み関数ceil-rem。例えば、(ceil-rem 20 7)収量(7 -1)



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.