分割を実施する


15

整数除算を処理するお好みの言語で除算アルゴリズムを実装します。正数のみを処理する必要がありますが、負および混合符号除算を処理する場合のボーナスポイントもあります。結果は端数のある結果のために切り捨てられます。

プログラムが入っていて/\divまたは類似した演算子を。言語のネイティブの除算機能を使用しないルーチンでなければなりません。

最大32ビットの除算のみを処理する必要があります。繰り返し減算を使用することはできません。

入力

新しい行またはスペースで区切られた標準入力で2つの入力を取得します(選択)

740 
2

出力

この場合、出力はになります370

最短の解決策が勝ちます。


されて740,2も入力を許可?すなわち、コンマ区切り?
ニブラー

「結果は小数の結果のために切り捨てられます」-わかりましたので、明らかに入力は整数以外の値になる可能性があります...しかし、除数が分割されたもの(例えば、5と10)よりも大きいのはどうですか?違いますか?
オーレルビリー

@gnibberそれは問題ありませんが、プログラムの説明で明確にします。
トーマスO

2
指数関数や他の数学関数の使用は本当に許可されていますか?多くのソリューションがab⁻¹やっているので、彼らは、舞台裏で割り算を使う
明唐

2
これは、最短の時間であるが、私は誰もタイムコードを見ていない
phuclv

回答:


27

Python-73文字

コンマ区切りの入力を取ります。例えば 740,2

from math import*
x,y=input()
z=int(exp(log(x)-log(y)))
print(z*y+y<=x)+z

5
これは、私の友人、賢いです
アーミル

「740,2」の出力は369です。これは正しいですか?
エルベックス

@Eelvex、<=である必要があり、修正して短くしました:)
ニブラー

14

JavaScript、61

A=Array,P=prompt,P((','+A(+P())).split(','+A(+P())).length-1)

これにより、文字列は被除数の長さ,,,,,,(6)になり、除数,,,(3)で分割され、長さ3:の配列になり['', '', '']ます。間違いなく最速ではありませんが、それでも面白いと思います!


2
ここまでの私のお気に入りの実装。クールなコードおめでとうございます!
トーマスエディング

少し短くしてみました。A=Array,P=prompt,P((''+A(+P())).split(','+A(+P())).length)
pimvdb



8

Python-72文字

カンマ区切りの入力を取ります(例:740,2)

x,y=input();z=0
for i in range(32)[::-1]:z+=(1<<i)*(y<<i<=x-z*y)
print z

8

Python、37

手順1.単項に変換します。

ステップ2.単項除算アルゴリズム。

print('1'*input()).count('1'*input())

7

Python-41文字

コンマ区切りの入力を取ります。例えば 740,2

x,y=input();z=x
while y*z>x:z-=1 
print z

1
これは、場合によっては、継続的に減算するよりも悪いです。たとえば、入力は5,4です。ループは4回実行されますが、減算の場合は1回減算するだけです。
アーミル

6

Python、70

私が考えたクレイジーなもの(カンマ区切りの入力を使用):

from cmath import*
x,y=input()
print round(tan(polar(y+x*1j)[1]).real)

小さな浮動精度エラーを受け入れる場合、round関数を削除できます。



3

PHP-82文字(バギー)

$i=fgets(STDIN);$j=fgets(STDIN);$k=1;while(($a=$j*$k)<$i)$k++;echo($a>$i?--$k:$k);

しかし、これは非常に簡単な解決策です-分数や異なる記号を処理しません(無限ループにジャンプします)。これについては詳しく説明しませんが、かなり簡単です。

入力は改行で区切られた標準入力です。

PHP-141文字(フル)

$i*=$r=($i=fgets(STDIN))<0?-1:1;$j*=$s=($j=fgets(STDIN))<0?-1:1;$k=0;$l=1;while(($a=$j*$k)!=$i){if($a>$i)$k-=($l>>=2)*2;$k+=$l;}echo$k*$r*$s;

前のものと同じ入出力。

はい、これは以前のサイズのほぼ2倍ですが、次のとおりです。

  • 分数を正しく処理します
  • 標識を正しく処理する
  • 2番目のパラメーターが0でない限り、無限ループに入ることはありません-しかし、それはゼロによる除算です-無効な入力

再フォーマットと説明:

$i *= $r = ($i = fgets(STDIN)) < 0 ? -1 : 1;
$j *= $s = ($j = fgets(STDIN)) < 0 ? -1 : 1;
                                    // First, in the parentheses, $i is set to
                                    // GET variable i, then $r is set to -1 or
                                    // 1, depending whether $i is negative or
                                    // not - finally, $i multiplied by $r ef-
                                    // fectively resulting in $i being the ab-
                                    // solute value of itself, but keeping the
                                    // sign in $r.
                                    // The same is then done to $j, the sign
                                    // is kept in $s.

$k = 0;                             // $k will be the result in the end.

$l = 1;                             // $l is used in the loop - it is added to
                                    // $k as long as $j*$k (the divisor times
                                    // the result so far) is less than $i (the
                                    // divided number).

while(($a = $j * $k) != $i){        // Main loop - it is executed until $j*$k
                                    // equals $i - that is, until a result is
                                    // found. Because a/b=c, c*b=a.
                                    // At the same time, $a is set to $j*$k,
                                    // to conserve space and time.

    if($a > $i)                     // If $a is greater than $i, last step
        $k -= ($l >>= 2) * 2;       // (add $l) is undone by subtracting $l
                                    // from $k, and then dividing $l by two
                                    // (by a bitwise right shift by 1) for
                                    // handling fractional results.
                                    // It might seem that using ($l>>=2)*2 here
                                    // is unnecessary - but by compressing the
                                    // two commands ($k-=$l and $l>>=2) into 1
                                    // means that curly braces are not needed:
                                    //
                                    // if($a>$i)$k-=($l>>=2)*2;
                                    //
                                    // vs.
                                    //
                                    // if($a>$i){$k-=$l;$l>>=2;}

    $k += $l;                       // Finally, $k is incremented by $l and
                                    // the while loop loops again.
}

echo $k * $r * $s;                  // To get the correct result, $k has to be
                                    // multiplied by $r and $s, keeping signs
                                    // that were removed in the beginning.

これで除算演算子を使用しましたが、少しずれるかもしれません。;)
トーマスO

@Thomasそうそう...今気づいた...私は実際にビットシフトについて考えていた(/ = 10の代わりに/ = 2に変更したとき)-それはもう1つの文字だった...推測するとにかくそれを使用する必要があります。
オーレルビリー

質問は、PHPがサポートしているstdinを使用する必要があると言っています。
ケビンブラウン

@ Bass5098 Aaahhh ...まあ、4文字獲得しました...修正されました。
オーレルビリー

3

Ruby 1.9、28文字

(?a*a+?b).split(?a*b).size-1

残りの部門、21文字

?a*a=~/(#{?a*b})\1*$/  

サンプル:

a = 756
b = 20
print (?a*a+?b).split(?a*b).size-1  # => 37
print ?a*a=~/(#{?a*b})\1*$/         # => 16

Ruby 1.8の場合:

a = 756
b = 20
print ('a'*a+'b').split('a'*b).size-1  # => 37
print 'a'*a=~/(#{'a'*b})\1*$/          # => 16

NoMethodError:69938:Fixnumのプライベートメソッド「split」が呼び出されました
rkj

@rkj、すみません、Ruby 1.9のみ。Ruby 1.8で実行するには('a'*a+'b').split('a'*b).size-1、3文字大きくする必要があります。
LBg

3

APL(6)

⌊*-/⍟⎕

/部門はここではないですが、foldr。つまり、F/a b cですa F (b F c)foldrと呼ばれるために使用できない場合は/、9文字で実行できます。

⌊*(⍟⎕)-⍟⎕

説明:

  • input()
  • ⍟⎕map(log, input())
  • -/⍟⎕foldr1(sub, map(log, input()))
  • *-/⍟⎕exp(foldr1(sub, map(log, input())))
  • ⌊*-/⍟⎕floor(exp(foldr1(sub, map(log, input()))))

2

PHP、55文字

<?$a=explode(" ",fgets(STDIN));echo$a[0]*pow($a[1],-1);

出力(740/2):http ://codepad.viper-7.com/ucTlcq


44文字:<?$a=fgetcsv(STDIN);echo$a[0]*pow($a[1],-1);数字を区切るには、スペースの代わりにカンマを使用します。
jdstankosky


2

Haskell、96文字

main=getLine>>=print.d.map read.words
d[x,y]=pred.snd.head.filter((>x).fst)$map(\n->(n*y,n))[0..]

入力は1行です。

コードは、除数dを取得し、すべての整数に対して乗算することにより、答えを検索しますn >= 0。ましょうm配当です。最大のnようn * d <= mな答えであることを選択されます。実際には、コードはnそのn * d > mようなリストから最初の要素を取得できるので、そのようなものを最も少なく選択し、1を引きます。他の場合、最後の要素を取得する必要がありますが、無限リストから最後の要素を取得するのは大変です。リストは有限であることが証明できますが、Haskellはフィルターを実行するときのほうがよくわからないため、無限にフィルター処理を続けます。


2

Common Lisp、42文字

(1-(loop as x to(read)by(read)counting t))

スペースまたは行区切り入力を受け入れます


2

バッシュ、 72 64文字

read x y;yes ''|head -n$x>f;ls -l --block-size=$y f|cut -d\  -f5

無限の数の改行を出力し、最初のxを取得し、それらをすべてfというファイルに入れてから、fのサイズをyのサイズのブロックで取得します。8文字を削るマナトワークのアドバイスを受けました。


「新しい行またはスペースで区切られたstdinで2つの入力を行う(選択)」ので、後者のスペースで区切られた値を選択することをお勧めします。その場合、あなたは書くことができますread x y。:いくつかのより多くの64文字に短縮することができるスペースを削除してpastebin.com/Y3SfSXWk
manatwork

1

Python-45文字

カンマ区切りの入力を取ります(例:740,2)

x,y=input()
print-1+len((x*'.').split('.'*y))

1

Python、94文字

再帰的バイナリ検索:

a,b=input()
def r(m,n):return r(m,m+n>>1)if n*b>a else n if n*b+b>a else r(n,2*n)
print r(0,1)

1

Python、148

他のソリューションは短いかもしれませんが、それらはウェブスケールですか?

CLOUDの力を活用するエレガントで一定時間のソリューションを次に示します。

from urllib import*
print eval(urlopen('http://tryhaskell.org/haskell.json?method=eval&expr=div%20'+raw_input()+'%20'+raw_input()).read())['result']

Haskellを使用することにも言及しましたか?


0

Python、46バイト

誰も退屈な減算ソリューションを投稿していないので、私はそれをやめられませんでした。

a、b = input()
i = 0
一方、a> = b:a- = b; i + = 1
印刷する

0

Smalltalk、Squeak 4.xフレーバー

このバイナリメッセージを整数で定義します。

% d 
    | i |
    d <= self or: [^0].
    i := self highBit - d highBit.
    d << i <= self or: [i := i - 1].
    ^1 << i + (self - (d << i) % d)

一度ゴルフをすると、この商はまだ長くなります(88文字):

%d|i n|d<=(n:=self)or:[^0].i:=n highBit-d highBit.d<<i<=n or:[i:=i-1].^1<<i+(n-(d<<i)%d)

しかし、それは合理的に高速です。

[0 to: 1000 do: [:n |
    1 to: 1000 do: [:d |
        self assert: (n//d) = (n%d)]].
] timeToRun.

->控えめなmac miniで127 ms(8 MOp / s)

通常の部門と比較して:

[0 to: 1000 do: [:n |
    1 to: 1000 do: [:d |
        self assert: (n//d) = (n//d)]].
] timeToRun.

-> 31 ms、わずか4倍遅い

Sdinの読み取りやstdoutの書き込みに文字をカウントしません。Squeakはスクリプト用に設計されていません。

FileStream stdout nextPutAll:
    FileStream stdin nextLine asNumber%FileStream stdin nextLine asNumber;
    cr

もちろん、より愚かな繰り返しの減算

%d self>d and:[^0].^self-d%d+1

または単純な愚かな列挙

%d^(0to:self)findLast:[:q|q*d<=self]

うまくいくかもしれないが、あまり面白くない


0
#include <stdio.h>
#include <string.h>
#include <math.h>


main()
{
   int i,j,ans;
   i=740;
   j=2;

   ans = pow(10,log10(i) - log10(j));
   printf("\nThe answer is %d",ans);
}

0

DC:26文字

?so?se0[1+dle*lo>i]dsix1-p

私はそれが周りの最速のソリューションではないことを認めます。


0

Python 54

コンマ区切りの入力を取ります。

  1. 長さxのドットのストリングを作成します
  2. 長さyのドットのセグメントを単一のコンマで置き換えます
  3. コンマをカウントします。

マークダウンはコードが続くリストで死ぬので、言葉?:

x,y=input()
print("."*x).replace("."*y,',').count(',')

0

Q、46

{-1+(#){x-y}[;y]\[{s[x-y]<>(s:signum)x}[y];x]}

q){-1+(#){x-y}[;y]\[{s[x-y]<>(s:signum)x}[y];x]}[740;2]
370
q){-1+(#){x-y}[;y]\[{s[x-y]<>(s:signum)x}[y];x]}[740;3]
246



0

Python、37

x,y=input()
print len(('0'*x)[y-1::y])

長さx'0'*x)の文字列を構築し、拡張スライスを使用yして、indexから始まるすべての文字を選択しますy-1。結果の文字列の長さを出力します。

Gnibblerと同様に、これはコンマ区切りの入力を取ります。削除するには9文字がかかります:

i=input
x,y=i(),i()
print len(('0'*x)[y-1::y])

0

Retina 0.7.3、33バイト(非競合)

言語はチャレンジよりも新しいです。最初に除数でスペースで区切られた入力を取得します。ゼロによる除算は未定義です。

\d+
$*
^(.+) (\1)+.*$
$#+
.+ .*
0

オンラインで試す


これを25バイトとしてどのようにカウントしますか?単項I / Oを期待している場合は、そう言うべきです(そして、それは24バイトだと思います)。わからないあなたが個別にかかわらず、0の場合を扱う理由:retina.tryitonline.net/...
マーティン・エンダー

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