ใช้งานการแบ่ง


15

ใช้อัลกอริทึมการหารในภาษาที่คุณชื่นชอบซึ่งจัดการการหารจำนวนเต็ม มันต้องการเพียงจัดการกับจำนวนบวก - แต่คะแนนโบนัสถ้ามันจัดการส่วนลบและผสมสัญญาณด้วย ผลลัพธ์จะถูกปัดเศษลงเพื่อผลลัพธ์ที่เป็นเศษส่วน

โปรแกรมอาจไม่ได้มี/, \, divหรือผู้ประกอบการที่คล้ายกัน ต้องเป็นกิจวัตรที่ไม่ได้ใช้ความสามารถในการแบ่งส่วนของภาษา

คุณจะต้องจัดการได้มากถึง 32 บิต ไม่อนุญาตให้ใช้การลบซ้ำ ๆ

อินพุต

ใช้สองอินพุตใน stdin คั่นด้วยบรรทัดหรือช่องว่างใหม่ (ตัวเลือกของคุณ)

740 
2

เอาท์พุต

370ในกรณีนี้การส่งออกจะเป็น

ทางออกที่สั้นที่สุดชนะ


จะ740,2ยังอนุญาตให้ป้อนข้อมูลหรือไม่ เช่นคั่นด้วยเครื่องหมายจุลภาคหรือไม่
gnibbler

"ผลลัพธ์ถูกปัดเศษลงเพื่อผลลัพธ์ที่เป็นเศษส่วน" - ตกลงดังนั้นข้อมูลที่ป้อนยังสามารถส่งผลให้มีจำนวนที่ไม่ใช่จำนวนเต็ม ... แต่สิ่งที่เกี่ยวกับตัวหารที่ใหญ่กว่าตัวหาร (พูด 5 และ 10) - เป็นสิ่งที่อนุญาตหรือ ไม่?
Aurel Bílý

@gnibber นั่นคงเป็นเรื่องดี แต่ให้ชัดเจนในคำอธิบายโปรแกรม
โทมัส O

2
ใช้เลขชี้กำลังและฟังก์ชันทางคณิตศาสตร์อื่น ๆ ที่อนุญาตจริงๆหรือไม่ พวกเขาใช้การแบ่งฉากเบื้องหลังเพราะหลายวิธีแก้ปัญหากำลังทำอยู่
Ming-Tang

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
นี่เพื่อนของฉันคือ CLEVER
Aamir

เอาต์พุตสำหรับ "740,2" คือ 369 ถูกต้องหรือไม่
Eelvex

@ สิบสองควรได้รับ <=, แก้ไขมันและทำให้มันสั้นลง :)
gnibbler

14

JavaScript, 61

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

สิ่งนี้ทำให้สตริงมีความยาวของตัวปันผล,,,,,,(6) และแยกตัวหาร,,,(3) ทำให้เกิดอาร์เรย์ที่มีความยาว 3: ['', '', '']ซึ่งความยาวของฉันจะถูกลบออก ไม่เร็วที่สุด แต่ก็น่าสนใจอยู่ดี


2
การใช้งานที่ชื่นชอบของฉันที่นี่จนถึง ขอแสดงความยินดีกับโค้ดสุดเจ๋ง!
Thomas Eding

ฉันพยายามทำให้สั้นลงเล็กน้อย A=Array,P=prompt,P((''+A(+P())).split(','+A(+P())).length)
pimvdb

10

JavaScript - 36 ตัวอักษร

p=prompt;alert(p()*Math.pow(p(),-1))

5
การแทนที่alertด้วยpจะทำให้คุณมีอักขระพิเศษเพิ่มขึ้น :)
Casey Chu


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 อัลกอริทึมการหาร Unary

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 ครั้งในกรณีที่มีการลบเราจะต้องลบเพียงครั้งเดียว
อาเมียร์

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

นี่เป็นวิธีการแก้ปัญหาที่ง่ายมากอย่างไรก็ตามมันไม่ได้จัดการกับเศษส่วนหรืออาการต่าง ๆ ฉันจะไม่ลงรายละเอียดในอันนี้มันค่อนข้างง่าย

อินพุตอยู่ใน stdin คั่นด้วยบรรทัดใหม่

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;

อินพุตและเอาต์พุตเช่นเดียวกับก่อนหน้านี้

ใช่ขนาดนี้เกือบสองเท่าของขนาดก่อนหน้า แต่:

  • จัดการเศษส่วนได้อย่างถูกต้อง
  • จัดการสัญญาณอย่างถูกต้อง
  • จะไม่เข้าสู่วงวนไม่ จำกัด ยกเว้นพารามิเตอร์ที่สองคือ 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 O ใช่ ... ฉันสังเกตเห็นแล้วตอนนี้ ... ฉันกำลังคิดเกี่ยวกับการเปลี่ยนแปลงเล็กน้อย (เมื่อฉันเปลี่ยนเป็น / = 2 แทน / = 10) - แต่มันเป็นถ่านอีกหนึ่ง ... เดาฉัน ' จะต้องใช้มันต่อไป ... Btw ที่ไม่ได้แบ่งเลย: D
Aurel Bílý

คำถามบอกว่าคุณต้องใช้ stdin ซึ่ง PHP รองรับ
เควินบราวน์

@ Bass5098 Aaahhh ... โอ้ดีได้รับ 4 ตัวอักษร ... คงที่
Aurel Bílý

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

Haskell, 96 ตัวอักษร

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

อินพุตอยู่ในบรรทัดเดียว

รหัสเพียงค้นหาคำตอบโดยการหารและคูณกับจำนวนเต็มทั้งหมดd n >= 0อนุญาตmเป็นเงินปันผล ที่ใหญ่ที่สุดnที่n * d <= mถูกเลือกให้เป็นคำตอบ รหัสเลือกน้อยที่สุดnนั้นจริงn * d > mและลบ 1 จากนั้นเพราะฉันสามารถนำองค์ประกอบแรกจากรายการดังกล่าว ในอีกกรณีหนึ่งฉันจะต้องใช้คนสุดท้าย แต่มันก็ยากที่จะทำสิ่งสุดท้ายจากรายการที่ไม่มีที่สิ้นสุด รายการสามารถพิสูจน์ได้ว่ามี จำกัด แต่ Haskell ไม่รู้จักดีขึ้นเมื่อดำเนินการตัวกรองดังนั้นจึงยังคงกรองอย่างไม่มีกำหนด


2

สามัญ Lisp, 42 charaacters

(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 ใช้คำแนะนำของ manatwork เพื่อกำจัดอักขระแปดตัว


ในฐานะ“ ใช้สองอินพุทบน stdin คั่นด้วยบรรทัดหรือช่องว่างใหม่ (ตัวเลือกของคุณ)”, เลือกที่ดีกว่าในภายหลัง, แยกช่องว่างค่า read x yซึ่งในกรณีนี้คุณสามารถเขียน ด้วยการลบช่องว่างออกอีกสองสามข้อสามารถลดได้ถึง 64 ตัวอักษร: pastebin.com/Y3SfSXWk
จัดการเอกสาร

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 = การป้อนข้อมูล ()
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.

-> 127 ms บน mac mini ขนาดเล็ก (8 MOp / s)

เปรียบเทียบกับแผนกปกติ:

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

-> 31 ms ช้าลงเพียง 4 เท่า

ฉันไม่นับตัวอักษรเพื่ออ่าน stdin หรือเขียน 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. จุลภาคนับ

คำเพราะ markdown ตายด้วยรายการตามด้วยรหัส:

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

0

คำถามที่ 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อักขระตัวที่เริ่มต้นจากดัชนี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/ …
Martin Ender

มันผิดพลาด
mbomb007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.