স্কোয়ার নম্বর ডিজিট ডেনসিটি


17

আমার দ্বারা উদ্ভাবিত একটি সংখ্যার বর্গ সংখ্যা সংখ্যার ঘনত্ব (এসএনডিডি) হ'ল সংখ্যার দৈর্ঘ্যের সাথে পরপর অঙ্কগুলিতে পাওয়া বর্গ সংখ্যাগুলির গণনার অনুপাত। উদাহরণস্বরূপ, ১9৯ হ'ল ​​একটি 3-সংখ্যার সংখ্যা যার সাথে 4 বর্গ সংখ্যা রয়েছে - 1, 9, 16, 169 - এবং এইভাবে 4/3 বা 1.33 এর বর্গ সংখ্যা সংখ্যার ঘনত্ব রয়েছে। 4-সংখ্যার 1444 এর 6 স্কোয়ার রয়েছে - 1, 4, 4, 4, 144, 1444 - এবং এইভাবে 6/4 বা 1.5 এর অনুপাত। পূর্ববর্তী উদাহরণে লক্ষ্য করুন যে স্কোয়ারগুলি পুনরাবৃত্তি করার অনুমতি দেওয়া হয়। এছাড়াও, 441 এর অনুমতি নেই, কারণ এটি ক্রমাগত 1444 নম্বরের ভিতরে খুঁজে পাওয়া যায় না।

আপনার টাস্কটি এমন একটি লিখন লেখা যা সর্বাধিক বর্গ সংখ্যা সংখ্যার ঘনত্ব সহ সংখ্যার জন্য প্রদত্ত পরিসর A - B (সমেত) অনুসন্ধান করে। আপনার প্রোগ্রামটি নিম্নলিখিত স্পেসিফিকেশন মেনে চলতে হবে:

  • ইনপুট এ, বি 1 থেকে 1,000,000,000 (1 বিলিয়ন) এর মধ্যে নিন। উদাহরণ:sndd 50 1000
  • বৃহত্তম এসএনডিডি সহ ফলাফল হিসাবে ফিরে আসুন। টাই করার ক্ষেত্রে, ক্ষুদ্রতম সংখ্যাটি ফিরুন।
  • 0 কোনও রূপ, 0, 00, 000, ইত্যাদি হিসাবে বর্গ হিসাবে গণনা করে না Ne 0 দিয়ে শুরু হওয়া স্কোয়ারগুলিও হয় না, যেমন 049 বা 0049।
  • নোট করুন যে পুরো সংখ্যাটি একটি বর্গ সংখ্যা হতে হবে না।

উদাহরণ:

sndd 14000 15000
Output: 14441

sndd 300 500
Output: 441

বোনাস: 1 থেকে 1,000,000,000 এর মধ্যে বৃহত্তম এসএনডিডি সহ সংখ্যাটি কী? আপনি কি প্রমাণ করতে পারেন যে এটি সবচেয়ে বেশি সম্ভব কিনা, বা আরও উচ্চতর কোনও বৃহত্তর হতে পারে?

বর্তমান স্কোর:

  1. রুবি: 142
  2. উইন্ডোজ পাওয়ারশেল: 153
  3. স্কেলা: 222
  4. পাইথন: 245

এখন যেহেতু একটি উত্তর নির্বাচন করা হয়েছে, এখানে জাভাস্ক্রিপ্টে আমার (অবিকৃত) রেফারেন্স বাস্তবায়ন: http://jsfiddle.net/ywc25/2/

উত্তর:


3

রুবি 1.9, 142 টি অক্ষর

$><<($*[0]..$*[1]).map{|a|n=0.0;(1..s=a.size).map{|i|n+=a.chars.each_cons(i).count{|x|x[0]>?0&&(r=x.join.to_i**0.5)==r.to_i}};[-n/s,a]}.min[1]
  • (139 -> 143): টাই ক্ষেত্রে স্থির আউটপুট।

@ ভেন্তোরো: উভয় পরীক্ষার ক্ষেত্রে ব্যর্থ। আমি মনে করি আপনি 0 *
মেলামোকব

@mellamokb তাদের এখানে ব্যর্থ নেই: $ ruby1.9 sndd.rb 14000 15000 => 14441x[0]>?00 দিয়ে শুরু স্কোয়ারগুলির জন্য চেকগুলি
ভেন্টোরো

@ মেল্লামোকব: এটি পরীক্ষার ক্ষেত্রে এখানে পাস করে।
নবেব

@ ভেন্টোরো: হুম .. আমার রুবি পরীক্ষার পরিবেশের সাথে অবশ্যই কিছু ভুল হতে হবে। আমি রুবির সাথে পরিচিত নই। আমার মনে হয় আমার কাছে 1.87 রয়েছে এবং আমি উপরের কোডটি sndd.rb এ অনুলিপি / আটকানো করেছি, তারপরে ruby sndd.rb 14000 15000উইন্ডোজ থেকে চালাচ্ছি, আমি 14000 পেয়েছি
মেল্লামব্যাক

@ মেল্লামোকব: রুবি ১.৮-এ, ?0একটি ফিক্সনাম, যেখানে রুবি ১.৮ এ এটি একটি স্ট্রিং, তাই আমি যে তুলনাটি উল্লেখ করেছি তার অর্থ রুবি সংস্করণের উপর নির্ভর করে (আসলে এটি একটি ব্যতিক্রমকে ১.৮ এ ফেলে দেওয়া উচিত)। সে কারণেই আমি শিরোনামে স্পষ্টভাবে সংস্করণ 1.9 উল্লেখ করেছি।
ভেন্টোরো

8

বোনাসের উত্তর দেওয়া হচ্ছে: <1e9 সংখ্যাগুলির জন্য সেরা স্কোর হ'ল 5/3 = 1.666 ..., 144411449 (এবং অন্যরা হতে পারে?) দ্বারা উত্পন্ন হয়েছে।

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

n = 11449441 এর স্কোর 1.625 এবং এর প্রথম এবং শেষ সংখ্যা একই। এই সত্যটি ব্যবহার করে আমরা নিম্নলিখিত স্কোরগুলি পেয়েছি:

1.625 for 11449441
1.666 for 114494411449441
1.682 for 1144944114494411449441
1.690 for 11449441144944114494411449441
1.694 for 114494411449441144944114494411449441

যা সংখ্যার একটি সীমাহীন ক্রম দেয় যা পূর্ববর্তী সংখ্যার তুলনায় কঠোরভাবে (যদিও হ্রাসমান) ভাল এবং <1e9 সংখ্যার জন্য সেরা স্কোরের চেয়ে প্রথম 2 এর চেয়ে ভাল।

যদিও এই ক্রমটি সামগ্রিকভাবে সেরা নাও হতে পারে। এটি একটি সীমাবদ্ধ স্কোর (12/7 = 1.714) এ রূপান্তর করে এবং সীমাটির চেয়ে আরও ভাল স্কোর সহ অন্যান্য নম্বর থাকতে পারে।

সম্পাদনা করুন : আরও ভাল ক্রম, 1.75 এ রূপান্তর করে

1.600 14441
1.667 144414441
1.692 1444144414441
1.706 14441444144414441
1.714 144414441444144414441

মজাদার! আপনি সম্ভবত প্রমাণ করেছেন যে এই ক্রমটি আসলে অসীম।
সুলতানিক

@ ইছুলতানিক: আসলেই নয়, কারণ সামগ্রিক সংখ্যাটি নিখুঁত বর্গক্ষেত্র হওয়ার কোনও প্রয়োজন নেই।
মেল্লামোকব

@ এসুতানিক: আমি মনে করি না যে ক্রমটি সম্পর্কিত, কারণ তারা পুরো সংখ্যাটি একটি বর্গ হিসাবে প্রয়োজন - আমার ক্রম অনুসারে কেবলমাত্র স্কোয়ারগুলি ছোট ছোট উপকেন্দ্র (<= 5 ডিজিট) হয়, যদি না দুর্ঘটনাক্রমে আরও বড় একটি থাকে is
কিথ র্যান্ডাল

আপনি এমন একটি সীমাহীন ক্রমও তৈরি করতে পারেন যেখানে লিঙ্কটি একটি অতিরিক্ত বর্গ তৈরি করে, অর্থাত্ 44 এ শেষ হওয়া এবং 1 দিয়ে শুরু হওয়া প্রতিটি সংমিশ্রণে 441 তৈরি করবে। একটি তুচ্ছ উদাহরণ হ'ল সিক্যুয়েন্স 144, 144144, 144144144, ইত্যাদি
মেল্লামোকব

@ মেল্লামোকব বাহ, আমি পুরোপুরি মিস করেছি যে সংখ্যাটি একটি নিখুঁত বর্গক্ষেত্র হতে হবে না। তুমি ঠিক বলছো.
সুলতানিক

3

উইন্ডোজ পাওয়ারশেল, 153 154 155 164 174

$a,$b=$args
@($a..$b|sort{-(0..($l=($s="$_").length)|%{($c=$_)..$l|%{-join$s[$c..$_]}}|?{$_[0]-48-and($x=[math]::sqrt($_))-eq[int]$x}).Count/$l},{$_})[0]

ওন্টোরোর ধন্যবাদ ওয়ান-বাইট হ্রাস করার জন্য আমি নিজেকে খুঁজে পেতে খুব বোকা ছিলাম।

154-বাইট সংস্করণ ব্যাখ্যা করা হয়েছে:

$a,$b=$args   # get the two numbers. We expect only two arguments, so that
              # assignment will neither assign $null nor an array to $b.

@(   # @() here since we might iterate over a single number as well
    $a..$b |  # iterate over the range
        sort {   # sort
            (   # figure out all substrings of the number
                0..($l=($s="$_").length) | %{  # iterate to the length of the
                                               # string – this will run off
                                               # end, but that doesn't matter

                    ($c=$_)..$l | %{       # iterate from the current position
                                           # to the end

                        -join$s[$c..$_]    # grab a range of characters and
                                           # make them into a string again
                    }
                } | ?{                     # filter the list
                    $_[0]-48 -and          # must not begin with 0
                    ($x=[math]::sqrt($_))-eq[int]$x  # and the square root
                                                     # must be an integer
                }

            ).Count `  # we're only interested in the count of square numbers
            / $l       # divided by the length of the number
        },
        {-$_}  # tie-breaker
)[-1]  # select the last element which is the smallest number with the
       # largest SNDD

2

পাইথন, 245 256

import sys
def t(n,l):return sum(map(lambda x:int(x**0.5+0.5)**2==x,[int(n[i:j+1])for i in range(l)for j in range(i,l)if n[i]!='0']))/float(l)
print max(map(lambda x:(x,t(str(x),len(str(x)))),range(*map(int,sys.argv[1:]))),key=lambda y:y[1])[0]
  • 256 → 245: কীথ র্যান্ডাল থেকে একটি পরামর্শের জন্য যুক্তি পার্সিং কোডটি ধন্যবাদ পরিষ্কার করেছে ।

stdinকমান্ড লাইন আর্গুমেন্টের বিপরীতে যদি পরিসীমাটি পড়ে নেওয়া হয় তবে এটি অনেক ছোট হতে পারে ।

সম্পাদনা:

বোনাস সম্পর্কে শ্রদ্ধার সাথে, আমার পরীক্ষাগুলি নিম্নলিখিত পরামর্শ দেয়:

অনুমান 1প্রত্যেক এন জন্য ∈ ℕ , নম্বরএন বৃহত্তম SNDD সঙ্গে একমাত্র সংখ্যা 1, 4, এবং 9 থাকা আবশ্যক।

অনুমান 2.n ∈ ℕ ∀ i ∈ ℕ n : এসএনডিডি ( এন ) ≥ এসএনডিডি ( আমি ) )।

প্রুফ স্কেচ । 1, 4, এবং 9 অঙ্ক সহ স্কোয়ারগুলির সেট সম্ভবত সীমাবদ্ধ । ∎


চেষ্টা করুনrange(*map(int,sys.argv[1:]))
কিথ র্যান্ডাল

1
অনুমান 2 টি মিথ্যা যদি আমার উত্তরে 1.75-কনভারজেন্ট সিকোয়েন্সটি সেরা স্কোরগুলি (একটি বড় যদি, স্বীকারোক্তিভাবে) উত্পন্ন করে, কারণ ক্রমের পরবর্তী উপাদানগুলি চিরতরে ভাল থাকে better
কীথ র্যান্ডাল

অনুমান 2 টি @ আর্টের উত্তর দ্বারা মিথ্যা, কারণ এসএনডিডি এর মানটি নির্বিচারে বড় করা যায়।
মেল্লামোকব

2

স্কালা, 222

object O extends App{def q(i: Int)={val x=math.sqrt(i).toInt;x*x==i}
println((args(0).toInt to args(1).toInt).maxBy(n=>{val s=n+""
s.tails.flatMap(_.inits).filter(x=>x.size>0&&x(0)!='0'&&q(x.toInt)).size.toFloat/s.size}))}

(স্কেলা ২.৯ প্রয়োজনীয়))


1

বোনাস প্রশ্ন বিবেচনা করে: পরিসরের বাইরে সর্বোচ্চ সম্ভাব্য এসএনডিডি অসীম।

কমপক্ষে, আমি যদি প্রশ্নটি সঠিকভাবে পড়ে থাকি তবে 100 (10 * 10) এর মতো একটি বর্গ গণনা করে।

আপনি যদি 275625 সংখ্যাটি বিবেচনা করেন তবে স্কোর 5/6, যেহেতু 25, 625, 5625, 75625 এবং 275625 সমস্ত বর্গক্ষেত্র।

2 শূন্যের যোগ দেয়: 27562500, যার স্কোর 10/8। এই অনুক্রমের সীমা 5/2 = 2.5

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

স্বীকার করা, এটি খুব সুন্দর সমাধান নয়, তবে এটি প্রমাণ করে যে এসএনডিডির কোনও উচ্চতর সীমা নেই।


"'একই রেখার পাশাপাশি আপনি এমন স্কোয়ারগুলি খুঁজে পেতে পারেন যা যে কোনও সংখ্যক ছোট স্কোয়ারের শেষ হয় I আমি এটি প্রমাণ করতে পারি, তবে আপনি সম্ভবত ধারণাটি পেয়ে যান।" আমি এই প্রমাণ বিকাশ দেখতে চাই। আমি 25 এ শেষ হওয়া বৃহত্তম সিকোয়েন্সটি দেখতে পাচ্ছি যেখানে 25 এ শেষ হওয়া প্রতিটি সংখ্যা একটি বর্গক্ষেত্র 275625 There সেখানে অন্য কোনও স্কোয়ার সন্ধানের জন্য আপনি শুরুতে রাখতে পারবেন এমন কোনও অঙ্ক 1-9 নেই। আপনি কি বলছেন এটি যথেচ্ছভাবে বড় করা যেতে পারে, এবং যদি তা হয় তবে কিভাবে এবং কেন?
মেল্লামবক

হ্যাঁ, ক্রমটি নির্বিচারে বড় করা যেতে পারে। প্রমাণটি হ'ল: যদি * a = b আপনার শুরুর সংখ্যা হয়, তবে (a + 10 ^ c) * (a + 10 ^ c) বিতেও সি শেষ হবে যদি যথেষ্ট পরিমাণে বড় হয়। অনুশীলনে কম সংখ্যক সংখ্যা থাকতে পারে যা আপনি বর্গক্ষেত্র গ্রহণ করলে খ। উদাহরণস্বরূপ, 18275625 একটি বর্গ (4275 * 4275)।
আর্ট Veenstra

স্কোয়ারগুলি সন্ধানের
মেল্লামোকব

@ আর্ট: এখানে এমন (তুচ্ছ) অনুক্রম, 5 ^ 2 (1/2), 55 ^ 2 (2/4), 5055 ^ 2 (3/8), 50005055 ^ 2 (4/16), ইত্যাদি is যেখানে প্রতিটি সংযোজন 5 * 10 ^ n, যেখানে এন পূর্ববর্তী এন্ট্রি থেকে দ্বিগুণ। প্রতিটি এন্ট্রি স্কোরের চেয়ে ছোট বৃদ্ধি পায় তবে যোগ দুটি প্রয়োগ করার সময় সীমাটি প্রান্তিক আকারে বড় হয়, সুতরাং সীমাগুলি (1/2), (2/2), (3/2), (4/2) ইত্যাদি ।
মেল্লামোকব

হ্যাঁ, এটিই ধারণা যা এসএনডিডি-র জন্য কোনও মান পৌঁছাতে পারে s
আর্ট ভেনস্ট্র্রা

1

Clojure - 185 অক্ষর

সম্ভবত আরও অনুকূলিত করা যেতে পারে তবে এখানে যায়:

(fn[A,B]((first(sort(for[r[range]n(r A(inc B))s[(str n)]l[(count s)]][(/(count(filter #(=(int%)(max 1%))(for[b(r(inc l))a(r b)](Math/sqrt(Integer/parseInt(subs s a b))))))(- l))n])))1))

দুটি পরামিতি সহ একটি ফাংশন হিসাবে ব্যবহৃত:

(crazy-function-as-above 14000 15000)
=> 14441

1

জেলি , 21 বাইট, ভাষা পোস্টডেটস চ্যালেঞ্জ

DµẆ1ị$ÐfḌƲS÷L
rµÇÐṀḢ

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

ব্যাখ্যা

সহায়ক ফাংশন (এর ইনপুটটির অঙ্কের ঘনত্ব গণনা করে):

DµẆ1ị$ÐfḌƲS÷L
Dµ              Default argument: the input's decimal representation
  Ẇ             All substrings of {the decimal representation}
      Ðf        Keep only those where
   1ị$          the first digit is truthy (i.e. not 0)
        Ḍ       Convert from decimal back to an integer
         Ʋ     Check each of those integers to see if it's square
           S    Sum (i.e. add 1 for each square, 0 for each nonsquare)
            ÷L  Divide by the length of {the decimal representation}

মূল প্রোগ্রাম:

rµÇÐṀḢ
rµ              Range from the first input to the second input
  ÇÐṀ           Find values that maximize the helper function
     Ḣ          Choose the first (i.e. smallest)

প্রোগ্রামটি যুক্তিযুক্তভাবে আরও আকর্ষণীয় - এইভাবে, এটি কেবলমাত্র একের চেয়ে সমস্ত সর্বাধিক ঘনত্বের নম্বর দেয় - তবে আমি স্পেসিফিকেশনটি মেনে চলার জন্য এটি যুক্ত করেছিলাম।

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