দুর্ভাগ্য সংখ্যা!


22

জানা বিষয়গুলি:

প্রথম, ভাগ্যবান সংখ্যা।

ভাগ্যবান সংখ্যাগুলি এর মতো উত্পন্ন হয়:

সমস্ত প্রাকৃতিক সংখ্যা নিন:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...

তারপরে, প্রতিটি দ্বিতীয় নম্বর সরান।

1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...

এখন, 3নিরাপদ।

প্রতি তৃতীয় নম্বর সরান:

1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...

এখন, 7নিরাপদ।

প্রতি 7 তম নম্বর সরান।

চালিয়ে যান এবং প্রতি nতম নম্বর সরিয়ে ফেলুন , যেখানে nনির্মূলের পরে প্রথম নিরাপদ নম্বর is

নিরাপদ সংখ্যার চূড়ান্ত তালিকাটি ভাগ্যবান সংখ্যা।


অশুভ সংখ্যাগুলি পৃথক সংখ্যার তালিকার সমন্বয়ে গঠিত, যা [U1, U2, U3... Un]

U1 ভাগ্যবান "প্রার্থী" থেকে প্রথম সংখ্যাটি সরানো হয়েছে, তাই তারা হ'ল:

2, 4, 6, 8, 10, 12, 14, 16, 18, 20...

U2 দ্বিতীয় সংখ্যাটি সরানো হয়েছে:

5, 11, 17, 23, 29, 35, 41, 47, 53, 59...

এবং এইভাবে এবং আরও ( U3তৃতীয় তালিকার তালিকায় U4চতুর্থ, ইত্যাদি)


চ্যালেঞ্জ:

আপনার টাস্ক দুটি ইনপুট দেওয়া হয় mএবং n, উৎপন্ন mতালিকায় তম সংখ্যা Un

ইনপুট এবং আউটপুট উদাহরণ:

(5, 2) -> 29
(10, 1) -> 20

চশমা:

  • আপনার প্রোগ্রামটি অবশ্যই mঅবধি 1e6এবং আরও nবেশি কাজ করে 100
    • আপনি গ্যারান্টিযুক্ত যে উভয় mএবং nইতিবাচক পূর্ণসংখ্যার।
    • আপনি যদি কৌতূহলী হন, U(1e6, 100)= 5,333,213,163। (আপনাকে ধন্যবাদ পাচলিক!)
  • আপনার প্রোগ্রামটি অবশ্যই 1 দিনের মধ্যে যুক্তিসঙ্গত আধুনিক কম্পিউটারে গণনা করতে হবে।

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোড!

PS: যদি কেউ এগুলি উত্পন্ন করার জন্য কোনও সাধারণ সূত্র নিয়ে আসে তবে ভাল লাগবে। আপনার যদি কোনও সূত্র থাকে তবে দয়া করে আপনার উত্তরে রাখুন!


OEIS অন: A219178 এবং A255543
Arnauld


2
আপনি কি এমন কোড প্রয়োগ করেছেন যা বাস্তবে সম্পাদন করতে পারে (1e6,1e6)?
জনাথন অ্যালান

2
আপনার যদি সময়ের প্রয়োজন হয় তবে আপনার সময়কালীন পরিবেশ নির্দিষ্ট করতে হবে (যেমন আপনার যন্ত্র, একটি অবাধে উপলভ্য অনলাইন ভিএম, বা "একটি যুক্তিসঙ্গত আধুনিক কম্পিউটার")।
মেগো

1
n=1মামলাটির জন্য এই কাজটি না করা কি গ্রহণযোগ্য ? যেহেতু এটি বিশেষ - অন্যান্য সমস্ত ক্ষেত্রে, পরবর্তী ভাগ্যবান সংখ্যার 0-ভিত্তিক সূচক n-1
ম্যারিডিয়াম

উত্তর:


1

সিজেম , 74 বাইট

ri0Lri:U{1$W%{1$\(1e>/+}/)+}/2t:A0@{@:B:(_0#):D{D(_A=tD<BD>+}&@)@DU=-}h]1=

এটি অনলাইন চেষ্টা করুন! বৃহত্তর কেসগুলির জন্য সময় নির্ধারণ করা হবে, নীচে নীচে সময় সীমাবদ্ধতায় আরও বেশি।


ব্যাখ্যা:

আমাদের প্রোগ্রামটি নির্লজ্জভাবে N ভাগ্যবান সংখ্যার একটি তালিকা তৈরি করার জন্য অ্যাডিটস কোডের ধার নিয়েছে , 1 এর পরিবর্তে 2 দিয়ে 2 চালনার প্রতিটি ধাপে বৃদ্ধি দেয়। একটি কোড শূন্য না পাওয়া পর্যন্ত প্রতিটি কোডে অবশিষ্ট কোড হ্রাস পায় (একটি অ-হ্রাসযুক্ত লেজ টুকরো টুকরো করে কাটা দিয়ে) এবং কার্যকরভাবে চালুনির প্রতিটি এন পর্যায়ের পদক্ষেপগুলি একবারে গণনা করে ।

ri                               e# read M
0Lri:U{1$W%{1$\(1e>/+}/)+}/2t:A  e# list steps (also becomes B)
0@                               e# arrange stack [B I M]
{                                e# while M
   @:B                           e#   get current B
   :(                            e#   decrement every element in B
   _0#):D                        e#   find first 0
   {                             e#   if there is a 0
      D(_A=t                     e#     reset that element in B
      D<BD>+                     e#     replace tail after 0
   }&                            e#   end if
   @)                            e#   increment I
   @DU=-                         e#   decrement M if N-th phase of sieve
}h                               e# end loop
]1=                              e# return I

টাইমিং:

যদি আপনাকে অবশ্যই বৃহত্তর সংখ্যার জন্য ব্রাউজারে প্রোগ্রামটি চালাতে হয় তবে আপনি এই দোভাষীটি ব্যবহার করতে এবং অনুরোধ করা হলে স্ক্রিপ্টটি চালিয়ে যেতে পারবেন, তবে এটি যোগ্যতা অর্জন করতে খুব ধীর হতে পারে। ( এম , এন ) = (100,100) ব্যবহার করতে 247 ডলার লাগে। প্রোগ্রামগুলির পুনরাবৃত্তি এম এর ক্ষেত্রে তুলনামূলকভাবে রৈখিক , সুতরাং কম্পিউটিং (1e6,100) ~ 29 দিন সময় নিতে পারে।

একটি পিসিতে শেল ইন্টারপ্রেটার ব্যবহার করে প্রোগ্রামের গণনা (100,100) s 6 এস এবং কম্পিউটস (1e4,100) ~ 463 এর মধ্যে। প্রোগ্রামটি 13-17hrs সালে (1e6,100) গণনা করতে সক্ষম হওয়া উচিত। এই ক্ষেত্রে আমি প্রোগ্রামটি যোগ্য বলে ধরে নিব।

নোট সব সময় পরিমাপ এবং গণনা উভয়ই ছিল।


7

পার্ল, 87 85 82 81 বাইট

জন্য +4 অন্তর্ভুক্ত -pX

এনডি দিয়ে প্রথমে এক লাইন হিসাবে এসটিডিএন-এ ইনপুট দিন (লক্ষ্য করুন এটি চ্যালেঞ্জের প্রস্তাবিত আদেশের বিপরীত। সুতরাং গণনা U(1000000, 100):

unlucky.pl <<< "100 1000000"

অ্যাডিটসুর ভাগ্যবান সংখ্যার উপর ভিত্তি করে অ্যালগরিদম উত্তর সময় জটিলতা O(n^2)তাই এটি প্রয়োজনীয় ব্যাপ্তির চেয়ে দ্রুত। 100, 1000000কেস দেয় 53332131630.7 সেকেন্ডের মধ্যে। পার্ল do$0ভিত্তিক পুনরাবৃত্তির সাথে সমস্যার কারণে এটি প্রচুর মেমরি ব্যবহার করে। এটিকে ফাংশন হিসাবে পুনরায় লেখাই মেমরির ব্যবহার করতে পারে O(n)তবে বেশ কয়েকটি বাইট দীর্ঘ হয়

unlucky.pl:

#!/usr/bin/perl -pX
$_=$a{$_}||=/\d+$/>--$_?2*$&+$^S:($_=$_.A.(do$0,$^S?0|$&+$&/~-$_:$&*$_-1),do$0)

এটি প্রদর্শিত হিসাবে কাজ করে, তবে ^Sদাবি করা স্কোর পেতে আক্ষরিক ব্যবহার করুন ।

$^Sপার্লগল্ফের আগের কোনও ব্যবহার সম্পর্কে আমি অবগত নই ।


তবে এটি কতক্ষণ সময় নেয় (1e6,100)?
ম্যারিডিয়াম

@ মেরিডিয়াম মেমোরি বিস্ফোরণের কারণে do$0এটি মূলত যে কোনও বাস্তব কম্পিউটারে পৌঁছনীয় নয় । তবে যদি সেই স্মৃতি প্রায় 2 বছর ধরে থাকে। আমি সত্যিই একটি সাধারণ সাব্রোটাইন ভিত্তিক সংস্করণ লিখেছি এবং পরীক্ষা করে দেখিনি, তবে আমি আশা করব যে এটি কয়েক মাসের মধ্যে শেষ হবে এবং খুব কম স্মৃতিযুক্ত কম্পিউটারেও চালিত হবে। সুতরাং এটি ভাল জিনিস যে এই মানগুলি এই চ্যালেঞ্জের জন্য প্রয়োজনীয় পরিসরে নেই।
টন হসপেল

(1e6,100)এক দিনের মধ্যে গণনা করা কি চ্যালেঞ্জ নয় ? এই মানগুলির প্রয়োজন নেই বলে আপনি কী বোঝাতে চাইছেন?
ম্যারিডিয়াম

@ মেরিডিয়াম লক্ষ্য করুন যে আমার প্রোগ্রামে nএবং mবিপরীত ক্রমে দেওয়া হয়। 100 1000000ইনপুট হিসাব U(1000000, 100)এবং দেয় 5,333,213,1630.7 সেকেন্ডের মধ্যে। এটি বর্তমানে পোস্ট করা এগুলির সবচেয়ে দ্রুত প্রোগ্রাম
টোন হসপেল

আহ ঠিক আছে, আমি এর (100,1e6)চেয়ে অনেক দ্রুত গতিতে প্রত্যাশা (1e6,100)করেছিলাম এবং ভেবেছিলাম এটিই বজ্রপাতের দ্রুত 0.7 সেকেন্ডের জন্য ব্যাখ্যা!
ম্যারিডিয়াম

7

পাইথন 3, 170

from itertools import*
def L(n,k=1):
 if n<2:yield from count(2+k,2)
 t=L(n-1);l=next(t)
 for i in t:
  n+=1
  if(n%l>0)==k:yield i
U=lambda m,n:sum(islice(L(n,0),m-1,m))

ফাংশন এল সম্ভাব্য ভাগ্যবান সংখ্যাগুলির সারি তৈরি করে (যদি কে সত্য হয়) বা আন (যদি মিথ্যা থাকে)। অলসভাবে মূল্যায়ন করা (যাতে আমি আন চাইলে আমাকে এন -1 অসীম তালিকা তৈরি করতে হবে না )।

ইউ ফাংশন চালান ।

গতি

ইউপি (1,000,000; 100) পিপিওয়াই দিয়ে আমার মেশিনে চালাতে প্রায় 1 ঘন্টা 45 মিনিট সময় নেয়। আমি সিপিথনের সাথে প্রায় চার ঘন্টা সন্দেহ করি। (হ্যাঁ, 4 ঘন্টা 20 মিনিট সুনির্দিষ্ট হতে হবে))

যদি আমি জেনারেটরের পরিবর্তে একটি তালিকা ব্যবহার করি তবে আমি কিছুটা গতি পেতে পারি তবে পাইথন আমাকে যে পরিমাণ অনুমতি দেয় তার চেয়ে আমার আরও বড় আকারের একটি তালিকা প্রয়োজন। এবং যদি এটি হয় তবে এটির জন্য কয়েক ডজন গিগাবাইট র‍্যামের প্রয়োজন হবে।


হ্যাঁ, এবং ইউ (1,000,000; 100) = 5,333,213,163


এখনই বৈধ হওয়া উচিত।
ক্লিমেজিক

3

Haskell,

এন = 1: 175 160 বাইটের জন্য গণনা করতে সক্ষম নয়

সংকলিত হয়ে গেলে এটি (1000000,100)ব্যবহারের জন্য একটি ইনপুট গণনা করতে আমার কম্পিউটারটি 2 ঘন্টা 35 মি নিয়েছিল :

n#s=y:(n#p)where y:p=drop(n-1)s
n%s=f n s$[]where f n s=(take(n-1)s++).f n(drop n s) 
l 2=[1,3..]
l m=((l$m-1)!!(m-2))%(l$m-1)
m?n=(((l n)!!(n-1))#(l$n))!!(m-1)

আমি whereমডিউলগুলি ছড়িয়ে দেওয়ার চেষ্টা করেছি , তবে তারা গতিকে প্রভাবিত করেছে বলে মনে হচ্ছে এবং কেন আমি নিশ্চিত নই ... তবে আমার মনে হয় এখানে আরও ছাঁটাই করা দরকার।

ব্যবহারের পদ্ধতিটি হ'ল m?nএকটি mএবং দেওয়া উত্তরের অনুসন্ধানের জন্য n

Ungolfed

everynth n xs = y:(everynth n ys) -- Takes every nth element from a list 'xs'
  where y:ys = drop (n-1) xs

skipeverynth n xs = f' n xs $ []  -- Removes every nth element from a list 'xs'
  where f' n xs = (take (n-1) xs ++) . f' n (drop n xs) 

l 2 = [1,3..] -- The base case of the list of lucky numbers for 'n=2'
l m = skipeverynth ((l$m-1)!!(m-2)) (l$m-1) -- Recursively defining next case as being the last one with every 'ath' element skipped. Here, 'a' is the (m-1)th elemnent of the (l (m-1)) list.
ul m = everynth ((l m)!!(m-1)) (l$m) -- This is not used other than to compute the final, required unlucky number list. It picks out every 'ath' element.

ans m n = (ul n)!!(m-1) -- The function giving the answer.

আমি মনে করি, 'স্কাইপওয়ারিঁথ' এবং 'অরেন্থ' ফাংশনগুলিকে একক ফাংশনে একত্রিত করা সম্ভব হতে পারে যা একটি জুটি ফেরত দেয়।

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

সমস্ত n: 170 বাইটের জন্য গণনা করতে সক্ষম

এটি মূলত একই, তবে maxএর বিশেষ কেসটি পরিচালনা করতে বেশ কয়েকটি ফাংশন নিক্ষেপ করতে হয়েছিল n=1

n#s=y:(n#p)where y:p=drop(n-1)s
n%s=f n s$[]where f n s=(take(n-1)s++).f n(drop n s) 
l 1=[1..]
l m=((l$m-1)!!(max 1$m-2))%(l$m-1)
m?n=(((l n)!!(max 1$n-1))#(l$n))!!(m-1)

2

আর 82 বাইট

f<-function(m,n){a=1:2e8
i=1
while(i<n){a=c(0,a)[c(F,rep(T,i))]
i=i+1}
a[(n+1)*m]}

ব্যবহার

f(5,2)
Returns 29

এটির সাথে শুরু করতে একটি বৃহত যথেষ্ট ভেক্টর থাকা দরকার তাই মানটি ফেরত দেওয়ার জন্য পর্যাপ্ত সংখ্যা বাকী রয়েছে। তৈরি করা ভেক্টর ইতিমধ্যে প্রায় 800Mb এবং ফাংশনটি এম = 1e4 এবং এন = 100 পর্যন্ত পরিচালনা করতে পারে তবে লক্ষ্যটির চেয়ে এখনও খুব কম।

চ (1e6,100) গণনা করার জন্য একটি বৃহত যথেষ্ট ভেক্টর তৈরি করতে 1: 2e10 এর প্রারম্ভিক ভেক্টর লাগবে। রুপি ডেটা বরাদ্দের পদ্ধতির কারণে এটি একটি ভেক্টর তৈরি করে> 70 জিবি যা কোনও কম্পিউটারে চালানো যায় না আমি জানি যদিও কোডটি চলবে।

Error: cannot allocate vector of size 74.5 Gb

রেফারেন্সের জন্য f (1e4,100) প্রায় 30 সেকেন্ডের মধ্যে চলে। এর উপর ভিত্তি করে এবং কয়েকটি ছোট পরীক্ষা চ (1e6,100) প্রায় এক ঘন্টা সময় নিতে পারে।


আপনার উত্তরটিকে প্রতিদ্বন্দ্বী হিসাবে চিহ্নিত করা চ্যালেঞ্জের প্রয়োজনীয়তা পূরণ করতে ব্যর্থ হওয়া থেকে বঞ্চিত হবে না।
মেগো

@ মেগো আইভ প্রচুর উত্তর দেখেছেন যা প্রয়োজনীয়তা পূরণ করতে ব্যর্থ হয় (এই চ্যালেঞ্জটিতে কমপক্ষে আরও 1 জন রয়েছে)। আমি এটিকে কোড করেছিলাম এবং আমার মনে হচ্ছে এটি কোডিংয়ের অনুরোধের সাথে মিলিত হয়েছে, আমি স্পষ্টভাবে বলেছি যে এটি কমেছে। এছাড়াও আপনি আপনার মন্তব্যে প্রশ্নটিতে উল্লেখ করার সাথে সাথে এটি কোন ধরণের কম্পিউটারে পরীক্ষা করা প্রয়োজন তা উল্লেখ করে না। আমি নিশ্চিত যে কম্পিউটারগুলি এখানে আছে যা মেমরির জন্য 7 গিগাবাইট লিখে এটি প্রক্রিয়া করতে পারে। আমি যার সাথে ছিলাম তা করতে পারিনি তবে আমি এখনও পোস্ট করতে চেয়েছিলাম এবং আমি মনে করি যে পরিষ্কার বিবৃতিটি একটি বৈধ আপস।
gtwebb

চ্যালেঞ্জের স্পেসিফিকেশন পূরণ না করে উত্তর সম্পর্কে আমাদের একটি পরিষ্কার নীতি আছে । বলা হচ্ছে, আপনি কেন নিজের উত্তরটিকে প্রতিদ্বন্দ্বী হিসাবে লেবেল করেছেন তা আমি নিশ্চিত নই। যদি আমি সঠিকভাবে বুঝতে পারি তবে এটি পর্যাপ্ত মেমরির সাথে কাজ করা উচিত তবে আপনি এটি পরীক্ষা করতে পারেন নি কারণ আপনার পর্যাপ্ত র‌্যাম নেই। এটা কি ঠিক?
ডেনিস

1
1. এই নীতিটি প্রয়োগ করা হচ্ছে, তবে চারজন মডারেটর সাইটে সমস্ত উত্তর পরীক্ষা করতে পারবেন না। যদি আপনি এমন কোনও জমাটি পান যা নিয়ম মেনে চলে না, তবে এটি মডারেটরের মনোযোগের জন্য পতাকাঙ্কিত করুন যাতে আমরা একবার নজর দিতে পারি। ২. অংশ নিতে আপনাকে গল্ফ করার ভাষা শিখতে হবে না। আর এর মতো প্রোডাকশন ভাষা ঠিক তেমন স্বাগত welcome আমি পাইথনের উত্তরগুলি নিয়মিত পোস্ট করি।
ডেনিস 15

1
৩. স্পপটি কোনও স্মৃতি সীমা উল্লেখ করে না, তবে একটি 24 ঘন্টা সময়সীমা রয়েছে। এটি পরীক্ষা করার জন্য 70 জিবিবি (বা আপনি গিগা বিট বোঝাতে চেয়েছিলেন ) সহ কম্পিউটারের অভাবে, এই উত্তরটি বৈধ কিনা তা নির্ধারণ করা শক্ত। আমি রানটাইম এক্সট্রোপোলেট করার চেষ্টা করার পাশাপাশি আপনাকেও পরামর্শ দিচ্ছি। যদি এটি এক দিনেরও কম হয়, তবে প্রতিদ্বন্দ্বিতামূলক শিরোনামটি সরিয়ে ফেলুন এবং পোস্টে আপনার এক্সট্রাপোলেশনটি অন্তর্ভুক্ত করুন। যদি এটি বেশি সময় নেয় তবে আপনার জমাটি অপ্টিমাইজ করা বা অপসারণ করা উচিত।
ডেনিস 15

1

র‌্যাকেট 332 বাইট

(λ(N m n)(let loop((l(filter odd?(range 1 N)))(i 1))(define x (list-ref l i))(if(= i (sub1 n))
(begin(set! l(for/list((j(length l))#:when(= 0(modulo(add1 j)x)))(list-ref l j)))(list-ref l(sub1 m)))
(begin(set! l(for/list((j(length l))#:unless(= 0(modulo(add1 j) x)))(list-ref l j)))(if(>= i(sub1 (length l)))l
(loop l(add1 i)))))))

অবরুদ্ধ সংস্করণ:

(define f
  (λ(N m n)
    (let loop ((l (filter odd? (range 1 N))) (i 1))
      (define x (list-ref l i))
      (if (= i (sub1 n))
          (begin (set! l (for/list ((j (length l)) 
                                   #:when (= 0 (modulo (add1 j) x)))
                           (list-ref l j)))
                 (list-ref l (sub1 m)))
          (begin (set! l (for/list ((j (length l)) 
                                   #:unless (= 0 (modulo (add1 j) x)))
                           (list-ref l j)))
                 (if (>= i (sub1 (length l)))
                     l
                     (loop l (add1 i))))))))

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

(f 100 5 2)

আউটপুট:

29

1

ক্লোজার, 221 বাইট

মাইটি লম্বা তবে কেস পরিচালনা করে (f 1)। যে বিশেষ ক্ষেত্রে ছাড়া এটি 183 বাইট ছিল। এটি পোস্ট না করার জন্য এটি অনেক বেশি চেষ্টা ছিল।

(defn f([n](if(< n 2)(take-nth 2(drop 2(range)))(f n 1(take-nth 2(rest(range))))))([n i c](if (< n 2)c(let[N(first(drop i c))F #((if(= 2 n)= >)(mod(inc %)N)0)](f(dec n)(inc i)(filter some?(map-indexed #(if(F %)%2)c)))))))

নমুনা আউটপুট:

(pprint (map #(take 10 (f %)) (range 1 10)))
((2 4 6 8 10 12 14 16 18 20)
 (5 11 17 23 29 35 41 47 53 59)
 (19 39 61 81 103 123 145 165 187 207)
 (27 57 91 121 153 183 217 247 279 309)
 (45 97 147 199 253 301 351 403 453 507)
 (55 117 181 243 315 379 441 505 571 633)
 (85 177 277 369 471 567 663 757 853 949)
 (109 225 345 465 589 705 829 945 1063 1185)
 (139 295 447 603 765 913 1075 1227 1377 1537))

1000000 100 কেস প্রায় 4.7 ঘন্টা গণনা করা হয়েছিল, কমপক্ষে এটি ক্রাশ হয়নি।

java -jar target\stackoverflow-0.0.1-SNAPSHOT-standalone.jar 1000000 100
5333213163
"Elapsed time: 1.7227805535565E7 msecs"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.