দশমিকগুলি ছাঁটাই করুন এবং গণনা করুন


11

এই চ্যালেঞ্জটিতে আপনি ইনপুট স্ট্রিংয়ে কত দশমিক স্থান রয়েছে তা আউটপুট করার জন্য একটি প্রোগ্রাম লিখবেন এবং প্রয়োজনে ইনপুটটি ছাঁটাবেন।

উদাহরণ

-12.32
2

32
0

3231.432
3

-34.0
0 -34

023
0 23

00324.230
2 324.23

10
0

00.3
1 0.3

0
0

-04.8330
3 -4.833

বিধি

  • ইনপুট একটি স্ট্রিং হবে যা STDIN, ফাংশন আর্গুমেন্ট বা নিকটতম সমতুল্য মাধ্যমে নেওয়া যেতে পারে
  • আউটপুট ফাংশন রিটার্ন, STDOUT, বা নিকটতম সমতুল্য মাধ্যমে হতে পারে।
  • আপনার ভাষার সর্বাধিক স্ট্রিং দৈর্ঘ্য ব্যতীত ইনপুট পূর্ণসংখ্যার আকারের কোনও সীমা নেই
  • যদি ইনপুটটিতে কোনও অপ্রয়োজনীয় (শীর্ষস্থানীয় বা পিছনে) জিরো থাকে:
    1. আপনি তাদের বাইরে নিয়ে যাওয়া উচিত
    2. নতুন সংখ্যায় দশমিক স্থানের পরিমাণ আউটপুট
    3. পৃথককারী দ্বারা পৃথক করা নতুন সংখ্যা আউটপুট করুন (উদাহরণস্বরূপ স্পেস, নিউলাইন, কমা)
  • ইনপুট সর্বদা এই RegEx এর সাথে মেলে: -?\d+(\.\d+)?বা আপনি যদি RegEx না বলে থাকেন :
    • সেখানে পারে একটি হতে -শুরুতে একটি ঋণাত্মক সংখ্যা implying হয়। তারপরে কমপক্ষে একটি অঙ্ক থাকবে। তারপরে ... এ এবং আরও কিছু অঙ্ক থাকতে পারে .
    • কোনও ইনপুট বৈধ কিনা তা পরীক্ষা করতে এখানে চেক করুন
  • কোনও রেজেক্স নেই

এটি তাই বাইট জিতে সংক্ষিপ্ততম কোড


হতে পারে বিয়োগ চিহ্ন এবং নেতৃস্থানীয় শূন্যগুলির সাথে একটি পরীক্ষার কেস যুক্ত করবেন?
লুইস মেন্ডো

এটি ছাঁটাই করা হয়েছে কিনা তা নির্বিশেষে চূড়ান্ত সংখ্যাটি আউটপুট দেওয়ার অনুমতি রয়েছে?
সন্নিবেশকারী নাম 22

1
@ অন্তর্ভুক্তকারীর নাম নেই এখানে কেবল দ্বিতীয় সংখ্যাটি ছাঁটাই করা থাকলে আউটপুট করতে পারবেন না
ডাউনগোট

1
আপনি একটি একক জন্য একটি পরীক্ষা কেস / উদাহরণ যুক্ত করতে চাইতে পারেন 0
সন্নিবেশকারীর নাম এখানে

3
অর্থহীন রেজেক্স সীমাবদ্ধতার জন্য -1।
কনর ওব্রায়ান

উত্তর:


0

পিএইচপি 7, 142 বাইট

আমি একরকম একক মুদ্রণ বিবৃতিতে সমস্ত কিছু মুছে ফেলতে সক্ষম হয়েছি:

<?=strlen((explode('.',$t=trim('-'==($_=$argv[1])[0]?$n=$_=trim($_,'-'):$_,0)))[1]).($t!==$_?($n?' -':' ').('.'==$t[0]?0:'').trim($t,'.'):'');

কমান্ড লাইন থেকে চালানো, যেমন:

$ php trimandcount.php "-04833.010"

ডেমো

খুব দীর্ঘ একটি (62 টি অক্ষর) সহ সমস্ত পরীক্ষার কেস কার্যত দেখুন:

1 কেনার আগে চেষ্টা করুন

1 সমস্ত ফলাফল দেখতে " 7.0.0 এর জন্য আউটপুট " নীচের বাক্সের উপরে ঘুরে দেখুন।


4

পাইথন 2, 165 180 বাইট

প্রথমে আমি আমার প্রথম পাইথ প্রোগ্রামটি লেখার কথা ভাবছিলাম, সম্ভাব্য কমাটির পরে অঙ্কগুলি গণনা করতে পেরেছিলাম। তবে আমি বেশ বিরক্ত হয়েছিলাম, আমি জানি না আপনি কীভাবে সেই ভাষা উপভোগ করবেন, অনুমান করুন এটি কেবলমাত্র জয়ের উদ্দেশ্যে। যাইহোক এখানে আমার সমাধান (সম্পাদিত কারণ এটি বৃহত সংখ্যক জন্য কাজ করে না):

def t(i):
 o,a='',i
 while a[-1]=='0':
  a=a[:-1]
 while a[0]=='0':
  a=a[1:]
 if a[-1]=='.':a=a[:-1]
 if'.'in a:o=str(len(a)-a.index('.')-1)
 else:o='0'
 if a!=i:o+=" "+a
 print o

পাইথের ক্ষেত্রে যদি কেউ আমার কাজ গড়ে তুলতে চায়: ~b@+cz"."" "1Wq@b_1"0"~b<b_1)plrb6আপনি কোথায় আছেন তা দেখার জন্য আপনি সম্ভবত এপি toোকাতে চাইতে পারেন @+


2

05 এ বি 1 ই , 23 বাইট (অ-প্রতিযোগিতামূলক)

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

কোড:

DÞ'.¡0Üg,\DÞ0Ü'.ÜDrQ_i,

ব্যাখ্যা:

D                       # Duplicate top of the stack, or input when empty
 Þ                      # Convert to float
  '.¡                   # Split on '.' (decimal point)
     0Ü                 # Remove trailing zeroes
       g                # Get the length
        ,               # Output top of the stack (the length)
         \              # Discard the top item
          D             # Duplicate top of the stack
           Þ            # Convert to float
            0Ü          # Remove trailing zeroes
              '.Ü       # Remove trailing dots
                 D      # Duplicate top of the stack
                  r     # Reverse the stack
                   Q_i, # If not equal, print top of the stack

আইএসও 8859-1 এনকোডিং ব্যবহার করে ।


2

জাভাস্ক্রিপ্ট (ES6), 156 162

'-0' এর জন্য স্থির বাগ সম্পাদনা করুন - থেক্স @ ফিজ ভ্রাস্টা সম্পাদনা করুন 2 6 বাইট সংরক্ষিত থেক্স @ নীল

এটি গোলযোগ, তবে এটি 100% স্ট্রিং ভিত্তিক - সংখ্যার ধরণের কারণে সীমাবদ্ধ নয় to

s=>(l=k=p=t=0,[...s].map(c=>++t&&c=='.'?p=t:+c&&(l=t,k=k||t)),m=p>l?p-1:p?l:t,k=k>p&&p?p-2:k-1,r=(s<'0'?'-':'')+s.slice(k,m),(p&&m>p?m-p:0)+(r!=s?' '+r:''))

কম গল্ফড

f=s=>
(
  // All values are position base 1, so that 0 means 'missing'
  // k position of first nonzero digit
  // l position of last non zero digit
  // p position of decimal point
  // t string length
  l=k=p=t=0,
  // Analyze input string
  [...s].map((c,i)=>c=>++t&&c=='.'?p=t:+c&&(l=t,k=k||t)),
  // m position of last digits in output
  // if the point is after the last nz digit, must keep the digits up to before the point
  // else if point found, keep  up to l, else it's a integer: keep all
  m=p>l?p-1:p?l:t,
  // the start is the first nonzero digit for an integer
  // but if there is a point must be at least 1 char before the point
  k=k>p&&p?p-2:k-1,
  // almost found result : original string from k to m
  r=(s<'0'?'-':'')+s.slice(k,m), // but eventually prepend a minus
  (p&&m>p?m-p:0) // number of decimal digits
  +(r!=s?' '+r:'') // append the result if it's different from input
)

পরীক্ষা

F=s=>(l=k=p=t=0,[...s].map(c=>++t&&c=='.'?p=t:+c&&(l=t,k=k||t)),m=p>l?p-1:p?l:t,k=k>p&&p?p-2:k-1,r=(s<'0'?'-':'')+s.slice(k,m),(p&&m>p?m-p:0)+(r!=s?' '+r:''))

console.log=x=>O.textContent+=x+'\n';
// Test cases  
;[['-12.32','2'],['32','0'],['3231.432','3'],['-34.0','0 -34']
 ,['023','0 23'],['00324.230','2 324.23'],['10','0'],['00.3','1 0.3']
 ,['0','0'],['-0','0'],['-04.8330','3 -4.833']]
.forEach(t=>{
  var i=t[0],k=t[1],r=F(i);
  console.log((k==r?'OK ':'KO ')+i+' -> '+r)})

function test(){var i=I.value,r=F(i);R.textContent=r;}
test()
input { width:90% }
input,span { font-family: sans-serif; font-size:14px }
Input: <input id=I oninput='test()' value='-000000098765432112345.67898765432100000'>
Output: <span id=R></span><br>
Test cases<br>
<pre id=O></pre>


আমার এবং আপনার উত্তর উভয়ের মতই মনে হচ্ছে -0ইনপুট হিসাবে সমস্যা আছে .. আমাদের আউটপুট করা উচিত 0, না0 0
ফেজ ভ্রাস্টা

হ্যাঁ, নির্দেশ করার জন্য ধন্যবাদ
edc65

@ ফেজব্রাস্টা স্থির
এডিসি 65

না c=='.'?p=t:+c&&(l=t,k=k||t)কাজ আপনি একটি বাইট সংরক্ষণ করতে?
নীল

আমার মনে হয় আপনি ব্যবহার করে আরো কিছু সংরক্ষণ করতে সক্ষম হতে পারেন t=l=k=p=0এবং ++t&&c=='.'ইত্যাদি
নিল

1

ES6, 102 180 177 বাইট

s=>(t=s.replace(/(-?)0*(\d+(.\d*[1-9])?).*/,"$1$2"),d=t.length,d-=1+t.indexOf('.')||d,t!=s?d+' '+t:d)

s=>{t=[...s];for(m=t[0]<'0';t[+m]==0&&t[m+1]>'.';)t[m++]='';r=l=t.length;for(r-=1+t.indexOf('.')||l;t[--l]<1&&r;r--)t[l]='';t[l]<'0'?t[l]='':0;t=t.join``;return t!=s?r+' '+t:r}

সম্পাদনা: @ বর্ধিত 3 বাইট ধন্যবাদ @ edc65; সন্নিবেশকারী নামটিতে 1 বাইট সংরক্ষণ করা হয়েছে।


বিভাজনের পরিবর্তে ছড়িয়ে দেওয়ার চেষ্টা করুনt=[...s]
এডক 65

@ এডসি ages ages আমি আবার লেখার পরে আবার এটি গলফ করার চেষ্টা করার জন্য যুগে যুগে কাটিয়েছি এবং আপনি গিয়ে একটি ফ্ল্যাশে একটি 3 বাইট সাশ্রয় করতে পারেন ...
নীল

আমার মনে হয় আপনি সংরক্ষণ করতে পারবেন 1 বাইট : প্রতিস্থাপন t[--l]==0সঙ্গে t[--l]<1
সন্নিবেশকারী

ধন্যবাদ!
নীল

0

সি ++, 180 বাইট

int f(char*s,char*&p){int m=*s=='-',n=0;for(p=s+m;*p=='0';++p);for(;*++s-'.'&&*s;);p-=p==s;if(*s){for(;*++s;)++n;for(;*--s=='0';--n)*s=0;*s*=n>0;}if(m&&*p-'0'|n)*--p='-';return n;}

এটি পোর্টেবল সি ++, যা অক্ষর এনকোডিংয়ের কোনও অনুমান করে না এবং এতে কোনও লাইব্রেরি (এমনকি স্ট্যান্ডার্ড লাইব্রেরিও নয়) অন্তর্ভুক্ত থাকে।

ইনপুট পাস করা হয় s। দশমিক স্থানের সংখ্যা ফিরে এসেছে; স্ট্রিংটি জায়গায় পরিবর্তিত হয়েছে এবং নতুন শুরুটি ফিরে আসবে p

অধিকার অনুসারে, আমি একটি ফিরে আসব size_t, তবে পরিবর্তে আমি দাবি করতে যাচ্ছি যে আপনার এটি একটি ওএসের জন্য সংকলন করা উচিত যা স্ট্রিংগুলির আকারকে অর্ধেকের সীমাতে সীমাবদ্ধ করে int। আমি মনে করি এটি যুক্তিসঙ্গত; এটি 32-বিট আর্কিটেকচারে 2 বিলিয়নেরও বেশি দশমিক স্থান গণনা করে।

ব্যাখ্যা

int f(char*s, char*&p){
    int m=*s=='-', n=0;
    for(p=s+m;*p=='0';++p);     // trim leading zeros
    for(;*++s-'.'&&*s;);        // advance to decimal point
    p-=p==s;                    // back up if all zeros before point
    if(*s){
        for(;*++s;)++n;          // count decimal places
        for(;*--s=='0';--n)*s=0; // back up and null out trailing zeros
        *s*=n>0;                 // don't end with a decimal point
    }
    if(m&&*p-'0'|n)*--p='-';    // reinstate negative sign
    return n;
}

পরীক্ষা প্রোগ্রাম

#include <cstring>
#include <cstdio>
int main(int argc, char **argv)
{
    for (int i = 1;  i < argc;  ++i) {
        char buf[200];
        strcpy(buf, argv[i]);
        char *s;
        int n = f(buf, s);
        printf("%10s ==> %-10s (%d dp)\n", argv[i], s, n);
    }
}

টেস্ট আউটপুট

    -12.32 ==> -12.32     (2 dp)
        32 ==> 32         (0 dp)
  3231.432 ==> 3231.432   (3 dp)
     -34.0 ==> -34        (0 dp)
       023 ==> 23         (0 dp)
 00324.230 ==> 324.23     (2 dp)
        10 ==> 10         (0 dp)
      00.3 ==> 0.3        (1 dp)
  -04.8330 ==> -4.833     (3 dp)
    -00.00 ==> 0          (0 dp)
       -00 ==> 0          (0 dp)
       000 ==> 0          (0 dp)
      0.00 ==> 0          (0 dp)
      -0.3 ==> -0.3       (1 dp)
         5 ==> 5          (0 dp)
        -5 ==> -5         (0 dp)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.