দশমিক প্রতিনিধিত্ব সময়কাল


16

এমন একটি ফাংশন লিখুন যা একক ধনাত্মক পূর্ণসংখ্যার n নেয় এবং 1 / n এর দশমিক প্রতিনিধিত্বের সময়কালে ফিরে আসে ।

পরীক্ষার কেস:

1 -> 1               # 1/1 = 1.0000...... = 1._0
2 -> 1               # 1/2 = 0.5000...... = 0.5_0
3 -> 1               # 1/3 = 0.3333...... = 0._3
7 -> 6               # 1/7 = 0.14285714.. = 0._142857
13 -> 6
14 -> 6
123 -> 5
345 -> 22
654 -> 108
12345 -> 822
67890 -> 120

এটি । বিল্ট-ইন বা লাইব্রেরিগুলি যা সরাসরি পিরিয়ড দেয় তা অনুমোদিত নয়। কমপক্ষে 100000 পর্যন্ত সংখ্যা যথাযথ সময়ের মধ্যে (বেশিরভাগ বেশ কয়েক মিনিটের মধ্যে) কাজ করা উচিত।


প্রশ্নটিতে বলা হয়েছে যে "কমপক্ষে 100000 অবধি সংখ্যার যুক্তিসঙ্গত সময়ের মধ্যে কাজ করা উচিত", তবে প্রোগ্রামটি কি এর চেয়ে বড় সংখ্যার জন্য সঠিক উত্তর দিতে হবে ? অথবা 100,000 অবধি সঠিক এমন একটি অ্যালগরিদম ব্যবহার করা কি গ্রহণযোগ্য হবে?
ফায়ারফ্লাই

1
@ ফায়ারফ্লাই অ্যালগরিদমগুলি অবশ্যই সঠিক উত্তর সরবরাহ করবে।
হাওয়ার্ড

2
1 কেন 1 ফিরে আসবে? আমি 0 মনে হবে?
টিমটেক

@Timtech1.00000000000000000000000000000000000
Cruncher

@ ক্রাঙ্কার ওহ ধন্যবাদ, আমি এখন এটি পেয়েছি।
টিমটেক

উত্তর:


11

এপিএল, ১৯ টি চর / বাইট *

{(↑⍳⍨1∘↓)⌽⍵|10x*⍳⍵}

Nars2000 । পূর্ববর্তী সংস্করণটি কয়েকটি সংখ্যায় ভুল ছিল, এটি সঠিক হওয়া উচিত। আমি 50 টি পর্যন্ত সমস্ত সংখ্যায় ম্যানুয়ালি এটি পরীক্ষা করেছিলাম।

আবার, সময়কাল দেখার জন্য ধারণার জন্য ক্রেডিট বেন রেখের কাছে যায়10^i (mod x)

বিস্তারিত দেখুন

{                     ⍳⍵}   generate all naturals up to the argument ⍵
                 10x*       raise 10 to each of them, with unlimited precision
              ⍵|            compute the respective remainders mod ⍵
            ⌽               reverse the list
 (  ⍳⍨    )                 (fork) find the position of the first occurrence
  ↑                         of the fist element of the list
       1∘↓                  in the remainder of the list

উদাহরণ

      {(↑⍳⍨1∘↓)⌽⍵|10x*⍳⍵}¨1 2 3 7 13 14 123 345 654 12345 67890
1 1 1 6 6 6 5 22 108 822 120

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: এপিএল নিজস্ব (লিগ্যাসি) একক বাইট অক্ষরে
লেখা যেতে পারে যা এপিএল প্রতীকগুলিকে উপরের 128 বাইট মানগুলিতে মানচিত্র করে। সুতরাং, স্কোর করার উদ্দেশ্যে, এন চরগুলির একটি প্রোগ্রাম যা কেবলমাত্র এসসিআইআই অক্ষর এবং এপিএল প্রতীক ব্যবহার করে তা এন বাইট দীর্ঘ হিসাবে বিবেচনা করা যেতে পারে।


আমি যেমন ইনপুট জন্য সঠিক উত্তর পেতে পারি না 20। আপনি দয়া করে যাচাই করতে পারেন?
হাওয়ার্ড

আপনার পোস্ট করা উদাহরণগুলি আমি অনুসরণ করেছি। আপনার উদাহরণে, 1/2 = 0.5 -> 1, তাই স্বাভাবিকভাবেই 1/20 = 0.05 -> ২ আপনি কী পাচ্ছেন?
টোবিয়া

1/20 = 0.05_0_ থেকে সঠিক উত্তরটি 1 হবে।
হাওয়ার্ড

আমি দেখি. আমাকে কিছু দিন, আমি আমার উত্তরটি সংশোধন করব।
টোবিয়া

4মনে হচ্ছে এটিও ভুল উত্তর দেবে, কারণ 10 != 100 (mod 4)
পিটার টেলর

7

গল্ফস্ক্রিপ্ট ( 42 27)

{:x)1\[{.10*x%}*]-1%(?)}:P;

বেঞ্চমার্ক সময়: 5 সেকেন্ড বেঞ্চমার্কিং কোড:

'"The time is #{Time.now#1
}"'~ puts
[1 2 3 7 13 14 123 345 654 12345 67890 99991]{[P]p}%
'"The time is #{Time.now#2
}"'~ puts

সময়কাল দেখার জন্য মূল ধারণাটির জন্য বেন রিচের কাছে ক্রেডিট 10^i (mod x)

ব্যাখ্যা

সময়ের pক্ষুদ্রতম ধনাত্মক পূর্ণসংখ্যা যেমন যে সব ভালোই বড় জন্য হিসাবে সংজ্ঞায়িত করা হয় iআমরা আছে frac(10^i * 1/x) = frac(10^(i+p) * 1/x)। আমরা যে সামান্য এটি সহজ করতে পারেন frac(10^i / x) = frac(10^(i+p) / x)। এখন, frac(a / x) = frac(b / x)iff a == b (mod x), তাই আমরা পূর্ণসংখ্যা ক্ষুদ্রতম ইতিবাচক খুঁজছেন সব ভালোই বড় জন্য যেমন যে i: 10^i == 10^(i+p) (mod x)

ধরুন 10^i == 10^(i+p) (mod x)। তারপরে 10^(i+1) == 10 * 10^i == 10 * 10^(i+p) == 10^(i+p+1) (mod x); সুতরাং একবার আমরা একটি পুনরাবৃত্তি পেলে, আমরা একটি অলঙ্ঘনীয় চক্রে আছি।

কেবলমাত্র xস্বতন্ত্র মান রয়েছে (mod x), তাই কবুতরের নীতি অনুসারে আমাদের অবশ্যই প্রথম x + 1মানগুলির পুনরাবৃত্তি পেতে হবে 10^i (mod x)

সুতরাং উপরের কোডটি কী করে * এর x + 2মানগুলি গণনা করা 10^i (mod x)। তারপরে সর্বশেষটি পুনরাবৃত্তি হওয়ার নিশ্চয়তা রয়েছে এবং তালিকাটি উল্টিয়ে তার জন্য অনুসন্ধান করে আমি সর্বাধিক সাম্প্রতিক ঘটনাটি খুঁজে পেতে পারি। তদুপরি, কারণ আমি কেবল একটি অনুসন্ধান করছি এটি সিউডলাইনার সময়।

* অতিরিক্তটি হ'ল বিশেষ কেসটি পরিচালনা করা x = 1, কারণ আমি হ্রাস করি না 10^0 (mod x)এবং তাই আমি একটি 0সন্ধান করতে চাই [1]


অসাধারণ! আমি আমার উত্তরটি আরও ভাল সমাধানের পরে মুছে ফেলেছি! -
বেন রেইচ

7

গল্ফস্ক্রিপ্ট - 26 বাইট

{:i.)+.,{;10*i%.}%i>|,}:f;

সম্পাদনা: 1দশমিক প্রতিনিধিত্বের দৈর্ঘ্যের চেয়ে দশমিক শেষ হলে আউটপুট আপডেট হয়েছে updated

একটি মোটামুটি দক্ষ সংস্করণ। মানটি 67890 প্রায় 10 সেকেন্ড এবং 99991 প্রায় 20 সেকেন্ডে চলে। এটি আগের চেয়ে খানিকটা ধীর (প্রায় অর্ধেক দ্রুত) যতটা পুনরাবৃত্তি হবে তার দ্বিগুণ হয়েছে, যার প্রথমার্ধটি অগ্রাহ্য করা হয়েছে।

বিকল্প, এছাড়াও 26 বাইট

{:i.)+.n*{*i%.}%i>)^^,}:f;

এই এক স্ট্রিং উপর পুনরাবৃত্তি দ্বারা কাজ করে "\n"*(2*i+1), যেখানে ফাংশনটিতে iমান দেওয়া হয়। প্রতিটি সময় ব্লকে পাস করা মান হ'ল অর্ডিনাল মান "\n", যা 10 হয়

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

চূড়ান্ত মানটির একটি অতিরিক্ত অনুলিপি ইতিমধ্যে স্ট্যাকের মধ্যে রয়েছে, তাই আমি চূড়ান্ত মানটি আবার সরিয়ে ফেলি ), স্ট্রিং দিয়ে এটি xor করব এবং তারপরে আবার xor করব, যাতে যে কোনও অক্ষর প্রথম জোড় দ্বারা যুক্ত বা সরানো হয়েছিল তা পুনরুদ্ধার করা যায়। যদি int op stringতার স্ট্রিং প্রতিনিধিত্বের চেয়ে চরিত্র হিসাবে বিবেচিত হয় তবে এটি )^^দ্বারা প্রতিস্থাপন করা যেতে পারে |

নোট করুন যে স্ট্রিংগুলি (যা গল্ফস্ক্রিপ্টে অন্তর্নিহিত বিন্যাস হিসাবে সঞ্চিত আছে) প্রতিটি অক্ষরের 256 এর মান প্রদর্শন করবে, প্রতিটি অক্ষরের মানগুলি এই সীমার বাইরে থাকতে পারে। স্বতন্ত্রতার জন্য (সেট অপারেশনগুলির মাধ্যমে) বা ইনটনেসিটির (মাধ্যমে ?) পরীক্ষা করার সময়, এটি প্রকৃত মান যা তুলনা করা হয় তা প্রদর্শন মানের চেয়ে।

বর্তমান গল্ফস্ক্রিপ্ট ইন্টারপ্রেটারের জন্য একটি প্যাচ ফাইল :

61c61
<       to_gs
---
>       Gstring.new([self])

উপরেরটি কেবল string op int(এবং বিপরীতে) এর আচরণকে প্রভাবিত করবে , যেখানে এর opমধ্যে একটি
+-|&^। এর আচরণ সহ সমস্ত কিছুই অকার্যকর থেকে যায় Gint`

নিম্নলিখিত 24 বাইট সমাধানটি তখন বৈধ হয়ে উঠবে:

{:i.)+.n*{*i%.}%i>|,}:f;

এবং এটি অন্যান্য সত্যই কুরুচিপূর্ণ কাজের চারপাশের স্থির করে দেয়


পাইথন - 48 বাইট

f=lambda n:len(set(10**-~i%n for i in range(n)))

সর্বাধিক দক্ষ সমাধান নয়, তবে 100000 এর চেয়ে কম মানের জন্য যুক্তিসঙ্গত ।

এফডাব্লুআইডাব্লু, মূল উপাদানটি দশমিকের মধ্যে চক্রীয় সংখ্যা উত্পন্ন করার জন্য আমার সমাধানের মতো ।

একই কোডের আরও কার্যকর সংস্করণ ( 70 বাইট ):

 def f(n):
  a=[];i=10%n
  while i not in a:a+=i,;i=i*10%n
  return len(a)

99991 মানটি এক সেকেন্ডের চেয়ে কম সময় নেয়।


@ পিটারটেলর এটি orখালি স্ট্রিংয়ের উপরে অ্যারে s এটি একটি নির্ধারিত অপারেশন হওয়ায় সমস্ত নকল আগেই সরানো হয়েছে।
প্রিমো

কিন্তু খালি স্ট্রিংটি কোথা থেকে আসে? যদি ফাংশনটি স্বয়ংসম্পূর্ণ হয় তবে আমি মনে করি আপনাকে একটি অতিরিক্ত বাইট ব্যয় করতে হবে এবং এটি তৈরি করতে হবে .|
পিটার টেলর

1
@ পিটারটেলর ঠিক করা হয়েছে
প্রিমো

1
এর আচরণ পরিবর্তন string int +করা অনেক প্রোগ্রাম ভেঙে দেবে । আমি নিশ্চিত নই যে এই ধরণের জুটিতে অন্যান্য অপ্স কতবার ব্যবহৃত হয়।
পিটার টেলর

@ পিটারটেলর আমি সম্মত, এটি হবে would তবে বিবেচনা করুন: চার্ট ইন ইন রূপান্তর করুন: []+''+বনাম ''+। চর হিসাবে স্ট্রিংয়ের জন্য অন্তর্ভুক্ত করুন: []++বনাম +। স্ট্রিংয়ের উপস্থাপনা হিসাবে স্ট্রিংয়ের জন্য যোগ করুন: +বনাম `+। এটির বর্তমান প্রয়োগে, int''+এর সমার্থক int`, যা অ্যারে করতে বাধ্য করার ভারসাম্যকে বিবেচনা করে অপব্যয়ী বলে মনে হয় এবং আপনি যদি এসকি চরটি চান তবে একটি স্ট্রিংয়ের কাছে বাধ্য হন।
প্রিমো

3

গল্ফস্ক্রিপ্ট, 48 47 46

দুটি পিঠ ছাড়ে কাটার জন্য @ পিটারটেলরকে ধন্যবাদ জানাই।

{2{1$1$%!{.@\/\d}*}:d~;5d;9{2$%}{10*9+}/+,}:f;

আমি জে ব্যবহার করার চেষ্টা করেছি, তবে এটি আমাকে সব ধরণের অদ্ভুত ফলাফল দেয়।

অনলাইন পরীক্ষা

এটি মূলত সংখ্যার 2 এবং 5 কে বিভক্ত করে (2 এবং 5 হ'ল 10 এর প্রধান কারণ, এবং তাদের পারস্পরিক ক্রিয়াকলাপ শেষ হয়ে যায় এবং আলগোরিদিম স্টাফ করে), তারপরে সর্বনিম্ন সংখ্যার n যেমন ফলস্বরূপ সংখ্যাটি 10 ​​^ n ভাগ করে - 1 কাল.


3
যদি আপনি জানেন যে কোনটি আপনার ফাংশনে প্রথম কল হবে তবে আপনি সেখানে সংজ্ঞাটি ইনলাইন করতে পারেন। অর্থাৎ আপনি পরিবর্তে {...}:d;...d1 চর সংরক্ষণ করুন...{...}:d~
পিটার টেলর

@PeterTaylor ধন্যবাদ, যে ভাবেননি
উদ্বায়ীতামূলক

1
fস্ট্যাকটি না রাখার বিষয়ে বেনকে মন্তব্য করার পরে , আমি লক্ষ্য করেছি যে আপনি এটিও করছেন। ;অন্যান্য ভাষার সাথে ন্যায্য তুলনা করার জন্য আপনার ফাংশনটি পপ করতে সত্যই যুক্ত করা উচিত ।
পিটার টেলর

2
আরেকটি মাইক্রো-অপ্টিমাইজেশন: int array ,)\;সংক্ষিপ্ত করা যেতে পারে int array +,
পিটার টেলর

2

পার্ল, 52 অক্ষর

sub f{($p,%r)=1;1until$r{$p=$p*10%$_[0]}++;~~keys%r}

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

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


ইনপুটটিতে চেষ্টা করুন 20যেখানে এটি ভুল ফলাফল দেয়।
হাওয়ার্ড

2

Clojure, 102, 117, 115, 106

unformated:

(defn r([n](r{}(iterate #(mod(* % 10)n)10)0))([a[f & s]i](if(a f)(- i(a f))(recur(assoc a f i)s(inc i)))))

ফরম্যাট:

(defn r
  ([n] (r {} (iterate #(mod (* % 10) n) 10) 0))
  ([a [f & s] i]
    (if (a f)
      (- i (a f))
      (recur
        (assoc a f i)
        s
        (inc i)))))

পিরিয়ড সহ চলমান সময় স্কেল। নমুনার মানগুলির জন্য আমার কম্পিউটারে প্রায় তাত্ক্ষণিক।

মূলত, এটি দীর্ঘ বিভাগে প্রতিটি পদক্ষেপের পরে বিয়োগের ফলাফল গণনা করে। একটি চক্র সনাক্ত করা হয় যে কোনও বিন্দুতে যদি সংখ্যাটি তার আগে গণনা করা হয় একইরকম হয়।


কোডটি ইনপুট দিয়ে বিরতি দেয় 20। আপনি দয়া করে যাচাই করতে পারেন?
হাওয়ার্ড

আপনি ঠিক বলেছেন, উপরের সমাধানটি ত্রুটিযুক্ত। আমি এটি ঠিক করতে পারি কিনা তা দেখতে পাবে।
রেডডেকউইনস

20 জন্য প্রত্যাশিত আউটপুট কি?
রেডডেকউইনস

সঠিক উত্তরটি হবে 1
হাওয়ার্ড

যেতে ভাল হওয়া উচিত, প্রথম অ্যালগরিদম প্রচুর ইনপুটগুলিতে ব্যর্থ হবে, উদাহরণস্বরূপ 12 এবং 20
রেডডেকউইনস

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