0 থেকে 1000 পর্যন্ত সমস্ত প্রাইম


9

এই সি কোডটি আরও ছোট করা কি সম্ভব? এটি 0 থেকে 1000 পর্যন্ত সমস্ত প্রাইমগুলি মুদ্রণ করে।

সি, 89 অক্ষর

int i,p,c;for(i=2;i<1e3;i++){c=0;for(p=2;p<i;p++)if(i%p==0)c++;if(c==0)printf("%u\n",i);}

6
কিছু "নিম্নরূপে আমরা ভাষা-নির্দিষ্ট চ্যালেঞ্জগুলি চাই না" কিছুটা প্রাক-শূন্য করার জন্য , কিছু কোডকে গল্ফ করা সাহায্যের বিষয়ে জিজ্ঞাসা করা বিষয়গুলি এবং চ্যালেঞ্জের চেয়ে আলাদা গল্প।
মার্টিন এন্ডার

4
আমাদের কি অ্যালগরিদম বা কেবল শেষ ফলাফল সংরক্ষণ করার দরকার আছে?
জন ডিভোরাক

আমি কঠোরভাবে নির্ভুল হতে 2 হতে শুরু করব, যেহেতু এই 0 এবং 1 টি প্রিন্ট করে
হিস্টোক্র্যাট

আপনি কি কোডটি দ্রুত সম্পাদন করার চেষ্টা করছেন বা উত্স কোডে কম অক্ষর ব্যবহার করার চেষ্টা করছেন?
ব্যবহারকারী 362929249

1
যেহেতু আপনি গল্ফের সাথে সহায়তা চাইছেন, তাই আপনার বর্তমান সমাধানের চরিত্র গণনাটি আপনার পোস্টে অন্তর্ভুক্ত করা সহায়ক (আমি এটি 89 হিসাবে তৈরি করব)।
মার্ক রিড

উত্তর:


7

59 57 বাইট

@ ফেয়ারসাম সলিউশনের ভিত্তিতে তবে প্রাথমিকতা পরীক্ষাটি আরও গল্ফ করা যেতে পারে

for(int p=1,d;d=p++%999;d||printf("%d\n",p))for(;p%d--;);

রানার 1212 এর মন্তব্যের ভিত্তিতে সম্পাদিত


2
আবদ্ধ চেক একটি বিট আরো golfed করা যেতে পারে: d=p++%999। অন্যথায়, এটি বেশ বায়ুচঞ্চল গল্ফিং কাজ দেখায়!
রানার 1212

10

67 বাইট

সি তে ট্রায়াল বিভাগের আসল বিকল্প নেই, তবে এটি অবশ্যই কিছুটা গল্ফ করা যেতে পারে।

for(int p=1,d;p++<999;d&&printf("%d\n",p))for(d=p;--d>1;)d=p%d?d:1;

C99 প্রাথমিক ঘোষণার প্রয়োজন, যা 1 বাইট সঞ্চয় করে।


6

(আমি সিটিতে পূর্ণসংখ্যার আকারের সীমাবদ্ধতা অনুধাবন না করে এটি লিখেছিলাম, তাই কোডটি সংক্ষিপ্ত করার ক্ষেত্রে এটি সম্ভবত কার্যকরী নয়))

প্রথমত, অ্যালগরিদম সম্পর্কে একটি শব্দ। আপনার কোডটি গল্ফ করার আগে, ফলাফল পাওয়ার জন্য সর্বোত্তম সামগ্রিক কৌশল সম্পর্কে আপনার ভাবা উচিত।

আপনি ট্রায়াল বিভাজন করে primality চেক করছি - প্রতিটি সম্ভাব্য ভাজক পরীক্ষা pএর i। এটি অক্ষরে ব্যয়বহুল কারণ এটি দুটি লুপ লাগে। সুতরাং, লুপ ছাড়াই প্রাথমিকতার পরীক্ষা করা অক্ষর সংরক্ষণের সম্ভাবনা রয়েছে।

উইলসনের উপপাদ্যটি প্রায়শই সংক্ষিপ্ত পদ্ধতির ব্যবহার হ'ল : সংখ্যাটি nপ্রধান এবং যদি কেবলমাত্র হয়

fact(n-1)%n == n-1

কারণ factঘটনা ফাংশন। আপনি সব সম্ভব পরীক্ষা করছি যেহেতু nথেকে 1থেকে 1000, এটা চলমান পণ্য সম্পর্কে অবগত থাকার দ্বারা গৌণিক বাস্তবায়ন এড়াতে সহজ Pএবং তাই দিয়েই আপডেট P*=nপ্রতিটি লুপ পরে। এক মিলিয়ন পর্যন্ত প্রাইমগুলি মুদ্রণের জন্য এই কৌশলটির পাইথন বাস্তবায়ন এখানে ।

বিকল্পভাবে, আপনার প্রোগ্রামটি কেবলমাত্র 1000 পর্যন্ত হওয়া উচিত তা অন্য কৌশল খোলায় : ফেরমেট প্রাথমিকতা পরীক্ষা । কিছু জন্য a, প্রতিটি প্রধান nসন্তুষ্ট

pow(a,n-1)%n == 1

দুর্ভাগ্যক্রমে, কিছু সংমিশ্রণ কারও nজন্য এই পরীক্ষায় পাস করে a। এগুলিকে ফেরমেট সিউডোপ্রিম বলা হয় । তবে a=2এবং a=3একসাথে ব্যর্থ হবেন না n=1105, সুতরাং আপনার প্রাইমগুলি 1000 এর আগে যাচাই করার উদ্দেশ্যে এটি যথেষ্ট a=2

pow(2,n-1)%n == 1 and pow(3,n-1)%n == 1

এটি 2 এবং 3 প্রাইমগুলি সনাক্ত করতেও ব্যর্থ হয়, সুতরাং সেগুলি বিশেষ-ক্ষেত্রেযুক্ত হওয়া দরকার।

এই পদ্ধতির কি সংক্ষিপ্ত? আমি জানি না কারণ আমি সি তে কোডিং করি না, তবে, কোডগুলি অক্ষরগুলি বের করা শুরু করার জন্য কোডের কোনও অংশে বসতি স্থাপন করার আগে সেগুলি চেষ্টা করা উচিত।


1
উইলসনের উপপাদ সি তে কার্যকর হয় না কারণ intসেগুলি 32-বিট। একই ফেরতাদের জন্য যায়।
feersum

ওফ, শুট এটি ফ্যাকটোরিয়ালগুলির জন্যও একটি সমস্যা। বিগ-ইনট টাইপ কি আছে?
xnor

@ xnor অন্তর্নির্মিত নয়।
মার্টিন এন্ডার

1
যদি কেউ সংজ্ঞায়িত করে fact(int n, int m) { return (n==0) ? 1 : (n*f(n-1)) % m; }তবে ফলাফলটি মোটামুটি বড় মানেরগুলির জন্য 32 বিট পূর্ণসংখ্যার উপচে পড়বে না n। ( mএটি মডিউলাস)
এপ্রোর্নটন

@anorton আমার মনে হয় আপনি অর্থ (n*fact(n-1,m)) % m। যা সমস্যাটিকে হাইলাইট করে: আপনি বাস্তবায়নে পুনরাবৃত্তি এড়াতে পারবেন না factকারণ mবাইরের লুপের প্রতিটি পুনরাবৃত্তির জন্য আলাদা হবে।
এইচডিভি

4

78 77 টি অক্ষর

(স্রেফ অন্যান্য ভাষায় কিছু কৌশল শিখেছে applied

int i=0,p,c;for(;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}

সি 99 মোডে 76 টি অক্ষর

for(int i=0,p,c;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}

2

58 টি অক্ষর (বা একটি সম্পূর্ণ প্রোগ্রামের জন্য 61)

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

for(int m,n=2;n<999;m>1?m=n%m--?m:n++:printf("%d\n",m=n));

সম্পূর্ণ প্রোগ্রাম:

n=2;main(m){n<999&&main(m<2?printf("%d\n",n),n:n%m?m-1:n++);}

1

67 64 বাইট

অ্যালকিমিস্টের সমাধান দ্বারা অনুপ্রাণিত:

int i=1,p;for(;i++<1e3;p-i||printf("%d\n",i)){p=1;while(i%++p);}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.