ভগ্নাংশটি পুনরাবৃত্ত দশমিককে রূপান্তর করুন


17

প্রায় এই মেরুটি যদি এই চ্যালেঞ্জের বিপরীতে থাকে তবে আমার সন্দেহ হয় যে এটি কিছুটা সহজ হবে।

আপনার কাজটি হ'ল বিন্যাসে দুটি পূর্ণসংখ্যা নেওয়া a/b(যৌক্তিক সংখ্যা গঠন করা) তারপরে দশমিকের মধ্যে সংখ্যাটি ঠিক আউটপুট করুন।

উদাহরণস্বরূপ, আপনি যদি ইনপুট 1/3করতে চান তবে এটি আউটপুট দেয়:

0.33333333333333333

এবং sচ্ছিক শীর্ষস্থানীয় 0 সহ সময়ের শেষে অবধি 3 এস মুদ্রণ অব্যাহত রাখবে (( আপনার ভাষা একই লাইনে মুদ্রণের অনুমতি না দিলে আপনি কেবল লাইন প্রতি একটি অক্ষর মুদ্রণ করতে পারবেন))

এর জন্য আচরণটি x/0সংজ্ঞায়িত হবে। এমন কোনও সংখ্যার জন্য যা দেখে মনে হচ্ছে এটি পুনরাবৃত্তি করে না (পছন্দ করুন, বলুন 5/4) এটি আসলে পুনরাবৃত্তি করে। নিম্নলিখিত দুটি ফর্মগুলির যে কোনওটির জন্য গ্রহণযোগ্য হবে 5/4:

1.25000000000000000
1.24999999999999999

(পুরো সংখ্যার সাথে একই 1.9999999বা 2.000000)

ভগ্নাংশ সরলতম ফর্ম নাও থাকতে পারেন, এবং aবা bনেতিবাচক হতে পারে (নোট -a/b = -(a/b), -a/-b = a/b, a/-b = -a/b, এবং -.6249999অবৈধ, কিন্তু -0.6249999গ্রহণযোগ্য, কিন্তু আপনি এখনও ব্যবহার করতে পারেন।


আমরা কি ইউনিক্স ব্যবহার করতে পারি bc, নাকি তা প্রতারণা করছে?
ডেভিড আর ট্রিবল 4'15

আমি আমার উত্তরটি গলফ করে রাখার আগে: aএবং / বা bনেতিবাচক হতে পারে?
ডেনিস

@ ডেনিস হ্যাঁ, তবে হয় aবা b(বা উভয়ই নেতিবাচক হতে পারে)

@ ডেভিডআর ট্রিবিবল আমি মনে করি এটি একটি আদর্শ ফাঁক, তাই না no

আপনার সর্বশেষ সম্পাদনাটি কি বলেছে যে শীর্ষস্থানীয় শূন্যগুলি ইতিবাচক সংখ্যা সহ ঠিক আছে, তবে নেতিবাচক নয়? যদি তা হয় তবে এর কারণ কী?
জিওবিটস

উত্তর:


2

সিজেম, 38 37 বাইট

l'/%:i2*~*0<'-*o:Dmd\zo'.{oA*Dmd\z1}g

কিভাবে এটা কাজ করে

l     e# Read line from STDIN.            STACK '17/-13'
'/%   e# Split at '/'.                    STACK ['17' '-13']
:i    e# Cast each element to int.        STACK [17 -13]
2*~   e# Duplicate and dump the array.    STACK 17 -13 17 -13
*     e# Multiply.                        STACK 17 -13 -221
0<    e# Compare with zero.               STACK 17 -13 1
'-*o  e# Print '-' that many times.       STACK 17 -13
:D    e# Save the topmost integer in D.   STACK 17 -13
md    e# Perform modular division.        STACK -1 4
\z    e# Swap and take absolute value.    STACK 4 1
o'.   e# Print and push '.'.              STACK 4 '.'
{     e# do:
  o   e#   Print.                         STACK 4
  A*  e#   Multiply by 10.                STACK 40
  Dmd e#   Divide modulo D.               STACK -3 1
  \z  e#   Swap and take absolute value.  STACK 1 3
  o   e#   Print.                         STACK 1
1}g   e# while(1)

আপনি যেহেতু দ্বিগুণ বিভাগ ব্যবহার করছেন এটি কি বিশাল সংখ্যার জন্য পুরোপুরি ভাঙ্গা নয়?
orlp

@ অরলপ: সম্পূর্ণ এটা এখন ঠিক।
ডেনিস

6

সি, 108 79

Negativeণাত্মক সংখ্যা নিয়ে কাজ করার জন্য সম্পাদনা করুন

স্টিডিন থেকে ইনপুট। পুরানো কে অ্যান্ড আর শৈলী।

main(a,b){char*s="-%d.";scanf("%d/%d",&a,&b);for(a*b<0?(a<0?a=-a:(b=-b)):++s;printf(s,a/b);s="%d")a=a%b*10;}

4

রুবি, 83 69 102 91 89 বাইট

->s{a,b=s.scan(/\d+/).map &:to_i
eval(s+?r)<0&&$><<?-
$><<a/b<<?.
loop{a=a%b*10
$><<a/b}}

কম্পিউটারের পূর্ণসংখ্যা বিভাগের ভিত্তিতে ম্যানুয়াল পূর্ণসংখ্যা বিভাগের সহজ বাস্তবায়ন।

গল্ফিংয়ে সহায়তার জন্য @ ব্লুটোরেজকে ধন্যবাদ

সম্পাদনা করুন: negativeণাত্মক সংখ্যা অন্তর্ভুক্ত করার জন্য সমাধান স্থির করে।


2
রুবিতে কিছু শর্টকাট ব্যবহার করে আপনি এটিকে 66 66 বাইটে নামিয়ে আনতে পারেন: ->s{a,b=s.split(?/).map &:to_i;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}আমি কেবল রুবি সম্পর্কে এটি পছন্দ করি।
ব্লুটোরেঞ্জ

বাহ, আমি কেবল অনেক কিছুই শিখেছি, ধন্যবাদ! আমি ?/চরিত্রগুলি বোঝাতে চাইনি $><<বা মুদ্রণ বা loopকীওয়ার্ড সম্পর্কে জানতাম না । অনেক ধন্যবাদ!!
রোরলর্ক 4'15

1
আপনাকে স্বাগত জানাই, কেউ কেউ এটিকে নির্দেশ না করা পর্যন্ত আমি এর মধ্যে অনেক কৌশল সম্পর্কে জানতাম না। $>জন্য সংক্ষিপ্ত $stdout, এবং <<একটি অপারেটর। আপনি দ্বিতীয় লাইনে এটি পরিবর্তন করে আরও একটি বাইট সংরক্ষণ করতে পারেন c*d<0&&$><<?-; তৃতীয় / চতুর্থ লাইনের সাথে একত্রে কয়েকটি বাইট এবং শেষ লাইনে $><<a/b<<?.পরে স্থানটি সরিয়ে আরও একটি বাইট <<এবং এটিকে 91 বাইটে নামিয়ে আনার একটি ধারণা এখানে রয়েছে: ->s{a,b=s.scan(/\d+/).map &:to_i;1==s.count(?-)&&$><<?-;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}(রুবি
২.২.০

সিনট্যাক্সটি $><<a/bসঠিকভাবে কাজ করে নি, এজন্য আমি সেখানে স্থান রেখেছি। বাকিটি ভাল লাগছে, আপনাকে অনেক ধন্যবাদ!
রোরলর্ক 4'15

1
আপনি যদি এখনও আগ্রহী হন তবে রুবি ২.১ (যেটি আমি প্রায় 10 মিনিট আগে শিখেছি) থেকে একটি যুক্তিযুক্ত আক্ষরিক ( Rational(2,3) == 2/3r) যা দ্বিতীয় লাইনটি সংক্ষিপ্ত করতে ব্যবহার করা যেতে পারে:eval(s+?r)<0&&$><<?-
0-03 এ ব্লুটোরেঞ্জ

2

জাভা, 177 176 170

s->{try{int x=new Integer(s.split("/")[0]),y=new Integer(s.split("/")[1]),z=1;for(;;x=x%y*10,Thread.sleep(999))System.out.print(x/y+(z-->0?".":""));}catch(Exception e){}}

অ্যালগরিদম সোজা; ছদ্মবেশী অংশটি মুদ্রণটি পেয়ে কাজ করছিল। শেষ পর্যন্ত, আমি কম্পিউটারে প্রতিটি পদক্ষেপের মধ্যে একটি সেকেন্ডের জন্য ঘুমিয়েছিলাম যাতে এটি মুদ্রণ করতে পারে।

প্রসারিত, চলমান সংস্করণ

public class RepeatedDecimal {
    public static void main(String[] args) {
        java.util.function.Consumer<String> f = s -> {
                try {
                    int x = new Integer(s.split("/")[0]),
                        y = new Integer(s.split("/")[1]),
                        z = 1;
                    for (;; x = x % y * 10, Thread.sleep(999)) {
                        System.out.print(x / y + (z-- > 0 ? "." : ""));
                    }
                } catch (Exception e) { }
                };

        f.accept("5/7");
    }
}

আউটপুটটিতে ফ্লাশিং সমস্যা থাকলেও আমি 9 এমএস ঘুমিয়ে আউটপুট প্রদর্শন করতে সক্ষম হয়েছি যা দুটি বাইট শেভ করবে।

@ স্নোমান এটি সম্ভবত হার্ডওয়্যার বা ওএসের উপর নির্ভর করে; আমার কম্পিউটার 250 মিমি বা তারও বেশি কম দিয়ে কাজ করবে না।
Ypnypn

2

আর, 103 137 109 103

এখন এটি দিয়ে আরও খুশি। একটি বিভাজক দিয়ে স্ক্যান ব্যবহার করে প্রচুর বাইট সংরক্ষণ করুন। উন্নতির জন্য এখনও কিছু জায়গা থাকতে পারে। <-সঙ্গে প্রতিস্থাপন =। এর সাথে সর্বদা সৌভাগ্য হয় নি, তবে এবার এটি কার্যকর হয়েছে।

cat(if(prod(i=scan(sep='/'))<0)'-',(n=(i=abs(i))[1])%/%(d=i[2]),'.',sep='');repeat cat((n=n%%d*10)%/%d)

টেস্ট রান

> cat(if(prod(i=scan(sep='/'))<0)'-',(n=(i=abs(i))[1])%/%(d=i[2]),'.',sep='');repeat cat((n=n%%d*10)%/%d)
1: -1/3
3: 
Read 2 items
-0.33333333333333333333...
> cat(if(prod(i=scan(sep='/'))<0)'-',(n=(i=abs(i))[1])%/%(d=i[2]),'.',sep='');repeat cat((n=n%%d*10)%/%d)
1: -5/-4
3: 
Read 2 items
1.250000000000000000000...

1

পাইথন 3, 107 115 বাইট

a,b=map(int,input().split("/"))
print(("%.1f"%(a/b))[:-1],end="")
b=abs(b)
while 1:a=abs(a)%b*10;print(a//b,end="")

অনেকটাই অকপট:

  • সংখ্যক এবং ডিনোমিনেটর ইনপুট করুন
  • দশমিক বিন্দুর পরে 1 অঙ্ক দিয়ে ভাগফলকে আউটপুট দিন, তারপরে শেষ অঙ্কটি বন্ধ করুন (যেমন -1/3-> -0.)
  • পরম মান নিন *
  • লুপ:
    • भाजককে বিভাজনের পরে অঙ্কটি অবশিষ্ট থাকে
    • 10 দ্বারা অঙ্ককে গুণ করুন
    • পরবর্তী অঙ্ক হিসাবে আউটপুট পূর্ণসংখ্যার ভাগফল

* (যদিও aকয়েকটি বাইট সংরক্ষণের জন্য গণনাটি লুপের ভিতরে সরানো হয়েছিল।)

সম্পাদনা করুন: negativeণাত্মক ভগ্নাংশ> -1 সহ স্থির ত্রুটি।


0

পাইথন 2.7, 209 বাইট

from sys import*;m,o=1,lambda x:stdout.write(str(x));a,b=[int(x)for x in argv[1].split('/')]
o(str(a*b)[0]);a,b=abs(a),abs(b);o('0'*(b>a))
while 1:
 while not((m*a)/b):o('0.'[m==1]);m*=10
 o((m*a)/b);a=(m*a)%b

সম্পাদনা:

এখন অনুরূপ হিসাবে সমস্ত অক্ষরকে একই লাইনে আউটপুট দেয়।

edit2:

অনুরোধ অনুসারে এখন কমান্ডলাইন আর্গুমেন্ট থেকে ভগ্নাংশটি পড়ছে :)


1
কয়েকটি টিপস: 1) mapতালিকার বোঝার পরিবর্তে ব্যবহার করা বেশ কিছুটা সাশ্রয় করে; 2) প্রায় প্রথম বন্ধনী প্রয়োজন না m*a, তার অবস্থানের কোনো হিসাবে *, %এবং /সব একই প্রাধান্য এবং বাম-মিশুক হয়; 3) লাইন 3-তে 0-বা-ডট যুক্তিটি সরল করা যেতে পারে "0."[m==1], যেহেতু আপনি কেবল এটিকে মুদ্রণ করছেন; 4) সম্ভবত অক্ষরগুলি কেবলমাত্র সেট হিসাবে সেট করা o=stdout.writeএবং প্রয়োজনীয় হিসাবে ব্যাকটিক্সের সাথে স্ট্রিংয়ে রূপান্তর করতে রক্ষা করবে ।
ডিএলস্ক

1
এছাড়াও কোডটি নেতিবাচক সাথে কাজ করে না: এর পরিবর্তে 1/-3দেয় । -1.666666666-0.333333333
ডিএলসাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.