Bölümü uygula


15

Tamsayı bölmesini işleyen favori dilinizde bir bölme algoritması uygulayın. Yalnızca pozitif sayıları işlemek gerekir - ancak negatif ve karışık işaret bölümünü de işliyorsa bonus puanları. Kesirli sonuçlar için sonuçlar aşağı yuvarlanır.

Program içermeyebilir /, \, divya da benzer operatörleri. Dilin yerel bölme yeteneklerini kullanmayan bir rutin olmalıdır.

Yalnızca 32 bitlik bölümlere kadar işlem yapmanız gerekir. Tekrarlanan çıkarma işlemine izin verilmez.

Giriş

Stdin'de yeni satır veya boşluklarla ayrılmış iki girdi alın (seçiminiz)

740 
2

Çıktı

Bu durumda, çıktı olur 370.

En kısa çözüm kazanır.


olduğu 740,2girişi için de izin? virgülle ayrılmış mı?
gnibbler

"Sonuçlar kesirli sonuçlar için aşağı yuvarlanır" - tamam, görünüşe göre girdi tamsayı olmayan bir sayıya da neden olabilir ... Ama bölen bölünmüş olandan daha büyükse (örneğin, 5 ve 10) - izin verilen veya değil?
Aurel Bílý

@gnibber Bu iyi olur, ancak program açıklamasında netleştirin.
Thomas O

2
üstel ve diğer matematik fonksiyonlarına izin veriliyor mu? sahne arkasında bölme kullanıyorlar, çünkü birçok çözüm ab⁻¹ yapıyor
Ming-Tang

2
Bu en kısa süredir ama kod zaman kimse görmedim
phuclv

Yanıtlar:


27

Python - 73 karakter

Virgülle ayrılmış girdi alır, ör. 740,2

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

5
Bu, arkadaşım, CLEVER
Aamir

"740,2" çıktısı 369. Bu doğru mu?
Eelvex

@Eelvex, <=, düzeltilmiş ve kısaltılmış
olmalı

14

JavaScript, 61

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

Bu, bir dizgiyi temettü ,,,,,,(6) uzunluğunda yapar ve bölücü ,,,(3) üzerine ayrılır, bu da uzunluğu 3'ten bir dizi ['', '', '']çıkarır; Yine de kesinlikle hızlı, ama umarım ilginç!


2
Şimdiye kadar burada en sevdiğim uygulama. Serin kod için tebrikler!
Thomas Eding

Biraz daha kısaltmaya çalıştım. A=Array,P=prompt,P((''+A(+P())).split(','+A(+P())).length)
pimvdb


9

Mathematica: 34 karakter

Sembolik denklemi çözer (xa == b)

Solve[x#[[1]]==#[[2]],x]&@Input[]

2
23 karakter,Solve[x#==#2]&@@Input[]
chyanog

8

Python - 72 karakter

Virgülle ayrılmış girdi alır, örneğin 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

Adım 1. Tekli'ye dönüştürün.

Adım 2. Tekli bölme algoritması.

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

7

Python - 41 karakter

Virgülle ayrılmış girdi alır, ör. 740,2

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

1
Bu, bazı durumlarda, sürekli olarak çıkarılmasından daha kötüdür. örneğin, girdi 5,4'tür. döngü çıkarma sırasında 4 kez çalışır, sadece bir kez çıkarmak zorundayız.
Aamir

6

Python, 70

Düşündüğüm çılgın bir şey (virgülle ayrılmış girdi kullanarak):

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

Küçük şamandıra hassaslığı hatalarını kabul ederseniz, roundişlev bırakılabilir.



3

PHP - 82 karakter (buggy)

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

Ancak bu çok basit bir çözümdür - kesirleri veya farklı işaretleri ele almaz (sonsuz bir döngüye atlar). Bu konuda ayrıntılara girmeyeceğim, oldukça basit.

Girdi stdin cinsindendir, yeni bir satırla ayrılmıştır.

PHP - 141 karakter (dolu)

$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;

Giriş ve çıkış öncekiyle aynı.

Evet, bu bir öncekinin neredeyse iki katı büyüklüğündedir, ancak:

  • Kesirleri doğru şekilde işler
  • işaretleri doğru şekilde işler
  • Sonsuz bir döngüye girmeyecek, ikinci parametrenin 0 OLMADIĞINI UNLESS - ancak bu sıfıra bölme - geçersiz giriş

Yeniden biçimlendirme ve açıklama:

$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.

Bu bölümde bir bölme operatörü kullandınız, yine de biraz kayma ile kaçabilirsiniz. ;)
Thomas O

@Thomas O evet ... Şimdi fark ettim ... Aslında biraz kaymayı düşünüyordum (/ = 10 yerine / = 2 olarak değiştirdiğimde) - ama bir karakter daha ... Sanırım ben ' Yine de kullanmak zorundayım ... Bu hiç bir şekilde bölünme değil: D.
Aurel Bílý

Soru, PHP'nin desteklediği stdin'i kullanmanız gerektiğini söylüyor.
Kevin Brown

@ Bass5098 Aaahhh ... Oh, 4 karakter kazandı ... Sabit.
Aurel Bílý

3

Yakut 1.9, 28 karakter

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

Kalan bölüm, 21 karakter

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

Örneklem:

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

Ruby 1.8 için:

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

NoMethodError: 69938 için çağrılan özel yöntem `` split '': Fixnum
rkj

@rkj, Üzgünüm, sadece 1.9. Ruby 1.8'de koşmak için ('a'*a+'b').split('a'*b).size-13 karakter daha büyük yapmalısınız .
LBg

3

APL (6)

⌊*-/⍟⎕

/burada bölünme değil foldr,. yaniF/a b c bir a F (b F c). Ben kullanamıyorsanız foldrdenir çünkü /, bu 9 karakter de yapılabilir:

⌊*(⍟⎕)-⍟⎕

Açıklama:

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



2

Haskell, 96 karakter

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

Giriş tek bir satırda.

Kod, yalnızca böleni alıp dtüm tamsayılarla çarparak cevabı arar n >= 0. Izin vermek mtemettü olmak. Büyük nolacak şekilde n * d <= mçekilir cevabı olmalıydı. Kod aslında en az nöyle seçer ve n * d > milk listeyi böyle bir listeden alabildiğim için 1'i çıkarır. Diğer durumda, sonuncuyu almak zorunda kalacaktım, ancak son elemanı sonsuz bir listeden almak zor. Listenin sonlu olduğu kanıtlanabilir, ancak Haskell filtreyi gerçekleştirirken daha iyi bilmiyor, bu nedenle de belirsiz bir şekilde filtrelemeye devam ediyor.


2

Common Lisp, 42 karakter

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

Boşluğu veya satırla ayrılmış girişi kabul eder


2

Bash, 72 64 karakter

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

Sonsuz sayıda yeni satır çıktısı alın, ilk x'i alın, hepsini f adlı bir dosyaya koyun, sonra y boyutunu bloklar halinde f boyutunu alın. Sekiz karakteri tıraş etmek için el işçiliği tavsiyesi aldı.


“Stdin'de yeni satır veya boşluklarla ayrılmış iki girişi al (seçiminize göre)” olarak, daha sonra, boşlukla ayrılmış değerleri daha iyi seçin. Bu durumda yazabilirsiniz read x y. Kaldırılan birkaç boşluk daha 64 karaktere indirilebilir: pastebin.com/Y3SfSXWk
manatwork

1

Python - 45 karakter

Virgülle ayrılmış girdi alır, örneğin 740,2

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

1

Python, 94 karakter

Yinelemeli bir ikili arama:

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

Diğer çözümler kısa olabilir, ancak web ölçeği midir?

İşte BULUT'un gücünü kullanan zarif, sabit zamanlı bir çözüm.

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

Haskell kullandığını söylemiş miydim?


0

Python, 46 bayt

Kimse sıkıcı çıkarma çözümünü yayınlamadı, bu yüzden buna karşı koyamadım.

a, b = girişi ()
I = 0
a> = b: a- = b; i + = 1
baskı ben

0

Smalltalk , Squeak 4.x lezzet

Bu ikili mesajı Tamsayı'da tanımlayın:

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

Bir kez golfe, bu bölüm hala uzun (88 karakter):

%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)

Ancak oldukça hızlı:

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

-> mütevazı mac mini'imde 127 ms (8 MOp / s)

Normal bölümle karşılaştırıldığında:

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

-> 31 ms, sadece 4 kat daha yavaş

Stdin okumak veya stdout yazmak için karakterleri saymıyorum, Squeak komut dosyası oluşturmak için tasarlanmadı.

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

Tabii ki, daha aptal tekrarlanan çıkarma

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

veya sade aptal numaralandırma

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

da işe yarayabilir, ama gerçekten ilginç değil


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 karakter

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

Bunun en hızlı çözüm olmadığını itiraf ediyorum.


0

Python 54

Virgülle sınırlanmış girdi alır.

  1. X uzunluğunda bir nokta dizesi yapar
  2. Y uzunluğundaki noktaların kesimlerini tek bir virgülle değiştirir
  3. Virgül sayar.

Markdown bir kod ve ardından kod ile ölür çünkü kelimeler:

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, 40 karakter

print(float(input())*float(input())**-1)

0

Python, 37

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

Bir uzunluk dizesi x( '0'*x) oluşturur ve ydizinden başlayarak her bir karakteri seçmek için genişletilmiş dilimleme kullanır y-1. Elde edilen dizenin uzunluğunu yazdırır.

Gnibbler gibi bu da virgülle ayrılmış girdi alır. Çıkarmak 9karakterlere mal olur:

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

0

Retina 0.7.3, 33 bayt (rakip değil)

Dil, meydan okumadan daha yeni. Önce bölenle boşlukla ayrılmış girdi alır. Sıfıra bölmek tanımsızdır.

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

Çevrimiçi deneyin


Bunu 25 bayt olarak nasıl sayıyorsunuz? Tekli G / Ç bekliyorsanız bunu söylemelisiniz (ve sanırım 24 bayt). 0 davasına neden ayrı ayrı davrandığınızdan emin değilsiniz: retina.tryitonline.net/…
Martin Ender

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.