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


23

এই প্রশ্নটি কেবলমাত্র দশমিকের অবসান ঘটাতে প্রযোজ্য নয় - দশমিকগুলি পুনরাবৃত্তি করাও একটি অ্যালগরিদমের মাধ্যমে ভগ্নাংশে রূপান্তর করা যেতে পারে।

আপনার কাজটি এমন একটি প্রোগ্রাম তৈরি করা যা ইনপুট হিসাবে বারবার দশমিক গ্রহণ করে এবং সেই দশমিক প্রসারণের সাথে সম্পর্কিত সংখ্যক এবং ডিনোমিনেটর (সর্বনিম্ন শর্তে) আউটপুট দেয়। 1 টির বেশি সংখ্যক ভগ্নাংশগুলিকে অনুচিত ভগ্নাংশের মতো উপস্থাপন করা উচিত 9/5। আপনি ধরে নিতে পারেন যে ইনপুটটি ইতিবাচক হবে।

বারবার দশমিক এই বিন্যাসে দেওয়া হবে:

5.3.87

দ্বিতীয় বিন্দুটির পুনরাবৃত্তি হওয়ার পরে সবকিছু দিয়ে:

5.3878787878787...

আপনার প্রোগ্রামটি দুটি সংখ্যক এবং ডিনোমিনেটরের প্রতিনিধিত্ব করে, একটি স্ল্যাশ দ্বারা পৃথক করা (অথবা আপনি যদি সরল পাঠ্য আউটপুট না দেন তবে আপনার ভাষায় সমমানের ফর্ম) আউটপুট দেবে:

889/165

নোট করুন যে দশমিক দশমিক দশমিক দ্বিতীয় বিন্দুর পরে আর কিছুই থাকবে না এবং দশমিক দশমিক দশমিক দশমিক দশমিক দুটি অংশের মধ্যে কিছুই থাকবে না।

পরীক্ষার মামলা

এই পরীক্ষার কেসগুলি প্রয়োজনীয় কোণার সমস্ত ক্ষেত্রে আবরণ করে:

0..3 = 1/3
0.0.3 = 1/30
0.00.3 = 1/300
0.6875. = 11/16
1.8. = 9/5
2.. = 2/1
5..09 = 56/11
0.1.6 = 1/6
2..142857 = 15/7
0.01041.6 = 1/96
0.2.283950617 = 37/162
0.000000.1 = 1/9000000
0..9 = 1/1
0.0.9 = 1/10
0.24.9 = 1/4

আপনি যদি চান, আপনি এটি ধরে নিতেও পারেন যে পূর্ণসংখ্যার অংশবিহীন ভগ্নাংশের প্রথম বিন্দুর বামে কিছুই নেই। আপনি এই পরীক্ষামূলক পরীক্ষার ক্ষেত্রে এটি পরীক্ষা করতে পারেন:

.25. = 1/4
.1.6 = 1/6
..09 = 1/11
.. = 0/1

1
ভগ্নাংশটি সহজ করার জন্য কি প্রয়োজনীয়? অথবা এটি অসম্পূর্ণ আকারে ছেড়ে দেওয়া কি যুক্তিযুক্ত (যেমন 9/99:)?
জাস্টিন

3
(in lowest terms)অর্থাত্ ভগ্নাংশটি সরল করতে হবে।
জো জেড।

2
আমি কি 13পরিবর্তে আউটপুট অনুমতি দেওয়া হয় 13/1?
এমনিআইপ

4
এই ইনপুট 1.9999...এবং আউটপুটটি হ্যান্ডেল করার বিষয়ে নিশ্চিত হন2/1
টমাস এডিং

3
@ থমাসডিং আপনার প্রয়োজনীয়তা অর্জনের 1.9999.জন্য 19999/10000, তাই না? 2/11..9
কিওয়ারটি

উত্তর:


8

ডায়ালগ এপিএল ( 75 73 69 68 টি অক্ষর)

এখানে আরেকটি এবং পঞ্চম প্রচেষ্টা (সম্ভবত আমার শেষটি); আমি 80 টি অক্ষরের চেয়ে কম সংখ্যক কোড লেখার চেষ্টা করে এবং নিয়মগুলির সাথে পুরোপুরি সামঞ্জস্য রেখে দিনটি কাটিয়েছি। এই চ্যালেঞ্জ আমার দিন তৈরি!

অবশেষে ডায়ালগ এপিএলের সাথে কাজ করে 75৫ টি অক্ষরের তৈরি এপিএলের একটি লাইন পেয়েছি (তবে অনলাইনে অনুবাদক পৃষ্ঠায় নয় কারণ মৃত্যুদন্ড কার্যকররূপে ফাংশন ব্যবহার করে ), যা নিম্নলিখিতটি:

(N,D)÷D∨N←(⍎'0',1↓I/⍨2=+\P)+(⍎'0',I/⍨2>+\P)×D←D+0=D←⍎'0',⌽2↓⍕¯1+10⊥P←'.'=I← '1.2.3'

অবশ্যই আমি এটি আরও ছোট করে তুলতে পারি, তবে বিশেষ ক্ষেত্রে যেখানে এক, দুই বা তিনটি ক্ষেত্র অনুপস্থিত। আমার কোড এমনকি ..ইনপুট কেস পরিচালনা করতে পারে ।

আমি জানি যে এপিএল পড়া কঠিন, এবং যেহেতু লোকেরা বুঝতে পারে যে একটি কোডের টুকরোগুলি আসলে কীভাবে কাজ করে তা এখানে কিছু ব্যাখ্যা রয়েছে। মূলত, আমি ভেরিয়েবল ডি-তে চূড়ান্ত ডিনোমিনেটর এবং ভেরিয়েবল এন এর চূড়ান্ত অংক গণনা করি

এপিএল ডান থেকে বামে পার্স করা হয়।

  • প্রথমত, স্ট্রিংটি ভেরিয়েবল আই ( I←) এ সংরক্ষণ করা হয় ।
  • তারপরে এটি বুলিয়ানগুলির একটি ভেক্টরকে ম্যাপ করা হয় যা নির্দেশ করে যে কোনও বিন্দুটি রয়েছে এবং এই ভেক্টরটিকে পি ( P←'.'=) বলা হয় । উদাহরণস্বরূপ '1.2.3' 0 0 0 1 0 এ ম্যাপ করা হবে।
  • এই ভেক্টরটি বেস 10 ( 10⊥) এ অঙ্কগুলি ; এখন '1.2.3' 1010 হয়।
  • তারপরে 1 টি এই সংখ্যাটি থেকে বাদ পড়েছে (হয় 1-⍨বা তার সাথে হয় ¯1+, আমি এখানে দ্বিতীয়টি বেছে নিয়েছি)। এখন '1.2.3' 1009।
  • তারপরে এই সংখ্যাটি স্ট্রিংয়ে রূপান্তরিত হয় ( ), দুটি প্রাথমিক অঙ্ক সরানো হয় ( 2↓), যা আমাদের প্রাথমিক '1.2.3' উদাহরণ থেকে 09 করে; স্ট্রিংটি বিপরীত হয় ( )।
  • এখানে, একটি বিশেষ কেস হিসাবে, আমি স্ট্রিংয়ের সামনে একটি প্রাথমিক 0 টি অক্ষর যুক্ত করি; চারটি অক্ষর ব্যবহার করে এটি আমার মন খারাপ করে '0',তবে দ্বিতীয় এবং তৃতীয়াংশ ক্ষেত্র দুটি খালি থাকলে কোনও ত্রুটি এড়াতে আমি এটি করেছি did স্ট্রিংটি একটি সংখ্যায় ( ) রূপান্তরিত হয় এবং এটি ডিতে সংরক্ষণ করা হয়, যা উভয় শেষ ক্ষেত্র খালি থাকলে ব্যতীত ডিনোমিনেটর, কারণ এই ক্ষেত্রে ডি 0 এর সমান হয়।
  • D←D+0=1 কোড সেট করুন ডি এর টুকরা যদি এটি বর্তমানে নাল, এবং এখন ডি হর (GCD বিভাগ আগে অবশ্য) রয়েছে।
  • ×প্রারম্ভিক স্ট্রিংয়ের প্রথম ধরণের সামগ্রীর সাথে এই ডোনমিনেটরকে গুণিত করা হয় ( (⍎'0',I/⍨2>+\P)যা আমার উদাহরণে 0 1 0 1 0 দিয়ে শুরু হয়) থেকে ক্রমান্বয়ে সংখ্যার যোগ করে (যা 0 1 1 2 করে তোলে) আমার উদাহরণে 2), কোন মানগুলি 2 এর চেয়ে ছোট (বুলিয়ান ভেক্টর তৈরি করে 1 1 1 0 0) পরীক্ষা করুন এবং আমি একই অক্ষর গ্রহণ করব; অন্য একটি ফাঁদ প্রতিরোধের জন্য স্ট্রিংয়ের সামনে আরও একটি 0 যুক্ত করা হয় (যদি দুটি প্রাথমিক ক্ষেত্র খালি থাকে) এবং পুরোটি একটি সংখ্যায় রূপান্তরিত হয়।
  • ইনপুট স্ট্রিংয়ের শেষ অংশটি পূর্বের পণ্যটির সাথে যুক্ত হয় (⍎'0',1↓I/⍨2=+\P), যা আবার পি নেয়, আবার কমুলেট করে যোগ করে, কোন মানগুলি 2 এর সমান হয় তা পরীক্ষা করুন (পূর্ববর্তী ব্যাখ্যা দেখুন), চেরেসারগুলি নেন, প্রথমটি সরান যা বিন্দু , একটি প্রতিরোধকারী প্রাথমিক 0 টি অক্ষর যুক্ত করে এবং একটি সংখ্যায় রূপান্তর করে।
  • যোগফলের সাথে অনুসরণ করা এই পণ্যটি এন-তে সংরক্ষিত হয় যা সংখ্যক।
  • অবশেষে জিসিডি ডিওএন দিয়ে গণনা করা হয় এবং উভয় সংখ্যা এই জিসিডি দ্বারা বিভক্ত হয়।

সম্পাদনা করুন: characters৩ টি অক্ষরের জন্য এখানে একটি স্থিরতা রয়েছে:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←D+0=D←⍎'0',⌽2↓⍕¯1+10⊥P←'.'=I←

এই হ্যাকের ধারণাটি প্রথমে কেসটি করা হয় যেখানে ক্রমবর্ধমান সংযোজনের মান 2 এর সমান হয়, পরে তাদের জন্য সংরক্ষণ করা হয় এবং প্রথম কেস পাওয়ার জন্য এই বিটওয়াস্ক মাস্কটি উল্টে দেয়; এইভাবে পরবর্তী ক্ষেত্রে কম্পিউটিংয়ের জন্য কম অক্ষর প্রয়োজন।

সম্পাদনা করুন: characters৯ টি অক্ষরের জন্য এখানে আরও একটি সমাধান রয়েছে:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←⍎'1⌈0',⌽2↓⍕¯1+10⊥P←'.'=I←

এই হ্যাকের ধারণাটি হ'ল স্ট্রিংয়ের এপিএল কোড হিসাবে মূল্যায়ন করার জন্য (সংখ্যাটি রূপান্তর পর্যায়ে) সবচেয়ে জটিল বিশেষ কেস এম্বেড করা।

সম্পাদনা করুন: 68 টি অক্ষরের জন্য এখানে আরও একটি সমাধান রয়েছে:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←⍎'1⌈0',⌽3↓⍕1-10⊥P←'.'=I←

এই হ্যাকের ধারণাটি হ'ল অপারেশনের মাধ্যমে 1 মানটিকে 1 বিকল্পের জন্য মানটিতে 1-এর যোগ করার পরিবর্তে সেই মানটিকে 1-তে বিয়োগ করে তারপরে একটি অক্ষর শুরুতে আরও সরান (যা বিয়োগ চিহ্ন হবে)।

সম্পাদনা: প্রসাধনী পরিবর্তন:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←1⌈⍎'0',⌽3↓⍕1-10⊥P←'.'=I←

আকারে কোনও উন্নতি হয়নি, তবে মূল্যায়নের জন্য কোডটির সর্বাধিক কার্যকারিতা পেয়ে আরও সন্তুষ্ট ।


আমি এটিকে চেষ্টা চালিয়ে যাওয়ার চেষ্টা করেছি এবং এটি অভিযোগ করে INVALID TOKEN। তুমি কি জানো কেন?
পিটার টেলর

@ পিটার টেইলর: হ্যাঁ, এটি আমার বার্তায় এমনকি বলা হয়েছে; কারণ আমি "এক্সিকিউট" অপারেটরটি ব্যবহার করি যা ডায়ালগের সার্ভারের জন্য অনিরাপদ এবং অনলাইনে অক্ষম করা হয়েছে (নিরাপদ মোড)। আপনাকে এটি ডায়ালগ এপিএল ইনস্টল করা সংস্করণে চেষ্টা করতে হবে।
টমাস বারুচেল

আহ, লজ্জা। আমি মাঝে মাঝে পিসিজি জমা পরীক্ষা করতে সক্ষম হতে 60 spend ব্যয় করতে যাচ্ছি না। আমি একটি বিকল্প অনলাইন এপিএল পরীক্ষক খুঁজে পেয়েছি, তবে আপনার কোডে ডায়ালগ-নির্দিষ্ট কিছু রয়েছে বলে মনে হচ্ছে কারণ এটি র‌্যাঙ্ক ত্রুটি বা দৈর্ঘ্যের ত্রুটি দেয়।
পিটার টেলর

@ পিটার টেলর; না ;-) দয়া করে, জিএনইউ এপিএল সহ আমার নিজস্ব ওয়েবসাইট (এখনও পরীক্ষামূলক এবং সরকারী নয়) ব্যবহার করুন; কিন্তু আমি এটা সামঞ্জস্যপূর্ণ (এক প্রায় প্রথম বন্ধনী করতে দুটি অক্ষর যোগ করতে হয়েছে I): এই দেখুন পার্মালিঙ্ক
টমাস Baruchel

15

পার্ল 6 (93 101 100 80 68 66 বাইট)

$/=split ".",get;say ($0+($1+$2/(9 x$2.comb||1))/10**$1.comb).nude

আকারটি ব্যর্থ হওয়ার পরিবর্তে কিছুই হ্যান্ডেল করার জন্য বাড়ানো হয়েছিল। মউক ব্যবহারের প্রস্তাব দিয়েছিলেন $/, সুতরাং এটি এখন ব্যবহৃত হচ্ছে, এবং কোডটি 20 বাইট ছোট হয়। আয়ীকো এর /সাথে প্রতিস্থাপনের প্রস্তাব করেছিল , তাই কোডটি আরও ছোট (12 বাইট দ্বারা)। তারপরে মউকের পরিবর্তে প্রতিস্থাপনের প্রস্তাব করা charsহয়েছিল comb(সংখ্যার প্রেক্ষাপটে, তারা অভিন্ন, কারণ সংখ্যায় রূপান্তরিত হওয়ার পরে অক্ষরের তালিকা অক্ষরের সংখ্যা)।

নমুনা আউটপুট:

$ perl6 script.p6
5.3.87
889 165
$ perl6 script.p6
2.0.0
2 1
$ perl6 script.p6
0..3
1 3
$ perl6 script.p6
0.0.3
1 30
$ perl6 script.p6
0.0.0
0 1
$ perl6 script.p6
0.1.6
1 6
$ perl6 script.p6
0.01041.6
1 96
$ perl6 script.p6
0.2.283950617
37 162
$ perl6 script.p6
123.456.789
41111111 333000

দুর্ভাগ্যক্রমে, দেখা যাচ্ছে যে দুটি বিন্দুর মধ্যে স্থানধারক হিসাবে শূন্য ব্যবহার করা কোনও অগ্রগতি নয়। 0..09ফিরে আসে 1/11, কিন্তু 0.0.09ফিরে আসে 1/110
জো জেড।

@JoeZ। ওহ ঠিক আছে. যখন কিছুই টাইপ না করা হয় তখন কেসটি পরিচালনা করার জন্য আমি আমার কোড আপডেট করেছি।
কনরাড বোরোস্কি

আমি পার্ল 6 জানি না, তবে আমি কি অনুমান করে সঠিকভাবে বুঝতে পারি যে 'এবিসি' দেওয়া হয়েছে, আপনার প্রোগ্রামটি সি / 99 ... 9 গণনা করার জন্য সঠিক যুক্তিযুক্ত পাটিগণিত ব্যবহার করে, তবে কেবল আবশ্যক গণনা করতে ভাসমান পয়েন্ট ব্যবহার করে? সেক্ষেত্রে খ এর অনেকগুলি সংখ্যা থাকলে এটি একটি ভুল উত্তর দেয়।
ওমর

@ ওমরআন্তোলান-কামারেনা: বেশ নয় Not পার্ল 6-এ যুক্তিগুলি ডিফল্ট, ভাসমান পয়েন্ট সংখ্যা নয়। উদাহরণস্বরূপ, 0.1 + 0.2 == 0.3পার্ল in
কনরাড বোরোস্কি

2
80 টি চরকে গল্ফ করেছেন: $/=split ".",get;say join "/",($0+($1+$2/(9 x chars $2 or 1))/10**$1.chars).nude:)
মউক

6

জে ( 85 90 89 অক্ষর)

আমার আসল ফাংশনটি, যা দ্বিতীয়টির চেয়ে 5 টি অক্ষর সংক্ষিপ্ত ছিল, বেশ কয়েকটি বাগ ছিল: এটি "এন / 1" হিসাবে পূর্ণসংখ্যার ফলাফল দেয় না এবং এটি একটি ডজন বা তার বেশি সংখ্যাসমুখে সংখ্যায় ভুল উত্তর দেয়। এখানে জেতে একটি সংশোধন ফাংশন যা একটি চরিত্র সংরক্ষণের জন্য ইভেলেক্সের পরামর্শকে অন্তর্ভুক্ত করে:

f=:3 :0
'a t'=.|:(".@('0','x',~]),10x^#);._1'.',y
(,'/'&,)&":/(,%+.)&1+/a%*/\1,0 1-~}.t
)

এটি একটি স্ট্রিং গ্রহণ করে এবং একটি স্ট্রিং প্রদান করে। এখানে একটি নমুনা অধিবেশন:

   f '..'
0/1
   f '0.0.0'
0/1
   f '3..'
3/1
   f '..052631578947368421'
1/19
   f '0.2.283950617'
37/162
   f '.0.103092783505154639175257731958762886597938144329896907216494845360824742268041237113402061855670'
1/97

আপনার আউটপুট থেকে আপনার ফাংশনটি ঠিক করা উচিত 0/1এবং 3/1প্রথম দুটি পরীক্ষার ক্ষেত্রে অবশ্যই এই মন্তব্যটি
এমনিআইপি

আমি পূর্ণসংখ্যার জন্য পাঁচটি চার্জের ব্যয় করে আউটপুট নির্ধারণ করেছি, @ এমনিআইপি।
ওমর

('0','x',~])একটি বাইট ব্যবহার এবং সংরক্ষণ করুন ।
ইলেভেক্স

5

সি, 171

বেশ দীর্ঘ. আরও কমানো যেতে পারে। না scanf, যেগুলি যদি বিন্দুগুলির মধ্যে কোনও সংখ্যা না থাকে তবে এটি সত্যিই এটি পরিচালনা করতে পারে না। কোন strtol। খালি সংখ্যা ক্রাঞ্চিং:

a,b,c,d,q;main(){while((q=getchar()-48)>-3)q<0?(d=b>0,b+=!b):d?(c=c*10+q,d*=10):(a=a*10+q,b*=10);for(a=a*--d+c,q=b*=d;q>1;a%q+b%q?--q:(a/=q,b/=q));printf("%d/%d\n",a,b);}

টেস্ট:

rfc <<< "2..142857"
15/7

5

ডিসি (সম্পূর্ণরূপে সাধারণ নয়, সংক্ষিপ্ত করে 76 টি অক্ষর)

সম্পূর্ণ সাধারণ নয়, তবে দয়া করে বিবেচনা করুন, আমি এটি বিশ্বের প্রাচীনতম জিনিসগুলির মধ্যে একটি দিয়ে করেছি:

5.3.87 dsaX10r^d1-rla*sasbdscX10r^dlc*rlb*rlb*la+snsdlnld[dSarLa%d0<a]dsax+dldr/rlnr/f

সম্পাদনা: আমি আমার সমাধান সম্পাদনা করি; এটি বেশি সাধারণ নয়, তবে খানিকটা খাটো:

sadsbX10r^sclaX10r^dd1-dsdlblc**rla*+dsnrld*dsd[dSarLa%d0<a]dsax+dldr/rlnr/f

এটি হিসাবে ব্যবহার করুন:

5.3.87 sadsbX10r^sclaX10r^dd1-dsdlblc**rla*+dsnrld*dsd[dSarLa%d0<a]dsax+dldr/rlnr/f
  • প্রথম ক্ষেত্রের প্রয়োজন নেই:

    .1.3 sadsbX10r^sclaX10r^dd1-dsdlblc**rla*+dsnrld*dsd[dSarLa%d0<a]dsax+dldr/rlnr/f
    

    ঠিক আছে।

  • দ্বিতীয় এবং তৃষ্ণার ক্ষেত্রে কমপক্ষে একটি অঙ্ক প্রয়োজন


5

জাভাস্ক্রিপ্ট, 203

পথ অনেক দীর্ঘ, তবে এখনও মজাদার। নিউলাইনগুলি কারণ সেমিকোলন অপঠনযোগ্য।

s=prompt(b=1).split(".")
P=Math.pow
a=s[0]
c=s[1]
d=P(10,l=c.length)
f=(P(10,s[2].length)-1)*P(10,l)||1
e=s[2]=+s[2]
a=d*a+b*c;b*=d
a=f*a+b*e;b*=f
function g(a,b){return b?g(b,a%b):a}g=g(a,b);a/g+"/"+b/g

আমি 889/NaNযখন দৌড়াচ্ছি তখন আমি পাচ্ছি 5.3.87... আমি কি কিছু ভুল করছি?
রাফেলকাস্ট্রোআউটো

আমি জানি না ... আমি যদি এই কোডটি কেবল সাফারি কনসোলে পেস্ট করি (ফায়ারফক্স বা ক্রোমও করুক) তবে এন্টার টিপুন এবং "5.3.87" টাইপ করুন, আমি কেবল "889/165"কনসোলে উঠি । আপনি এটি কিভাবে চালাচ্ছেন? @ ইরফেলকাস্ট্রোআউটো
মার্চকে টমসডিং করুন

কিছুই নয় ... আমি অনুমান করি যেহেতু এটি এখন কাজ করছে সেহেতু আমি কিছু ভুল করেছি ...
রাফায়েলকাস্ট্রোটো

1
আপনি b=1অংশটি ভিতরে নিয়ে গিয়ে 1 টি অক্ষর সংরক্ষণ করতে পারেন prompt()
ব্যবহারকারী 2428118

1
f=(P(10,s[2].length)-1)*P(10,l),f=f?f:1=>f=(P(10,s[2].length)-1)*P(10,l)||1
f.ardelian

3

জে (বিভিন্ন পদ্ধতি)

খুব ভিন্ন পদ্ধতির উপর ভিত্তি করে আরেকটি সমাধান; এবার পুরোপুরি সাধারণ; একটি পূর্ণসংখ্যা জমা দেওয়া হলে কেবল 1-ডিনোমিনিটরটি অনুপস্থিত:

   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '.1.3'
2r15
   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '.1.'
1r10
   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '1..'
1
   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '1..3'
4r3

3

গল্ফস্ক্রিপ্ট (67 টি অক্ষর)

`{'.'/1$=.10\,?@-).!+0@+~}+3,/1$4$*]-1%~;*+*+].~{.@\%.}do;{/}+/'/'@

এনবি এটি খালি পূর্ণসংখ্যার অংশগুলি সমর্থন করে।

স্ট্রিং ফর্মের হলে 'n.p.q'তারপর মান n + p/E + q/(DE) = ((nD + p)E + q)/DEযেখানে D = 10^(len p)এবং E = 10^(len q) - 1, ব্যতীত যখন len q = 0, যে ক্ষেত্রে E = 1(0 দ্বারা বিভাজন এড়াতে)।

ব্যবচ্ছেদ:

           # Stack: 'n.p.q'
`{         # Combined with the }+ below this pulls the value into the block
           # Stack: idx 'n.p.q'
    '.'/   # Stack: idx ['n' 'p' 'q']
    1$=    # Stack: idx str   (where str is the indexed element of ['n' 'p' 'q'])
    .10\,? # Stack: idx str 10^(len str)
    @-)    # Stack: str 10^(len str)-idx+1
           #   If idx = 0 we don't care about the top value on the stack
           #   If idx = 1 we compute D = 10^(len 'p')
           #   If idx = 2 we compute E' = 10^(len 'q') - 1
    .!+    # Handle the special case E'=0; note that D is never 0
    0@+~   # Stack: 10^(len str)-idx+1 eval('0'+str) (GolfScript doesn't treat 011 as octal)
}+         # See above
3,/        # Run the block for idx = 0, 1, 2
           # Stack: _ n D p E q
1$4$*      # Stack: _ n D p E q D*E
]-1%~;     # Stack: D*E q E p D n
*+*+       # Stack: D*E q+E*(p+D*n)
].~        # Stack: [denom' num'] denom' num'
{.@\%.}do; # Stack: [denom' num'] gcd
{/}+/      # Stack: denom num
'/'@       # Stack: num '/' denom

অনলাইন ডেমো যা প্রতিটি পরীক্ষার ইনপুটগুলির সাথে প্রোগ্রামে চলমান অনুকরণ করে, একবারে একটি করে।


আমি চেষ্টা করে দেখেছি এবং এটি সমস্ত নিয়ম অনুসরণ করে বলে মনে হচ্ছে না: "নোট করুন যে দশমিকের দশমিকের শেষের সাথে দ্বিতীয় বিন্দুর পরে কিছুই থাকবে না এবং দশমিক দশমিক দশমিক দশমিক দুটি অংশের মধ্যে দুটি বিন্দুর মধ্যে কিছুই থাকবে না।" আমি আপনার কোডটি ইনপুট দিয়ে কাজ করতে পারিনি0.1.
টমাস বারুচেল

-1। আপনি +300 পয়েন্ট পেয়েছেন তা লক্ষ্য করার পরে আমি এটি আবার চেষ্টা করেছি। এটি ন্যায্য নয়, কারণ অন্যান্য সমাধানগুলি সমস্ত নিয়ম অনুসরণ করার জন্য যথাসাধ্য চেষ্টা করেছে, যা আপনি অবশ্যই করেননি।
টমাস বারুচেল

@।, আমি আপনার এই দাবিতে আপত্তি জানাই যে আমি বিধিগুলি অনুসরণ করার চেষ্টা করি নি। Testচ্ছিক পরীক্ষার কেসগুলির অবস্থানটি আমাকে এই ভেবে বিভ্রান্ত করেছিল যে চূড়ান্ত ব্লকটি প্রয়োজনীয় সমস্ত ক্ষেত্রে আচ্ছাদন করে; এটি প্রমাণিত হয়েছে যে আমি ভুল ছিলাম এবং অন্যান্য লোকদের একই ভুলটি এড়াতে আমি শীঘ্রই প্রশ্নটি সম্পাদনা করতে যাচ্ছি। পূর্বে অপরিবর্তিত কোণার কেসগুলি হ্যান্ডেল করার জন্য আমি এখন আমার কোড আপডেট করেছি এবং তা প্রদর্শনের জন্য আমার লিঙ্কটিকে একটি পরীক্ষায় আপডেট করেছি।
পিটার টেলর

ঠিক আছে. আপনি সম্ভবত 300 পয়েন্ট প্রাপ্য। কোডগল্ফে নতুন হওয়ার কারণে, এই 300 পয়েন্টগুলি আমার জন্য একটি চ্যালেঞ্জিং লক্ষ্য ছিল এবং আমি এখনও এখনও মনে করি যে সময়সীমার সময়ে আমার কোডটি নিয়মগুলির সাথে পুরোপুরি ফিট করার জন্য সবচেয়ে সংক্ষিপ্ত ছিল was যাইহোক, পয়েন্ট জয়ের জন্য আমার সমস্ত জীবন রয়েছে। শুভেচ্ছা।
টমাস বারুচেল

@ ברוכאל: আমি 500 পয়েন্ট শুরু করতে চেয়েছিলাম (হ্যাঁ, আমি এর মতো উদার, এটি আমি কম দিতে পারি না) অনুগ্রহ করে আপনাকে সেই পয়েন্টগুলি দিতে পারি, তবে আমার ধারণা এখানে ইতিমধ্যে একটি অনুগ্রহ শুরু হয়েছে। যাইহোক ভাল. আমি ভাবছি কখন এই অনুগ্রহ শেষ হবে এবং কে এই পয়েন্টগুলি পাবে।
কনরাড বোরোস্কি

2

পাইথন

কোনও গ্রন্থাগার নেই - 156 টি অক্ষর

_=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b),
(10**len(c)-bool(c))*10**len(b);f=_(d,e);print'%i/%i'%(d/f,e/f)

ব্যবহার করে fractions- 127 টি অক্ষর

from fractions import*;a,b,c=raw_input().split('.');print Fraction(int(a+b+c)-bool(c)*int(a+b
),(10**len(c)-bool(c))*10**len(b))

fractionsমত সংস্করণ প্রিন্ট জিনিস "ভগ্নাংশ (7, 5)" পরিবর্তে "7/5", তাই নয় কি?
ওমর

এটা না; আমি শীর্ষে কাজ করছি না, উপায় দ্বারা। _=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b), ValueError: need more than 1 value to unpack
টমসডিং

@ OmarAntolín-Camarena আমি যতদূর জানি, printব্যবহারসমূহ strযখন উপলব্ধ নয় repr। এটি আমার শেষ ফলাফল: puu.sh/7w64w.png
ওবেরন

@ টমসমিডিং উভয়ই এক লাইনে রয়েছে; তাদের উত্তরে ফিট করার জন্য লাইন ব্রেকটি যুক্ত করা হয়েছিল। _=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b),(10**len(c)-bool(c))*10**len(b);f=_(d,e);print'%i/%i'%(d/f,e/f)সব এক লাইনে যেতে হবে।
ওবেরন

ঠিক আছে, @ ওবারন, আপনি সম্ভবত অনুমান করতে পারেন যে আমি আমার কম্পিউটারে ছিলাম না এবং কোডটি চালাতে পারিনি।
ওমর

2

গণিত, 143

যথারীতি ম্যাথমেটিকা ​​কাজটি করার জন্য অনেকগুলি উচ্চ-স্তরের ফাংশন সরবরাহ করে, তবে তাদের ভার্বোজের নাম দেয়।

x=StringTake;c=ToExpression;p=s~StringPosition~".";{o,t}=First/@p;u=StringLength@s-t;d=t-o-1;Rationalize@(c@x[s,t-1]+c@x[s,-u]/((10^u)-1)/10^d)

আমার সময় পেলে পরে নমুনা আউটপুট যোগ করতে হবে।


আমার কাছে দেখে মনে হচ্ছে যেন এটি এন / 1 এর পরিবর্তে পূর্ণসংখ্যাকে n হিসাবে আউটপুট করে। এটা কি সঠিক? (আমার সমাধানটিতে একই বাগ রয়েছে ... :()
ওমর

আহ, এখন আমি .... মন্তব্যগুলিতে নির্দিষ্ট। কী অদ্ভুত প্রয়োজনীয়তা ... যদি প্রতিটি অন্যান্য ভগ্নাংশ হ্রাস n/1হয় তবে হ্রাস করার অনুমতি দিচ্ছেন না কেন n? আমি পরে পূর্ণসংখ্যার রূপান্তর করতে অতিরিক্ত ~ 50 বাইট যুক্ত করব।
জোনাথন ভ্যান মাত্রে

আপনার পদ্ধতির ঠিক আছে। খনি ব্যবহার করে FromDigitsতাই আমিও এটি পোস্ট করার সিদ্ধান্ত নিয়েছি।
ডেভিডসি

2

রুবি - 112

x,y,z=gets.chop.split".";y||='0';z||='0';puts((y.to_i+Rational(z.to_i,10**z.length-1))/10**y.length+x.to_i).to_s

এটি রুবীর সাথে আমার প্রথম পরীক্ষা, সুতরাং উন্নতির পরামর্শ দিতে নির্দ্বিধায়।

$ ruby20 % <<< '5.3.87'
889/165
$ ruby20 % <<< '0..3'
1/3
$ ruby20 % <<< '0.0.3'
1/30
$ ruby20 % <<< '0.00.3'
1/300
$ ruby20 % <<< '0.6875.0'
11/16
$ ruby20 % <<< '1.8.0'
9/5
$ ruby20 % <<< '2..'
2/1
$ ruby20 % <<< '..'
0/1

সরানো হচ্ছে সমর্থন ".. 'এবং" .1.2 "মানে কি বৈশিষ্ট অনুসরণ করছেন না, ঠিক? (আমি তাদের খুব সরানোর পছন্দ করেন।)
ওমর

@ OmarAntolín-Camarena উপর নির্দিষ্ট বিন্দু, বৈশিষ্ট, বলছেন যে If you wish। আমি চাই না, তাই আমি সংখ্যার প্রথম বা তৃতীয় দল ছাড়া ভগ্নাংশকে সমর্থন করছি না। তবে আমি সংখ্যার ২ য় গোষ্ঠীর অভাব ভগ্নাংশকে সমর্থন করছি, যা এই অনুমানের সাথে মেলে।
এমনিআইপি

@ মিনিপ, আপনি অনুমানটি ভুলভাবে লিখেছেন: এটি বলে না যে "আপনি যদি চান তবে আপনি সমর্থন করতে পারেন .. এবং .1.2", এটি বলে, "আপনি যদি চান তবে আপনি ধরে নিতে পারেন যে 0 .. এবং 0.1.2 সর্বদা হিসাবে দেওয়া হয় .. এবং .1.2 "।
ওমর

@ ওমরআন্তোলন-কামারেনা পয়েন্ট নিয়েছে। সম্পাদনা করা হয়েছে।
এমনিআইপ

2

সি, 164

এটি অরিওন সি এর সমাধানের মতো, যদিও আমি এটি স্ক্র্যাচ থেকে করেছি। আমি স্বীকার করি তবে তার বেশ কয়েকটি অপটিমাইজেশন চুরি হয়েছে। এটি খুব খাটো নয়, তবে এটি পরিচালনা করে 25 = 1/4 এবং 0.000000.1 = 1/9000000।

long a,b,c,d,e;main(){while((c=getchar()-48)>-3)c+2?a=a*10+c,b*=10:b?e=a,d=b:(b=1);
b>d?a-=e,b-=d:0;for(d=2;d<=a;)a%d+b%d?d++:(a/=d,b/=d);printf("%ld/%ld\n",a,b);}

2

কোনও লাইব্রেরি ব্যবহার করে দুটি অজগর উত্তর। প্রথমটির আগে একটি সংখ্যা ছাড়াই প্রথমে alচ্ছিক ইনপুট পরিচালনা করে। এবং 162 অক্ষর

_=lambda a,b:b and _(b,a%b)or a;i,t,r=raw_input().split(".");b=r!="";d=(10**len(r)-b)*10**len(t);n=int((i+t+r)or 0)-b*int((i+t)or 0);f=_(d,n);print "%i/%i"%(n,d)

দ্বিতীয়টি প্রথম অঙ্কের আগে কিছুই হ্যান্ডেল করে না তবে প্রয়োজনীয় সমস্ত ইনপুটগুলি সঠিকভাবে পরিচালনা করে এবং এটি 150 অক্ষর

_=lambda a,b:b and _(b,a%b)or a;i,t,r=raw_input().split(".");b=r!="";d=(10**len(r)-b)*10**len(t);n=int(i+t+r)-b*int(i+t);f=_(d,n);print "%i/%i"%(n,d)

2

Haskell,

import Data.Ratio
f n=case s '.' n of
    [x,y,z]->(r x)%1+(r y)%(10^(length y))+(r z)%((10^t-1)*(10^(length y)))
        where
            r ""=0
            r n=read n
            t = if length z==0 then 9 else length z
s _ []=[[]]
s n (x:xs) | x==n = []:(s n xs)
           | otherwise = let (l:ls)=s n xs in (x:l):ls

আরে, এটি কোড-গল্ফ, আপনি চেষ্টা করছেন না!
mniip

@ এমনিপ আমি কোড গল্ফে ভাল নই। কমপক্ষে আমি একক চরিত্রের পরিবর্তনশীল নাম ব্যবহার করেছি।
পাইরুলেজ

1
আপনি কখনই ভাষা বা ব্যবহৃত অক্ষর / বাইটের মোট পরিমাণ নির্দিষ্ট করেন নি।
জাস্টিন ফে

2
ইনডেন্টগুলিতে স্থান বাঁচাতে, spanপ্রয়োগ করতে, ফাংশনের জন্য সংক্ষিপ্ত পরিচয় যুক্ত করুন, যেখানে সম্ভব স্থান সরিয়ে ফেলুন {; Use ব্যবহার করুন । import Data.Ratio v=span(/='.');w=tail;l=length;f n=(r x)%1+(r y)%p+(r z)%((10^t-1)*p)where{(x,b)=v n;(y,d)=v(w b);z=w d;p=10^(l y);r""=0;r n=read n;t=if null z then 9 else l z}- 178 অক্ষর, 321. থেকে নেমে দ্রষ্টব্য Trueজন্য একটি প্রতিশব্দ হয় otherwise, null zহয়length z==0
bazzargh

2

জাভাস্ক্রিপ্ট (ECMASCript 6) 180 175

G=(a,d)=>d?G(d,a%d):a;P=a=>+("1e"+a);L=a=>a.length;f=prompt().split(".");B=P(L(b=f[1]));D=P(L(b)+L(c=f[2]))-P(L(b))||1;alert((m=(f[0]+b||0)*D+B*(c||0))/(g=G(m,n=B*D))+"/"+n/g)

যদিও এটি 300 বন্টনের পক্ষে সুস্পষ্ট বিজয়ী নয় ... এটিই আমি নিয়ে আসতে পারি সবচেয়ে কম সময়:

  • পূর্ববর্তী সংস্করণ থেকে পরিবর্তনগুলি: যুক্তিতে কিছুটা পরিবর্তন এবং পাওয়ার Pফাংশনে পরিবর্তিত হয়ে এর +("1e"+a)পরিবর্তে Math.pow(10,a)আরও কয়েকটি অক্ষর সংরক্ষণ করা ...

1

গণিত 175

f@i_:=
If[IntegerQ[g=FromDigits[Map[IntegerDigits@ToExpression@#&,StringSplit[i,"."]/.""-> {}]
/.{a_,b_,c_}:> {{Sequence@@Join[a,b],c},Length@a}]],HoldForm[Evaluate@g]/HoldForm@1,g]

রুটিন বেশিরভাগ ইনপুট ম্যাসেজ করতে যায়। প্রায় 50 টি চরিত্রগুলি পূর্ণসংখ্যাগুলি পরিচালনা করতে গিয়েছিল।


উদাহরণ

f["7801.098.765"]

frac1

আরও উদাহরণ:

TableForm[
 Partition[{#, f[#]} & /@ {"19..87", "19.3.87", "5.3.87", "0.0.3", "0..3", "0.2.283950617", 
"123.456.789", "6666.7777.8888", "2.0.0","0.0.0"}, 5], TableSpacing -> {5, 5}]

frac2


এটি সাধারণত গণিতায় কীভাবে সম্পন্ন হবে

FromDigitsপুনরাবৃত্তি পুনরাবৃত্তি দশমিক থেকে সরাসরি একটি ভগ্নাংশ গ্রহণ করতে পারে, তবে শর্ত থাকে যে ইনপুটটি কোনও নির্দিষ্ট আকারের হয়। পূর্ণসংখ্যা হিসাবে পূর্ণসংখ্যা হিসাবে প্রদর্শিত হয়।

z={{{1, 9, {8, 7}}, 2}, {{1, 9, 3, {8, 7}}, 2}, {{5, 3, {8, 7}}, 1}, {{{3}}, -1}, {{{3}}, 0}, 
{{2, {2, 8, 3, 9, 5, 0, 6, 1, 7}}, 0}, {{1, 2, 3, 4, 5, 6, {7, 8, 9}}, 3}, 
{{6, 6, 6, 6, 7, 7, 7, 7, {8}}, 4}, {{2}, 1}, {{0}, 1}}

FromDigits/@z

z- র


আপনার আউটপুটটি ভুল ফর্ম্যাটে রয়েছে, এটি বেশ সুন্দর।
ওমর

আশ্চর্যের বিষয় হল, এটি ম্যাথমেটিকায় ভগ্নাংশ প্রকাশের জন্য ডিফল্ট ফর্ম্যাট। এই ফর্ম্যাটটিকে সহজ সরল করে তুলতে আরও বেশ কয়েকটি অক্ষর লাগবে।
ডেভিডসি

1

জে (96 টি অক্ষর)

আমি স্ল্যাশ চিহ্নটি পৃথককারী হিসাবে ব্যবহার করি না (তবে ম্যাথামেটিকায় সমাধানটি হয় না কারণ এটি গ্রাফিকাল উপস্থাপনা ব্যবহার করে যা কোনওভাবে ভাল); জে ভাষায় ভগ্নাংশটি এর rপরিবর্তে প্রদর্শিত হবে /:

   (((-.@]#[)((".@[%#@[(10x&^)@-{.@])+({.@](10x&^)@-#@[)*<:@{:@](".%<:@(10x&^)@#)@}.[)I.@])(=&'.')) '1..3'
4r3
   (((-.@]#[)((".@[%#@[(10x&^)@-{.@])+({.@](10x&^)@-#@[)*<:@{:@](".%<:@(10x&^)@#)@}.[)I.@])(=&'.')) '123.456.789'
41111111r333000

1

এপিএল (সম্পূর্ণ সাধারণ নয়)

সম্পূর্ণ সাধারণ নয় (ডিসির জন্য আমার সমাধানের মতো); ডায়ালগ এপিএলের সাথে কাজ করে (তবে ডায়ালগ এপিএলের অনলাইন সংস্করণে নয়, কেন তা নিশ্চিত নয়):

(R,F)÷(F←D×N)∨R←(⍎C)+D×(⍎I/⍨2>+\P)×N←10*¯1++/≠\P⊣D←¯1+10*⍴C←1↓I/⍨2=+\P←'.'=I← '123.456.789'

প্রথম ক্ষেত্রটি isচ্ছিক, তবে অন্য দুটি ক্ষেত্রেই কমপক্ষে একটি অঙ্কের প্রয়োজন।


1

জাভাস্ক্রিপ্ট (189)

i=prompt().split(".");a=i[0];b=i[1];c=i[2];B=b.length;p=Math.pow;n=a+b+c-(a+b);d=p(10,B+c.length)-p(10,B);f=1;while(f){f=0;for(i=2;i<=n;i++)if(n%i==0&&d%i==0){n/=i;d/=i;f=1}};alert(n+"/"+d)

উদাহরণ:

ইনপুট:

5.3.87

আউটপুট:

889/165

1

সি (420 টি লিখিত হিসাবে অক্ষর; অপ্রয়োজনীয় সাদা স্থান অপসারণের পরে কম)

নোট করুন যে এটি -৪-বিট long(যেমন 64৪ বিট লিনাক্স) ধরেছে; এটি 0.2.28395061732-বিট ব্যবহার করে সিস্টেমে পরীক্ষার ক্ষেত্রে ব্যর্থ হবে long। এটিকে টাইপ long longপরিবর্তন করে এবং printfসেই অনুযায়ী ফর্ম্যাট স্ট্রিং পরিবর্তন করে কিছু অক্ষরের ব্যয়ে স্থির করা যায় ।

#include <stdio.h>

long d[3], n[3], i;

int main(int c, char** v)
{
  while (c = *v[1]++)
    switch(c)
    {
    case '.':
      n[++i] = 1;
      break;
    default:
      d[i] = 10 * d[i] + c - '0';
      n[i] *= 10;
    }

  n[2] -= n[2] != 1;

  while (i--)
    d[2] += d[i] * n[i+1], n[i]*=n[i+1];

  i = d[2];
  *n = n[1];

  while (i)
    *d = i, i = *n%i, *n = *d;
  printf("%ld/%ld\n", d[2]/ *n, n[1]/ *n);
}

খুশী হলাম। আপনি পরিবর্তন করে 1 টি অক্ষর বন্ধ শেভ করতে '0'করতে 48
টড লেহম্যান

আমি মনে করি আপনি switchবিবৃতিটি আবার লিখে আরও কিছু সঞ্চয় করতে পারেন if(c==46) n[++i]=1; else d[i]=10*d[i]+c-48,n[i]*=10;
টড লেহম্যান

-3

জিটিবি , ৮১

`_:s;_,1,l?_)-S;_,"."
s;A;,1,S;_,".")-1
s;_,1+S;_,"."),l?_)-S;_,"."))→_
x?A;+_)►Frac

উদাহরণ

?3.25.
            13/4

4
যতক্ষণ না কোনও সংকলক এই ভাষার জন্য নিখরচায় উপলব্ধ করা হয়, ততক্ষণ আমি যে উত্তরটি ব্যবহার করে তা হ্রাস করব।
গ্যারেথ

1
উপরে লিঙ্ক করা পৃষ্ঠায় একটি সংকলক আছে বলে মনে হচ্ছে?
skibrianski

@ এসকিবারিয়ানস্কি মেটাতে এই পোস্টটি
mniip

2
@ গ্যারেথ, আপনার ডাউনওয়েট করার জন্য বেশ কয়েকটি ম্যাথমেটিক জবাব রয়েছে। : পি
ওমর

2
@ ওমরআন্তোলন-কামারেনা গণিতের জন্য একটি সংকলক / দোভাষী রয়েছে। জিটিবির কোনও নেই। GTBআপনি আমাকে বিশ্বাস না করলে উপরের লিঙ্কটি অনুসরণ করুন । মালিকানাধীন প্রোগ্রামের জন্য আপনি কিছু সংকুচিত জিনিস পাবেন, তারপরে আপনি সেই প্রোগ্রামটি অনুসন্ধান করবেন এবং খুঁজে পাবেন যে সাইট যে কোনও ডাউনলোড সরবরাহ করার দাবি করে তা এটি উপলভ্য নয়। তাহলে আমরা কীভাবে এটি সংকলন করব?
গ্যারেথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.