Phân chia số lượng không quá ít


15

Viết một chương trình hoặc chức năng mà mất trong nguyên dương a, bc, và in hoặc lợi nhuận a/bđể cchữ số thập phân, sử dụng các hoạt động + - * /% [cộng, trừ, nhân, chia, điều chỉnh] trên nguyên dương: bạn có thể sử dụng tất cả những gì ngôn ngữ của bạn cho phép, nhưng không phải trên số dấu phẩy động. Phạm vi của a, b, c sẽ là phạm vi được phép cho các số nguyên không dấu trong ngôn ngữ của bạn. Kết quả số sẽ được cắt ngắn đến chữ số cuối cùng để in (vì vậy không round).

Điều này có nghĩa là nếu ngôn ngữ của bạn không có loại số nguyên (chỉ có số float), bạn có thể tham gia bằng cách sử dụng các số float này làm số nguyên dương. Manh mối của bài tập này là viết hàm tìm các chữ số trong phân chia điểm nổi, chỉ sử dụng thao tác + - * /% trên các số nguyên [không dấu].

Ví dụ

  • print(1,2,1) sẽ in 0.5
  • print(1,2,2) sẽ in 0.50
  • print(13,7,27) sẽ in 1.857142857142857142857142857
  • print(2,3,1) sẽ in 0.6
  • print(4,5,7) sẽ in 0.8000000
  • print(4,5,1) sẽ in 0.8
  • print(9999,23,1) sẽ in 434.7
  • print(12345613,2321,89) sẽ in nếu Ngôn ngữ của bạn không dấu 32 bit 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

Mã ngắn nhất tính bằng byte thắng. Tôi xin lỗi nếu điều này xuất hiện không rõ ràng ... Tôi cũng không biết ngôn ngữ, không nhớ từ ngữ tốt hơn ... Tốt hơn là nên có một liên kết đến Ideone.com hoặc một nơi khác để dễ dàng thử câu trả lời đặc biệt là kiểm tra một số đầu vào khác với đề xuất.


1
Phạm vi của các số nguyên a, b, c là gì?
TonMedel

@TonMedel, phạm vi của a, b, c sẽ là phạm vi cho phép số nguyên không dấu trong Ngôn ngữ của bạn: ví dụ: nếu là 32 bit không dấu thì sẽ là 0..0xFFFFFFFF nhưng nếu c> = 0xFFFFFFF thì đầu ra sẽ lớn chậm một chút ...
RosLuP

2
Đây là một chức năng làm tròn - hay chính xác hơn, nó cần phải là một chức năng làm tròn để được chỉ định đúng. Hiện tại, vẫn chưa rõ câu trả lời đúng sẽ là gì, vd (1,2,0). Xem meta.codegolf.stackexchange.com/a/5608/194
Peter Taylor

1
Xin lỗi vì đã mở lại câu hỏi này; Tôi nghĩ rằng nó gần như đã sẵn sàng để mở lại, ngoại trừ vấn đề Peter Taylor đã chỉ ra. Đầu ra cho là (1,2,0)gì?
Sản phẩm ETH

2
Trên thực tế (1,2,0)nên không liên quan vì 0không phải là một số nguyên dương. Và tôi thích nó hơn nếu c vẫn như vậy vì tôi không cần phải suy nghĩ về việc nối thêm .hay không
TonMedel

Câu trả lời:


5

05AB1E , 17 13 11 19 14 byte

Đầu vào theo mẫu b, a, c.
Đã lưu 5 byte nhờ Grimy .

‰`¹+I°*¹÷¦'.sJ

Hãy thử trực tuyến!


Tôi vừa thử trực tuyến với đầu vào 13,7,27 và câu trả lời không chính xác
Mathieu J.

@shigazaru: Nó trả về cùng kết quả như thử trường hợp. Bạn có nhận thấy thứ tự của đầu vào là b,a,c?
Emigna

Tôi thử nút "Thử trực tuyến" trong đó có phân chia này: 12345613/2321 với 89 chữ số, nhưng kết quả là có 5319.922 ... thay vì 5319.0922 ...
RosLuP

1
15:‰`I°*¹÷I°+¦'.sJ
Grimmy

2
14:‰`¹+I°*¹÷¦'.sJ
Grimmy

4

Haskell, 87 byte

(a#b)c|s<-show$div(a*10^c)b,l<-length s-c,(h,t)<-splitAt l s=['0'|l<1]++h++['.'|c>0]++t

Ví dụ sử dụng: (13#7)27-> "1.857142857142857142857142857".

23 byte để xử lý c==0 trường hợp và sử dụng số 0 đứng đầu thay vì những thứ như .5.

Cách thức hoạt động: nhân avới 10^c, chia cho b, biến thành một chuỗi, chia ở nơi .phải chèn, nối cả hai phần với một .giữa và sửa các trường hợp cạnh.


4

Perl 6 ,  58 57 55  48 byte

{(($^a.FatRat/$^b*10**$^c).Int.FatRat/10**$c).base(10,$c)}
{(Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c).base(10,$c)}
{base Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c: 10,$c}
{base ($^a*10**$^c div$^b).FatRat/10**$c: 10,$c}

Điều khá khó chịu là nó có thể được rút ngắn chỉ {($^a.FatRat/$^b).base(10,$^c)}khi nó được phép làm tròn đến giá trị gần nhất.

Giải trình:

# bare block lambda with 3 placeholder parameters 「$^a」, 「$^b」 and 「$^c」
{
  (
    (

      # create an Int containing all of the digits we care about
      $^a * 10 ** $^c div $^b

    ).FatRat / 10**$c  # turn it into a Rational

  ).base( 10, $c )     # force it to display 「$c」 digits after the decimal point
}

Tôi không quen thuộc với perl6, nhưng không phải (...).FatRat / 10**$xlà một bộ phận của Rational? Bạn chỉ được phép chia số nguyên.
nimi

@nimi a Rational là một lớp có hai Ints .
Brad Gilbert b2gills

Các toán tử toán học chỉ được phép cho các loại số nguyên và không cho các loại số khác. Trích dẫn: "Manh mối của bài tập này ... để viết hàm ... chỉ sử dụng thao tác + - * /% trên các số nguyên [không dấu]."
nimi

@nimi Vì vậy, nếu tôi đã viết một bản triển khai lại Rational và không thêm does Realhoặc does Numericnó có được phép không? Điều gì sẽ xảy ra nếu tôi gia tăng (bản vá khỉ) lớp hiện có để loại bỏ các vai trò đó, điều đó có được phép không?
Brad Gilbert b2gills

Đừng biết nữa. Tôi đọc thông số kỹ thuật như đã nói trước đây: +-*/%chỉ với các loại số nguyên. "số nguyên" về mặt chức năng (trước hết: phân chia số nguyên) không phải là biểu diễn bên trong. Bạn có nghĩ rằng nó được phép sử dụng một thư viện dấu phẩy động phần mềm, mà (mặc dù tên) cũng chỉ sử dụng các số nguyên để biểu diễn bên trong?
nimi

3

Perl, 55 byte

Bao gồm +3 cho -p

Cho a và b trên một dòng trên STDIN, c trên dòng tiếp theo

division.pl
1 26
38
^D

division.pl:

#!/usr/bin/perl -p
eval'$\.=($_/$&|0)."."x!$\;$_=$_%$&.0;'x(/ .*/+<>)}{

đó $_/$&là một chút tranh cãi. Tôi thực sự muốn một phân chia số nguyên ở đó nhưng perl không có mà không tải các mô-đun đặc biệt. Vì vậy, nó tạm thời là một số nguyên mà sau đó tôi ngay lập tức cắt (sử dụng |0) để kết thúc với số nguyên mà một số nguyên sẽ cung cấp. Nó có thể được viết lại ($_-$_%$&)/$&để thậm chí không tạm thời có một giá trị không nguyên (mặc dù bên trong nó vẫn là một số float)


Bạn có thể sử dụng $-để làm cho nó int chỉ? (Tôi nghĩ rằng có những giới hạn nghiêm ngặt về sự pha trộn / tối đa của nó, và tôi chắc chắn rằng bạn muốn đã coi nó, nhưng dù nó có giá trị kiểm tra!)
Dom Hastings

@DomHastings Nó vẫn sẽ bị cắt cụt sau khi thực hiện phép chia dấu phẩy động. Perl đơn giản là không có phân chia số nguyên mà không cóuse integer
TonMedel

Ah, vậy là nó chỉ bịt mặt $-, tốt để biết. Cảm ơn!
Dom Hastings

3

JavaScript (ES6), 55 50 byte

f=(a,b,c,d=".")=>~c?(a/b|0)+d+f(a%b*10,b,c-1,""):d

(a/b|0)thực hiện phép chia float nhưng ngay lập tức chuyển thành một số nguyên. Xin vui lòng cho tôi biết nếu điều này không được phép.


3

PHP, 187 byte

làm việc với các chuỗi cho tử số có thể là giá trị int lớn hơn sau đó PHP_INT_MAX

list(,$n,$d,$c)=$argv;$a=str_split($n);while($a){$n.=array_shift($a);if($n>=$d||$r)$n-=$d*$r[]=$n/$d^0;}if(!$r)$r[]=0;if($c)$r[]=".";while($c--){$n*=10;$n-=$d*$r[]=$n/$d^0;}echo join($r);

Tôi không có cơ hội nào khác thì 13/7 được rút ngắn xuống còn 1.8571428571429 và tôi đạt được nên không phải là trường hợp thử nghiệm với 27 chữ số thập phân

Cách này 36 byte không được phép

<?=bcdiv(($z=$argv)[1],$z[2],$z[3]);

phân chia phao không được phép theo OP
Maltysen

@Maltysen Sorry I make a rollback.I was so afraid to find a shorter solution that I not recognize that it against the specifation.
Jörg Hülsermann

2

Pyth - 21 19 18 16 14 bytes

Will be looking over the input format, that can prolly save a bunch.

j\.c`/*E^TQE]_

Test Suite. (P.S. the 27 one doesn't finish online, so I did 10 instead).


@Emigna Nor does it have to since 0 is not a positive integer (even though the op keeps adding examples with c=0)
Ton Hospel

@TonHospel: Ah, indeed. I was looking at the examples. I can shorten my answer then :)
Emigna

Doesn't work with numbers that has a leading 0 after the decimal point, for example 2/21 to 10 decimals.
Emigna

2/21 with 10 digits print only 9 digit after the point
RosLuP

2/21 with 10 digits as Emigna says instead of 0.09... print 0.9...
RosLuP

2

JavaScript (ES6),  64  62 59 bytes

Saved 2 bytes thanks to ETHproductions.

The included division always results in an integer.

f=(a,b,n,s)=>~n?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):s

console.log(f(13,7,27))


Would skipping m altogether still work? f=(a,b,n,s)=>n+1?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):s is 60 bytes.
ETHproductions

@ETHproductions - Indeed. Thanks!
Arnauld

2

Java 7, 105 bytes

import java.math.*;String c(int...a){return new BigDecimal(a[0]).divide(new BigDecimal(a[1]),a[2],3)+"";}

Ungolfed & test code:

Try it here.

import java.math.*;
class M{
  static String c(int... a){
    return new BigDecimal(a[0]).divide(new BigDecimal(a[1]), a[2], 3)+"";
  }

  public static void main(String[] a){
    System.out.println(c(1, 2, 1));
    System.out.println(c(1, 2, 2));
    System.out.println(c(13, 7, 27));
    System.out.println(c(2, 3, 1));
    System.out.println(c(4, 5, 7));
    System.out.println(c(4, 5, 0));
    System.out.println(c(9999, 23, 0));
    System.out.println(c(12345613, 2321, 89));
  }
}

Output:

0.5
0.50
1.857142857142857142857142857
0.6
0.8000000
0
434
5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

I don't think this is valid, because it's essentially floating-point division, even though it's called divide and not /.
corvus_192

@corvus_192 Another deleted Java answer that posted later than me had the reasoning, which I'll copy-paste here (Credit for this explanation goes to @SocraticPhoenix): "How It Works: Java BigDecimals are implemented as BigIntegers, with a scale. This is technically floating point, however the BigInteger and BigDecimal objects use only the int type to store numerical value. (Isn't that cool? BigInteger is an int[] of digits. Like, {1,2,5} in base 10 is 125. I'm not sure what base the digits of BigInteger are actually in, but I would guess it's more than 10."
Kevin Cruijssen

2

Ruby, 67 bytes

->(a,b,c){('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/,'\1.\2')}

if I make it a function to execute the test cases above

def print(a,b,c); ('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2'); end
 => :print 
print(1,2,1)   # would print 0.5
 => "0.5" 
print(1,2,2)   # would print 0.50
 => "0.50" 
print(13,7,27) # would print 1.857142857142857142857142857
 => "1.857142857142857142857142857" 
print(2,3,1)   # would print 0.6
 => "0.6" 
print(4,5,7)   # would print 0.8000000
 => "0.8000000" 
print(4,5,1)   # would print 0.8
 => "0.8" 
print(9999,23,1) # would print 434.7
 => "434.7" 
print(12345613,2321,89) # would print if your Language has 32 bit unsigned 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
 => "5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466" 
"('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2')".length
 => 52 

Welcome to code golf! For most languages, when you define a function, you have to define it all the way, and you can't rely on assuming there are predefined variables like that. In Ruby, the shortest way to define a lambda is with ->a,b,c{...} where you replace the ellipses with your code. (The actual assigning of the variable is unneeded by consensus.)
Value Ink

thanks, I was under the wrong impression that others had left out that part... but you're right. I just added it.
Mathieu J.

2

Racket 203 bytes

(let*((s(~r(/ a b)#:precision c))(sl(string-split s "."))(s2(list-ref sl 1))(n(string-length s2)))
(if(< n c)(begin(for((i(- c n)))(set! s2(string-append s2 "0")))(string-append(list-ref sl 0)"."s2))s))

Ungolfed:

(define (f a b c)
  (let* ((s (~r(/ a b)#:precision c))
         (sl (string-split s "."))
         (s2 (list-ref sl 1))
         (n (string-length s2)))
    (if (< n c)
        (begin 
          (for ((i (- c n)))
            (set! s2 (string-append s2 "0")))
          (string-append (list-ref sl 0) "." s2))
        s )))

Usage:

(f 7 5 3)
(f 1 2 1) 
(f 1 2 2) 
(f 13 7 27)

Output:

"1.400"
"0.5"
"0.50"
"1.857142857142857142857142857"

Other method (not valid answer here):

(real->decimal-string(/ a b)c)

I'm afraid this is invalid, because real->decimal-string expects a real value as its first argument, so / is floating point division, which is not allowed in this task. Also: real->decimal-string rounds ((f 1 6 7) -> 0.1666667) instead of truncating.
nimi

Thanks for the observations. I will correct the code soon.
rnso

1

q, 196 bytes

w:{((x 0)div 10;1+x 1)}/[{0<x 0};(a;0)]1;{s:x 0;m:x 2;r:(10*x 1)+$[m<0;{x*10}/[-1*m;a];{x div 10}/[m;a]]mod 10;d:1#.Q.s r div b;($[m=-1;s,".",d;$[s~,:'["0"];d;s,d]];r mod b;m-1)}/[c+w;("";0;w-1)]0

To run: set a, b, c first.


1

Rust, 114 byte

fn print(mut a:u32,b:u32,c:u32){let mut p=||{print!("{}",a/b);a=a%b*10};p();if c>0{print!(".")}for _ in 0..c{p()}}

mã kiểm tra:

fn main() {
    print(1, 2, 1);    println!(""); // should print 0.5
    print(1, 2, 2);    println!(""); // should print 0.50
    print(13, 7, 27);  println!(""); // should print 1.857142857142857142857142857
    print(2, 3, 1);    println!(""); // should print 0.6
    print(4, 5, 7);    println!(""); // should print 0.8000000
    print(4, 5, 0);    println!(""); // should print 0
    print(9999, 23, 0);println!(""); // should print 434
    print(12345613,2321,89); println!("\n");  // 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
}

1

PHP, 89 byte

list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;

intdiv () được giới thiệu trong php 7 vì vậy nó yêu cầu điều đó. php 7.1 sẽ cho phép tôi thay đổi danh sách () thành [] và do đó sẽ tiết kiệm được 4 byte.

sử dụng như:

php -r "list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;" 1 2 1

thay thế $o.=intdiv($a=10*($a%$b),$b);bằng $o.=($a=10*($a%$b))/$b^0;sẽ tiết kiệm 4 byte.
Jörg Hülsermann

Ban đầu tôi sẽ thực hiện lời khuyên đó (tôi đã chỉnh sửa câu trả lời và tất cả mọi thứ) nhưng lần thứ hai nghĩ rằng đó là phân chia điểm trôi nổi và sau đó là một diễn viên để tăng chiều dài <10%, tôi hoàn toàn gắn bó với thông số kỹ thuật của câu hỏi.
dùng59178

1

C #, 126 byte

(a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

Chương trình đầy đủ với các trường hợp thử nghiệm:

using System;
using System.Numerics;

namespace DivisionOfNotSoLittleNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<BigInteger,BigInteger,int,string>f= (a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

            //test cases:
            Console.WriteLine(f(1,2,1));    //0.5
            Console.WriteLine(f(1,2,2));    //0.50
            Console.WriteLine(f(13,7,27));  //1.857142857142857142857142857
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,7));    //0.8000000
            Console.WriteLine(f(4,5,1));    //0.8
            Console.WriteLine(f(9999,23,1));    //434.7
            Console.WriteLine(f(12345613,2321,89)); //5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,2));    //0.80
        }
    }
}

Bộ phận nguyên được thực hiện. Số có kích thước bất kỳ có thể được sử dụng, do BigIntegerloại dữ liệu ( System.Numericsbắt buộc phải nhập ). Tham số đếm số cđược giới hạn ở 2 ^ 31-1, tuy nhiên, nó sẽ cung cấp quá nhiều chữ số.


1

Groovy ( 78 77 42 byte)

{a,b,n->Eval.me(a+'.0g').divide(b, n, 1)}​

Giải trình

Eval.me(a+'.0g');- Chuyển đổi từ đầu vào số nguyên sang đầu vào BigDecimal. Trong Groovy, ký hiệu BigDecimal là ký hiệu kép với G hoặc g được nối thêm. Tôi cũng có thể sử dụng hàm tạo new BigDecimal(it)nhưng điều này đã lưu một byte.
.divide(b, n, 1)- Chia cho b với độ chính xác n, nửa chế độ làm tròn.

Dùng thử tại đây: https://groovyconsole.appspot.com/script/5177545091710976


Nhưng BigDecimal hỗ trợ hoạt động điểm nổi, trừ khi tôi nhầm, tôi tin rằng đã bị cấm trong bài tập này.
Mathieu J.

1

Mẻ, 122 byte

@set/as=%1/%2,r=%1%%%2
@set s=%s%.
@for /l %%a in (1,1,%3)do @set/ad=r*10/%2,r=r*10%%%2&call set s=%%s%%%%d%%
@echo %s%

1

Toán học, 50 byte

StringInsert[ToString@Floor[10^# #2/#3],".",-#-1]&

Chức năng giấu tên của ba đối số (mà được sắp xếp c, a, bđể tiết kiệm ở đâu đó byte), mà trả về một chuỗi. Nó nhân lên a/bbởi 10^c, mất chức năng số nguyên lớn nhất, sau đó chuyển đổi thành một chuỗi và chèn một dấu thập phân ở vị trí thích hợp. Quá tệ, tên hàm không ngắn hơn.


1

Python 3, 62 byte

a,b,c=map(int,input().split());print("{:.{1}f}".format(a/b,c))

Dùng thử tại đây

* Lưu ý : repl.it sử dụng phiên bản cũ hơn của Python 3 , yêu cầu tất cả các chỉ mục trường được chỉ định, thay vào đó, "{:.{1}f}"sẽ có nghĩa là 63 byte trong"{0:.{1}f}" repl.it

Cách sử dụng

Nhập tất cả ba giá trị với khoảng trắng ở giữa. tức là một đầu vào của 1 2 1sẽ cho kết quả là0.5

Giải trình

input().split(): Nhận đầu vào của người dùng và chia nó thành một danh sách với dấu phân cách (dấu cách)

a,b,c = map(int,XX): Ánh xạ các biến vào các giá trị được chỉ định bởi người dùng với kiểu int

"{:.{1}f}".format(a/b,c): Định dạng một chuỗi để hiển thị kết quả phân chia và thay thế {1}bằngc để đặt vị trí thập phân của chuỗi được hiển thị

print(XX): in chuỗi được cung cấp


1

Python 3 , 58 byte

lambda a,b,c:(lambda s:s[:-c]+"."+s[-c:])(str(a*10**c//b))

Hãy thử trực tuyến!

Điều này chính xác với số thập phân được chỉ định miễn là a * 10 ** c là không quá lớn.

Tôi cố gắng Python 2 để rút ngắn str(...)đến `...`nhưng Python 2 chèn một Llúc kết thúc nếu nó quá lớn nên kiểm tra cho rằng sẽ mất cách nhiều byte hơn nó có giá trị.


1

Stax , 13 byte

ä·oαì█↕▬AS¥é▼

Chạy và gỡ lỗi nó

Các đối số được chấp nhận theo c a bthứ tự.


Vấn đề sẽ là trường hợp "in (9999,23,1)" kết quả in trong bài đăng là "434,7" trong khi kết quả của bạn có vẻ như "4,7" giống như trường hợp cuối cùng: 5319,092201etc thay vì 9,092201etc
RosLuP

Tôi không đồng ý ... Tôi đã theo dõi sáng nay liên kết của bạn và kết quả cho trường hợp "in (9999,23,1)" theo thứ tự chức năng của bạn là 4,7 chứ không phải
434,7

@RosLuP: Tôi đã thay đổi cách tiếp cận. Kết quả bây giờ chính xác là `434,7`. Tôi cũng giảm kích thước của một byte trong quá trình này.
đệ quy

0

C, 67 byte

h(a,b,i){int j=!i;for(;printf(j++?"%u":"%u.",a/b),i--;a=10*(a%b));}

Hãy thử trực tuyến!

Một số phiên bản trước tôi nghĩ có lỗi trong bộ nhớ đọc được gán cho chương trình ... Cảm ơn trần và tất cả ...


@ceilingcat ok cảm ơn bạn
RosLuP

Tôi thích cái cuối cùng 69 byte
RosLuP


@ceilingcat ok cảm ơn bạn
RosLuP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.