एक दोहराया दशमलव को एक अंश में परिवर्तित करें


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
@ThomasEding 1.9999.है 19999/10000, 2/1आप की जरूरत है 1..9, है ना?
क्वर्टी

जवाबों:


8

डायलॉग एपीएल ( 75 73 69 68 अक्षर)

यहाँ एक और पाँचवाँ प्रयास है (सबसे शायद मेरा अंतिम एक); मैंने उस दिन को being० अक्षरों से छोटे कोड को लिखने की कोशिश में बिताया और नियमों के अनुरूप था। इस चुनौती ने मेरा दिन बना दिया!

मुझे आखिरकार 75 अक्षरों से बने एपीएल की एक पंक्ति मिल गई, Dyalog APL के साथ काम करना (लेकिन ऑनलाइन इंटरप्रिटर पेज पर नहीं क्योंकि निष्पादन कार्य का उपयोग करना), जो निम्नलिखित है:

(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 ( I←) में संग्रहीत किया जाता है ।
  • फिर यह एक वेक्टर के एक वेक्टर पर मैप किया जाता है जो दर्शाता है कि एक बिंदु कहां है, और इस वेक्टर को P ( P←'.'=) कहा जाता है । उदाहरण के लिए '1.2.3' को 0 1 0 1 0 पर मैप किया जाएगा।
  • यह वेक्टर बेस 10 ( 10⊥) में अंक है ; अब '1.2.3' 1010 है।
  • फिर 1 को इस संख्या से प्रतिस्थापित किया जाता है (या तो 1-⍨या इसके साथ ¯1+, यहां मैंने दूसरा चुना है)। अब '1.2.3' 1009 है।
  • तब यह संख्या एक स्ट्रिंग में बदल जाती है ( ), दो प्रारंभिक अंक हटा दिए जाते हैं ( 2↓), जो हमारे प्रारंभिक '1.2.3' उदाहरण से 09 बनाता है; स्ट्रिंग उलट है ( )।
  • यहां, एक विशेष मामले के रूप में, मैं स्ट्रिंग के सामने एक प्रारंभिक 0 चरित्र जोड़ता हूं; यह मुझे चार वर्णों का उपयोग करने के लिए दुखी करता है, '0',लेकिन मैंने एक त्रुटि से बचने के लिए ऐसा किया जब दूसरे और तिहाई क्षेत्र दोनों खाली हैं। स्ट्रिंग को वापस एक संख्या में बदल दिया जाता है ( ) और इसे डी में संग्रहीत किया जाता है, जो कि पिछले दोनों क्षेत्रों के खाली होने पर सिवाय भाजक के होता है, क्योंकि ऐसे मामले में डी 0 के बराबर है।
  • D←D+0=कोड का टुकड़ा D से 1 सेट करता है यदि यह वर्तमान में शून्य है, और अब D में भाजक (हालांकि GCD विभाजन से पहले) है।
  • इस भाजक को गुणा किया जाता है ( ×) प्रारंभिक स्ट्रिंग की सामग्री के साथ मैं दूसरी डॉट तक (⍎'0',I/⍨2>+\P)जिसके साथ पी फिर से शुरू होता है (मेरे उदाहरण में 0 1 0 1 0), उन्हें क्रमांकित करके क्रमिक संख्याएं जोड़ता है (जो 0 1 1 2 बनाता है) मेरे उदाहरण में 2), जांचें कि कौन से मान 2 से छोटे हैं (बूलियन वेक्टर 1 1 1 0 0 बनाकर), और I में संबंधित अक्षर ले रहे हैं; एक और जाल (यदि दो प्रारंभिक क्षेत्र खाली हैं) को रोकने के लिए एक और 0 को स्ट्रिंग के सामने जोड़ा जाता है और पूरे को एक संख्या में बदल दिया जाता है।
  • इनपुट स्ट्रिंग के पिछले भाग को पिछले उत्पाद के साथ जोड़ा जाता है (⍎'0',1↓I/⍨2=+\P), जो P को फिर से लेता है, फिर से संचयी करके जोड़ता है, जांचें कि कौन से मान 2 के बराबर हैं (पिछले स्पष्टीकरण देखें), वर्ण लेता है, पहले एक को हटाता है जो एक डॉट है , एक प्रारंभिक प्रारंभिक वर्ण को जोड़ता है और एक संख्या में परिवर्तित होता है।
  • इस उत्पाद का एक योग के साथ एन में संग्रहित किया जाता है जो अंश है।
  • अंत में GCD की गणना D∨N के साथ की जाती है और दोनों संख्याओं को इस GCD द्वारा विभाजित किया जाता है।

संपादित करें: यहाँ 73 वर्णों के लिए एक फिक्स है:

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

इस हैक का विचार पहले मामले की गणना कर रहा है जहां संचयी जोड़ में 2 के बराबर मूल्य हैं, उन्हें बाद के लिए संग्रहीत करना और पहले मामले को प्राप्त करने के लिए इस बिटवाइज़ मास्क को निष्क्रिय करना; इस प्रकार अगले मामले की गणना करने के लिए कम पात्रों की आवश्यकता होती है।

संपादित करें: यहाँ 69 वर्णों के लिए एक और फिक्स है:

(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 से घटाकर फिर बाद में एक वर्ण को शुरुआत में हटा दें (जो कि ऋण चिह्न होगा)।

संपादित करें: कॉस्मेटिक परिवर्तन:

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

आकार में कोई सुधार नहीं, लेकिन मूल्यांकन किए जाने वाले कोड से अधिकतम फ़ंक्शन प्राप्त करने के लिए अधिक संतुष्ट ।


मैंने इसे tryapl.org से चलाने का प्रयास किया और यह शिकायत करता है INVALID TOKEN। तुम जानते हो क्यों?
पीटर टेलर

@Peter टेलर: हाँ, यह मेरे संदेश में भी कहा गया है; इसका कारण यह है कि मैं "निष्पादित" ऑपरेटर का उपयोग करता हूं जो कि Dyalog के सर्वर के लिए असुरक्षित होगा और इसे ऑनलाइन (सुरक्षित मोड) अक्षम कर दिया गया है। आपको इसे Dyalog APL के स्थापित संस्करण पर आज़माना होगा।
थॉमस बरुचेल

आह, शर्म की बात है। मैं एक सामयिक पीसीजी प्रस्तुत करने का परीक्षण करने में सक्षम होने के लिए 60 € खर्च करने वाला नहीं हूं। मुझे एक वैकल्पिक ऑनलाइन APL परीक्षक मिल गया है, लेकिन आपके कोड में कुछ Dyalog- विशिष्ट प्रतीत होता है क्योंकि यह रैंक त्रुटियों या लंबाई त्रुटियों को देता है।
पीटर टेलर

@ अभिनेता टेलर; नहीं;; जीएनयू एपीएल के साथ कृपया मेरी अपनी वेबसाइट (अभी भी प्रायोगिक और आधिकारिक नहीं) का उपयोग करें; लेकिन मैं इसे संगत (एक के आसपास कोष्ठक बनाने के लिए दो पात्रों को जोड़ने के लिए किया था 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

केवल असफल होने के बजाय कुछ भी नहीं संभालने के लिए आकार में वृद्धि की गई थी। Mouq का उपयोग करने का प्रस्ताव है $/, इसलिए अब इसका उपयोग किया जा रहा है, और कोड 20 बाइट्स छोटा है। Ayiko ने प्रतिस्थापित /करने का प्रस्ताव दिया , इसलिए कोड और भी छोटा है (12 बाइट्स द्वारा)। तब Mouq की जगह प्रस्तावित 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 को नहीं जानता, लेकिन क्या मैं यह अनुमान लगाने में सही हूं कि 'एबीसी' को देखते हुए, आपका प्रोग्राम सटीक तर्कसंगत अंकगणित का उपयोग करके c / 99 ... 9 की गणना करता है, लेकिन केवल ab की गणना करने के लिए फ्लोटिंग पॉइंट का उपयोग करता है? उस स्थिति में यदि b के कई अंक हैं तो यह गलत उत्तर देगा।
उमर

@ OmarAntolín-Camarena: बिलकुल नहीं। पर्ल 6 में, तर्कसंगत डिफ़ॉल्ट हैं, फ्लोटिंग पॉइंट नंबर नहीं। उदाहरण के लिए, 0.1 + 0.2 == 0.3पर्ल 6.
कोनराड बोरोस्की

2
80 वर्णों के लिए गोल्फ: $/=split ".",get;say join "/",($0+($1+$2/(9 x chars $2 or 1))/10**$1.chars).nude:)
मूक

6

जे ( 85 90 89 वर्ण)

मेरा मूल कार्य, जो दूसरे की तुलना में 5 वर्ण छोटा था, कीड़ों की एक जोड़ी थी: यह पूर्णांकों को "n / 1" के रूप में आउटपुट नहीं करता था और इसने एक दर्जन या अधिक अंकों के साथ संख्याओं पर गलत उत्तर दिया था। यहाँ J में एक सुधारा गया कार्य है जिसमें एक वर्ण को बचाने के लिए Exx का सुझाव शामिल है:

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पहले दो परीक्षण मामलों को ठीक करना चाहिए , यह टिप्पणी
mniip

मैंने 5 चरों की लागत से पूर्णांक के लिए आउटपुट तय किया, @mniip।
उमर

('0','x',~])एक बाइट का उपयोग करें और सहेजें।
बारहवीं

5

सी, 171

काफी समय। और कम किया जा सकता है। scanfयदि डॉट्स के बीच कोई संख्या नहीं है तो नहीं , जो वास्तव में इसे संभाल नहीं सकता है। नहीं strtol। बस संख्या crunching:

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... Am मैं कुछ गलत कर?
राफेलकास्ट्रोकोटो

मुझे नहीं पता ... अगर मैं सिर्फ सफारी कंसोल (फ़ायरफ़ॉक्स या क्रोम में भी करना चाहिए) में इस कोड को पेस्ट करता हूं, तो एंटर दबाएं और "5.3.87" टाइप करें, मैं अभी "889/165"कंसोल में मिलता हूं । आप इसे कैसे चला रहे हैं? @ अराफेलोकास्ट्रोउटो
टॉम्स्किंग

कोई बात नहीं ... मुझे लगता है कि मैंने कुछ गलत किया है क्योंकि यह अब काम कर रहा है ...
rafaelcastrocouto

1
आप b=1भाग को अंदर ले जाकर 1 वर्ण बचा सकते हैं prompt()
user2428118

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;{/}+/'/'@

NB यह रिक्त पूर्णांक भागों का समर्थन करता है।

यदि स्ट्रिंग प्रपत्र का है, '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 अंक मिले। यह उचित नहीं है, क्योंकि अन्य समाधानों ने सभी नियमों का पालन करने की पूरी कोशिश की है, जो आपने स्पष्ट रूप से नहीं किया है।
थॉमस बरूचेल

@ ברו אל, मुझे आपके दावे पर आपत्ति है कि मैंने नियमों का पालन करने की कोशिश नहीं की है। वैकल्पिक परीक्षण के मामलों की स्थिति ने मुझे यह सोचने में भ्रमित कर दिया कि अंतिम ब्लॉक ने सभी आवश्यक मामलों को कवर किया; यह पता चला है कि मैं गलत था, और मैं जल्द ही इस सवाल को संपादित करने जा रहा हूं कि अन्य लोग भी यही गलती न करें। अब मैंने अपने कोड को पहले से अनछुए कोने वाले मामलों को संभालने के लिए अपडेट किया है, और उस लिंक को दिखाने के लिए अपने लिंक को एक परीक्षण में अपडेट किया है।
पीटर टेलर

ठीक है। आप शायद 300 अंकों के हकदार हैं। कोडगॉल्फ के लिए नया होने के नाते, ये 300 अंक मेरे लिए एक चुनौतीपूर्ण लक्ष्य थे, और मैं अभी भी उन्हें नहीं पाने के लिए निराश हूं, जबकि मैं अभी भी सोच रहा हूं कि समय सीमा पर मेरा कोड नियमों को पूरी तरह से फिट करने के लिए सबसे छोटा था। वैसे भी, मेरे पास अंक जीतने के लिए मेरा सारा जीवन है। सादर।
थॉमस बरूचेल

@ ברו :אל: मैं 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
tomsmeding

@ OmarAntolín-Camarena AFAIK, उपलब्ध होने पर printउपयोग करता strहै, नहीं repr। मेरे अंत में यह आउटपुट है: puu.sh/7w64w.png
ओबेरॉन

@tomsmeding दोनों एक लाइन पर हैं; उत्तर में उन्हें फिट बनाने के लिए लाइन ब्रेक जोड़ा गया था। _=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

गणितज्ञ, १४३

हमेशा की तरह, गणितज्ञ नौकरी करने के लिए कई उच्च-स्तरीय कार्य प्रदान करता है, लेकिन उन्हें क्रिया नाम देता है।

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)

नमूना उत्पादन बाद में जोड़ा जाएगा जब मेरे पास समय होगा।


यह मुझे ऐसा लगता है जैसे कि यह n / 1 के बजाय पूर्णांक को आउटपुट करता है। क्या वह सही है? (मेरे समाधान में एक ही बग है ... :()
उमर

आह, अब मैं देख रहा हूँ .... टिप्पणियों में निर्दिष्ट। क्या एक अजीब आवश्यकता है ... अगर हर दूसरे अंश को कम किया जाता है, तो 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-कामारेना पर खास बिंदु, कल्पना का कहना है कि If you wish। मेरी इच्छा नहीं है, इसलिए मैं 1 या 3 अंक के समूह के बिना अंशों का समर्थन नहीं कर रहा हूं। मैं हालांकि अंकों के दूसरे समूह की कमी वाले अंशों का समर्थन कर रहा हूं, जो कल्पना से मेल खाता है।
मैनीप

@minip, आप कल्पना को गलत बताते हैं: यह नहीं कहता है "यदि आप चाहें तो आप समर्थन कर सकते हैं .. और .1.2", यह कहता है, "यदि आप चाहें, तो आप मान सकते हैं कि 0 .. और 0.1.2 हमेशा की तरह दिए गए हैं। .. और .1.2 "।
उमर

@ OmarAntolín-Camarena Point लिया गया। संपादित।
मैनीप

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

कोई पुस्तकालयों का उपयोग करते हुए दो अजगर जवाब। पहले पहले एक अंक के बिना वैकल्पिक इनपुट को संभालता है। और 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

हास्केल

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 मैं कोड गोल्फ में अच्छा नहीं हूं। कम से कम मैंने एकल चरित्र चर नामों का उपयोग किया है।
20

1
आपने कभी भी भाषा या कुल वर्णों / बाइट्स का उपयोग नहीं किया है।
जस्टिन फे

2
इंडेंट पर स्थान बचाने के लिए {;} का उपयोग करें, एस spanको लागू करने के लिए, कार्यों के लिए लघु उपनाम जोड़ने के लिए, जहां संभव हो, अंतरिक्ष को हटा दें। 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 अक्षर)

मैं एक विभाजक के रूप में स्लैश प्रतीक का उपयोग नहीं करता (लेकिन मैथमेटिका में समाधान या तो नहीं है क्योंकि यह एक ग्राफिकल प्रतिनिधित्व का उपयोग करता है जो वैसे भी बेहतर है); J भाषा में अंश को rइसके साथ प्रदर्शित किया जाता है /:

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

1

एपीएल (पूरी तरह से सामान्य नहीं)

पूरी तरह से सामान्य नहीं (डीसी के लिए मेरे समाधान की तरह); Dyalog APL के साथ काम करता है (लेकिन Dyalog APL के ऑनलाइन संस्करण पर नहीं, निश्चित नहीं कि क्यों):

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

पहला फ़ील्ड वैकल्पिक है, लेकिन दोनों अन्य क्षेत्रों के लिए कम से कम एक अंक आवश्यक है।


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 वर्ण लिखित के रूप में, अनावश्यक व्हाट्सएप को हटाने के बाद कम)

ध्यान दें कि यह 64-बिट 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

जीटीबी , 81

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

उदाहरण

?3.25.
            13/4

4
जब तक एक संकलक को इस भाषा के लिए स्वतंत्र रूप से उपलब्ध नहीं कराया जाता है, तब तक मैं इसका उपयोग करने वाले हर उत्तर को समाप्त कर दूंगा।
गारेथ

1
ऊपर लिंक किए गए पृष्ठ पर एक संकलक लगता है?
स्किब्रींस्की


2
@ गैरेथ, आप को नीचा दिखाने के लिए, गणित के कुछ जवाब हैं। : पी
उमर

2
@ OmarAntolín-Camarena गणितज्ञ के लिए एक संकलक / दुभाषिया है। GTB के पास कोई नहीं है। GTBयदि आपको मुझ पर विश्वास नहीं है तो ऊपर दिए गए लिंक का पालन करें । आपको एक मालिकाना कार्यक्रम के लिए कुछ संपीड़ित सामान मिलेगा, फिर आप उस कार्यक्रम की खोज करेंगे और पाएंगे कि डाउनलोड करने का दावा करने वाली साइट का कहना है कि यह उपलब्ध नहीं है। तो हम इसे कैसे संकलित करते हैं?
गारेथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.