চার থেকে দূরত্ব


13

এই চ্যালেঞ্জটি এই ভিডিওটির ভিত্তিতে । আমি আপনাকে এই চ্যালেঞ্জটি চেষ্টা করার আগে এটি দেখার পরামর্শ দিই।

প্রথমে আমরা একটি ফাংশন সংজ্ঞায়িত করি। এই ফাংশনটি ( ওইআইএস ) ইনপুট হিসাবে একটি পূর্ণসংখ্যা n নেয় এবং ইংরেজির এন এর প্রতিনিধিত্ব করে (স্পেস বা হাইফেন ছাড়াই) অক্ষরের সংখ্যা আউটপুট করে। উদাহরণস্বরূপ "তিন" এর 5 টি অক্ষর রয়েছে তাই 3 টি মানচিত্র 5।

ভিডিওতে প্রদর্শিত যে কোনও সংখ্যার সাথে এই প্রক্রিয়াটি পুনরাবৃত্তি করা শুরু করে অবশেষে একটি চারটি হবে, যা চিরকালের জন্য নিজের কাছে মানচিত্র করবে।

এখানে একটি অপরিশোধিত নির্দেশিত গ্রাফটি সংখ্যার কক্ষপথ 16 এর চেয়ে কম দেখাচ্ছে:

  12 11
    \|      
15 2 6 1 10 14 13
  \ \|/ /  /  /
   7 3-/  8--/
    \|   /
 9 0 5--/
  \ \|
   \-4

আপনার চ্যালেঞ্জ হ'ল চারটি পৌঁছানোর আগে একটি সংখ্যা কী পদক্ষেপ নেবে (বা এই ফাংশনটি একটি সংখ্যায় কতবার প্রয়োগ করতে হবে) তা নির্ধারণ করা (উদাহরণস্বরূপ নির্দেশিত গ্রাফের স্তর)।

ইংলিশ নাম্বার গঠন করা হচ্ছে

এই চ্যালেঞ্জের জন্য কেউ কীভাবে ইংরেজি শব্দ গঠন করতে হবে তার একটি সংক্ষিপ্ত বিবরণ এখানে দেওয়া হল:

উনিশের মধ্যে এক নম্বরটি হ'ল:

এক, দুই, তিন, চার, পাঁচ, ছয়, সাত, আট, নয়, দশ, এগারো, বারো, তের, চৌদ্দ, পনের, ষোল, সতের, আঠারো, উনিশ

উনিশটিরও বেশি সংখ্যার জন্য প্রক্রিয়াটি নিম্নরূপ:

যদি সংখ্যাটির কয়েকশ স্থান থাকে তবে কয়েক শ জায়গায় এবং "শত" নাম দিয়ে শুরু হবে।

যেমন

100 -> "onehundred"

যদি অবশিষ্টটি বিশের কম হয় তবে বাকীটির ইংরেজী উপস্থাপনা যুক্ত করুন।

যেমন

714 -> "sevenhundredfourteen"

অন্যথায় যদি দশকের অঙ্কটি সঠিক উপস্থাপনাকে শূন্য না করে:

2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety

যেমন

470 -> "fourhundredseventy"

অবশেষে যদি কোনওর ডিজিট থাকে তবে এর প্রতিনিধিত্ব যুক্ত করতে হবে

যেমন

681 -> "sixhundredeightyone"

আরও শর্তাবলী

  • এক শতাধিক সংখ্যার চেয়ে বেশি সংখ্যার জন্য আপনার অক্ষরের সংখ্যা গণনা করার সময় "এবং" ছেড়ে দেওয়া উচিত। উদাহরণস্বরূপ 577 হ'ল "পাঁচতম শততম", যার 23 টি অক্ষর রয়েছে।

  • আপনার প্রোগ্রামকে অবশ্যই স্ট্যান্ডার্ড পদ্ধতির মাধ্যমে সমস্ত সংখ্যাকে 0 এর চেয়ে বড় এবং 1000 এর চেয়ে কম ইনপুট হিসাবে গ্রহণ করতে হবে।

  • আপনার প্রোগ্রামকে স্ট্যান্ডার্ড আউটপুট পদ্ধতিতে প্রয়োজনীয় পদক্ষেপগুলির সংখ্যা আউটপুট করতে হবে।

  • এটি কোডগল্ফ তাই কয়েকটি বাইটের সাথে সমাধান জিততে পারে।

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

1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4 

1
সম্পর্কিত আমি ভেবেছিলাম এটি একটি ডুপ, তবে আমি এটি খুঁজে পাচ্ছি না।
জেমস

"এবং" কি হয়েছে? বা বরং, কেন ছেড়ে চলে যান এবং ?!
জোনাথন অ্যালান

উত্তর:


5

জাভাস্ক্রিপ্ট (ES6), 106 বাইট

f=(n,a="03354435543668877998")=>n-4&&1+f(7*(n>99)-(-a[n/100|0]-(a[n%=100]||a[n%10])-"0066555766"[n/10|0]))

অঙ্কগুলি ওভারহেডের পরেও স্ট্রিংগুলি দৈর্ঘ্যকে এনকোড করার সেরা উপায় বলে মনে হচ্ছে way


হ্যাঁ, আমার প্রায় (প্রায় পোস্ট) উত্তরটি দেখতে ঠিক ঠিক এমনটি দেখাচ্ছিল, কেবল 11 বাইটের চেয়ে ছোট।
ETH প্রোডাকশনগুলি

@ এথ প্রডাকশনস ভাল পোস্ট আমি পোস্ট করার আগে 16 বাইট বন্ধ গল্ফ!
নীল

2

পাইথন, নাম্বারওয়ার্ড সহ, 97 113 115 94 93 92 বাইট

+16 বাইট (হাইফেনেশনটি ভুলে গেছেন যে নাম্বুওয়ার্ড्स প্রয়োগ করে যা আসলে কোনও পরীক্ষার ক্ষেত্রে ফলাফল পরিবর্তন করে না, যদিও 23এবং 577প্রত্যেকের হাইফেন রয়েছে)
+২ বাইট ( f=পুনরাবৃত্ত হওয়া সত্ত্বেও ভুলে যাওয়া )
-২০ বাইট (ব্যবহার re)
-8 বাইট @Wheat উইজার্ড ধন্যবাদ (ব্যবহারের ~, প্রতিস্থাপন n!=4সঙ্গে n-4, এবং ... এক লাইন আমদানি>: _ <)
-1 বাইট ধন্যবাদ @Cyoce করার জন্য (থেকে স্থান 4 and)

import re,num2words as w
f=lambda n:n-4and-~f(len(re.sub('\W|and','',w.num2words(n))))

কেবল পদক্ষেপের সংখ্যা গণনা করা; বিশাল এবং নেতিবাচক পূর্ণসংখ্যার জন্যও কাজ করে (সংখ্যা 2 \Wপাসওয়ার্ডের ফাঁকে ফাঁকা স্থান, কমা এবং হাইফেনগুলি সন্ধান করে):

>>> for test in (1,4,7,23,577,600,-1*2**96,3**96):
...     print('test: {0}  ->  {1}'.format(test, f(test)))
...
test: 1  ->  3
test: 4  ->  0
test: 7  ->  2
test: 23  ->  5
test: 577  ->  6
test: 600  ->  4
test: -79228162514264337593543950336  ->  4
test: 6362685441135942358474828762538534230890216321  ->  5

ধাপে ধাপে এই শেষ ঘটনাটি এখানে:

sixquattuordecillionthreehundredsixtytwotredecillionsixhundredeightyfiveduodecillionfourhundredfortyoneundecilliononehundredthirtyfivedecillionninehundredfortytwononillionthreehundredfiftyeightoctillionfourhundredseventyfourseptillioneighthundredtwentyeightsextillionsevenhundredsixtytwoquintillionfivehundredthirtyeightquadrillionfivehundredthirtyfourtrilliontwohundredthirtybillioneighthundredninetymilliontwohundredsixteenthousthreehundredtwentyone
fourhundredfiftyone
nineteen
eight
five

1
f=আপনার ল্যাম্বদা ফাংশনের আগে আপনার কোনও প্রয়োজন নেই
অ্যাডহক গার্ফ হান্টার

1
import re,num2words as rদুটি ভিন্ন বিবৃতি পরিবর্তে চেষ্টা করুন ।
অ্যাডহক গার্ফ হান্টার


1
@WheatWizard num2wordsহয় w, reএখনও re- যে উভয় মডিউল এবং ফাংশন বলা হয় নোটnum2words
জনাথন অ্যালান

1
ঠিক আছে শেষেরটি, একটি বাইট সংরক্ষণ করার জন্য and 1+প্রতিস্থাপন করা and-~যেতে পারে
অ্যাডহক গার্ফ হান্টার


1

গণিত, 89 বাইট

Length@FixedPointList[StringLength@StringReplace[IntegerName@#,{" "->"","-"->""}]&,#]-2&

টিপিক্যাল ম্যাথমেটিকা: বিল্ট-ইন ফাংশনগুলি ভাল, দীর্ঘ ফাংশনের নামগুলি খারাপ। FixedPointListউত্তরটি পরিবর্তিত না হওয়া পর্যন্ত বারবার দ্বিতীয় যুক্তিতে তার প্রথম যুক্তি (একটি ফাংশন) প্রয়োগ করে সমস্ত ফলাফল তালিকাভুক্ত; ফলাফল অত: পর মূল ইনপুট এবং পুনরাবৃত্তি আউটপুট দুটি অনুলিপি অন্তর্ভুক্ত -2শেষে। গণিতের অন্তর্নির্মিত IntegerNameস্পেস এবং হাইফেন রয়েছে, তাই আমাদের হাত দিয়ে সেগুলি থেকে মুক্তি পাওয়া দরকার।

বিরক্তিকরভাবে, IntegerNameএর আউটপুটটিতে সাধারণ হাইফেনের চেয়ে "-" (ইউনিকোড # 8208) অক্ষর রয়েছে; কেন এই জমা 88. বদলে 89 বাইট (এবং আমি উপরের কোড চার ব্যবধান সহ বসে করতে পারেনি যে এবং এটা ইউনিকোড অক্ষর-কোন সাহায্যের স্বীকার করবেন? -so উপরের কোড ঠিক ঠিক যদি কাজ করবে না আছে কাটা এবং আটকানো ।)


1

পাইথন 2.7, 344 216 208 বাইট:

x=`input()`;c=0;y=lambda v:dict(zip(range(0,10),[0]+v));l=[3,3,5,4,4,3,5,5,4];d=y(l);e=y([3,6,6,6,5,5,7,7,6]);f=y([i+7for i in l])
while x!='4':x=`sum([q[int(r)]for q,r in zip([d,e,f],x[::-1])])`;c+=1
print c

অন্যান্য পাইথনের উত্তরের মতো কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করে না। মাধ্যমে ইনপুট নেয় stdinএবং আউটপুট stdout

সমস্ত পরীক্ষার মামলা দিয়ে Repl.it!

ব্যাখ্যা

প্রথমে প্রতিটি সংখ্যার ইংরেজি শব্দ উপস্থাপনার দৈর্ঘ্যের সাথে যুক্ত করে প্রতিটি সংখ্যার সাথে [1,9]যথাক্রমে, দশক এবং শত স্থানে বন্ধ ব্যবধানে প্রতিনিধিত্ব করে এমন প্রতিটি শব্দটি তিনটি অভিধান তৈরি করে। উদাহরণস্বরূপ, অভিধানে প্রথম এন্ট্রি dকরা হয় 1:3যেমন 1বানান করা হয় oneইংরেজিতে এবং আছে 3চিঠিপত্র।

তারপরে, কিছু স্ট্রিং ইনপুটটিতে প্রতিটি অঙ্কের স্থানটিকে xতার সংশ্লিষ্ট অভিধানে বরাদ্দ করা হয়, যার পরে প্রতিটি জায়গার প্রতিটি সংখ্যা সংশ্লিষ্ট অভিধানে তার মানটির সাথে মিলে যায়। উদাহরণস্বরূপ, ধরুন ইনপুট নম্বরটি ছিল 2320দশ জায়গায় অভিধান সঙ্গে যুক্ত করা হবে করা e, যা এটি দিয়ে মিলেছে হয় 6, এবং 3বেশী জায়গায় অভিধান সঙ্গে যুক্ত করা হবে d, যা এটির সাথে মিলেছে হয় 5। এই মিলে যাওয়া অঙ্কগুলি তখন সংখ্যার ইংলিশ উপস্থাপনার দৈর্ঘ্যের প্রতিনিধিত্ব করতে একত্রে যুক্ত করা হয়, যা xস্ট্রিং হিসাবে নির্ধারিত হয় এবং যতক্ষণ x!='4', লুপটি চলতে থাকে, ততক্ষণ বৃদ্ধি cকরে1প্রতিটি সময় এই পর্যন্ত নেওয়া পদক্ষেপ সংখ্যা প্রতিনিধিত্ব করতে। অতএব, 23মিলা হবে 11, যা হবে পালা মিলা করা 6যা আবর্তিত হবে 3এবং তারপর 5এবং পরিশেষে থেকে 4, ফলে 5মোট ধাপ।

অবশেষে, লুপটি শেষ হয়ে গেলে, "দূরত্ব থেকে চারটি" উপস্থাপনের cআউটপুট stdout, যা এই ক্ষেত্রে হবে 5


1

জাভা, 556 295 বাইট

261 বাইট সংরক্ষণের জন্য @ কেভিন ক্রুজসেনকে ধন্যবাদ

  void int(n) {int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;while(n>0){if(n/100>0)c+=(s[n/100]+7);else {if(n>0&n<25){c+=s[n];break;}else{c+=s[(n/10)+22];}}n=n%t;t=t/10;}while(c!=4){v++;c=s[c];}System.out.print(v);}


Ungolfed:

  void int(n) {

    int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,9,8,6,9,9,11,10,6,6,5,5,7,7,6};
     int c=0,t=(int)Math.pow(10,(int)Math.log10(n)),v=1;
         while(n>0){
            if(n/100>0)
                c+=(s[n/100]+7);
            else {if(n>0&n<25){
                c+=s[n];
            break;
            }
            else{
                c+=s[(n/10)+22];

            }
            }
            n=n%t;
            t=t/10;
        }

        while(c!=4)
        {
            v++;
        c=s[c];
        }
System.out.print(v);
}

আমি মনে করি আপনার কোডে ভুল হয়েছে, কারণ s++স্ট্রিং-অ্যারেতে এটি সম্ভব নয় ..: এস
কেভিন ক্রুইজসেন

@ কেভিন ক্রুজসেন আমি এস (কাউন্টার) কে INT এবং STRING হিসাবেও ঘোষণা করি .... জাভা স্বয়ংক্রিয়ভাবে সিদ্ধান্ত নেয় যে এটি একটি INT is
নোট

ওয়েল, তা করতে ব্যর্থ হলে যদি আমি ideone আপনার কোড বা আমার অন্ধকার আইডিই চালানোর কারণ আপনার দুই s: গলফ ভালো বেশ একটি বৃহৎ পরিমাণ দ্বারা আপনার কোড .. BTW, আপনি যা করতে পারেনint c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}
কেভিন Cruijssen

আমি হতবাক হয়ে গেছি ...... আমার কোডটি কী ঘটেছিল এবং ধন্যবাদ কেভিনক্রুইজসেন..আমি এটি সংশোধন করছি ... আবার ধন্যবাদ।
নোট

এনপি :) আমি মনে করি এটি যদি অন্যথায় ব্যবহার না করে আরও কিছুটা গোল হয়ে যেতে পারে তবে সেখানে ব্রেক করুন (তবে আমি এটি অন্য কারও কাছে ছেড়ে দেব), তবে আপনার প্রাথমিক কোডটি চ্যালেঞ্জ মোকাবেলার জন্য দুর্দান্ত ভিত্তি ছিল, সুতরাং +1 আমার থেকে.
কেভিন ক্রুইজসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.