শতাংশকে একটি "সরল" অনুপাতে রূপান্তর করুন


16

আপনি একটি রাজনৈতিক ওয়েবসাইট চালান , এবং নির্ধারণ করেছেন যে কোনও শতাংশে ("%১%" প্রকাশিত হওয়ার তুলনায় কোনও নির্বাচনে জয়ী হওয়ার বা হারার সুযোগকে অনুপাত হিসাবে ("5 %" ) হিসাবে প্রকাশ করা হলে লোকেরা আরও ভাল স্বজ্ঞাত জ্ঞান রাখে )।

তবে আপনি "৮৮৮ তে ৫৮" এর মতো বিভ্রান্তিকর অনুপাতও প্রদর্শন করতে চান না, আপনি চাইবেন যে এগুলি আরও যথাযথ না হলেও এমনকি তাদের আরও সহজে বোঝা যায়।

সুতরাং, 0.1% এবং 99.9% এর মধ্যে শতাংশ দেওয়া , নীচের নিয়মগুলি ব্যবহার করে নিকটতম "সহজে বোঝার" অনুপাত " এক্স ইন y " প্রদান করুন :

  1. সর্বাধিক মান (নীচে ব্যতিক্রম দেখুন) 10 বা তার চেয়ে কমের মধ্যে নিকটতম অনুপাতটি ফিরিয়ে আনতে হবে । 55% "" 9-এ 5 "ফিরে আসবে," 20 এ 11 "নয়।
  2. অনুপাতগুলি তাদের সর্বনিম্ন শর্তে হ্রাস করা উচিত । 65% এর "3 ইন 2" ফিরিয়ে নেওয়া উচিত, "6 ইন 4" নয়।
  3. 10% অধীনে মানগুলি ফেরত পাঠাবেন "ফর্ম এর নিকটতম অনুপাত মধ্যে n 1 " কোথায় এন (10,12,15,20,30,40,50,60,70,80,90,100) অন্যতম । উদাহরণস্বরূপ, 6% "15 এ 1" ফেরত আসবে।
  4. 90% এর চেয়ে বেশি মানগুলি " n-1 এ " ফর্মের নিকটতম অনুপাতটি ফেরত পাঠাতে হবে যেখানে n (10,12,15,20,30,40,50,60,70,80,90,100) এর মধ্যে একটি । উদাহরণস্বরূপ, 98.7% "80 এ 79" প্রত্যাবর্তন করা উচিত।
  5. 1% অধীনে মানগুলি আসতে উচিত " <100 জনের মধ্যে 1 জন "
  6. 99% উপর মানগুলি আসতে উচিত " > 99 100 "

বা, অন্যভাবে এটি সম্পর্কে চিন্তা করার জন্য, আপনার প্রোগ্রামটি নিম্নলিখিত সম্ভাব্য ফলাফলগুলি থেকে নিকটতম অনুপাতটি ফিরিয়ে আনবে (আমি আপনার সুবিধার জন্য তাদের আনুমানিক মানগুলি অন্তর্ভুক্ত করেছি):

<1 in 100
 1 in 100  = 1.00%
 1 in 90   = 1.11%
 1 in 80   = 1.25%
 1 in 70   = 1.43%
 1 in 60   = 1.67%
 1 in 50   = 2.00%
 1 in 40   = 2.50%
 1 in 30   = 3.33%
 1 in 20   = 5.00%
 1 in 15   = 6.67%
 1 in 12   = 8.33%
 1 in 10   = 10.00%
 1 in 9    = 11.11%
 1 in 8    = 12.50%
 1 in 7    = 14.29%
 1 in 6    = 16.67%
 1 in 5    = 20.00%
 2 in 9    = 22.22%
 1 in 4    = 25.00%
 2 in 7    = 28.57%
 3 in 10   = 30.00%
 1 in 3    = 33.33%
 3 in 8    = 37.50%
 2 in 5    = 40.00%
 3 in 7    = 42.86%
 4 in 9    = 44.44%
 1 in 2    = 50.00%
 5 in 9    = 55.56%
 4 in 7    = 57.14%
 3 in 5    = 60.00%
 5 in 8    = 62.50%
 2 in 3    = 66.67%
 7 in 10   = 70.00%
 5 in 7    = 71.43%
 3 in 4    = 75.00%
 7 in 9    = 77.78%
 4 in 5    = 80.00%
 5 in 6    = 83.33%
 6 in 7    = 85.71%
 7 in 8    = 87.50%
 8 in 9    = 88.89%
 9 in 10   = 90.00%
 11 in 12  = 91.67%
 14 in 15  = 93.33%
 19 in 20  = 95.00%
 29 in 30  = 96.67%
 39 in 40  = 97.50%
 49 in 50  = 98.00%
 59 in 60  = 98.33%
 69 in 70  = 98.57%
 79 in 80  = 98.75%
 89 in 90  = 98.89%
 99 in 100 = 99.00%
>99 in 100

অন্যান্য শর্তাদি:

  • সংখ্যার ইনপুট 0.1 থেকে 99.9 এর মধ্যে বা 0.001 থেকে 0.999 এর মধ্যে হতে পারে , যার মধ্যে আরও সুবিধাজনক। আপনাকে অবশ্যই কমপক্ষে 3 টি উল্লেখযোগ্য অঙ্ক পরিচালনা করতে হবে।
  • আপনাকে অবশ্যই একটি অনুপাত আউটপুট করতে হবে ("3 ইন 4"), সমান ভগ্নাংশ নয় ("3/4")।
  • যদি ইনপুটটির সমানভাবে দুটি অনুপাত থাকে তবে আপনার প্রোগ্রামটি যে কোনও একটিতে ফিরে আসতে পারে। 7.5% "12-এ 1" বা "15-এ 1" ফিরে আসতে পারে।
  • শীর্ষস্থানীয় / পিছনে সাদা স্থান এবং / অথবা নতুন লাইনগুলি ভাল

উদাহরণ :

Input  :   Output
 0.5   :  <1 in 100
 1.0   :   1 in 100
 1.5   :   1 in 70
 7.5   :   1 in 15  or  1 in 12 (either is acceptable)
 9.2   :   1 in 10
13.1   :   1 in 8
29.2   :   2 in 7
29.3   :   3 in 10
52.7   :   1 in 2
52.8   :   5 in 9
72.0   :   5 in 7
73.9   :   3 in 4
88.8   :   8 in 9
90.8   :   9 in 10
94.2   :  19 in 20
98.7   :  79 in 80
98.9   :  89 in 90
99.0   :  99 in 100
99.1   : >99 in 100

এটি একটি চ্যালেঞ্জ, প্রতিটি ভাষার জয়ের মধ্যে সংক্ষিপ্ততম কোড।

(এর অনুরূপ, তবে এর সদৃশ নয়) দশমিককে ভগ্নাংশে রূপান্তর করুন , নিকটতম ভগ্নাংশ , আনুমানিক ভাসমান পয়েন্ট সংখ্যাটি এন-অঙ্কের যথার্থতার সাথে রূপান্তর করুন )


If there are two ratios equally close to the input, your program can return either one. 7.5% could return "1 in 12" or "1 in 15"তার মানে কি আমরাও ফিরে আসতে পারি 7 in 100? বিটিডব্লিউ, 1 in 14এই ক্ষেত্রে ইনপুট কাছাকাছি।
DimChtz

@DimChtz না, যেমন নিয়ম 3 লঙ্ঘন করে (10% অধীনে মান হিসাবে "1 প্রকাশ করা উচিত এন ", নির্দিষ্ট সম্ভাব্য মান জন্য এন )।
ব্র্যাডিসি 29:18

ওহ, আমি এটি লক্ষ্য করিনি। ঠিক আছে.
DimChtz

2
আমি এটি চাই যদি আমরা কেবলমাত্র একটি টিউপল / তালিকা বা কোনও কিছুর মতো বিন্যাস হিসাবে অঙ্ক এবং ডিনোমিনেটর আউটপুট করতে পারি তবে ইতিমধ্যে প্রতিদ্বন্দ্বী উত্তর রয়েছে সুতরাং আমি মনে করি এই চ্যালেঞ্জের জন্য খুব দেরি হয়ে গেছে। ভবিষ্যতের চ্যালেঞ্জগুলির জন্য, আমি আরও নমনীয় আই / ও ফর্ম্যাটটি বিবেচনা করব কারণ যখন স্ট্রিং হ্যান্ডলিংয়ের দরকার হয় তখন কিছু ভাষাগুলি অন্যের চেয়ে বেশি প্রতিযোগিতামূলক হারায়।
হাইপারনিউট্রিনো ২১ আগস্ট'১২'১২

1
@ ব্র্যাডসি - এলএল। আমি মাত্র 538-এ ছিলাম, এবং আমি সবাই "বাহ! আমি এ থেকে একটি গল্ফিং চ্যালেঞ্জ তুলব!"
চাস ব্রাউন 21

উত্তর:


6

টি-এসকিউএল, 385 বাইট

SELECT TOP 1IIF(i>.99,'>',IIF(i<.01,'<',''))+n+' in '+d
FROM t,(SELECT ISNULL(PARSENAME(value,2),'1')n,PARSENAME(value,1)d FROM
STRING_SPLIT('100,90,80,70,60,50,40,30,20,15,12,10,9,8,7,6,5,2.9,4,2.7,3.10,3,3.8,2.5,3.7,4.9,2,5.9,4.7,3.5,5.8,2.3,7.10,5.7,3.4,7.9,4.5,5.6,6.7,7.8,8.9,9.10,11.12,14.15,19.20,29.30,39.40,49.50,59.60,69.70,79.80,89.90,99.100',','))m
ORDER BY ABS(i-ABS(n)/d)

ইনপুট পূর্ব বিদ্যমান টেবিল মারফত টি সাংখ্যিক ক্ষেত্র সহ আমি , আমাদের আই মান অনুযায়ী

এই ইনপুট টেবিলটি স্ট্রিং থেকে পার্স করা ইন-মেমরি টেবিলের সাথে যুক্ত হয়েছে STRING_SPLIT(যা সারিগুলি পৃথক করে) এবং PARSENAME(যা দিয়ে অঙ্ক এবং ডিনোমিনেটরকে পৃথক করে .)।

টেবিলটি ইনপুট মান i থেকে দূরত্ব অনুসারে বাছাই করা হয় এবং উপরের সারিটি যথাযথভাবে ফর্ম্যাট করা দেয়।


5

কাঠকয়লা , 84 বাইট

NθF¹¹«F⊖ι⊞υ⟦⊕κι⟧≔⎇⊖ι∨×χι¹²¦¹⁵ιF²⊞υ⟦∨κ⊖ιι⟧»≔Eυ↔⁻θ∕§ι⁰§ι¹η≔⌕η⌊ηη×<‹θ·⁰¹×>›θ·⁹⁹⪫§υη in 

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। শতাংশের চেয়ে দশমিক হিসাবে ইনপুট নেয়। ব্যাখ্যা:

Nθ

ভগ্নাংশটি ইনপুট করুন।

F¹¹«

এন=0এন=10

F⊖ι⊞υ⟦⊕κι⟧

জন্য অনুপাত তৈরি করুন1এনএন-1এন

≔⎇⊖ι∨×χι¹²¦¹⁵ι

এনটি12,15,20100এন

F²⊞υ⟦∨κ⊖ιι⟧»

জন্য অনুপাত তৈরি করুনএন-1এন1এন

≔Eυ↔⁻θ∕§ι⁰§ι¹η

সমস্ত অনুপাতের দশমিক মান গণনা করুন এবং আসল ইনপুট সহ পরম পার্থক্য গ্রহণ করুন।

≔⌕η⌊ηη

1224

×<‹θ·⁰¹

<0.01

×>›θ·⁹⁹

>0.99

⪫§υη in 

inপ্রিন্ট সহ উপযুক্ত অনুপাতের সংখ্যক এবং ডিনোমিনেটরে যোগ দিন ।


5

জাভাস্ক্রিপ্ট (ES7), 164 159 144 বাইট

]0,1[

r=>(g=m=>--n+11?g((q=n>1?n*10:n+10-~'13'[n],d=((p=r<.1?1:r>.9?q-1:n<0&&r*q+.5|0)/q-r)**2)>m?m:(o=p+' in '+q,d)):r<.01?'<'+o:r>.99?'>'+o:o)(n=11)

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

পি/কুই

=(পি/কুই-R)2

মিমি

কুই

মন্তব্য

r => (g = m =>               // r = input; g() = recursive function, taking m = best score
  --n + 11 ?                 // decrement n; if n is still greater than or equal to -10:
    g(                       //   do a recursive call to g():
      ( q =                  //     compute q = denominator:
        n > 1 ?              //       if n is greater than 1:
          n * 10             //         q = n * 10 (20, 30, ..., 100)
        :                    //       else:
          n + 10 - ~'13'[n], //         q = 12 if n = 0, 15 if n = 1, n + 11 if n < 0
        d = ((               //     compute d = (p / q - r)²:
          p =                //       compute p = numerator:
          r < .1 ?           //         if r is less than 0.01:
            1                //           p = 1
          :                  //         else:
            r > .9 ?         //           if r is greater than 0.90:
              q - 1          //             p = q - 1
            :                //           else:
              n < 0 &&       //             if n is negative (i.e. q is in [1,10]):
              r * q + .5 | 0 //               p = round(r * q)
                             //             otherwise: p = 0 (which will be ignored)
          ) / q - r          //       compute p / q - r
        ) ** 2               //       and square the result (cheaper than absolute value)
      ) > m ?                //     if d is greater than m:
        m                    //       leave m unchanged
      : (                    //     else:
        o = p + ' in ' + q,  //       update the output string o
        d                    //       and update m to d
    ))                       //   end of recursive call
  :                          // else (all possible ratios have been tried out):
    r < .01 ? '<' + o :      //   if r is less than 0.01, prefix with '<'
    r > .99 ? '>' + o :      //   if r is greater than 0.99, prefix with '>'
    o                        //   otherwise, just return o
)(n = 11)                    // initial call to g() with m = n = 11

4

জেলি , 58 বাইট

⁵R×⁵;12,15µ’,1,€)Ẏ;⁵Œc¤ð÷/ạ¥ÞḢj“ in ”
”<”>“”>.99$?<.01$?;Ç

এটি অনলাইন চেষ্টা করুন!

-16 Arnauld ধন্যবাদ বাইট (ঠিক পূর্বে লিখুন পারেন <এবং >পরিবর্তে পুরো ফ্রেজ rewriting এর)
-6 জনাথন অ্যালান করার বাইট ও বাগ সংশোধন করা হয়েছে ধন্যবাদ


@ আরনাউল্ড ওহ আপনি ঠিক বলেছেন, সে সম্পর্কে কখনও ভাবেননি: পি ধন্যবাদ!
হাইপারনিউট্রিনো

0.3ফলে উচিত 3 in 10না2 in 7
জনাথন অ্যালান

আপনি শুধু অপসারণ করা উচিত µµ, না? সম্পাদনা করুন - এবং তারপরে গল্ফ ÐṂṂকরুনÞḢ
জোনাথন অ্যালান

আমি বিশ্বাস করি যে বাগটি সমাধান 9করা উচিত তা পরিবর্তন করা ।
জোনাথন অ্যালান

@ জোনাথান অ্যালান ওহ ওহফফ্, হ্যাঁ আমি 10 টি বৈধ ডিনোমিনেটর হিসাবে ব্যবহার করছিলাম না। ধন্যবাদ। এবং না, ডাবল মিউ অপসারণ কাজ করে না কারণ ডায়াডিক লিংক-মিনিট ফাংশনের ডান পাশে "ন্যূনতম" সংযুক্ত রয়েছে যা অবশ্যই আমি চাই না তবে কেবল একটি মিউ স্থাপন করা এটি ঠিক করে না বলে মনে হয় । যদিও গল্ফের জন্য ধন্যবাদ: ডি
হাইপারনিউট্রিনো

3

পাইথন 2 , 261 278 261 237 177 বাইট

lambda n:' <>'[(n<.01)-(n>.99)]+'%d in %d'%min([(a,b)for b in[[12,15]+r(10,110,10),r(1,11)][.1<n<.9]for a in r([1,b-1][n>.9],[b,2][n<.1])],key=lambda(a,b):abs(1.*a/b-n))
r=range

এটি অনলাইন চেষ্টা করুন!


1
পাইথন সেমিকোলনগুলিকে সমর্থন করে না? আমি ভুল না হলে আপনি ... এর '\n 'সাথে প্রতিস্থাপন করতে পারেন ';'
দেব

@ ব্র্যাডিসি ফিক্সড :)
টিফিল্ড

3

পরিষ্কার , 224 198 197 বাইট

import StdEnv,Data.List,Text
t=toReal
$p=if(p<1.0)"<"if(p>99.0)">"""+snd(minimum[(abs(p-t n*1E2/t d),n<+" in "<+d)\\i<-[10,12,15:[20,30..100]],(n,d)<-[(1,i),(i-1,i):diag2[1..10][1..10]]|gcd n d<2])

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

t = toReal                              // give `toReal` a shorter name
$ p
 = if(p < 1.0)                          // if the percentage is less than 1%
  "<"                                   // prepend "<"
 if(p > 99.0)                           // if the percentage is > 99%
  ">"                                   // prepend ">"
  ""                                    // otherwise prepend nothing
 + snd (                                // to the second element of
  minimum [                             // the smallest item in a list composed of
   (                                    // pairs of
    abs (                               // the absolute value of
     p -                                // the difference between the percentage
     t n*1E2 / t d                      // and the ratio
    ) 
   ,                                    // associated with
    n <+ " in " <+ d                    // the string representation of the ratio
   )                                    // in the form of a tuple
   \\ i <- [10, 12, 15: [20, 30..100]]  // for every special denominator `i`
   , (n, d) <- [(1, i), (i - 1, i): diag2 [1..10] [1..10]]
                                        // for every ratio `n` : `d`
   | gcd n d < 2                        // where `n` / `d` cannot be further simplified
  ]
 )

3

জেলি ,  53  52 বাইট

_.01,.99Ṡµ<0ịØ<ḣE⁵Ż×⁵+12,5Ṡ,’Ɗż€$Ẏ;⁵Œc¤÷/ạ¥Þ³Ḣj“ in 

একটি পূর্ণ প্রোগ্রাম যা ফলাফল মুদ্রণ করে।

এটি অনলাইন চেষ্টা করুন!

অথবা পরীক্ষা-স্যুটটি দেখুন

নোট করুন যে টেস্ট-স্যুটটি কোডকে এক একাত্ত্বিক লিঙ্ক হিসাবে পরিবর্তিত করা হয়েছে যার দ্বারা:

  1. রেজিস্টার ব্যবহার করে বর্তমান "কর্মসূচির ইনপুট" র ট্র্যাক রাখতে, ³করতে ®; এবং
  2. সাথে "ইন" এর জন্য অক্ষর কোডের তালিকাটি বন্ধ করে “ in দেওয়া“ in ”

কিভাবে?

কোড দিয়ে শুরু হয় যা কোনও প্রয়োজনীয় মুদ্রণ <বা >সাইন এবং তারপরে কোডের মাধ্যমে বাধ্যতামূলক করে যা সমস্ত সংখ্যা-ডিনোমিনেটর জোড়গুলি তৈরি করে (কিছু কিছু অপ্রয়োজনীয় সরলীকৃত ফর্ম সংস্করণগুলির সাথে, তাদের সরলীকৃত ফর্মের পরে) এবং স্থিতিশীল ব্যবহার করে সর্বনিম্ন পৃথক বিভাগ-মূল্যায়িত এন্ট্রি প্রিন্ট করে সাজানোর সাথে যোগদান in

_.01,.99Ṡµ<0ịØ<ḣE⁵Ż×⁵+12,5Ṡ,’Ɗż€$Ẏ;⁵Œc¤÷/ạ¥Þ³Ḣj“ in  - Main Link: number in [0,1], n
 .01,.99                                             - literal pair = [0.01, 0.99]
_                                                    - subtract -> [n - 0.01, n - 0.99]
        Ṡ                                            - sign (vectorises) (-1 if <0; 1 if >0; else 0) 
         µ                                           - start a new monadic link
                                                     -   call that X
          <0                                         - less than zero? (vectorises)
             Ø<                                      - literal list of characters = "<>"
            ị                                        - index into (vectorises) ("<<" if n < 0.01; ">>" if n >= 0.99; else "><")
                E                                    - all (of X) equal? (1 if ((n < 0.01) OR (n > 0.99)) else 0
               ḣ                                     - head to index ("<" if n < 0.01; ">" if n > 0.99; else "")
                                                     -   (the following nilad forces a print of that)
                 ⁵                                   - literal 10
                  Ż                                  - zero-range -> [0,1,2,3,4,5,6,7,8,9,10]
                   ×⁵                                - multiply by 10 -> [0,10,20,30,40,50,60,70,80,90,100]
                      12,5                           - literal pair = [12,5]
                     +                               - add -> [12,15,20,30,40,50,60,70,80,90,100]
                                $                    - last two links as a monad
                             Ɗ                       -   last three links as a monad
                          Ṡ                          -     sign -> [1,1,1,1,1,1,1,1,1,1,1]
                            ’                        -     decrement -> [11,14,19,29,39,49,59,69,79,89,99]
                           ,                         -     pair -> [[1,1,1,1,1,1,1,1,1,1,1],[11,14,19,29,39,49,59,69,79,89,99]]
                              ż€                     -   zip with for €ach -> [[[1,12],[1,15],[1,20],[1,30],[1,40],[1,50],[1,60],[1,70],[1,80],[1,90],[1,100]],[[11,12],[14,15],[19,20],[29,30],[39,40],[49,50],[59,60],[69,70],[79,80],[89,90],[99,100]]]
                                 Ẏ                   - tighten -> [[1,12],[1,15],[1,20],[1,30],[1,40],[1,50],[1,60],[1,70],[1,80],[1,90],[1,100],[11,12],[14,15],[19,20],[29,30],[39,40],[49,50],[59,60],[69,70],[79,80],[89,90],[99,100]]
                                      ¤              - nilad followed by link(s) as a nilad:
                                   ⁵                 -   literal 10
                                    Œc               -   unordered pairs -> [[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[3,10],[4,5],[4,6],[4,7],[4,8],[4,9],[4,10],[5,6],[5,7],[5,8],[5,9],[5,10],[6,7],[6,8],[6,9],[6,10],[7,8],[7,9],[7,10],[8,9],[8,10],[9,10]]
                                  ;                  - concatenate -> [[1,12],[1,15],[1,20],[1,30],[1,40],[1,50],[1,60],[1,70],[1,80],[1,90],[1,100],[11,12],[14,15],[19,20],[29,30],[39,40],[49,50],[59,60],[69,70],[79,80],[89,90],[99,100],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[3,10],[4,5],[4,6],[4,7],[4,8],[4,9],[4,10],[5,6],[5,7],[5,8],[5,9],[5,10],[6,7],[6,8],[6,9],[6,10],[7,8],[7,9],[7,10],[8,9],[8,10],[9,10]]
                                           Þ         - sort by:
                                          ¥          -   last two links as a dyad:
                                                     -       ...(with right argument of
                                            ³        -           the program input, n)
                                        /            -     reduce by:
                                       ÷             -       division
                                         ạ           -     absolute difference
                                             Ḣ       - head
                                               “ in  - literal list of characters " in "
                                              ;      - concatenate
                                                     - implicit print

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.