প্রাইম টাইম ট্র্যাভেল


23

কাউকে বলবেন না, তবে আমি আমার মামার সময় ভ্রমণের মেশিনকে টিকিয়েছি! যদিও আমার মামা প্রাইম সংখ্যাগুলিতে আকস্মিক হয়ে আছেন, এবং এটি মেশিনে দেখায় - তিনি এটি প্রোগ্রাম করেছেন যাতে এটি কেবলমাত্র একটি প্রধান সংখ্যা পর্যন্ত সংখ্যক তারিখগুলিতে যেতে পারে।

সুতরাং এটি যেতে পারে না 1947-08-15কারণ 1947 + 8 + 15 = 1970, যা কোনও মৌলিক সংখ্যা নয়। এটা তোলে করতে যান 1947-07-25, কারণ 1947 + 7 + 25 = 1979, যা মৌলিক নয়। সুতরাং আমি যদি ভারতের স্বাধীনতা উদযাপনগুলি দেখতে ফিরে যেতে চাই তবে মনে হয় আমাকে কয়েক সপ্তাহ আগে যেতে হবে এবং সেই 20 দিন অপেক্ষা করতে হবে।

আমার আরও কয়েকটি তারিখ রয়েছে যেটিতে আমি যেতে চাই এবং একইভাবে আমার টার্গেটের তারিখের আগে (বা আমি ভাগ্যবান, সমান) একটি তারিখে যেতে হবে, এটি একটি মূল সংখ্যার সমান। যদিও আমি অধৈর্য, ​​এবং খুব বেশি অপেক্ষা করতে চাই না - তাই আমি যে তারিখটি আমি ব্যবহার করতে পারি তা আমার লক্ষ্য তারিখের সবচেয়ে কাছের সন্ধান করতে চাই।

আপনি কি আমাকে এমন একটি প্রোগ্রাম লিখতে পারেন যা আমার টার্গেটের তারিখ নেয় এবং আমাকে টাইম মেশিনে ইনপুট করার তারিখটি দেয় - প্রদত্ত তারিখের নিকটতম বা সমান অংশ যার অংশগুলি একটি মৌলিক সংখ্যায় যোগ করে?

(এই চ্যালেঞ্জের জন্য, আমরা প্রলেপটিক গ্রেগরিয়ান ক্যালেন্ডার ব্যবহার করছি - যার সহজ অর্থ হ'ল আমরা বর্তমান গ্রেগরিয়ান ক্যালেন্ডার এমনকি পিরিয়ডের জন্যও ব্যবহার করি যখন লোকেরা তখনকার বয়স্ক জুলিয়ান ক্যালেন্ডার ব্যবহার করছিল))

ইনপুট

  • একটি তারিখ
    • আদর্শভাবে, বর্তমান যুগের কোনও তারিখ (AD); ব্যবহারিকভাবে, আপনার ভাষা প্রাকৃতিকভাবে পরিচালনা করতে পারে যে উপসেট
    • যে কোনও একক মানব-পঠনযোগ্য ফর্ম্যাটে- আপনার পছন্দ

আউটপুট

  • ইনপুট তারিখের নিকটতম তারিখ, যা ইনপুটটির চেয়ে কম বা সমান এবং যার তারিখ + মাস + বছর মূল সংখ্যার সমষ্টি।
    • যে কোনও একক মানব-পঠনযোগ্য ফর্ম্যাটে- আপনার পছন্দ

।: দিন, মাস এবং বছরের মতো "মানব পাঠযোগ্য" যা আলাদাভাবেই হোক না কেন

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

1947-08-15
=> 1947-07-25
1957-10-04
=> 1957-09-27
1776-07-04
=> 1776-07-04
999-12-12
=> 0999-12-10
2018-06-20
=> 2018-06-15
1999-01-02
=> 1998-12-29
1319-12-29
=> 1319-07-01

(প্রশ্নটির সহায়তার জন্য @ শেগি, @ পিটারটেলর এবং @ আরনাউল্ডকে ধন্যবাদ জানাই))


আউটপুটে কোনও আজেবাজে সময় দেওয়া কি ঠিক আছে? (উদাঃ Fri Jul 25 02:46:39 CEST 1947)
ওয়াটল ছিল

@ ওয়াস্টল হ্যাঁ, তারিখের তথ্য যতক্ষণ না আউটপুটটির একটি নির্দিষ্ট স্থির দৈর্ঘ্যের সাবস্ট্রিং (তাই নির্দিষ্ট উদাহরণের জন্য নেই)।
মনসিকা

উত্তর:



4

জাভাস্ক্রিপ্ট (নোড.জেএস) , 94 বাইট

সিনট্যাক্স কারিঙে 3 সংখ্যার হিসাবে ইনপুট নেয় (year)(month)(day)। শীর্ষস্থানীয় হাইফেন সহ হাইফেন-বিভাজিত স্ট্রিংটি ফেরত দেয়।

y=>m=>g=d=>(P=k=>n%++k?P(k):~k)(n=eval(s='-'+new Date(y,m-1,d).toJSON().split`T`[0]))?g(d-1):s

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

আমরা প্রথমে তারিখটিকে JSON ফর্ম্যাটে yyyy-mm-ddT00:00:00.000Z( আইএসও 8601 ) রূপান্তর করি , এটিকে বিভক্ত করি 'T', কেবল বাম অংশ রাখি এবং একটি অগ্রণী হাইফেন যুক্ত করি যা দেয় -yyyy-mm-dd

s = '-' + new Date(y, m - 1, d).toJSON().split`T`[0]

এই অভিব্যক্তি গুলি এখন যেতে পারে eval()'বিপরীত পেতে uated এন এর সমষ্টি এর বছর + + মাস + + দিন

n = eval(s)

আমরা -n প্রাইম কিনা (যা ক্ষেত্রে এটি 0 দেয় ) এটি পরীক্ষা করতে আমরা সহায়ক ফাংশন পি () ব্যবহার করি । যদি তা হয় তবে আমরা এস । অন্যথায়, আমরা আগের দিনটির সাথে আবার চেষ্টা করব।

(P = k => n % ++k ? P(k) : ~k)(n) ? g(d - 1) : s

1
আমার মনে হয় যে প্রাইম চেকটি কীভাবে কাজ করে এবং শেষ হয় তা বুঝতে না পেরে আমার কেবল একদিনের ছুটি দরকার। ভাল গল্ফিং!
- মনিকা

3

পাইথন 2 , 130 127 বাইট

ইনপুট হয় year, month, day

-3 বাইট কেভিন ক্রুইজসেনকে ধন্যবাদ ।

from datetime import*
def f(a):
  while(lambda n:any(n%m<1for m in range(2,n)))(a.year+a.month+a.day):a-=timedelta(1)
  print a

এটি অনলাইন চেষ্টা করুন!


আপনাকে ইনপুট হিসাবে একটি তারিখ-অবজেক্ট নেওয়ার অনুমতি দেওয়া হয়েছে, যাতে আপনি 3 বাইট সংরক্ষণ করতে পারেন ।
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুজসেন আপনাকে ধন্যবাদ আপনি কি মনে করেন এই একটি বৈধ ইনপুট ফরম্যাট?
ovs

কেন হবে না তা আমি দেখছি না, সুতরাং এটি অন্য -4। সে সম্পর্কে ভেবে দেখিনি।
কেভিন ক্রুইজসেন

2

জাভা 8, 144 128 বাইট

d->{for(;;d=d.minusDays(1)){int n=d.getYear()+d.getMonthValue()+d.getDayOfMonth(),i=2;for(;i<n;n=n%i++<1?0:n);if(n>1)return d;}}

এটি অনলাইনে চেষ্টা করুন।

java.time.LocalDateশ্রেণী পুরাতন তুলনায় একটি উন্নতি হয়েছে java.util.Date(কিন্তু কেন তারা আর নামগুলো করতে হয়েছে getMonthValueএবং getDayOfMonthপরিবর্তে getMonthএবং getDay) ..>।>

ব্যাখ্যা:

d->{                      //  Method with LocalDate as both parameter and return-type
  for(;;                  //  Loop indefinitely
      d=d.minusDays(1)){  //    Going one day back after every iteration
    int n=d.getYear()+d.getMonthValue()+d.getDayOfMonth(),
                          //   Set `n` to the sum of year+month+day
    i=2;for(;i<n;n=n%i++<1?0:n);if(n>1)
                          //   If `n` is a prime:
      return d;}}         //    Return the now modified input-LocalDate `d`

2

রুবি , 94 বাইট

এটি অনলাইন চেষ্টা করুন!

একটি একক তারিখের ইনপুট নেয় এবং আইএসও 8601 ফর্ম্যাট ( YYYY-MM-DD) এ স্ট্রিং দেয় ।

require'date'
require'prime'
->d{d.downto(0){|i|break i.to_s if (i.day+i.month+i.year).prime?}}

এটি রুবির প্রাইম মডিউলটি ব্যবহার করে। যদি এটি অনুমোদিত না হয় বা ভ্রূণ হয়, তবে আরও দুটি বাইটের জন্য আমি এই ঘৃণা উপস্থাপন করি:


রুবি , 97 বাইট

এটি অনলাইন চেষ্টা করুন!

এটি এই স্ট্যাকওভারফ্লো উত্তর থেকে প্রধান সংখ্যার জন্য একটি চেক ব্যবহার করে । এটি কীভাবে কাজ করে সে সম্পর্কে আমার কোনও ধারণা নেই, এটি কিছুটা ডাইনী যাদুবিদ্যার মতো দেখাচ্ছে। উপরের মত একই ইনপুট এবং একই আউটপুট।

require'date'
->d{d.downto(0){|i|break i.to_s if ?1*(i.day+i.month+i.year)!~ /^1?$|^(11+?)\1+$/}}

যতক্ষণ না আমদানি লাইনগুলি বাইট গণনায় অন্তর্ভুক্ত থাকে (যা আপনি এখানে করেছেন) মডিউলগুলি ব্যবহার করা পুরোপুরি ঠিক fine দেখে মনে হচ্ছে যদিও তবুও আপনার প্রাথমিক dএবং স্পেসের চারপাশে প্যারান্থেসের দরকার নেই if, সুতরাং আপনি এগুলি অপসারণ করে আপনার প্রথম উত্তর থেকে 3 বাইট ছাঁটাই করতে পারেন। টিআইও লিঙ্ক
সূন্দর - মনিকা

3
আমি যদিও জাদুকরী ঘৃণা পছন্দ করি। এটি একবার আপনি খুব ভাল ঝরঝরে এবং সন্ধান করে দেখুন: ?x*n !~ /^x?$|^(xx+?)\1+$/= এন প্রাইম হয় কিনা তা পরীক্ষা করতে, 'এন' এর একটি স্ট্রিং তৈরি করুন, এটি 0 বা 1 x এর নয় (যা প্রাইম নয়) তা পরীক্ষা করুন এবং এটি কোনওটির সাথে মেলে না 2 বা ততোধিক x এর পুনরাবৃত্তি (মিলের ^(xxxxx)\1+$অর্থ n এর দ্বারা 5 দ্বারা বিভাজ্য)। এটি আমাদের জন্য আমাদের লুপিং করতে রেজেক্স ইঞ্জিনটির ব্যাকট্র্যাকিংকে গালাগালি করে - এটি উজ্জ্বল, এটি সান্দ্র এবং প্রাণীর বলিদান সম্ভবত এটির আবিষ্কারে জড়িত ছিল।
- মনিকা

প্রথম বন্ধনী এবং স্থান সম্পর্কে ভাল জায়গা! ধন্যবাদ।
আইএমপি 1

"জাদুবিদ্যা" সংস্করণটি 92 বাইটে করা যেতে পারে, এখানে দেখুন । যেহেতু আমরা প্রাথমিকতার জন্য যে যোগফলটি পরীক্ষা করতে চাই তা কমপক্ষে 3 (যেহেতু নূন্যতম তারিখের 0001-01-01 এর যোগফল 1 + 1 + 1 = 3), আমরা রেজেক্সের সেই অংশটি সরাতে পারি যা বিশেষত ইনপুট 0 বা হ্যান্ডেল করার জন্য হয় 1. এটি মুছে ফেলা এবং সরলীকরণ একটি 91 বাইট সংস্করণ দেয়।
সূন্দর - মনিকা

একটি আকর্ষণীয় পদ্ধতির। 'মাস' এর পরিবর্তে 'সোম' ব্যবহার করে 2 বাইট সংরক্ষণ করুন
জিবি

2

রুবি , 57 53 বাইট

->d{d-=9until/^(11+)\1+$/!~?1*(d.day+d.year+d.mon);d}

এটি অনলাইন চেষ্টা করুন!

আমার ধারণা নয় - আইএমপি 1 দ্বারা "ঘৃণা" থেকে চুরি হয়েছে


আসল ধারণা:

রুবি , 59 বাইট

->d{d-=9until((2...w=d.day+d.year+d.mon).all?{|x|w%x>0});d}

এটি অনলাইন চেষ্টা করুন!


1
8e4পরিবর্তে কাজ ব্যবহার করবেন ?
ক্রিটসি লিথোস

হ্যাঁ, অবশ্যই এটি কাজ করে। এটি 9 বা অন্য কোনও ছোট সংখ্যা ব্যবহার করেও কাজ করে। এটি চালাতে কেবল অনেক বেশি সময় নেয়। ধন্যবাদ।
জিবি


2

এফ #, 134 133 বাইট

let rec s(d:System.DateTime)=
 let x=d.Year+d.Month+d.Day
 if(Seq.tryFind(fun i->x%i=0){2..x-1}).IsNone then d else d.AddDays(-1.)|>s

-1 বাইট ধন্যবাদ সূন্দর থেকে ।

এটি অনলাইন চেষ্টা করুন!

দিন, মাস এবং বছর মোট এবং এটি প্রধান কিনা তা দেখুন। যদি তা হয় তবে সেই তারিখটি ফিরিয়ে দিন। যদি তা না হয় তবে 1 দিন তারিখটি হ্রাস করুন এবং আবার চেষ্টা করুন।


1
অ্যাডডয়েস কল -1.0হিসাবে -1.আপনি লিখে লিখে একটি বাইট সংরক্ষণ করতে পারেন ।
সূন্দর - মনিকা

আপনি ঠিক বলেছেন ... সত্যিই অদ্ভুত। তবে দরকারী। ধন্যবাদ।
Ciaran_McCarthy

1

পাওয়ারশেল , 105 90 বাইট

for($a=$args[0];'1'*((Date $a -f yyyy+MM+dd)|iex)-match'^(..+)\1+$';$a=$a.AddDays(-1)){}$a

এটি অনলাইন চেষ্টা করুন!

-13 বাইটের জন্য সন্দরকে ধন্যবাদ।

এ হিসাবে ইনপুট নেয় DateTime 2018-06-20এবং এতে সংরক্ষণ করে $a। তারপরে আমরা forলুপে আছি । প্রতিটি পুনরাবৃত্তি, আমরা যেমন $a -fঅরমেটেড গ্রহণ করছি yyyy+MM+dd(অর্থাত্ বর্তমানের তারিখটি আমরা +চিহ্ন দ্বারা পৃথক হয়েছি ) এর সাথে যুক্ত হয়ে |iex(অনুরূপ eval), স্ট্রিং-গুণিত করে 1একটি দিয়ে অবিচ্ছিন্ন সংখ্যা গঠনের জন্য এবং একটি প্রাইম-চেকিং রেজেক্স ব্যবহার করে বর্তমান তারিখটি প্রধান কিনা তা নির্ধারণ করা। যদি এটি প্রাইম না .AddDays(-1)হয় তবে আমরা একদিন পিছনে যাব এবং লুপটি চালিয়ে যাব। যদি এটি প্রাইম হয় তবে আমরা লুপটি ভেঙে $aনিখুঁত আউটপুট দিয়ে পাইপলাইনে রাখি ।

ফলাফল আউটপুট সংস্কৃতি নির্ভর। টিআইওতে, যা ব্যবহার করে en-us, আউটপুটটি দীর্ঘ-তারিখের ফর্ম্যাট, যা দেখতে ভাল লাগে Saturday, July 1, 1319 12:00:00 AM


ডেটটাইম অবজেক্ট হিসাবে আর্গুমেন্টটি পাঠিয়ে আপনি কয়েকটি বাইট সংরক্ষণ করতে পারেন। এছাড়াও, রেজেক্সকে 2 এর উপরে সংমিশ্রণগুলি মেলাতে সরল করা যেতে পারে (যেহেতু ন্যূনতম তারিখ 0001-01-01যার সমষ্টি 3)। আমি এই পরিবর্তনগুলি এখানে একটি ক্র্যাক গ্রহণ ।
সূন্দর - মনিকা

(মনে রাখবেন যে আমি একটি পাওয়ারশেল নবাগত এবং সেই লিঙ্কযুক্ত কোডটি কেবলমাত্র ন্যূনতমভাবে পরীক্ষা করা হয়েছে, এমনকি এখান থেকে সমস্ত পরীক্ষার মামলাও চেষ্টা করেনি))
সুন্দরের - মনিকা

@ সুন্দর আমি এই ইনপুটটি সম্পর্কে ভেবেছিলাম, তবে এটি আমার কাছে কিছুটা "প্রতারণামূলক" বলে মনে হয়েছিল, সুতরাং আমি তার পরিবর্তে স্ট্রিং ইনপুট নিয়ে চলেছি। রেজেক্সের টিপটির জন্য ধন্যবাদ - এটি কীভাবে কাজ করে তা আমি সম্পূর্ণরূপে বুঝতে পারি না, তাই আমি কেবল হাসি এবং হিস্ট্রি করে যখন এটি সামনে আসে। হে হে।
অ্যাডমবর্কবার্ক

1

বাশ , 114 108 বাইট

a=`date +%s -d$1`
while [ "`date +%d+%m+%Y -d@$a|bc|factor|awk NF!=2`" ]
do a=$[a-86400]
done
date +%F -d@$a

এটি অনলাইন চেষ্টা করুন!

আমার প্রথম বাশ গল্ফ সত্যিই, আমার প্রথম আসল বাশ প্রোগ্রামটি ... এখান থেকে নেওয়া প্রাথমিকতার পরীক্ষা ।

টাইমজোন পরিবর্তন থাকলে এটি কখনও কখনও ব্যর্থ হতে পারে তবে টিআইও ইউটিসি ব্যবহার করে, সুতরাং সেখানে এটি কাজ করা উচিত।


প্রথম লাইনের "9" টি টাইপো? এটি এবং এর চারপাশের উদ্ধৃতিগুলি অপসারণ করা (যেহেতু আমরা ইনপুটটিতে ফাঁকা স্থান থাকা উচিত নয়) এবং এর শেষে একটি এ যুক্ত করে ১১০ বাইটে@$ ওয়ার্কিং কোড দেয় ।
সূন্দর - মনিকা

@ সুন্দর আমি ভেবেছিলাম দিবালোকের সময় সাশ্রয় করতে সমস্যা হতে পারে তবে আমি আগামীকাল আবার তা পরীক্ষা করে
দেখব

1

সি (জিসিসি) , 167 বাইট

r;P(n,i){for(r=0;++i<n;)r|=n%i<1;}f(y,m,d){for(;P(y+m+d,1),r;)!--d?d=" >8><><>><><>"[!--m?y--,m=12:m]/2+(m==2&!(y%4)&y%100|!(y%400)):0;printf("%04d-%02d-%02d",y,m,d);}

এটি অনলাইন চেষ্টা করুন!

ভগ্নস্বাস্থ্য শিঠ্ট

r;P(n,i){for(r=0;++i<n;)r|=n%i<1;}

অ্যান্টি-প্রাইম-চেকিং ফাংশন। যেহেতু আমাদের সবচেয়ে প্রারম্ভিক বৈধ বছরটি আমাদের মোকাবেলা করতে হবে তা হল 0001-01-01, তাই আমাদের সবচেয়ে বেশি চিন্তার সবচেয়ে কম সংখ্যা 3, সুতরাং এন == 2 বা এন <2 এর জন্য বিশেষ-কেস চেকগুলি সরিয়ে নেওয়া হয়। n যদি প্রাইম না হয় তবে সত্যের মান সেট করা হয় । আর এটি বিশ্বব্যাপী রাখা হয়, যেহেতু এটি ফেরত না দেওয়া হওয়ায় দুটি বাইট সাশ্রয় হয় ( বিশ্বব্যাপী চেক করতে i=n;বনাম ফিরে ,rআসা)। আমি আরও 2 বাইট সংরক্ষণ করতে, ফাংশন কলার দ্বারা 1 তে সেট করা আছে।

f(y,m,d){for(;P(y+m+d,1),r;)

আমরা তিনটি পৃথক পূর্ণসংখ্যার হিসাবে তারিখটি গ্রহণ করি এবং মূল লুপটি শুরু করি, যা y + m + d প্রাইম না হওয়া অবধি চলে। তারপরে আমরা ফাংশনের মাংসে আসি:

!--d?                           Decrement day and check if zero, which means we go back to last day of previous month.
d=" >8><><>><><>"               The string contains the number of days of each month times 2, to bring them into printable ASCII range.
                                We begin the string with a space, to avoid having to substract from index later.
[!--m?y--,m=12:m]/2+            Decrement month and check if zero. If so, go back a year and set m to 12. Use m as index in string.
(m==2&!(y%4)&y%100|!(y%400))    If the new month is February, add 1 to day if it's a leap year.
:0;                             Do nothing if day did not become zero.

লিপ ইয়ার চেক এবং স্ট্রিংয়ের সূচী হিসাবে, যখন মূল্যায়ন আদেশটি অনির্ধারিত করা হয়েছে তখন এম এবং ওয়াই উভয়ই ব্যবহার করা ভাল বলে মনে হতে পারে। ভাগ্যক্রমে, আমরা কেবল লিপ ইয়ারের জন্য পরীক্ষা করি যদি মি == 2 হয়, যা আমরা মি এবং ওয়াই পরিবর্তনের সাথে সাথে একই সময়ে ঘটতে পারে না, যেহেতু কেবল জানুয়ারি থেকে ডিসেম্বর পর্যন্ত ঘটে থাকে, সুতরাং লিপ ইয়ার চেকটি কখনই বিরক্ত হয় না মূল্যায়নের আদেশ।

পরিশেষে, ফলাফলটি STDOUT এ মুদ্রিত হয়:

printf("%04d-%02d-%02d",y,m,d);}

0

সি # - 281 239 232 চর

using System;class P{static void Main(){var d=DateTime.Parse(Console.ReadLine());do{int c=d.Year+d.Month+d.Day;if(c%2!=0){int i=3;for(;i<=c;i+=2)if(c%i==0)break;if(i>=c)break;}d=d.AddDays(-1);}while(d>DateTime.MinValue);Console.WriteLine(d);}}

ungolfed:

using System;
class P
{
    static void Main()
    {
        var d = DateTime.Parse(Console.ReadLine());
        do
        {
            int c = d.Year + d.Month + d.Day;
            // minimum datetime in c# is 0001-01-01
            // therefore do not need to check for the first two primes 
            int i = 3;
            for (; i < c; i += 2) if (c % i == 0) break;
            // check to break the date decrement loop if counter passed the input value
            // ie, no factor could be found
            if (i >= c) break;

            d = d.AddDays(-1);
        } while (d > DateTime.MinValue);
        Console.WriteLine(d);
    }
}

কোডটি কম দক্ষ তবে ছোট তৈরি করা হয়েছে। প্রাইম লুপ এখন বর্গমূলের চেয়ে পূর্ণসংখ্যায় যাবে। এটি সমস্ত এমনকি সংখ্যার প্রক্রিয়া করবে।


আপনি সম্ভবত অপসারণ করতে পারেন public। এছাড়াও, যেহেতু কলিং প্যারামিটার হিসাবে তারিখের ইনপুটটি পাওয়া যায় না বলে মনে হয় না, তাই আপনি Main(string[]a)এবং পরে থাকতে পারেনDateTime.Parse(a[0])
Corak

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