বিপুল সংখ্যক প্রতিনিধিত্ব করার জন্য সাধারণ টিপস


21

কখনও কখনও, গল্ফ করার সময়, তাদের কোডগুলিতে একটি বড় সংখ্যক (গুলি) উপস্থাপন করা প্রয়োজন। সেগুলি হিসাবে লিখলে বাইট-কাউন্ট উল্লেখযোগ্যভাবে বাড়তে পারে।

কোডটিতে সংক্ষিপ্তভাবে প্রতিনিধিত্ব করার জন্য আপনার কাছে কোন সাধারণ 1 টিপস রয়েছে?

দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।


1 সঙ্গে সাধারণ , আমি পরামর্শগুলি একটি ভাষাও চেয়ে বেশি প্রয়োগ করা যেতে পারে মানে। ভাষা-নির্দিষ্ট টিপসের জন্য, তাদের নিজ নিজ থ্রেডে পোস্ট করুন।




আমি কাউকে প্রশ্নটি ভুল বুঝে দেখেছি - শিরোনামে বলা উচিত এটি গল্ফ সম্পর্কে।
janর্জন জোহানসেন

উত্তর:


15

বিশেষ সংখ্যা জন্য সন্ধান করুন

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

এবং যদি এটি না হয়ে থাকে তবে এমনটি হতে পারে যে একটি বৃহত সংখ্যা যা আপনার উদ্দেশ্যে ফিট করে এবং পরিবর্তে ব্যবহার করা যেতে পারে।


4
এমনকি আপনি যে নম্বরটি চান তা কোনও বিল্টিন ফাংশন দিয়ে উত্পন্ন করতে না পারলেও, এমন একটি সংখ্যা তৈরি করা সম্ভব হতে পারে যা আপনি আপনার সংখ্যাটিতে পৌঁছানোর জন্য সাধারণ গণনার ভিত্তি হিসাবে ব্যবহার করতে পারেন, তবে এখনও এটি লেখার বাইরে বাইট সংরক্ষণ করে saving
শেগি

7
"বৃহত্তর সংখ্যা" এর জন্য +1 - যদি 1.01e6পুনরাবৃত্তিগুলি যথেষ্ট 1e7হয় তবে চলমান সময় ব্যয়ে 3 বাইট সংরক্ষণ করে।
ক্রিস এইচ

13

বিটওয়াইজ বুলিয়ান অপারেটরগুলি ব্যবহার করুন

কিছু ভাষার বিটওয়াইস এবং, ওআর, এক্সওর এবং কখনও কখনও না।

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

উদাহরণস্বরূপ, 214748372210 বাইট, তবে 2<<30^74(74 এর সাথে 2 ^ 31 বিটওয়াইস-এক্সওরড) কেবল 8।


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

3
@rici সত্য যদি সমস্ত পূর্ণসংখ্যাকে দশমিক দশমিক হিসাবে লেখা হয় তবে এটি সম্ভব যে জোরের সাথে পূর্ণসংখ্যার ব্যবহারটি পূর্ণরূপ বা বিয়োগের সাথে ব্যবহার করা যেতে পারে এমনভাবে সংক্ষিপ্ত করা যেতে পারে: এরকম কিছু চিন্তা করুন 1e9^2e9
এইচডিভি

2
@rici আপনি কিভাবে জোরের 9<<49^7<<19পরিবর্তে সংযোজন ব্যবহার করে প্রকাশ করবেন ?
L3viathan

2
@rici না, আমি যা লিখেছিলাম তা বোঝাতে চেয়েছি। এটি 1286561280জাভাস্ক্রিপ্ট এবং পার্ল (এবং সম্ভবত অন্যান্য ভাষাগুলি) এ মূল্যায়ন করে এবং এটি ব্যবহার করে সমতুল্য +বা এর চেয়ে সমমানের তুলনায় এই মানটি তৈরি করা একটি ছোট এক্সপ্রেশন -
এইচডিভি

@ এইচভিডি: ঠিক আছে, পয়েন্ট নেওয়া হয়েছে।
ধনী

11

পুনরাবৃত্ত সংখ্যাগুলির জন্য স্ট্রিংগুলি ব্যবহার করুন

প্রকৃতির ক্ষেত্রে খুব পুনরাবৃত্তিযোগ্য সংখ্যার জন্য, আপনি স্ট্রিংগুলি ব্যবহার করতে পারেন এবং এটিকে পূর্ণসংখ্যায় কাস্ট করতে পারেন। উদাহরণস্বরূপ, জাভাস্ক্রিপ্টে

+"1".repeat(100) // returns 100 1s (saves 84 bytes!)

2
অথবা আপনি 1e100/9এই ক্ষেত্রে খুব বড় ভগ্নাংশ ব্যবহার করতে পারেন ।
ETH প্রোডাকশনগুলি

11

বৈজ্ঞানিক স্বরলিপি ব্যবহার করুন

বৈজ্ঞানিক স্বরলিপি দীর্ঘ সংখ্যার ক্ষেত্রে বাইট সংরক্ষণ করতে পারে। উদাহরণ স্বরূপ:

3564e-8 // returns 0.00003564 (saves 3 bytes!)

3
সেক্ষেত্রে শুধু কেন ব্যবহার করবেন 3564e-8না?
জোয়

@ জো হ্যাঁ, অবশ্যই! ধন্যবাদ! :)
অর্জুন

মঞ্জুর, আপনি সাধারণত অন্য নম্বরটি লিখতে পারেন .00003564যা আবার এক বাইটও খাটো।
জোয়

@ জোয়ি প্রতিটি ভাষা করে না, তাই আমি এটিকে সম্পাদন করব না Ar
অর্জুন

এটা কি ইচ্ছাকৃত যে 3564 (বাম) 354 (ডান) হয়ে যায় বা এটি টাইপো?
এরিক

10

পরিবর্তে অন্য নম্বর ব্যবহার করুন

এটি একটি উত্তর-উত্তর মত শোনাতে পারে, তবে এটি সর্বদাই সুস্পষ্ট হয় না যে সংক্ষিপ্ত কোড দ্বারা একটি বৃহত সংখ্যা গণনা করা যায়। একটি উদাহরণ আমার মনে আছে যে কোনও স্ট্রিংয়ের গুগল অনুলিপিগুলি আউটপুট দেয় , যেখানে সুস্পষ্ট উত্তরগুলির জন্য 10 100 গণনা করা প্রয়োজন । যেমনটি দেখা যাচ্ছে যে 10 100 এর যে কোনও একককে গণনা করা সমানভাবে সঠিক, তবে কয়েকটি ভাষায় সংক্ষিপ্ত উত্তর নিয়ে যায়। ডেনিসের উত্তরটিতে 100 ডলার ব্যবহার করা হয়েছে, আমার নিজস্ব 250 255 টি ব্যবহার করে ।


4
এর আর একটি উদাহরণ সিজেম যেখানে আপনি esযদি কেবলমাত্র একটি বৃহত সংখ্যক প্রয়োজন তবে এর মান (বা এটি সর্বদা একই) এর জন্য যত্ন নিচ্ছেন না যদি আপনি বর্তমান টাইমস্ট্যাম্পটি পেতে পারেন can
মার্টিন ইন্ডার

10

বেস কম্প্রেশন

বেস ডিকম্প্রেশন কোডটি মোটামুটি জটিল হতে পারে তবে আপনার যদি সত্যই প্রচুর সংখ্যক হয় তবে এটি কখনও কখনও 10 এর চেয়ে বেশি বেসে সংকোচনে সহায়তা করতে পারে।

এটি এছাড়াও সাহায্য করে যে কিছু ভাষায়, বেস সংক্ষেপণ কোডটি খুব সহজ। উদাহরণস্বরূপ, পিএইচপি আছে base64_decode(_), পাইথন আছে int(_,36), জাভাস্ক্রিপ্ট আছে parseInt(_,36), এবং অনেক গল্ফিং ভাষায় বেস ডিকম্প্রেশন বিল্টিন রয়েছে। উদাহরণস্বরূপ, সিজেমে:

"+ÜTbô±"256b

এটি একটি ছাপিয়ে যায় না। এটি অনলাইন চেষ্টা করুন!

এই ফলন:

12345678987654321

9

বৃহত পুনরাবৃত্তি সংখ্যার জন্য সূচকীয় ভগ্নাংশ ব্যবহার করুন

বলুন আপনি 100 1 এর তৈরি সংখ্যাটি তৈরি করতে চেয়েছিলেন। আপনি ব্যবহার করতে পারে int("1"*100), +"1".repeat(100)ইত্যাদি কিন্তু আপনি খুব পাসে আসলে এটি এতই সুবিধা গ্রহণ করতে পারেন

1e100/9

এটি অত্যন্ত পুনরাবৃত্ত সংখ্যাগুলির জন্য সবচেয়ে ভাল কাজ করে যেমন একক অঙ্কের তৈরি। একটি দম্পতি পুনরাবৃত্তি অঙ্কগুলিও বেশ ভালভাবে কাজ করে:

12e100/99  // Generates 121212121212... (100 digits)

কখনও কখনও আপনি কিছু অদ্ভুত প্যাটার্ন পাবেন যা এ পদ্ধতিতে মোটামুটি নিখরচায় প্রতিনিধিত্ব করা যেতে পারে। আপনার যদি প্রয়োজন হয় তবে int("123456790"*11)উদাহরণস্বরূপ:

1e100/81

সতর্কতা অবলম্বন করুন: এই জাতীয় সংখ্যাগুলির এত int("1234567890"*10)সহজ উপস্থাপনা নেই।


9

2 এর ক্ষয়ক্ষতির জন্য বিটওয়াইস বাম শিফ্টটি ব্যবহার করুন

যদিও, এমন অনেকগুলি ভাষা রয়েছে যা ক্ষয়ক্ষতির জন্য অপারেটরকে সমর্থন করে, কিছু না। এবং যা না হয়, তাদের সাধারণত কলিং ফাংশনগুলি (বা ক্লাস / অবজেক্ট পদ্ধতি) প্রয়োজন, যার জন্য কয়েকটি বাইট লাগতে পারে।

যখন আপনি ক্ষমতায় 2 বাড়াতে প্রয়োজন কিন্তু আপনি কিছু বাইট সংরক্ষণ করতে পারবেন এন Bitwise বাম স্থানান্তর অপারেটর ব্যবহার করে <<যেমন 1<<n। নোট যে এই হবে শুধুমাত্র সংরক্ষণ যদি আপনি বাইট এন চেয়ে বা তার অধিক 17 সমান যাইহোক, এই হবে সবসময় সংরক্ষণ যদি আপনি বাইট এন গতিশীল। কয়েকটি উদাহরণ:

1<<2 // returns 4 (3 bytes more :( )
1<<3 // returns 8 (3 bytes more :( )
1<<6 // returns 64 (2 bytes more :( )
1<<14 // returns 16384 (no bytes saved)
1<<17 // returns 131072 (saves 1 byte!)
1<<18 // returns 262114 (saves 1 byte!)

4
নোট করুন যে আপনি 1 এর পরিবর্তে অন্যান্য মানগুলি ব্যবহার করতে পারেন 8<<9 // 4096তাই আমরা 99<<616 বাইটে উঠতে পারি , যা 6,917,529,027,641,081,85613 বাইট সংরক্ষণের সমান !
ড্রাকো 18s

@ ড্রাকো 18 হ্যাঁ, এবং এটি এখানে আচ্ছাদিত ।
অর্জুন

এটি আর একটিতে বুলিয়ান বিটওয়াইস অপারেটরগুলি coversাকা রয়েছে। হ্যাঁ, এতে বিটশিফিংও রয়েছে, তবে এটি এক্সওআরটিতে দুটি বৃহত সংখ্যা ব্যবহার করার এবং একটি তৃতীয়, নির্দিষ্ট নম্বর পাওয়ার কথা বলে।
ড্রাকো 18

7

চাইনিজ রিমেন্ডার উপপাদ্য

যদি নির্বিচারে বড় সংখ্যক ঘন ঘন উপস্থিত হয়, বা লক্ষ্য প্রোগ্রামিং ভাষার ক্ষেত্রে বড় সংখ্যার উপস্থাপনের জন্য অনেকগুলি বাইটের জন্য ব্যয় হয়, আপনি চাইনিজ রিমাইন্ডার উপপাদ্যটি বিবেচনা করতে পারেন।

কিছু জোড়ের তুলনামূলকভাবে প্রাইম পূর্ণসংখ্যাগুলি বেছে নিন m i > = 2, এবং আপনি 0 থেকে এলসিএম পর্যন্ত বড় সংখ্যা প্রকাশ করতে পারেন (মি 1 , মি 2 , ..., মি i ) -1

উদাহরণস্বরূপ, আমি 2, 3, 5, 11, 79, 83, 89, 97 বেছে নিই, তারপরে আমি স্বতন্ত্রভাবে 18680171730 এর চেয়ে কম সংখ্যা প্রকাশ করতে পারি। 10000000000 (1e10) 0,1,0,1,38,59,50,49 (1e10 mod 2, 3 ..., 97) হিসাবে প্রকাশ করা যেতে পারে যা বিশেষ বিগ ইন্টিজার শ্রেণি / কাঠামো হিসাবে প্রকাশ করার দরকার নেই যা সংরক্ষণ করতে পারে কিছু প্রোগ্রামিং ভাষার কিছু বাইট।

সংযোজন এবং বিস্তারণ সরাসরি এই প্রতিনিধিত্ব ব্যবহার করে করা যেতে পারে। উদাহরণ:

(0,1,0,1,38,59,50,49)+(0,2,0,6,23,20,16,53) = 1e10 + 5000 
                                            = (0+0 mod 2, 1+2 mod 3, 0+0 mod 5, 1+6 mod 11, 38+23 mod 79, 59+20 mod 83, 50+16 mod 89, 49+53 mod 97)

1
সে সম্পর্কে বিস্তারিত বলার যত্ন?
স্কিডদেব

@ মাইউব আমি কিছু ব্যাখ্যা যোগ করেছি, তবে আমার সন্দেহ যে এটি বেশিরভাগ ক্ষেত্রেই অকেজো।
আরিয়া অ্যাক্স

1
এটি "বাকি উপপাদ্য"।
janর্জন জোহানসেন

6

স্ট্রিং প্যাডিং ব্যবহার করুন (যেখানে সম্ভব)

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


উদাহরণ

1111111111111111111111112জাভাস্ক্রিপ্ট (ES8) এ নম্বর (25 বাইট) তৈরি করতে :

+"2".padStart(25,1) // 19 bytes

3

এক্সটেনশন ব্যবহার করুন

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

উদাহরণ

জাভাস্ক্রিপ্ট সর্বোচ্চ নিরাপদ পূর্ণসংখ্যা হয় 9007199254740991যা 16 সংখ্যা বিশিষ্ট হয়। ES7 এ নিম্নলিখিত 7 বাইট দিয়ে গণনা করা যেতে পারে:

2**53-1

ES6 এবং এর আগের সমতুল্য, যখন এই উদাহরণে পূর্ণসংখ্যার একই দৈর্ঘ্য, এটি দেখায় যে আরও ভার্বোজ পদ্ধতি ব্যবহার করা আপনাকে অগত্যা কোনও বাইটের জন্য ব্যয় করতে পারে না।

Math.pow(2,53)-1

উদাহরণস্বরূপ, যদি আপনি ইতিমধ্যে আপনার কোডের অন্য কোথাও কোনও একটি চরিত্রের সাথে পৃথক হয়ে থাকেন তবে উপরের অংশটি যদি ছোট হয়ে Mathযায়।


2

ভাসা জায়গায় ভগ্নাংশ ব্যবহার করুন

উদাহরণ: 1./3জায়গায়0.333333333

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