সন্তুষ্টি রাউন্ডিং


16

সন্তুষ্টি রাউন্ডিং

আপনি যখন বিজ্ঞান ক্লাসে থাকবেন, এবং 2 টি সিগ ডুমুরের কাছাকাছি যেতে বললেন, তবে আপনার উত্তরটি কী 5.2501...? আপনার চারপাশে হওয়া উচিত 5.3, তবে এটি কেবল অতৃপ্ত! বৃত্তাকার দ্বারা 5.3, আপনি পুরো 0.05 দ্বারা বন্ধ আছেন, যা 0.1 এর তুলনায় বিশাল পরিমাণ (আপনি যে স্থানের মানটি ঘুরছেন)! সুতরাং সন্তুষ্টিজনক পথে আমাকে সাহায্য করুন round

সন্তোষজনক উপায়ে গোল করতে, আপনাকে অবশ্যই প্রথম অঙ্কে গোল করতে হবে যা অপেক্ষাকৃত ছোট ত্রুটি তৈরি করে - গোল করার সময় সর্বাধিক ত্রুটির অর্ধেকেরও কম। মূলত, আপনি যখনই 0, 1, 8 বা 9 এর মুখোমুখি হন তখন আপনাকে গোল করতে হবে যদি এটি কখনও না ঘটে তবে ইনপুটটি যেমন ফিরিয়ে দিন। নেতৃস্থানীয় জিরো বা বেশীগুলি নিয়ে গোল করবেন না - এটি কেবল সন্তুষ্টি বোধ করে না।

ইনপুট

একটি স্ট্রিং বা ফ্লোট মান যা একটি ননজিভেটিভ দশমিক সংখ্যা উপস্থাপন করে।

আউটপুট

একই দশমিক সংখ্যাটি স্ট্রিং বা ভাসমান বিন্যাসে সন্তুষ্টিজনকভাবে বৃত্তাকার।

উদাহরণ

Input -> Output
0 -> 0
0.5 -> 0.5
0.19 -> 0
0.8 -> 1
5.64511 -> 5.645
18.913 -> 20
88.913 -> 100
36.38299 -> 36.4
621 -> 620
803.22 -> 1000
547.4726 -> 547.4726

এটি একটি চ্যালেঞ্জ, তাই সংক্ষিপ্ততম কোড জিতেছে!



036.40000বৈধ আউটপুট হিসাবে বিবেচিত স্ট্রিংগুলি কি?
আর্নল্ড

1
আমরা কি ধরে নিতে পারি যে একটি .0অংশ পূর্ণসংখ্যার জন্য দেওয়া হবে? এছাড়াও, 0ইতিবাচক নয়।
এরিক আউটগল্ফার

পছন্দ করেছেন
কুইনটেক

1
তাই 19রাউন্ড 20কিন্তু 0.19রাউন্ড 0? কেন?
নিল

উত্তর:


2

জাভাস্ক্রিপ্ট (ES6),  100 99 98  78 বাইট

স্ট্রিং হিসাবে ইনপুট নেয়। একটি ফ্লোট ফেরত দেয়।

s=>+(0+s).replace(/\d/g,(d,i)=>j&&+d+((n=s[i+!++s[i]])<2&&i?--j:n>7&&j--),j=1)

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

কিভাবে?

আমরা প্রথমে ইনপুট স্ট্রিংয়ের একটি নেতৃস্থানীয় 0 প্রেন্ডেন্ড করি , যাতে আমাদের সম্ভাব্য নেতৃস্থানীয় 8 বা 9 আগে একটি সংখ্যা থাকার গ্যারান্টি দেওয়া হয় , এটি অবশ্যই অবিলম্বে রাউন্ডিং ট্রিগার করতে হবে।

পতাকা 1 সেট করা থাকবে যতক্ষণ না আমরা এমন একটি সংখ্যা খুঁজছি যার উপরে আমরা একটি সন্তোষজনক বৃত্তাকার করতে পারি এবং তার পরে 0 সেট করা হয়।

যেহেতু আমরা যে স্ট্রিংয়ের মধ্য দিয়ে চলছি তাতে একটি শীর্ষস্থানীয় 0 যুক্ত করা হয়েছিল তবে গুলি অপরিবর্তিত রেখে দেওয়া হয়েছে, বর্তমান অক্ষর রয়েছে এবং গুলি[আমি] পরবর্তী অক্ষরটির দিকে নির্দেশ করছে ।

আমরা সম্ভাব্য দশমিক বিভাজককে এড়িয়ে পরবর্তী অঙ্কটি এন লোড করতে আমরা নিম্নলিখিত কোডটি ব্যবহার করি :

n = s[i + !++s[i]]

যদিও স্ট্রিং জাভাস্ক্রিপ্টে অপরিবর্তনীয়, প্রকাশের ভাষা ++s[i]ফিরে আসবে গুলি[আমি]+ +1 যদি এটি একটি সাংখ্যিক মান ধারণ করে, যদিও গুলি[আমি] আসলে বৃদ্ধি করা হয় না। সুতরাং, সমস্ত সংখ্যার ( 0 সহ) এর জন্য f a l s e ( 0 তে জোর করা ) এবং দশমিক বিভাজকের জন্য t r u e ( 1 তে জোর করা ) হিসাবে অভিব্যক্তিটি !++s[i]মূল্যায়ন করা হয় ।একটিগুলি00টিRতোমার দর্শন লগ করা1"."

যখন রাউন্ডইং ঘটে, আমরা উত্পাদ d + --jযদি পরবর্তী অঙ্ক এন হয় 0 বা 1 (এবং আসল ইনপুটের নেতৃস্থানীয় অঙ্ক নয়) এবং d + j--যদি এন হয় 8 বা 9 । অতএব, উভয় ক্ষেত্রে 0 তে সেট করা হয়েছে তবে আমরা প্রথম ক্ষেত্রে 0 থেকে যোগ করব (গোল করে নিচে) এবং দ্বিতীয় ক্ষেত্রে 1 (গোল করবো ))


1
আর পিনবল / রাবারের বল পড়ে খাদের মধ্যে পড়ে! :)
কুইনটেক

2

রুবি , 79 77 69 67 65 বাইট

->n,z=n+".0"{z[i=z=~/\./]='';n.to_f.round (z=~/(?!^)[01]|8|9/)-i}

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

ব্যাখ্যা

  • ->n স্ট্রিং হিসাবে ইনপুট নিন
  • z=n+".0"একটি অস্থায়ী স্ট্রিং তৈরি করুন zযা ডট এবং প্রাসঙ্গিক অঙ্ক রাখার গ্যারান্টিযুক্ত।
  • i=z=~/\./দশমিক বিন্দুর অবস্থান নির্ধারণ করুন zএবং নির্ধারণ করুন i
  • z[i]='' বিন্দুটি ড্রপ করুন যাতে এটি আর এগিয়ে না যায়।
  • z=~/(?!^)[01]|8|9/অ-শুরুর 0-1বা যে কোনও 8-9, যেটি প্রথমে আসে তার অবস্থান নির্ধারণ করুন ।
  • (...)-i এই পার্থক্যটি রাখার জন্য দশমিক জায়গাগুলির সংখ্যা হবে, যদি আমরা বিন্দুটির বামদিকে গোল করবো negativeণাত্মক।
  • n.to_f.round ... ভাসতে রূপান্তর করুন এবং রাউন্ডিং করুন।

1

জেলি , 34 বাইট

;”.ḟ$µ»"”2e€⁽¡XṾ¤;1i1_i”.$_>¥0ɓVær

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

-1 জনাথন অ্যালানকে ধন্যবাদ ।


কেন ŒV? আমি মনে করি Vখুব কাজ করবে।
জোনাথন অ্যালান

@JonathanAllan নাঃ। (মূলত ব্যাংকারদের গোলাকার কৌতুক)
এরিক দ্য আউটগল্ফার

ওহ, কারণ এটি ইনপুটটিতে অভিনয় করছে না? _>¥0ɓVærআমার মত চেষ্টা করুন (আমি দ্রুত dyadic ব্যবহার মিস্ও!)
জনাথন অ্যালান

@ জোনাথান অ্যালান আহ, চেইনের চতুর ব্যবহার, ধন্যবাদ।
এরিক আউটগল্ফার

1

জেলি ,  30  29 বাইট

-১ এরিক দ্য আউটগোল্ফারকে ধন্যবাদ ( ¥তার উত্তর থেকে দ্রুত ডায়াডিকের ব্যবহার )

O;0µ_8H1¦%8ỊTḢ_<48TḢƊ_>¥0ɓVær

একটি ভাসা লিঙ্ক যা অক্ষরগুলির একটি তালিকা গ্রহণ করে যা একটি ফ্লোট দেয়।

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

কিভাবে

প্রথম দ্রষ্টব্য যে ইনপুট স্ট্রিংটি কেবলমাত্র অক্ষরগুলির মধ্যে বিশেষভাবে তৈরি করা হয় 0123456789.যার অর্ডিনাল রয়েছে [48,49,50,51,52,53,54,55,56,57,46], যার আটটি দ্বারা বিভাজিত হওয়ার সময় অবশিষ্ট রয়েছে [0,1,2,3,4,5,6,7,0,1,6]। শুধুমাত্র অক্ষর যার মধ্যে আছে -1এবং 1সমেত 0, 1, 8, এবং 9

তদুপরি আমরা যদি অর্ডিনালগুলি ( [40,41,42,43,44,45,46,47,48,49,38]) একই (মোটামুটি সুস্পষ্টভাবে) ধারণ করে আটটি বিয়োগ করি । আমরা এই (অর্ধেক যদি [20,20.5,21,21.5,22,22.5,23,23.5,24,24.5,19]যা remainders যখন আট যার মধ্যে আছে দ্বারা বিভক্ত আছে) শুধুমাত্র অক্ষর -1এবং 1সমেত 8এবং 9

O;0µ_8H1¦%8ỊTḢ_<48TḢƊ_>¥0ɓVær - Link: list of characters, S
O                             - ordinal (vectorises across S)
 ;0                           - concatenate a zero
                              - (to cater BOTH for no '0', '1', '8', or '9' AND for no '.')
   µ                          - start a new monadic link (call that X)
    _8                        - subtract eight (vectorises across X)
        ¦                     - sparse application...
       1                      - ...to: indices: one
      H                       - ...do: halve (i.e. halve first ordinal)
         %8                   - modulo by eight (vectorises)
           Ị                  - insignificant (abs(v)<=1?) (vectorises)
            T                 - truthy indices
             Ḣ                - head
                    Ɗ         - last three links as a monad (i.e. f(X)):
               <48            -   less than 48? (i.e. was it a '.' in S or the added 0?)
                  T           -   truthy indices
                   Ḣ          -   head
              _               - subtract
                       ¥      - last two links as a dyad
                      < 0     -   less than zero? (1 if so 0 otherwise)
                     _        -   subtract
                         ɓ    - start a new dyadic chain (i.e. f(S,X))
                          V   - evaluate S as Jelly code (i.e. get S as a float)
                           ær - round to the nearest multiple of 10^(-X)

1

রেটিনা 0.8.2 , 75 বাইট

^[89]
10
T`d`0`(?<=.)[01].*|(?<=8|9).*
T`89d`0d`.\.?[89]
(\.|(\..+?))0+$
$2

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। ব্যাখ্যা:

^[89]
10

একটি নেতৃস্থানীয় 8বা এর কেস পরিচালনা করুন 9

T`d`0`(?<=.)[01].*|(?<=8|9).*

যদি অ-নেতৃস্থানীয় 0বা থাকে 1, তবে এটি শূন্য করুন এবং বাকী স্ট্রিং আউট। এছাড়াও, যদি কোনও 8বা থাকে 9তবে তা রেখে দিন, তবে বাকী স্ট্রিংটি শূন্য। (তবে উভয় ক্ষেত্রে দশমিক বিন্দু অপরিবর্তিত রেখে দিন))

T`89d`0d`.\.?[89]

যদি এখনও এই মুহুর্তে একটি 8বা একটি 9থাকে, তবে এটি শূন্য করুন এবং পূর্ববর্তী অঙ্কটি বৃদ্ধি করুন (সম্ভবত দশমিক বিন্দুর আগে)।

(\.|(\..+?))0+$
$2

ট্রেলিং শূন্যগুলি দশমিক বিন্দুর পরে থাকলে মুছুন, তবে এর মধ্যে অন্য কোনও অঙ্ক না থাকলে কেবলমাত্র দশমিক পয়েন্ট মুছুন।


1

সি (জিসিসি) , 111 102 বাইট

g(_,i,j,k)char*_;{for(i=*_<56?*_++:48,j=3;j;j&=k%8>1|(i=*_++)/48*2)putchar(j&1?i+(k=_[*_<48])/56:48);}

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

//_: input, as string
//i: current digit, rounded if applicable
//j: tracks whether number is rounded, and whether \0 or '.' has been encountered
//k: digit to test rounding (round if k is one of 0,1,8,9)
//'0'==48, '8'==56
g(_,i,j,k)char*_;{
    for(i=*_<56?*_++:48,j=3;                //special case: if first digit is 8 or 9, use a
                                            //placeholder digit with value 0. initialize j.
        j;                                  //only stop execution when number is rounded and
                                            //'.' or \0 has been encountered.
        j&=k%8>1|(i=*_++)/48*2)             //check if execution should stop.
        putchar(j&1?i+(k=_[*_<48])/56:48);  //print '0' if rounding had already been done;
                                            //otherwise, print digit. round up as needed.
}

0

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 280 বাইট

c=>{int d=c.IndexOf('.');int t=c.IndexOfAny(new char[]{'8','9','0','1'},1);var m=c[0]=='8'||c[0]=='9'?1>0:0>1;var z=decimal.Parse(c);Func<decimal>q=()=>(decimal)Math.Pow(10,m?d<0?c.Length:d:d<0?c.Length-t:d>t?d-t:d-t+1);return m?Math.Round(z/q())*q():t<0?z:Math.Round(z/q())*q();}

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

যদি আমি দশমিকের পরিবর্তে ডাবল ব্যবহার করি তবে এটি সংক্ষিপ্ত হতে পারে তবে আমি নির্ভুলতা সংরক্ষণে দশমিক ব্যবহার করেছি, না হলে 547.4726 এর মতো সংখ্যা 547.472595214844 হবে।

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 268 বাইট

c=>{int d=c.IndexOf('.');int t=c.IndexOfAny(new char[]{'8','9','0','1'},1);var m=c[0]=='8'||c[0]=='9'?1>0:0>1;var z=float.Parse(c);Func<double>q=()=>Math.Pow(10,m?d<0?c.Length:d:d<0?c.Length-t:d>t?d-t:d-t+1);return m?Math.Round(z/q())*q():t<0?z:Math.Round(z/q())*q();}

এটি অনলাইনে চেষ্টা করুন! (কম নির্ভুল সংস্করণ)

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