적은 숫자의 사단


15

양의 정수에 걸리는 프로그램이나 함수를 작성 a, bc, 및 인쇄 또는 반환 a/bc소수점, + 작업을 사용하여 - 양의 정수에 [는 조절 추가, 빼기, 곱하기, 나누기] * / % : 당신은 모두를 사용할 수 귀하의 언어는 부동 소수점 숫자를 허용하지만 허용하지는 않습니다. a, b, c의 범위는 사용자 언어에서 부호없는 정수에 허용되는 범위입니다. 숫자 결과는 인쇄 할 마지막 숫자로 잘립니다 (그래서 no round).

즉, 언어에 정수 유형이없는 경우 (float 만 해당) 이러한 float 숫자를 양의 정수로만 사용하여 참여할 수 있습니다. 이 연습의 단서는 [부호없는] 정수에서 +-* / % 연산 만 사용하여 부동 소수점 나누기에서 숫자를 찾는 함수를 작성하는 것입니다.

  • print(1,2,1) 인쇄 할 것이다 0.5
  • print(1,2,2) 인쇄 할 것이다 0.50
  • print(13,7,27) 인쇄 할 것이다 1.857142857142857142857142857
  • print(2,3,1) 인쇄 할 것이다 0.6
  • print(4,5,7) 인쇄 할 것이다 0.8000000
  • print(4,5,1) 인쇄 할 것이다 0.8
  • print(9999,23,1) 인쇄 할 것이다 434.7
  • print(12345613,2321,89) 언어에 부호가없는 32 비트가있는 경우 인쇄 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

바이트 단위의 가장 짧은 코드가 이깁니다. 이것이 명확하지 않으면 유감입니다. 언어도 모릅니다. 단어를 잘 기억하지 마십시오 ... 제안 된 것과 다른 입력을 테스트하십시오.


1
정수 a, b, c의 범위는 무엇입니까?
Ton Hospel

@Ton Hospel a, b, c의 범위는 언어에서 부호없는 정수를 허용하는 범위입니다. 조금 느려 ...
RosLuP

2
반올림 함수입니다.보다 정확하게는 올바르게 지정하려면 반올림 함수 여야합니다. 현재 정답이 무엇인지 확실하지 않습니다 (1,2,0). 참조 meta.codegolf.stackexchange.com/a/5608/194
피터 테일러

1
이 질문을 다시 열어서 죄송합니다. 피터 테일러가 지적한 문제를 제외하고는 거의 다시 문을 열 준비가 된 것 같습니다. 출력은 무엇입니까 (1,2,0)?
ETHproductions

2
양의 정수가 아니기 (1,2,0)때문에 실제로 는 관련 0이 없습니다. 같은 C의 유적은 내가 추가에 대해 생각하지 않아도 선호하는 것 때문에 경우 그리고 나는 그것을 원합니다 .여부
톤 Hospel

답변:


5

05AB1E , 17 13 11 19 14 바이트

형식으로 입력하십시오 b, a, c. Grimy
덕분에 5 바이트를 절약했습니다 .

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

온라인으로 사용해보십시오!


방금 입력 13,7,27로 온라인으로 시도했지만 대답이 올바르지 않습니다.
Mathieu J.

@ 시가 자루 : 테스트 사례 와 동일한 결과를 반환 합니다 . 입력 순서는 b,a,c무엇입니까?
Emigna

이 부서가있는 곳에서 "온라인 시도"버튼을 사용해보십시오. 89 자리의 12345613/2321이지만 결과는 5319.0922 대신 5319.922 ...입니다.
RosLuP

1
15 :‰`I°*¹÷I°+¦'.sJ
그리미

2
14 :‰`¹+I°*¹÷¦'.sJ
그리미

4

하스켈, 87 바이트

(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

사용 예 : (13#7)27-> "1.857142857142857142857142857".

23 바이트를 처리하고 c==0와 같은 대신 0을 사용합니다 .5.

그것이 작동하는 방법 : 곱셈 a10^c의해 나누기 b는이 문자열 분할로 전환 .삽입해야합니다으로 두 부분을 조인 .의 사이 가장자리 케이스를 고정합니다.


4

펄 6 ,  58 57 55  48 바이트

{(($^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}

상당히 성가신 것은 {($^a.FatRat/$^b).base(10,$^c)}가장 가까운 값으로 반올림 된 경우 로 단축 될 수 있다는 것 입니다.

설명:

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

나는 perl6에 익숙하지 않지만 (...).FatRat / 10**$x, Rational의 부서가 아닌가? 정수만 나눌 수 있습니다.
nimi

@nimi a Rational 은 두 개의 Ints를 가진 클래스입니다 .
Brad Gilbert b2gills

수학 연산자는 정수 유형에만 허용되며 다른 숫자 유형에는 허용되지 않습니다. 인용구 : "[부호없는] 정수에 +-* / % 연산 만 사용하여 함수를 작성하는이 연습의 실마리."
nimi

@nimi 그렇다면 Rational을 다시 구현하고 추가하지 않았 does Real거나 does Numeric허용된다면? 해당 역할을 제거하기 위해 기존 클래스를 보강 (원숭이 패치)하면 어떻게됩니까?
브래드 길버트 b2gills

몰라 이전에 말한대로 스펙을 읽었습니다 : +-*/%일반 정수 유형에서만. 내부 표현이 아닌 기능성 (정수 나누기) 측면에서 "일반 정수". 소프트웨어 부동 소수점 라이브러리를 사용할 수 있다고 생각합니까 (이름에도 불구하고) 내부 표현에 정수만 사용합니까?
nimi

3

펄, 55 바이트

에 +3 포함 -p

STDIN에서 한 줄에 a와 b를, 다음 줄에 c를 줘

division.pl
1 26
38
^D

division.pl:

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

$_/$&약간의 논쟁의 여지가있다. 실제로 정수 나누기를 하지만 특수 모듈을로드하지 않고는 펄이 없습니다. 따라서 일시적으로 정수가 아닌 정수이며 즉시 (을 사용하여 |0) 잘라내어 정수 나누기가주는 정수로 끝납니다. ($_-$_%$&)/$&정수가 아닌 값을 일시적으로 갖지 않기 위해 다시 작성할 수 있습니다 (내부적으로 여전히 부동 소수점 임)


당신이 사용할 수 $-그것은 단지 int로 만들어? (나는 그것의 혼합 / 최대에 엄격한 제한이 있다고 생각하고, 당신은 이미 그것을 고려했을 것입니다,하지만 확인 가치가 있지만!)
Dom Hastings

@DomHastings 부동 소수점 나누기를 한 후에도 여전히 잘립니다. 펄은 단순히 정수 나누기가 없다use integer
Ton Hospel

아, 그냥 가려져있어서 $-좋습니다. 감사!
Dom Hastings

3

자바 스크립트 (ES6), 55 50 바이트

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

(a/b|0)float 나누기를 수행하지만 즉시 정수로 캐스트합니다. 이것이 허용되지 않는 경우 알려주십시오.


3

PHP, 187 바이트

분자의 문자열과 함께 작동하며 int 값보다 클 수 있습니다 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);

13/7이 1.8571428571429로 단축 된 다른 기회는 없으며 소수점 이하 27 자리로 테스트 케이스에 도달하지 못합니다.

이 방법은 36 바이트는 허용되지 않습니다

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

플로트 분할은 OP에 따라 허용되지 않습니다
Maltysen

@Maltysen 죄송합니다. 롤백을하셨습니다. 사양에 대한 인식이 불가능한 더 짧은 솔루션을 찾는 것이 너무 두려웠습니다.
Jörg Hülsermann

2

Pyth- 21 19 18 16 14 바이트

입력 형식을 살펴보고 번거롭게 저장할 수 있습니다.

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

테스트 스위트 . (PS 27은 온라인으로 끝나지 않으므로 대신 10을했습니다.)


@Emigna 또한 그 이후 0로 양의 정수가 아니 어야한다 (op가 예제를 계속 추가하더라도 c=0)
Ton Hospel

@TonHospel : 아, 그래요. 나는 예를보고있었습니다. 나는 대답을 짧게 할 수있다. :)
Emigna

소수점 뒤에 선행 0이있는 숫자 (예 : 2/21-10 소수)에서는 작동하지 않습니다.
Emigna

2/21 10 자리 숫자는 단지 시점 이후 9 자리 인쇄
RosLuP

Emigna으로 10 자리 2/21은 ... 0.9 인쇄 ... 대신 0.09로 말한다
RosLuP

2

자바 스크립트 (ES6),  64  62 59 바이트

ETH 프로덕션 덕분에 2 바이트를 절약했습니다.

포함 된 나누기는 항상 정수입니다.

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


건너 뛰기 m가 여전히 작동합니까? f=(a,b,n,s)=>n+1?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):s60 바이트입니다.
ETHproductions

@ETHproductions-참으로. 감사!
Arnauld

2

자바 7, 105 바이트

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

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

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

산출:

0.5
0.50
1.857142857142857142857142857
0.6
0.8000000
0
434
5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

이것이 호출 divide되지 않고 본질적으로 부동 소수점 나누기 때문에 이것이 유효하다고 생각 하지 않습니다 /.
corvus_192

@ corvus_192 나보다 나중에 게시 된 또 다른 삭제 된 Java 응답은 추론을 통해 여기에 복사하여 붙여 넣습니다 (이 설명에 대한 크레딧은 @SocraticPhoenix 참조 ) . 이것은 기술적으로 부동 소수점이지만 BigInteger 및 BigDecimal 오브젝트는 int숫자 값을 저장하기 위해 유형 만 사용 합니다 (멋지지 않습니까? BigInteger는 int[]자릿수입니다. 예를 들어 10 진의 {1,2,5}는 125입니다. I BigInteger의 숫자가 실제로 어떤 자리에 있는지 잘 모르겠지만 10보다 큽니다. "
Kevin Cruijssen

2

루비, 67 바이트

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

위의 테스트 사례를 실행하는 기능으로 만들면

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 

코드 골프에 오신 것을 환영합니다! 대부분의 언어에서 함수를 정의 할 때는 항상 정의해야하며, 사전 정의 된 변수가 있다고 가정 할 수는 없습니다. Ruby에서 람다를 정의하는 가장 짧은 방법 ->a,b,c{...}은 타원을 코드로 바꾸는 것입니다. (변수의 실제 할당은 컨센서스에 의해 필요하지 않습니다.)
Value Ink

고마워, 나는 다른 사람들이 그 부분을 배제했다는 잘못된 인상을 받았다. 그러나 당신은 옳다. 방금 추가했습니다.
Mathieu J.

2

라켓 203 바이트

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

언 골프 드 :

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

용법:

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

산출:

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

다른 방법 (여기서 정답이 아닙니다) :

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

첫 번째 인수로 값을 real->decimal-string기대 real하므로 /부동 소수점 나누기 이므로이 작업에서 허용되지 않으므로 이것이 유효 하지 않습니다. 또한 : 잘리지 않고 real->decimal-string반올림 ( (f 1 6 7)-> 0.1666667)합니다.
nimi

관찰 해 주셔서 감사합니다. 곧 코드를 수정하겠습니다.
rnso

1

q, 196 바이트

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

실행하려면 : 먼저 a, b, c를 설정하십시오.


1

녹, 114 바이트

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()}}

테스트 코드 :

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 바이트

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

intdiv ()는 PHP 7에 도입되었으므로 필요합니다. PHP 7.1에서는 list ()를 []로 변경할 수 있으므로 4 바이트를 절약 할 수 있습니다.

다음과 같이 사용하십시오.

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

교체 $o.=intdiv($a=10*($a%$b),$b);$o.=($a=10*($a%$b))/$b^0;4 바이트 저장합니다.
Jörg Hülsermann

처음에 나는 그 조언을 받아 들일 것입니다 (나는 대답과 모든 것을 편집했습니다). 그러나 두 번째로 그것이 부동 소수점 나누기이고 int로 캐스트되어 길이가 10 % 미만으로 증가하기를 바랍니다. 질문.
user59178

1

C #, 126 바이트

(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),".");};

테스트 케이스가 포함 된 전체 프로그램 :

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

정수 나누기가 구현됩니다. BigInteger데이터 유형 으로 인해 모든 크기의 숫자를 사용할 수 있습니다 (가져 오기 System.Numerics필요). 자릿수 계수 매개 변수 c는 2 ^ 31-1로 제한되지만 충분한 자릿수를 제공해야합니다.


1

그루비 ( 78 77 42 바이트)

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

설명

Eval.me(a+'.0g');-정수 입력에서 BigDecimal 입력으로 변환합니다. groovy에서 BigDecimal 표기법은 G 또는 g가 추가 된 이중 표기법입니다. 생성자를 사용할 수도 new BigDecimal(it)있었지만 바이트가 절약되었습니다.
.divide(b, n, 1)-반올림 모드를 반올림하여 n 정밀도로 b로 나눕니다.

여기에서 시도하십시오 : https://groovyconsole.appspot.com/script/5177545091710976


그러나 BigDecimal은 실수하지 않으면이 운동에 대해 금지 된 것으로 생각되는 부동 소수점 연산을 지원합니다.
Mathieu J.

1

배치, 122 바이트

@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

Mathematica, 50 바이트

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

(정렬 세 개의 인수의 이름 기능 c, a, b문자열을 반환, 바이트 어딘가에 저장). 이 곱하기 a/b10^c가장 큰 정수 함수를 취한 다음 문자열로 변환하여 적절한 지점에 소수점을 삽입합니다. 함수 이름이 짧지 않은 것이 너무 나쁩니다.


1

파이썬 3, 62 바이트

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

여기 사용해보십시오

* 참고 : repl.it이 버전의 이전 사용 파이썬 3 지정할 수있는 모든 필드 인덱스를 필요로 의미가 "{:.{1}f}"있을 것입니다 "{0:.{1}f}"그것을 만드는 대신 63 바이트 에서 repl.it을

사용하는 방법

사이에 공백이있는 세 값을 모두 입력하십시오. 즉, 입력 1 2 10.5

설명

input().split(): 사용자 입력을 가져 와서 (공백)으로 구분 된 목록으로 분할합니다.

a,b,c = map(int,XX): 변수를 int 유형의 사용자가 지정한 값으로 맵핑합니다.

"{:.{1}f}".format(a/b,c): 나누기 결과를 표시하도록 문자열을 형식화 {1}하고c 하고 표시된 문자열의 소수점 이하 자릿수를

print(XX): 제공된 문자열을 인쇄합니다


1

파이썬 3 , 58 바이트

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

온라인으로 사용해보십시오!

a * 10 ** c너무 크지 않은 한 지정된 소수 자릿수까지 정확합니다 .

나는 파이썬 2를 줄여서 str(...)to를 줄 `...`였지만 파이썬 2는 L너무 큰 경우 끝에를 삽입 하므로 그 값을 확인하는 데 가치가있는 것보다 많은 바이트가 필요합니다.


1

Stax , 13 바이트

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

실행 및 디버깅

인수는 c a b순서대로 허용됩니다 .


문제는 "print (9999,23,1)"의 경우입니다. 포스트의 결과 인쇄는 "434.7"이지만 결과는 "4.7"인 것처럼 보입니다. 9.092201etc 대신 5319.092201etc
RosLuP

동의하지 않습니다 ... 오늘 아침에 귀하의 링크를 따르고 귀하의 기능 순서에서 "print (9999,23,1)"사례에 대한 결과는 4.7이며 434.7이 아닙니다.
RosLuP

@RosLuP : 접근 방식을 변경했습니다. 결과는 이제 정확히 434.7입니다. 또한 프로세스에서 바이트 크기를 줄였습니다.
재귀

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.