একটি পিনারি নম্বর মানিক করুন


32

পটভূমি

দশমিক, বাইনারি, হেক্সাডেসিমাল, অক্টাল: এখানকার বেশিরভাগ লোককে কয়েকটি পূর্ণসংখ্যার বেস সিস্টেমগুলির সাথে পরিচিত হওয়া উচিত। উদাহরণস্বরূপ, হেক্সাডেসিমাল সিস্টেমে, একটি সংখ্যা abc.de 16 উপস্থাপন করবে

a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2

তবে, কেউ অযৌক্তিক সংখ্যার মতো অ-পূর্ণসংখ্যার ঘাঁটিও ব্যবহার করতে পারে। এই জাতীয় বেস একবারে স্বর্ণের অনুপাত uses = (1 + √5) / 2 ≈ 1.618 ... ব্যবহার করে । এগুলি পূর্ণসংখ্যা বেসগুলিতে অ্যানালগালিভাবে সংজ্ঞায়িত করা হয়। সুতরাং একটি সংখ্যা abc.de φ (যেখানে একটি থেকে পূর্ণসংখ্যার সংখ্যা হয়) উপস্থাপন করবে

a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2

নোট করুন যে নীতিগতভাবে কোনও অঙ্কই নেতিবাচক হতে পারে (যদিও আমরা এর সাথে অভ্যস্ত নই) - আমরা একটি শীর্ষস্থানীয় সহ একটি নেতিবাচক অঙ্ক উপস্থাপন করব ~। এই প্রশ্নের আমরা থেকে সংখ্যায় পর্যবসিত নিজেদেরকে সীমাবদ্ধ উদ্দেশ্য পূরণকল্পে ~9করতে 9, তাই আমরা unambiguously (মাঝে টিলড চিহ্ন সহ) এক স্ট্রিং হিসেবে একটি সংখ্যা লিখতে পারেন। সুতরাং

-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2

হিসাবে লেখা হবে ~290.~43। আমরা এই জাতীয় সংখ্যাকে একটি ফিনারি নম্বর বলে থাকি

একটি ফিনারি নম্বর সর্বদা স্ট্যান্ডার্ড আকারে উপস্থাপন করা যায় , যার অর্থ প্রতিনিধিত্ব কেবলমাত্র অঙ্কগুলি ব্যবহার করে 1এবং কোথাও 0না রেখে এবং and চ্ছিক 11বিয়োগ চিহ্ন সহ পুরো সংখ্যাটি নেতিবাচক তা নির্দেশ করে to (মজার বিষয় হল, প্রতিটি পূর্ণসংখ্যার স্ট্যান্ডার্ড আকারে একটি অনন্য সীমাবদ্ধ প্রতিনিধিত্ব রয়েছে))

প্রতিনিধিত্বগুলি যা মান আকারে নেই নীচের পর্যবেক্ষণগুলি ব্যবহার করে সর্বদা স্ট্যান্ডার্ড আকারে রূপান্তর করা যেতে পারে:

  1. 011 φ = 100 φ (কারণ φ 2 = φ + 1)
  2. 0200 φ = 1001 φ (কারণ φ 2 + 1 / φ = 2φ)
  3. 0 ~ 10 φ = ~ 101 φ (কারণ φ - 1 / φ = 1)

এছাড়াও:

  1. যদি সর্বাধিক উল্লেখযোগ্য অঙ্কটি হয় ~1(বাকী সংখ্যাটি স্ট্যান্ডার্ড ফর্ম হিসাবে থাকে), সংখ্যাটি নেতিবাচক হয়, এবং আমরা এটিকে সমস্ত অদলবদল করে 1এবং ~1, একটি বিয়োগ চিহ্নটি প্রস্তুত করে এবং উপরের তিনটি বিধি প্রয়োগ করে আমাদের অবধি পুনরায় প্রয়োগ করতে পারি স্ট্যান্ডার্ড ফর্ম প্রাপ্ত।

এই জাতীয়করণের উদাহরণ এখানে দেওয়া হয়েছে (প্রতিটি অঙ্কের অবস্থানটি সারিবদ্ধ রাখতে আমি ইতিবাচক অঙ্কগুলির জন্য অতিরিক্ত স্পেস ব্যবহার করছি): 1~3.2~1φ

      1~3. 2~1φ         Rule:
=     0~2. 3~1φ         (3)
=    ~1~1. 4~1φ         (3)
=  ~1 0 0. 4~1φ         (3)
=  ~1 0 0. 3 0 1φ       (3)
=  ~1 0 1. 1 0 2φ       (2)
=  ~1 1 0. 0 0 2φ       (1)
=  ~1 1 0. 0 1 0 0 1φ   (2)
= - 1~1 0. 0~1 0 0~1φ   (4)
= - 0 0 1. 0~1 0 0~1φ   (3)
= - 0 0 1.~1 0 1 0~1φ   (3)
= - 0 0 0. 0 1 1 0~1φ   (3)
= - 0 0 0. 0 1 1~1 0 1φ (3)
= - 0 0 0. 0 1 0 0 1 1φ (3)
= - 0 0 0. 0 1 0 1 0 0φ (1)

ফলন ।-0.0101φ

আরও পড়ার জন্য, উইকিপিডিয়ায় এই বিষয়ে একটি খুব তথ্যমূলক নিবন্ধ রয়েছে।

চ্যালেঞ্জ

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

আপনি STDIN, ARGV বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিতে পারেন এবং হয় ফলাফলটি ফেরত দিতে পারেন বা এটি STDOUT এ মুদ্রণ করতে পারেন।

আপনি উপরোক্ত পদ্ধতির চেয়ে আলাদা অ্যালগরিদম ব্যবহার করতে পারবেন যতক্ষণ না এটি নীতিগতভাবে সালিসি (বৈধ) ইনপুটগুলির জন্য সঠিক এবং সঠিক - এটি হ'ল একমাত্র সীমা যা অন্তর্ভুক্তের আকারের মতো প্রযুক্তিগত সীমাবদ্ধতা হতে পারে ডেটা প্রকার বা উপলভ্য র‌্যাম। উদাহরণস্বরূপ, ভাসমান-পয়েন্ট নম্বর হিসাবে ইনপুটটি মূল্যায়ন এবং তারপরে লোভের সাথে অঙ্কগুলি বেছে নেওয়া অনুমোদিত নয়, কারণ যে কোনও ইনপুট খুঁজে পেতে পারে যার জন্য ভাসমান-পয়েন্টের ভুলগুলি ফলাফল তৈরি করতে পারে।

এটি কোড গল্ফ, সংক্ষিপ্ত উত্তর (বাইটে) জিতেছে।

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

Input       Output

1           1.
9           10010.0101
1.618       10000.0000101
1~3.2~1     -0.0101
0.~1021     0. (or -0.)
105.~2      1010.0101
~31~5.~1    -100000.1001

এখন আমি আমার সংখ্যায় নেতিবাচক অঙ্কগুলি ব্যবহার করতে চাই! 1 ~ 3 * 6 == 5 ~ 8
হারুন

উত্তর:


6

জাভাস্ক্রিপ্ট (ES6) - 446 418 422 420 বাইট

minified:

F=s=>{D=[];z='000000000';N=t=n=i=e=0;s=(z+s.replace(/^([^.]*)$/,'$1.')+z).replace(/~/g,'-').replace(/-?\d/g,s=>((D[n++]=s/1),0));for(;i<n-3;i=j){if(p=D[j=i+1]){if(!e&&p<0){D=D.map(k=>-k);N=~N;p=-p}e=1}d=D[i];x=D[i+2];m=D[i+3];if(p<0){d--;p++;x++;e=j=0}if(p>1){d++;m++;p-=2;e=j=0}if(!d&&p*x==1){d=p;e=j=p=x=0}D[i]=d;D[i+1]=p;D[i+2]=x;D[i+3]=m}return(N?'-':'')+s.replace(/0/g,()=>D[t++]).replace(/^(0(?!\.))+|0+$/g,'')}

সম্প্রসারিত:

F = s => {
    D = [];
    z = '000000000';
    N = t = n = i = e = 0;
    s = (z + s.replace( /^([^.]*)$/, '$1.' ) + z).replace( /~/g, '-' ).
        replace( /-?\d/g, s => ((D[n++]=s/1),0) );

    for( ; i < n-3; i = j ) {
        if( p = D[j = i+1] ) {
            if( !e && p < 0 ) {
                D = D.map( k=>-k );
                N = ~N;
                p = -p;
            }
            e = 1;
        }
        d = D[i];
        x = D[i+2];
        m = D[i+3];

        if( p < 0 ) {
            d--;
            p++;
            x++;
            e = j = 0;
        }
        if( p > 1 ) {
            d++;
            m++;
            p-=2;
            e = j = 0;
        }
        if( !d && p*x == 1 ) {
            d = p;
            e = j = p = x = 0;
        }

        D[i] = d;
        D[i+1] = p;
        D[i+2] = x;
        D[i+3] = m;
    }

    return (N ? '-' : '') + s.replace( /0/g, ()=>D[t++] ).replace( /^(0(?!\.))+|0+$/g, '' );
}

কোডটি একটি ফাংশন তৈরি Fকরে যা নির্দিষ্ট রূপান্তর সম্পাদন করে।

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

আমার নোট করা উচিত যে কোডটি কেবল ইনপুটগুলির একটি "যুক্তিসঙ্গত পরিসর" পরিচালনা করে। আবদ্ধ না করে ফাংশনের ডোমেনটি প্রসারিত করতে, জিরোগুলির সংখ্যা zবাড়ানো যেতে পারে এবং ধ্রুবক সীমাবদ্ধ while( c++ < 99 )লুপটি বাড়ানো যায়। সরবরাহিত পরীক্ষার ক্ষেত্রে ইতিমধ্যে সমর্থিত পরিসীমা ইতিমধ্যে ওভারকিল।

নমুনা আউটপুট

F('1')          1.
F('9')          10010.0101
F('1~3.2~1')    -0.0101
F('0.~1021')    -0.
F('105.~2')     1010.0101
F('~31~5.~1')   -100000.1001

-0.চমত্কার নয়, কিন্তু উত্তর এখনো সঠিক। প্রয়োজনে আমি এটি ঠিক করতে পারি।


@ মার্টিনবাটনার: আপনি পারতেন, তবে এটা কঠিন হবে। এটি সম্পূর্ণ ইনপুটটির উপরে "পাস" সংখ্যার সীমাবদ্ধ এবং প্রতিটি পাসে বেশ কয়েকটি অপারেশন রয়েছে। আমার অন্ত্রে মনে করেন যে পাস সংখ্যা স্বাভাবিক কোনো প্রয়োজন নেই nডাক আসবে ইনপুট মধ্যে কোথাও হবে nএবং n log(n)। যে কোনও ক্ষেত্রে, পাসের সংখ্যা যোগ করা প্রতিটি চরিত্রের জন্য 10 এর গুণক দ্বারা বাড়ানো যেতে পারে। zধ্রুবকটিতে শূন্যের সংখ্যাটিও একটি আকর্ষণীয় সমস্যা। আমি সন্দেহ করি যে কোনও সম্ভাব্য ইনপুটটির জন্য 9 ওভারকিল ।
COTO

@ মার্টিনবাটনার: ধন্যবাদ চরিত্রের ক্লাসে পালানো সরিয়ে ফেললাম। হিসাবে $0, জাভাস্ক্রিপ্ট এটি সমর্থন করে না। বা কমপক্ষে ফায়ারফক্স না। : পি
কোটো

ঠিক আছে, আমি মনে করি আপনার বাফার হিসাবে 7 টিরও বেশি শীর্ষস্থানীয় শূন্যের প্রয়োজন হবে না তবে আমি মনে করি পিছনের শূন্যগুলি অনুমান করা কিছুটা কঠিন be বাহ্যিক লুপ হিসাবে, আমি মনে করি না যে আপনার এমনকি এটির প্রয়োজনও রয়েছে, যদি আপনি কেবল এটির জন্য একটি লুপ তৈরি করেন (বা লুপের জন্য এটি অভ্যন্তরে একীভূত করেন) এবং যখন আর কোনও পরিবর্তন না পাওয়া যায় তখনই কেবল ব্রেক হয়ে যায়। আমি অনুমান করি যে আমার অনুমানটি সে ক্ষেত্রে কিছুটা পরিষ্কার হতে পারে তবে "নীতিগতভাবে সালমানের (বৈধ) ইনপুটগুলির জন্য সঠিক এবং সঠিক" দ্বারা আমি বোঝাতে চেয়েছিলাম যে কেবলমাত্র তাত্ত্বিক সীমাটি আপনার অন্তর্নির্মিত ডেটা / আপনার র্যামের আকার হওয়া উচিত।
মার্টিন এন্ডার

1
@COTO করতে 1 বাইট সংরক্ষণ, আপনি প্রথম অংশ চলন্ত চেষ্টা করতে পারেন for( i = e = 0; i < n-3; i = j )দ্বারা for(; i < n-3; i = j )এবং শীর্ষে ঘোষণা সরানো, হচ্ছে N = t = n = 0;দিয়ে প্রতিস্থাপিতN = t = n = i = e = 0;
ইসমাইল মিগুয়েল

1
@IsmaelMiguel: jএকটি মূল্য এ ধ্রুবক অনুষ্ঠিত হয় না i+1। তিন লক্ষ্য করুন ifব্লক, jরিসেট হয় 0। সুতরাং প্রথম ifব্লকের পরে যে কোনও সময়ে এটির জন্য প্রক্সি হিসাবে ব্যবহার করা যায় না i+1। ভেরিয়েবলটি iনিজেই লুপের শেষ না হওয়া পর্যন্ত আপডেট করা যায় না (তৃতীয় বিবৃতিটি ব্যবহার করে for) যেহেতু এর মানটি লুপের শেষ অবধি অবধি ব্যবহৃত হয়। তবে তা বলে, সম্ভবত আমি কিছু মিস করছি। আপনি যদি কোডটি সংক্ষিপ্ত করতে সক্ষম হন তবে এটি পরীক্ষা করে দেখুন এবং এটি এখনও কার্যকর কিনা তা যাচাই করে নিন, দয়া করে এখানে পেস্টবিন.কম এবং একটি লিঙ্কে একটি অনুলিপি পোস্ট করুন। আমি উত্তরে আপনাকে যথাযথ creditণ প্রসারিত করব। :)
কোতো

2

হাস্কেল, 336 বাইট

z=[0,0]
g[a,b]|a*b<0=g[b,a+b]
g x=x<z
k![a,b,c,d]=[b,a+b,d-c+read k,c]
p('.':s)=1:0:2`drop`p s
p('~':k:s)=['-',k]!p s
p(k:s)=[k]!p s
p[]=1:0:z
[1,0]&y='.':z?y
[a,b]&y=[b,a+b]?y
x@[a,b]?y@[c,d]|x==z,y==z=""|g y='-':x?[-c,-d]|g[c-1,d]='0':x&[d,c+d]|g[c,d-1]='1':x&[d,c+d-1]|0<1=[b-a,a]?[d-c,c]
m[a,b,c,d]=[1,0]?[a*d+b*c-a*c,a*c+b*d]
f=m.p

এটি লোভী অ্যালগরিদম, তবে ভাসমান-পয়েন্ট ত্রুটিগুলি এড়ানোর [a,b]জন্য সংখ্যার a + ( a , b ∈ ℤ) এর যথাযথ উপস্থাপনা সহ । g[a,b]পরীক্ষার কিনা একটি + + <0. ব্যবহারের উদাহরণ:

*Main> f "9"
"10010.0101"
*Main> f "1~3.2~1"
"-0.0101"
*Main> f "0.~1021"
"0."
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.