除算と剰余


36

この課題は、ほとんどの「標準」言語ではおそらく些細なことですが、難解で、低レベルで、かつ/またはこのサイトではめったに見られない使用が難しい言語に対処します。解決する興味深い問題を提供するはずなので、これはあなたが読んだ奇妙な言語を試す機会です!

タスク

2つの自然数ab入力として受け取り、整数除算の結果とその除算a/bの剰余(a%b)の2つの他の数値を出力します。

これはです:各言語の最短回答(バイト単位)が勝ちます!

入出力

  • 0 <= a<= 255、1 <= b<= 255。各入力(および出力)も1バイトに収まります。
  • 2つの数値が明確に区別できる限り、入力と出力の両方に任意の形式を選択できます(たとえば、2つの結果を区切り文字なしで一緒に印刷しない)

a,b->division,remainder
5,7->0,5
5,1->5,0
18,4->4,2
255,25->10,5

注:除算の結果と残りの両方を返す組み込み関数は禁止されています。少なくとも、あなたの言語が同じ引数に2つの関数を適用する方法を示してください。

注2:いつものように、コードがどのように機能するかの説明は非常に歓迎されます。


リーダーボード

これは、言語ごとに勝者の概要を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


つまり、代わりに提供a bするb a代わりに、引数を逆にすることはできますか?
エリックアウトゴルファー

@EriktheOutgolfer:You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable
エミグナ

@Emignaええ、私は逆転してもそれらを区別できないようにしなかったのかわかりませんでした。
エリックアウトゴルファー

@EriktheOutgolferそれらを逆にする必要があることを知っていれば、それらを区別するのに問題はありません:)
レオ

残念ながら、除数がの場合、BFアルゴリズムは機能しません1
mbomb007

回答:


23

BitCycle146 79 64バイト

私の元のコードのセクション全体が不要であることに気付いた。大幅な削減!

v  <>!
A\B^^=
? D^>^<
 >\v^~ D@
 >/ C/
  > C ^
A/B v
^   <
?  D^

プログラムは、除数を最初にして、コマンドラインから単項で入力を受け取ります。aで区切られた商と剰余を単項で出力します0。例えば、ここですa=11b=4a/b=2a%b=3

C:\>python bitcycle.py divmod.btc 1111 11111111111
110111

Ungolfed、実行中

これa=3b=5、アニメーションをオンにした、未使用のバージョンコンピューティングです(グリッチについては申し訳ありません)。

BitCycleで実行されているDivmod

説明を試みる

説明は、非ゴルフバージョンに適用されます。取り組む前に、Esolangsページを読んで、言語がどのように機能するかを理解することをお勧めします。

アルゴリズムは次のようになります。

  • プログラムが終了するまで外側のループを実行します。
    • 除数のビットに対して内部ループを実行し、それらを被除数のビットとペアにします。
      • 除数のすべてのビットに一致する被除数ビットがある場合、単一のビットを出力します。
      • 除数のすべてのビットに一致する被除数ビットがあるわけではない場合、区切り文字を出力し、0その後にどの被除数ビットがあったかを出力してから終了します。

コードの中心は、コレクター間の関係(大文字)です。各文字と、複数の独立したコレクターがあるので、のようにそれらを参照してみましょうA1A2B1B2、など、上から下に番号付け。

  • A1そしてA2、メインループの先頭で、それぞれ、除数と被除数を保持します。
  • 内側のループは、除数と被除数から一度に1ビットずつ剥離します。
    • 除数の残りは、もしあれば、常にに入りB1ます。
    • 除数と被除数の両方が空ではない場合、1ビットが入り、1ビットがにC1入りC3ます。残りの配当はに入りB2ます。
    • 除数のみが空ではない場合、配当の終わりに達し、残りを印刷する時が来ました。除数からのビットはに入りC2ます。
    • 配当のみが空でない場合、除数の終わりに達しました。それは内のビットを処理する時が来たC3か、C2出力のために。残りの配当はに入りC4ます。
  • Bコレクターにビットがある場合、それらはコレクターに内容を循環させA、内側のループを継続します。
  • 一度ABコレクターがすべて空である、Cコレクターが開き、我々は処理段階に進みます。
    • C1及びC4その内容(除数および被除数残り、それぞれ)にダンプD1とをD3
    • C2が空の場合、まだ商を出力しています。
      • 内容はC3右上の=スイッチに移動します。最初の1ビットは、そのまま通過し!て出力されます。
      • 場合1ビットが通過する、それはボードオフ以降のすべてのビットを送信するポイントの右方向へのスイッチを作動させます。
    • C2が空でない場合、残りを印刷しています。
      • の最初のビットはC2aに否定され0、スイッチを通過します。に0進み、!出力されます。
      • 場合0ビットが通過するには、ポイント左方向にスイッチを作動させます。これで、からのすべてのビットC3がスイッチから左に移動し、にリダイレクトされ、!残り全体が出力されます。
      • からの最初のビットのコピーC2もに送信されD2ます。
  • 今、Dコレクターが開きます。
    • に何かがある場合D2、それは残りを印刷したことを意味します。からのビットがにD2ヒットし@、プログラムが終了します。
    • そうでなければ、内容D1D3にループバックA1し、A2それぞれ、メインループがやり直します。

それは素晴らしいです
エヴァン・カースレイク

「プログラムはコマンドラインから入力を単項で取ります」:それは私にとってバイナリのように見えますか?
therealfarfetched

おっと。出力はバイナリのように見えたので、入力もそうであるはずです。それから私はテキストを読みました。気にしないで。:P
therealfarfetched

15

brainfuck43 41バイト

,<,[>->+<[>]>>>>+<<<[<+>-]<<[<]>-]>>.>>>.

これは、Esolangsの破壊的モジュラスアルゴリズムの修正版を使用しています。

プログラムは、STDINから2バイト– dおよびnをこの順序で読み取り、2バイト– n%dおよびn / dをこの順序でSTDOUTに出力します。TIOにあるような、二重に無限または円形のテープを備えたBrainfuckインタープリターが必要です。

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

使い方

プログラムが開始する前に、すべてのセルに値0が保持されます。STDIN()からdを読み取り,、1ステップ左(<)に移動し、STDIN()からnを読み取る,と、テープは次のようになります。

       v
A      B      C      D      E      F      G      H      J
0      n      d      0      0      0      0      0      0

次に、n> 0と仮定して、whileループに入ります

[>->+<[>]>>>>+<<<[<+>-]<<[<]>-]

テープを次のように変換します。

まず、>->+<セルCに進み、それをデクリメントし、次にセルDに進み、それをインクリメントし、最後にセルCに戻ります。次に何が起こるかは、セルCの値がゼロかどうかによって異なります。

  • セルCが正の値を保持している場合[>](セルがゼロ以外のときに右に進む)、セルEに進みます。

    >>>>+<<<セルJに進んでインクリメントし、セルFに戻ります。

    セルFは常に0を保持するため、whileループ[<+>-]は完全にスキップされ、<<セルDに戻ります。

    どちらので、最終的に、DCが保持0を[<]細胞に禿上がるであろう(細胞が非ゼロである間に左移動)A

  • セルC0を保持している場合、ループ[>]は完全にスキップされます。>>>>+<<<セルGに進んでインクリメントし、セルDに戻ります。

    この時点で、Ddを保持し(実際、CDの値の合計は常にdになります)、したがって[<+>-]Dが正の場合、Cをインクリメントし、Dをデクリメントします)、CdにD0に設定します

    最後に、<<細胞にretrocedes B[<]さらに細胞に左(細胞が非ゼロである間に左移動)A

どちらの場合も、>-セルBに進み、それをデクリメントします。そして、これがゼロにならない限り、ループは最初からやり直します。

k回の反復後、テープは次のようになります。

       v
A      B      C      D      E      F      G      H      J
0      n-k    d-k%d  k%d    0      0      k/d    0      k-k/d

n回の繰り返しの後、Bはゼロになり、ループから抜け出します。目的の値(n%dおよびn / d)はセルDおよびGに格納されるため、>>.>>>.それらを出力します。


12

Funciton224の 108バイト

バイトカウントは、BOMを使用したUTF-16エンコーディングを前提としています。

 ┌──┬───┐
┌┴╖╓┴╖ ┌┴╖
│%╟║f╟┐│÷╟┘
╘╤╝╙─╜│╘╤╝
 └────┴─┘

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

上記は、f2つの整数を取り、その除算とその積の両方を返す関数を定義しています(入力と出力の合計が4を超えない限り、ファンシトンの関数は複数の出力を持つことができます)。

複数の目的で2つの入力値を使用することは実際には非常に簡単です。値がTジャンクションでコネクタを分割すると、両方のブランチに沿って複製されます。

実際に、ソリューションを実装するだけでなく、ユーザーに結果を表示する方法を見つけるのに2倍の時間がかかりました。

また、Funcitonはビルトインdivmod、持っている÷%、と面白いことビルトインを÷し、%私の解決策の用途は実装されていることの面で ÷%。ただし、f上記の私の機能はまったく同じではありません÷%:入力の順序を入れ替える必要があり、それを変更するのは簡単なようですが、これまでのところ、バイト数を増やすことなくそうすることはできませんでした。


10

JavaScript(ES6)、17バイト

@Arnauldに1バイトのゴルフをしてくれてありがとう

x=>y=>[x/y|0,x%y]

フォーマット(x)(y)で入力を受け取ります

ビットごとに実行することでx / yの下限を
取得するか、x%yで剰余を取得します
両方の値が返されるように両方の値を配列に入れます

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


10

APL(Dyalog)、5バイト

@ngnのおかげで-2バイト

⌊÷,|⍨

これは、フォーク(3トレイン)のトップ(2トレイン)です。ここで、トップの右タインは派生関数(関数に適用された演算子の結果)です。

       result 
         ↑┌──────────┐
         ││    ┌────┐│┌──────┐ (derived function)
         │↓        ↓│↓      │╱
       ┌───┐ ┌───┐ ┌───┐ ╔═══╤═══╗
           ÷   ,   |    
       └───┘ └───┘ └───┘ ╚═══╧═══╝
                              
left argument ┴─────────────────┘  (operator)
                └─────────┴ right argument

 の床

÷ 分割

, に仕えた

|
 引数を交換した 除算剰余(APLモジュラスは「後方」)

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


どのようにしてそのクールな図を作成しましたか?
emiflake

2
@WolfgangTS苦労して。Dyalog APLには、暗黙関数の基本的なツリー図を作成する機能が付属しています。オンラインでお試しください!私はそれから始めました
...-アダム

痛い、とても難しい。私は恐れているという忍耐を持っていません、笑
emiflake

短い:⌊÷,|⍨
ngn

@ngn痛い、あなたは私を得た。まだここにいることを嬉しく思います。
アダム


7

MATL12 10バイト

Qt:ie=&fhq

入力されaた後、b。出力は剰余であり、商です。

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

説明

これにより、モジュロと除算の両方が回避されます。代わりに、配列の再形成を使用します。

  1. a+1非ゼロ要素の配列を作成します。
  2. b行の2D配列として変形します。これにより、必要に応じて自動的にゼロが埋め込まれます。
  3. 最後の非ゼロエントリであるマイナスの行と列のインデックスは、1それぞれ剰余と商です。

たとえばa=7、考慮してくださいb=3

Q    % Input a implicitly. Push a+1
     % STACK: 8
t:   % Duplicate. Range from 1 to that
     % STACK: 8, [1 2 3 4 5 6 7 8]
ie   % Input b. Reshape as a matrix with b rows (in column major order)
     % STACK: 8, [1 4 7;
                  2 5 8]
                  3 6 0]
=    % Compare for equality
     % STACK: [0 0 0;
               0 0 1;
               0 0 0]
&f   % Row and column indices (1-based) of nonzero element
     % STACK: 2, 3
hq   % Concatenate. Subtract 1. Implicitly display
     % STACK: [1 2]

2
これは、ラテラル思考の良い例です。
レオ

6

Mathematica、20 18バイト

⌊#/#2⌋@Mod@##&

柔軟な出力ルールの軽度の乱用:結果はとして与えられdiv[mod]、未評価のままになります。個々の数字を用いて抽出することが可能result[[0]]result[[1]]

そして、それはばかげて名付けられたビルトインよりも1バイトだけ長いですQuotientRemainder

Mathematicaでは、実際には同じ入力に複数の関数を適用するきちんとした方法がありますが、3バイト長くなります。

Through@*{Quotient,Mod}

1
言語が組み込みを単純に組み合わせた組み込みを作成するとき、それは悪いことを知っています…
-Fatalize

1
@ファタライズですか?divmodビルトインは非常に便利であり、Mathematicaがそれを持っている唯一の言語ではありません。
マーティンエンダー

8
@Fatalize、商の計算には、剰余の計算に必要なものと同じ多くの作業が必要です。両方の結果を使用する場合、適切に設計されたquotRemビルトインを使用すると、呼び出しquotrem個別にかなりの時間を節約できます。
ジュリアンウルフ

6

05AB1E、5バイト

÷²¹%‚

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

05AB1Eにはバグがあるため、暗黙的な入力は機能しません:( エミニャは、入力はしばしば逆にプッシュされることに注意しました。


5バイトで÷²¹%)できます。
エミグナ

@Emigna私はそれが有効であるかどうかわからない。待って、それはどのように機能したのですか?
エリックアウトゴルファー

1
なぜそれが有効ではないのかわかりません。暗黙の入力は、このような場合に想定される順序と逆の順序でスタックにプッシュされるため、機能します。
エミグナ

@Emigna引数を逆にすることができるかどうかOPに尋ねました。
エリックアウトゴルファー

2
私はYou may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable、入力がとして取得されることを決定できることを意味しますdivisor, dividenddivisor, dividend答えに「入力は次のように
扱わ

6

クラゲ、14バイト

p
m
,|S
% i
Ei

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

説明

クラゲは、同じ入力に複数の機能を適用することに関しては美しい言語です。言語は2Dであり、すべてのバイナリ関数は1つの入力に対して南向き、別の入力に対して東向きに見えます。そのため、西と北から1つの値に近づくと、コード内で値を複製することなく、2つの関数に値を渡すことができます。

iプログラムの2つのsは、プログラムの開始時に2つの入力値に置き換えられます。今%は分裂です。東から1つの入力を直接受け取り、南に移動すると、Eその検索を東にリダイレクトします。したがって、両方の入力が%引数として渡されます。

| moduloのビルトインであり、基本的に同じことを行いますが、putで両方とも南向きになります。

両方の結果をでペアに連結し,ます。次にm、floor関数(%浮動小数点除算であるために必要)があり、最後に結果をで出力しpます。


6

Cubix、12 13バイト

;W@o,I|\S%;O

次のキューブにマッピングされるもの

    ; W
    @ o
, I | \ S % ; O
. . . . . . . .
    . .
    . .

ここで試してみてください

実行時の手順の説明
,I|I,-スーパーフロース整数除算で始まり、入力から最初の整数を取得し、反射して入力から次の整数を取得し、再び除算します
O;-整数除算の結果を出力してポップし
%ます-modを実行します これは後で行うことができますが、ここで終了します
S\o-スタックにスペース文字を追加し、スペースをリダイレクトして出力します
W;-左にシフトしてスタックからスペースをポップします
O|@-以前に計算されたMODを出力し、水平リフレクターを通過して停止します


私を2分倒した。いい答えだ!
ルーク

@Lukeおかげで、私は別のオフを得ることができると思ったが、とらえどころのない証明
MickyT

6

Brain-Flak56 54バイト

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

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

-Wheat Wizardのおかげで2バイト

説明

現在知られているBrain-Flakの整数除算モジュロは非常によく似ています(実際、現在使用されている整数除算は、feersumのモジュロで行った単なる変更です)。

モジュロ除算と整数除算の比較:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

便利なことに、整数除算プログラムは3番目のスタックのみを使用してデータを格納し、モジュロプログラムは通常の2つのスタックのみを使用してデータを格納します。したがって、両方を同時に実行するだけで、互いに衝突することはありません。

モジュロ除算と整数除算の組み合わせ:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

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

最後に、この組み合わせで使用される整数除算とモジュロプログラムの両方は、スタッククリーンになるように設計されています(スタックにゴミを残さない/入力以外のスタック上の値の(非)に依存しない)この問題のため。したがって、メインループの最後にゼロをポップすることなく2バイトを節約し、スタックの一番下のゼロパディングに依存して、開始時にゼロをプッシュしないことでさらに2バイトを節約できます。

これにより、最終プログラムが提供されます。
({}<>)<>([()]{()<(({})){({}[()])<>}{}>}<><([{}()]{})>)

整数除算プログラムの説明については、feersumの答えを参照してください

整数部の説明近日公開...


5

Java 8、18バイト

(a,b)->a/b+","+a%b

これは、型のラムダ式ですBiFunction<Integer, Integer, String>

私は驚いています...これは実際にはJavaのかなり簡潔なソリューションです。ラムダ式に行く!


5

Brain-Flak168 148 110バイト

最初にWikiをチェックすべきだったと思う

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

フォーマット:

Input:    Output:
A (18)    remainder (2)
B (4)     division  (4)

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

(({})(<           # Copy A
({}(<             # Pick up A
(({})<>)          # Copy B to the other stack
>))               # Put A on top of a 0 on the second stack
                  # At this point the stacks look like this:   A
                                                               0
                                                             B B
                                                               ^

<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>) # Positive division from the wiki
>))                                          # Put down A on top of a 0
                                             # The stack now: A
                                                              0
                                                            Div B
                                                              ^

<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<>)     # Modulo from the wiki


5

sed、36バイト

35バイトのコード、-rフラグの場合は+1 。

:a;s/^(1+)( 1*)\1/\1\2x/;ta;s/.* //

最初に小さい数字で、スペースで区切られた単項で入力を受け取ります。単項で出力します。最初の商は1sで、残りの商はxsです。(これが受け入れられない場合はお知らせください1。入力のようにスペース区切りのsに変更します。)

説明

:a;                                  Define label a
   s/            /     /;            Perform this substitution:
     ^(1+)                           Match the first unary number...
          ( 1*)                      ... followed by a space and 0 or more 1s...
               \1                    ... followed by the the first group again
                  \1\2x              Keep the first two parts unchanged; replace the third
                                     with an x
                         ta;         If the substitution succeeded, goto a
                            s/.* //  After the loop is over, remove the first number

5

Excel 2013、31 30 26バイト

=INT(A1/B1)&","&MOD(A1;B1)

説明

入力はセルA1とにありB1ます。これは単純にFLOORand MOD関数の戻り値を返します。これは、除算のフローリングと残りの値です。これらの値はコンマで区切られます。


セルA1とB1はA1とA2ではなく、セルを意味すると思います
-fəˈnɛtɪk

はい、ありがとう。今すぐ修正
ルーク

1バイトの保存FLOOR(A1/B1;1)の代わりにQUOTIENT(A1;B1)
トーストエンジニア

入力は常に自然数であるためFLOOR(A1/B1;1)、「INT(A1 / B1)」に置き換えてさらに4バイトを節約できると思います
Wernisch



4

OIL134の 106 103 102バイト

改行で区切られた2つの数値、stdinから入力を取得します。整数除算の結果、次に改行、そして残りを出力します。

OILには除算、剰余、加算、減算などの組み込み関数がないため、これは私がこれまで書いた中で最も複雑なOILプログラムの1つです。除算の基本的な方法であるネストされたデクリメントの繰り返しで動作します。

コードは注釈付きの形式で、スクリプト言語のスタイルでコメントを付けて表示します。実行する前に、コメントを削除する必要があります。

5  # read input into lines 0 and 2

5
2
0  # the zero to compare to (nops)
1  # make a backup of the second input at line 3
2
3
10 # check if the second input is 0. %
4
2
24 # if so, jump to 24 (marked with §)
13 # else, go on
10 # check if the first input is zero &
4

31 # if so, jump to 31 (marked with $)
18 # else, go on
9  # decrement both numbers

9
2
6  # jump to line 8 (marked with %)
8
8  # increment the value in line 1 (initially a zero) §
1
1  # "restore the backup"
3
2
6  # jump to line 13 (marked with &)
13
10 # is the second number zero? $
4
2
42 # if so, jump to 42 (marked with +)
36 # else go on
9  # decrement both the second number and the backup
2
9
3
6  # jump to 31 (marked with $)
31
4  # print the division +
1
11 # a newline
4
3  # and the remainder (from the backup)

編集:「定数」を1桁の場所に移動して(参照するバイトが少ない)、さらに3つのバイトを削り取り、2つのゼロの場所を暗黙的に指定します(代わりに空の行を使用します。前)。

編集:最初のゼロを暗黙的にすることによる別のバイト。本当に必要なのは、リテラルのゼロだけです。


すごい仕事!それはまさにこのチャレンジが受け取ることを期待した種類の答えです:)注:除数は常に厳密に正であることが保証されているため、0による除算をチェックする必要はありません;)
Leo

@Leo私は、除数が常に厳密に正となることを保証してい冒頭で。ゼロ部分による除算を行うと機能しません。このケースは、「実際の」除算が正常な場合でも発生する可能性があります。正しく覚えていれば、これは余りがゼロのときに起こります。
-L3viathan

12行目のチェックではなく、4行目のチェックについて説明しています...プログラムの開始時に1回だけ実行されませんか?
レオ

@Leo Done、ほぼ30文字少ない、ありがとう!
-L3viathan

4

網膜、14バイト

入出力フォーマットを悪用しましょう!

(.*)¶(\1)*
$#2

入力をb\na単項で、単項数字に単一の非数字、非改行文字を使用して受け取ります。入力と同じ文字を使用して、商を10進数で出力し、直後に単項で剰余を出力します。

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

(.*) ¶(\1)*最初の数字、次に改行(¶はRetinaの\ nの省略形です)にマッチし、そして最初の数字を可能な限り何度も繰り返します。2番目のグループの一致数が除算の結果になり、一致しない部分が残りになります。

では$#2、私たちは第二群の捕獲数と前の行にマッチしたすべてのものを交換して、私たちの結果を得ます。


ハハ、まったくその通り、私は明らかに夜遅くにプログラムを書くべきではありません。
FryAmTheEggman

4

ArnoldC286 283バイト

HEY CHRISTMAS TREE c
YOU SET US UP 0
HEY CHRISTMAS TREE d
YOU SET US UP 0 
GET TO THE CHOPPER c
HERE IS MY INVITATION a
HE HAD TO SPLIT b
ENOUGH TALK
GET TO THE CHOPPER d
HERE IS MY INVITATION a
I LET HIM GO b
ENOUGH TALK
TALK TO THE HAND c
TALK TO THE HAND d
YOU HAVE BEEN TERMINATED

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

使い方

HEY CHRISTMAS TREE c      //DECLARE VARIABLE c = 0
YOU SET US UP 0
HEY CHRISTMAS TREE d      //DECLARE VARIABLE d = 0
YOU SET US UP 0

GET TO THE CHOPPER c      /*
HERE IS MY INVITATION a      SET c = a/b
HE HAD TO SPLIT b         
ENOUGH TALK                */

GET TO THE CHOPPER d      /*
HERE IS MY INVITATION a      SET d = a mod b
I LET HIM GO b
ENOUGH TALK                */

TALK TO THE HAND c        // PRINT c
TALK TO THE HAND d        // PRINT d
YOU HAVE BEEN TERMINATED  //END

出力フォーマット

a/b
a mod b

3

ラビリンス、11バイト

?:?:}/!\{%!

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

説明

?:   Read a and duplicate.
?:   Read b and duplicate.
}    Move a copy of b over to the auxiliary stage.
/    Compute a/b.
!    Print it.
\    Print a linefeed.
{    Get back the other copy of b.
%    Compute a%b.
!    Print it.

その後、IPは行き止まりになり、向きを変え、プログラム%が再度実行されたときにゼロによる除算が試行されたために終了します。



3

> <>27 26 16 + 1 = 17バイト

:r:{%:n','o-$,n;

注意

  • -vフラグを使用して入力します。例については、TIOを参照してください。
  • これは、最初に剰余を出力し、次にカンマ、最後に整数除算を出力します。

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

説明

スタックとして始まることに注意してくださいA, B場合、A及びBための、第1および第2の入力を表す-vためのフラグ。

:r:{%:n','o-$,n; # Explanation
:r:{             # Do some stack modifications to prepare it for
                 #    next part
                 #    (Stack: B, A, A, B)
    %            # Take the modulo of the top two items
                 #    (Stack: B, A, A%B)
     :           # Duplicate it
                 #    (Stack: B, A, A%B, A%B)
      n          # Pop once and output as number
                 #    (Stack: B, A, A%B)
       ','o      # Print separator
                 #    (Stack: B, A, A%B)
           -     # Subtract the modulo from the first input
                 #    (Stack: B, A-A%B)
            $,   # Swap the two inputs so they are back in order
                 #     and divide, so we get an integer
                 #    (Stack: floor(A/B))
              n; # Output that as a number and finish.

最大255の入力値を提供するにはどうすればよいですか?
レオ

より高いASCII / Unicode値を使用してください。įそうすると、255 になります。-
ルーク

さて、いいですね:)ところで、コマンドラインから-vフラグを使って直接入力番号を取得する方が短いのではないでしょうか?
レオ

それはできますが、それをTIOで動作させることができなかったため、このソリューションで解決しました。8バイト-1(-vフラグ用)を節約します。
ルーク


3

C、21バイト

#define f(a,b)a/b,a%b

f(a、b)を2つの用語で区切られたコンマで置き換えるマクロ。関数に渡した方がいいでしょうが、そうでなければ2つを選択する方法はありません。

オンラインで試す


3

Haskell、21バイト

a#b=(div a b,mod a b)

オンラインでお試しください!使用例:を13#2返します(6,1)。はい、これはかなり退屈ですが、少し面白いですdivMod、同じように機能する。

私たちはそれでありながら、そこにもあるquotremそしてquotRemそれはのように自然数で同じように動作しdivmodそしてdivMod。ただし、負の入力の場合、結果はmod除数と同じ符号を持ち、結果は被除数remと同じ符号を持ちます。または、Preludeドキュメントに記載さquotれているように、div整数除算はゼロに向かって切り捨てられ、整数除算は負の無限大に向かって切り捨てられます。


no divまたはmodbuild-inはどうですか?

組み込みなし、36 32 31バイト

a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b

オンラインでお試しください!使用例:を13#2返します(1,6)。つまり、mod結果が最初で、div結果が2番目です。aがより小さい場合b、はで a mod bありaa div bある0ため、(a,0)が返されます。それ以外の場合は再帰的に計算するmoddiva-bb、アドオン1し、除算結果にして、残りを保持します。

除算結果に1を追加するには<$>、を使用します。mapれます。これは、リスト上の関数のマッピングにますが、タプルでも機能しますが、関数は2番目のタプル要素にのみ適用されます。

編集:xnorのおかげで1バイト保存しました!


2
あなたの2番目の解決策は<$>タプルを使用して1バイトを削り、2番目の要素に作用します:a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b
xnor

3

SWIプロローグ、109バイト

p(A):-print(A).
d(F,S,0,F):-S>F.
d(F,S,D,R):-G is F-S,d(G,S,E,R),D is E+1.
d(F,S):-d(F,S,D,R),p(D),p(-),p(R).

出力:

?- d(255,25).
10-5
true .
?- d(5,7).
0-5
true .

説明:

組み込みの除算またはモジュロなしの単純な再帰アルゴリズム。「2番目の数値が最初の数値に何回適合するか」を単純に数えます。そして、結果(Dに統合)と残り(R)を報告します。

//編集:不要なスペースを削除しました


PPCGへようこそ!私は以前にPrologを使用したことはあり:-ませんが、最後の行にはスペースがありますが、他の行にはスペースがないことに気付きました。何らかの理由でそこに必要ですか?同じことは、スペースが必要ないことE + 1F-S示唆する間も続きます。
ライコニ

ライコニ:あなたは間違いなく正しいです!スペースを削除し、最終バイト数を更新しました。
ヤンドロゼン


2

MATL、5バイト

/k&G\

MATL Onlineで試してみてください

説明

        % Implicitly grab the two inputs as numbers
/       % Divide them
k       % Round down the result
&G      % Grab the two inputs again
\       % Compute the remainder

2

ウロボロス、15バイト

r.r.@/Inao\%n1(

番号を逆順に取得します(例:)10 42ここで試してみてください。

説明

r.r.             Read a number, duplicate, read a number, duplicate
    @            Rotate a copy of the first number to the top of the stack
     /I          Divide and truncate to integer
       n         Output as number
        ao       Push 10 and output as character (newline)
          \%     Swap the remaining two values and take the mod
            n    Output as number
             1(  Push 1 and swallow that many characters from the end of the program,
                 halting execution
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.