Çok az sayıdan değil


15

Pozitif tamsayılar alır bir program veya fonksiyon yazın a, bve c, ve baskılar veya döner a/biçin condalık basamağa + işlemlerini kullanarak - pozitif tamsayılar üzerinde [modüle, eklenti, çıkarma, çarpma, bölme] * /%: Tüm kullanabileceğiniz diliniz izin verir, ancak kayan nokta numaralarına izin vermez. A, b, c aralığı, dilinizde işaretsiz tamsayılar için izin verilen aralıktır. Sayı sonucu yazdırılacak son basamağa kısaltılır (yani hayır round).

Bu, dilinizde bir tamsayı türü yoksa (yalnızca kayan nokta), bu kayan noktalı sayıları yalnızca pozitif tamsayı olarak kullanarak katılabileceğiniz anlamına gelir. Bu egzersizin ipucu, yalnızca [işaretsiz] tamsayılarda + - * /% işlemini kullanarak bir kayan nokta bölümündeki rakamları bulan işlevi yazmak olacaktır.

Örnekler

  • print(1,2,1) basar 0.5
  • print(1,2,2) basar 0.50
  • print(13,7,27) basar 1.857142857142857142857142857
  • print(2,3,1) basar 0.6
  • print(4,5,7) basar 0.8000000
  • print(4,5,1) basar 0.8
  • print(9999,23,1) basar 434.7
  • print(12345613,2321,89) Dilinizde 32 bit işaretsizse yazdırılır 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

Bayt cinsinden en kısa kod kazanır. Bu net görünmüyorsa özür dilerim ... Dilleri de bilmiyorum, kelimeleri iyi hatırlamıyorum ... Cevabı kolayca denemek için Ideone.com'a veya başka bir yere bağlantı vermek daha iyidir. bazı girişleri önerilenden farklı test edin.


1
A, b, c tamsayılarının aralığı nedir?
Ton Hospel

@ Hospel a, b, c aralığı, Dilinizde imzasız tam sayı için izin verilen aralık olacaktır: örneğin 32 bit imzasızsa 0..0xFFFFFFFF olur, ancak c> = 0xFFFFFFF çok büyükse çıktı biraz yavaş ol ...
RosLuP

2
Bir yuvarlama işlevidir - veya daha doğrusu, düzgün bir şekilde belirtilmesi için bir yuvarlama işlevi olması gerekir. Şu anda, örneğin doğru cevabın ne olacağı belirsiz (1,2,0). Bkz. Meta.codegolf.stackexchange.com/a/5608/194
Peter Taylor

1
Bu soruyu tekrar açtığım için üzgünüm; Sanırım Peter Taylor'ın işaret ettiği sorun dışında yeniden açılmaya neredeyse hazır. Fo çıktı nedir (1,2,0)?
ETHproductions

2
Olumlu bir tamsayı olmadığı için aslında (1,2,0)alakasız olmalıdır 0. Böyle c kalıntıları Ben ekleyerek düşünmek zorunda tercih ediyorum çünkü eğer bunu tercih ediyorum .ya da değil
Ton Hospel

Yanıtlar:


5

05AB1E , 17 13 11 19 14 bayt

Formu girin b, a, c. Grimy
sayesinde 5 bayt kurtardı .

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

Çevrimiçi deneyin!


Ben sadece 13,7,27 giriş ile çevrimiçi denedim ve cevap doğru değil
Mathieu J.

@shigazaru: Test senaryolarıyla aynı sonucu döndürür . Girişlerin sırasının olduğunu fark ettiniz b,a,cmi?
Emigna

Bu bölümün olduğu "Çevrimiçi deneyin" düğmesini deniyorum: 89 basamaklı 12345613/2321, ancak sonuç 5319.0922 yerine 5319.922 ... gibi bir şey var ...
RosLuP

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

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

4

Haskell, 87 bayt

(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

Kullanım örneği: (13#7)27-> "1.857142857142857142857142857".

c==0Davayı işlemek için 23 bayt ve bunun gibi şeyler yerine önde gelen bir sıfır kullanmak .5.

Nasıl çalışır: çarpın aile 10^cbölün, bbir dizeye, split dönüşebilir .takılı olmalıdır, her iki parça katılmak bir .arada ve sınır durumları düzeltmek.


4

Perl 6 ,  58 57 55  48 bayt

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

Oldukça can sıkıcı olan şey {($^a.FatRat/$^b).base(10,$^c)}, en yakın değere yuvarlanmasına izin verilmesi durumunda kısaltılabilmesidir .

Açıklama:

# 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'ya aşina değilim, ama (...).FatRat / 10**$xbir Akılcılığın bir bölümü değil mi? Yalnızca tamsayıları bölmenize izin verilir.
nimi

@nimi bir Rasyonel iki olan bir sınıftır Ints .
Brad Gilbert b2gills

Matematik işleçlerine yalnızca tam sayı türleri için izin verilir, diğer sayısal türler için izin verilmez. Alıntı: "Bu alıştırmanın ipucu ... fonksiyon yazmak için ... sadece [işaretsiz] tamsayılar üzerinde + - * /% işlemini kullanarak."
nimi

@nimi Peki, Rational'in yeniden uygulanmasını yazsaydım ve buna izin vermediyse does Realveya does Numericbuna izin verilirse? Bu rolleri kaldırmak için mevcut sınıfı arttırırsam (maymun yaması), buna izin verilir mi?
Brad Gilbert b2gills

Bilmiyorum. Daha önce de belirtildiği gibi özellikleri okudum: +-*/%sadece düz tamsayı tipleriyle. işlevsellik açısından "düz tamsayı" (her şeyden önce: tamsayı bölme) iç temsili değildir. Sizce (isme rağmen) sadece dahili temsil için tamsayılar kullanan bir yazılım kayan nokta kitaplığı kullanılmasına izin veriliyor mu?
nimi

3

Perl, 55 bayt

İçin +3 içerir -p

STDIN'de bir satırda a ve b, sonraki satırda c

division.pl
1 26
38
^D

division.pl:

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

$_/$&Biraz tartışılabilir. Aslında orada bir tamsayı bölümü istiyorum ama perl özel modülleri yüklemeden buna sahip değil. Bu yüzden geçici olarak tamsayı olmayan bir tamsayı, sonra hemen kesiyorum (kullanarak |0) bu yüzden bir tamsayı bölümü verecek tamsayı ile sonuçlanır. ($_-$_%$&)/$&Geçici olarak tamsayı olmayan bir değere sahip olmamak için yeniden yazılabilir (yine de dahili olarak hala bir kayan nokta olacaktır)


$-Sadece int yapmak için kullanabilir misiniz ? (Ben karışımı / max üzerinde sıkı sınırlar olduğunu düşünüyorum, ve eminim zaten düşünmüştüm, ama kontrol etmeye değer olsa da!)
Dom Hastings

@DomHastings Kayan nokta bölümü yaptıktan sonra yine de kısaltılmış olur. Perl olmadan tamsayı bölümü yokuse integer
Ton Hospel

Ah, bu yüzden sadece maskeli $-, bilmek güzel. Teşekkürler!
Dom Hastings

3

JavaScript (ES6), 55 50 bayt

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

(a/b|0)şamandıra bölümü gerçekleştirir ancak hemen bir tamsayıya yayınlar. İzin verilmiyorsa lütfen bana bildirin.


3

PHP, 187 Bayt

int için daha büyük olabilir, pay için dizelerle çalışır 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'a kısaldığında başka şansım yok ve 27 ondalık basamaklı test davasına ulaşamıyorum

Bu şekilde 36 Bayt'a izin verilmez

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

Şamandıra bölümüne OP uyarınca izin verilmez
Maltysen

@Maltysen Üzgünüm bir geri alma yapıyorum. Daha kısa bir çözüm bulmaktan çok korktum ve spesifikasyona göre tanımadığım için.
Jörg Hülsermann

2

Pyth - 21 19 18 16 14 bayt

Bir grup prolly kaydedebilirsiniz giriş formatı üzerinden bakacak.

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

Test Takımı . (PS 27 bir çevrimiçi bitmez, ben bunun yerine 10 yaptım).


@Emigna Ne de o zamandan beri 0pozitif bir tamsayı değil (op ile örnekler eklemeye devam ediyor olsa da c=0)
Ton Hospel

@TonHospel: Ah, gerçekten. Örneklere bakıyordum. Cevabımı kısaltabilirim :)
Emigna

Ondalık noktadan sonra 0 önde gelen sayılarla çalışmaz, örneğin 2/21 ila 10 ondalık sayı.
Emigna

10 basamaklı 2/21 noktadan sonra yalnızca 9 basamak
basar

2/21 Emigna'nın söylediği gibi 10 basamaklı 0.09 ... baskı 0.9 ...
RosLuP

2

JavaScript (ES6),  64  62 59 bayt

ETHproductions sayesinde 2 bayt tasarruf etti.

Dahil edilen bölüm her zaman bir tamsayı ile sonuçlanır.

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


mTamamen atlamak hala işe yarar 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 bayttır.
ETHproductions

@ETHproductions - Gerçekten. Teşekkürler!
Arnauld

2

Java 7, 105 bayt

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

Test edilmemiş ve test kodu:

Burada deneyin.

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

Çıktı:

0.5
0.50
1.857142857142857142857142857
0.6
0.8000000
0
434
5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

Aslında bölünme noktası yüzüyor çünkü denir rağmen, bu geçerli olduğunu düşünmüyorum dividedeğil /.
corvus_192

@ corvus_192 Benden sonra gönderilen başka bir silinen Java yanıtı, burada kopyalayıp yapıştıracağım mantığı vardı (Bu açıklama için kredi @SocraticPhoenix'a gidiyor ): " Nasıl Çalışır: Java BigDecimals, bir ölçekle BigIntegers olarak uygulanır. Bu teknik olarak kayan bir noktadır, ancak BigInteger ve BigDecimal nesneleri yalnızca intsayısal değeri depolamak için türü kullanır. (Bu harika değil mi? BigInteger bir int[]basamaktır. 10 tabanındaki {1,2,5}, 125'dir. BigInteger rakamlarının gerçekte hangi bazda olduğundan emin değilim, ama 10'dan fazla olduğunu tahmin ediyorum. "
Kevin Cruijssen

2

Ruby, 67 bayt

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

yukarıdaki test senaryolarını yürütmeyi bir işlev haline getirirsem

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 

Golf koduna hoş geldiniz! Çoğu dil için, bir işlevi tanımladığınızda, onu tam olarak tanımlamanız gerekir ve bunun gibi önceden tanımlanmış değişkenler olduğunu varsaymaya güvenemezsiniz. Ruby'de lambda tanımlamanın en kısa yolu ->a,b,c{...}, elipsleri kodunuzla değiştirmektir. (Değişkenin gerçek ataması fikir birliği ile gereksizdir.)
Değer Mürekkep

teşekkürler, başkalarının bu kısmı dışarıda bıraktığı yanlış izlenimindeydim ... ama haklısın. Az önce ekledim.
Mathieu

2

Raket 203 bayt

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

Kullanımı:

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

Çıktı:

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

Diğer yöntem (burada geçerli cevap değil):

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

Korkarım bu geçersiz, çünkü ilk argüman olarak real->decimal-stringbir realdeğer bekliyor , bu yüzden /bu görevde izin verilmeyen kayan nokta bölümü var. Ayrıca: kısaltma yerine real->decimal-stringyuvarlar ( (f 1 6 7)-> 0.1666667).
nimi

Gözlemler için teşekkürler. Kodu yakında düzeltirim.
rnso

1

q, 196 bayt

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

Çalıştırmak için: önce a, b, c'yi ayarlayın.


1

Pas, 114 bayt

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

test kodu:

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 bayt

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

intdiv () php 7'de kullanılmaya başlandığından bunu gerektirir. php 7.1 () listesini [] olarak değiştirmeme izin verir ve böylece 4 bayt tasarruf eder.

gibi kullanın:

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

yerine $o.=intdiv($a=10*($a%$b),$b);ile $o.=($a=10*($a%$b))/$b^0;4 Bayt kurtaracak.
Jörg Hülsermann

Başlangıçta bu tavsiyeyi alacağım (cevabı ve her şeyi düzenledim) ama ikinci olarak kayan nokta bölümü olduğunu ve daha sonra int için bir döküm olduğunu düşündüm, böylece uzunluktaki <% 10'luk bir artış için tamamen soru.
user59178

1

C #, 126 bayt

(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 senaryolarıyla birlikte tam program:

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

Tamsayı bölümü uygulanır. BigIntegerVeri türü nedeniyle herhangi bir boyuttaki numaralar kullanılabilir (içe aktarma System.Numericsgereklidir). Rakam sayısı parametresi c2 ^ 31-1 ile sınırlıdır, ancak yeterli sayıda rakam içermelidir.


1

Harika ( 78 77 42 Bayt)

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

açıklama

Eval.me(a+'.0g');- Tamsayı girişinden BigDecimal girişine dönüştürün. Harika BigDecimal gösterimi ekli G veya g ile çift gösterimdir. Ben de yapıcı kullanabilirsiniz new BigDecimal(it)ama bu bir bayt kurtardı.
.divide(b, n, 1)- n hassasiyetli, yuvarlama modu yarı yukarı b ile bölün.

Burada deneyin: https://groovyconsole.appspot.com/script/5177545091710976


Ancak BigDecimal, yanılmıyorsam, bu egzersiz için yasak olduğuna inanılan kayan nokta işlemini destekler.
Mathieu J.

1

Toplu, 122 bayt

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

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

(Sıralanır üç bağımsız değişken Adsız fonksiyonu c, a, bbir dize döndürür, bir bayt bir yere kaydetmek için). Bu çarpar a/btarafından 10^c, bir dizeye, sonra dönüştürür büyük tamsayı fonksiyonunu alır ve uygun noktada bir ondalık noktayı ekler. Çok kötü işlev adları daha kısa değil.


1

Python 3, 62 Bayt

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

Buradan Deneyin

* Not : repl.it ver eski kullanır Python 3 belirtilecek tüm alan indeksleri gerektirir, anlamı "{:.{1}f}"olacak "{0:.{1}f}"onu yapma yerine 63 bayt içinde repl.it

Nasıl kullanılır

Aradaki boşluklarla üç değeri de girin. yani bir girdisi 1 2 1sonucu0.5

açıklama

input().split(): Kullanıcı girişini alır ve (boşluk) ayırıcısı ile bir listeye böler

a,b,c = map(int,XX): Değişkenleri int türüyle kullanıcı tarafından belirtilen değerlerle eşler

"{:.{1}f}".format(a/b,c): Biçimleri bir dize bölümü sonucunu ve yerine geçen gösterilecek {1}ile cgörüntülenen dize ondalık yeri ayarlamak için

print(XX): verilen dizgeyi yazdırır


1

Python 3 , 58 bayt

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

Çevrimiçi deneyin!

Bu, belirtilen ondalık sayıya kadar kesin a * 10 ** c çok büyük olmadığı .

Ben kısaltmak için Python 2 denedik str(...)için `...`ancak Python 2 ekler bir Lo kontrol daha yol almak 's yetmeyecek kadar bayt olur bu yüzden çok büyük ise sonunda.


1

Stax , 13 bayt

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

Çalıştır ve hata ayıkla

Argümanlar c a bsırayla kabul edilir .


Sorun, yazıdaki "baskı (9999,23,1)" durumudur, sonuçta "434.7" olurken, sonucunuz son olarak aynı "4.7" gibi görünür: 9.092201etc yerine 5319.092201etc
RosLuP

Kabul etmiyorum ... Bu sabah bağlantınızı takip ettim ve işlev siparişinizdeki "print (9999,23,1)" davasının sonucu 434,7 değil, 4.7 idi
15'te RosLuP

@RosLuP: Yaklaşımı değiştirdim. Sonuç artık doğru bir şekilde '434.7'. Ayrıca, işlemdeki boyutu bir bayt azalttım.
özyinelemeli

0

C, 67 bayt

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

Çevrimiçi deneyin!

Some previous version I think had a bug in read memory out of assigned to the program...Thanks to ceilingcat and for all...


@ceilingcat ok thank you
RosLuP

I like the last one 69 bytes
RosLuP


@ceilingcat ok thank you
RosLuP
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.