পূর্ণসংখ্যার পূর্ণ বর্গমূল [বন্ধ]


12

সমস্যা:

আপনার পছন্দের ভাষাতে, স্বল্পতম ফাংশনটি লিখুন যা স্বাক্ষরবিহীন 64৪-বিট পূর্ণসংখ্যার বর্গমূলের মেঝে দেয়।

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

আপনার ফাংশনটি অবশ্যই সমস্ত ইনপুটগুলির জন্য সঠিকভাবে কাজ করবে, তবে এখানে কয়েকটি দেওয়া হয়েছে যা ধারণাটি চিত্রিত করতে সহায়তা করে:

               INPUT ⟶ OUTPUT

                   0 ⟶  0
                   1 ⟶  1
                   2 ⟶  1
                   3 ⟶  1
                   4 ⟶  2
                   8 ⟶  2
                   9 ⟶  3
                  15 ⟶  3
                  16 ⟶  4
               65535 ⟶ 255
               65536 ⟶ 256
18446744073709551615 ⟶ 4294967295

নিয়মাবলী:

  1. আপনি নিজের ফাংশনটির নাম পছন্দ করতে পারেন। (বেনামে, বেনামে বা ল্যাম্বডা ফাংশনগুলি যতক্ষণ না কোনওরকম কলযোগ্য হয় ততক্ষণ ঠিক are)
  2. এই চ্যালেঞ্জের মধ্যে চরিত্রের গণনা সবচেয়ে বেশি গুরুত্বপূর্ণ, তবে রানটাইমও গুরুত্বপূর্ণ। আমি নিশ্চিত যে আপনি খুব ছোট চরিত্রের গণনা দিয়ে ও ()n) সময়ের উত্তরের জন্য পুনরাবৃত্তভাবে স্ক্যান করতে পারবেন তবে ও (লগ (এন)) সময়টি সত্যই আরও ভাল হবে (এটি হ'ল এন এর ইনপুট মান ধরে নিলে, একটি বিট দৈর্ঘ্য নয়)।
  3. আপনি সম্ভবত বিশুদ্ধরূপে পূর্ণসংখ্যা এবং / অথবা বুলিয়ান শিল্পকর্ম ব্যবহার করে ফাংশনটি বাস্তবায়ন করতে চাইবেন। তবে, আপনি যদি সত্যিই ভাসমান-পয়েন্ট গণনাগুলি ব্যবহার করতে চান, তবে এতক্ষণ ঠিক আছে যতক্ষণ আপনি কোনও লাইব্রেরি ফাংশন কল করবেন না। সুতরাং, কেবল return (n>0)?(uint32_t)sqrtl(n):-1;সি তে বলা সীমা ছাড়িয়ে গেছে যদিও এটি সঠিক ফলাফল দেয়। আপনি ফ্লোটিং পয়েন্ট গাণিতিক ব্যবহার করছেন, আপনি ব্যবহার করতে পারেন তাহলে *, /, +, -, এবং exponentiation (যেমন, **অথবা ^যদি এটি একটি বিল্ট-ইন আপনার পছন্দের ভাষায় অপারেটর, কিন্তু এর শুধুমাত্র ক্ষমতা exponentiation 1 বেশী না কম )। এই সীমাবদ্ধতা হ'ল কল sqrt()বা বৈকল্পের মাধ্যমে "প্রতারণা" রোধ করা বা ½ পাওয়ারকে মান বাড়ানো।
  4. আপনি যদি ভাসমান-পয়েন্ট অপারেশনগুলি ব্যবহার করেন (দেখুন # 3), আপনার রিটার্ন টাইপটি পূর্ণসংখ্যার হতে হবে না; কেবলমাত্র যে প্রত্যাবর্তন মানটি একটি পূর্ণসংখ্যা, যেমন ফ্লোর (স্কয়ার্ট (এন)) এবং কোনও স্বাক্ষরবিহীন 32-বিট মান রাখতে সক্ষম হবে।
  5. আপনি যদি সি / সি ++ ব্যবহার করেন তবে আপনি স্বাক্ষরবিহীন 64৪-বিট এবং ৩২-বিট পূর্ণসংখ্যার ধরণের উদাহরণস্বরূপ uint64_tএবং এর uint32_tমধ্যে সংজ্ঞায়িত হিসাবে ধরে নিতে পারেন stdint.h। অন্যথায়, কেবল নিশ্চিত করুন যে আপনার পূর্ণসংখ্যার ধরণটি কোনও 64-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যাকে ধারণ করতে সক্ষম।
  6. যদি আপনার ল্যাঙ্গেজ 64৪-বিট পূর্ণসংখ্যার সমর্থন না করে (উদাহরণস্বরূপ, ব্রেনফাকে দৃশ্যত কেবলমাত্র 8-বিট পূর্ণসংখ্যার সমর্থন রয়েছে), তবে সেই সাথে যথাসাধ্য চেষ্টা করুন এবং আপনার উত্তর শিরোনামের সীমাবদ্ধতাটি বর্ণনা করুন। এটি বলে, যদি আপনি কীভাবে a৪-বিট পূর্ণসংখ্যাকে এনকোড করতে পারেন এবং 8-বিট আদিম গাণিতিক ব্যবহার করে এর বর্গমূল সঠিকভাবে পেতে পারেন তবে আপনার আরও শক্তি!
  7. মজা করুন এবং সৃজনশীল হন!

7
"তবে ও (লগ (এন)) সময়টি আসলেই ভাল।" - কত ভাল? বোনাস আছে? এটা কি কঠিন প্রয়োজন? এটি কি মূলত আলাদা চ্যালেঞ্জ? এটি কি কেবল একটি দুর্দান্ত ধারণা যা সত্যই স্কোরিংকে প্রভাবিত করে না?
জন ডিভোরাক

3
সাধারণত অ্যালগোরিদমিক জটিলতা আনতে ইনপুট মানের চেয়ে ইনপুটটির আকারটি ব্যবহার করা হয় । সেই অর্থে ইনক্রিমেন্ট-এবং-পুনরায় চেষ্টা করা অ্যালগরিদম গতিতে ক্ষতিকারক।
জন ডিভোরাক

3
উম্মে ... O(log_2 n) === O(log_4 n)log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2
জন ডিভোরাক

1
2/4 গণনা করে?
মাইলো

1
বেশিরভাগ ভাসমান-পয়েন্টের ডেটা টাইপগুলিতে যাইহোক এই কাজের জন্য প্রয়োজনীয় নির্ভুলতা নেই। পুরো ইনপুট ব্যাপ্তির জন্য 53 টি উল্লেখযোগ্য বিট যথেষ্ট নয়।
ব্যবহারকারী 2357112

উত্তর:


14

সিজোম, 17 (বা 10) বাইট

{_1.5#\/i}

পরীক্ষার কেসগুলি যাচাই করে অনলাইনে চেষ্টা করে দেখুন :

[0 1 2 3 4 8 9 15 16 65535 65536 18446744073709551615]{_1.5#\/i}%N*

রাউন্ডিং ইস্যুগুলির কারণে এটি শেষ পরীক্ষার কেসটি পাস করবে না, তবে যেহেতু সিজেমে 18446744073709551615কোনও পূর্ণসংখ্যা নয় (এটি একটি বড় পূর্ণসংখ্যা ), আমরা এখনও ভাল, তাই না?

যদি তা না হয় তবে নিম্নলিখিত (এবং কিছুটা দীর্ঘ) কোডটি ত্রুটিগুলি সংশোধন করবে:

{__1.5#\/i_2#@>-}

আর সংক্ষিপ্ত সমাধানটি নয়, তবে ফায়স্ট

কিভাবে এটা কাজ করে

__    " Duplicate the integer twice. ";
1.5#  " Raise to power 1.5. Note that, since 1.5 > 1, this doesn't break the rules. ";
\     " Swap the result with the original integer. ";
/     " Divide. ";
i     " Cast to integer. ";
_2#   " Push square of a copy. ";
@     " Rotate the orginal integer on top of the stack. ";
>-    " If the square root has been rounded up, subtract 1. ";

Hahaha! ওফ, ঠিক আছে, আপনি আমাকে একটি প্রযুক্তিতে পেয়েছেন। আমার কোনও ভগ্নাংশের শক্তি বলা উচিত ছিল না। তবে আপনার কোডটি প্রকৃতপক্ষে বর্ণিত বিধিগুলি মান্য করে, তাই আমি এটিকে সমর্থন করছি। :)
টড লেহম্যান

2
পুরো ইনপুট পরিসীমাটি কভার করার জন্য সিজেমে কি স্বেচ্ছাসেবী-নির্ভুলতা দশমিক রয়েছে?
isaacg

এছাড়াও, ক্যান টু ইন ইন -> 0 ব্যবহার করে দুর্দান্ত হ্যাক।
isaacg

ঝরঝরে ধারণা, এটি সঠিক একই অক্ষর সংখ্যা মধ্যে J মধ্যে প্রতিনিধিত্ব করা যেতে পারে: <.@%~^&1.5। আমি কি এটি আলাদা উত্তর হিসাবে পোস্ট করতে পারি (যেহেতু এটি মূলত আপনার একটি সঠিক বন্দর)?
Sepuʎs

@ :উস: এগিয়ে যান। তবে আমি ঠিক বুঝতে পেরেছি যে আমার সমাধানটি শেষ পরীক্ষার কেস সহ বড় সংখ্যার জন্য ভুলভাবে গোল হতে পারে। আমার আত্মপক্ষ সমর্থন করে, এটা আমার পরিদর্শন গৃহীত শুধুমাত্র কারণ 4294967295এবং 4294967296বর্ণন খুব অনুরূপ ...
ডেনিস

10

হাস্কেল, 28 26

আমি বিশ্বাস করি যে এটি কোনও ভাষারই সংক্ষিপ্ত এন্ট্রি যা গল্ফিংয়ের জন্য ডিজাইন করা হয়নি।

s a=[x-1|x<-[0..],x*x>a]!!0

এটি sপ্যারামিটার সহ একটি ফাংশনটির নাম দেয় aএবং যার বর্গের চেয়ে বেশি তার প্রথম সংখ্যাকে বিয়োগ করে দেয় a। অবিশ্বাস্যভাবে ধীরে ধীরে চালিত হয় (O (sqrt n), সম্ভবত?)।


1
একটি তালিকা সূচক ( [...]!!0) কি মাথা থেকে খাটো হবে না?
isaacg

হ্যাঁ, এটি হবে ধন্যবাদ :-)
জামাক

7

গল্ফস্ক্রিপ্ট, 17 টি অক্ষর

{).,{.*1$<},,\;(}

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

এই জঘন্যতা ইনপুট মান হিসাবে লগারিটমিক সময় না, O (sqrt এন) সময় নয়, ফলাফল উত্পাদন করতে একটি দীর্ঘস্থায়ী লিনিয়ার পরিমাণ সময় লাগে। এটি অনেক বেশি জায়গা নেয়। একেবারে ভয়াবহ। তবে ... এটি কোড-গল্ফ।

অ্যালগরিদমটি হ'ল:

n => [0..n].filter(x => x*x < n+1).length - 1

আমি এটা ভালোবাসি!! চমৎকার কাজ! এটি সুন্দরভাবে বিকৃত।
টড লেহম্যান

7

পাইথ , 14 টি অক্ষর

DsbR;fgb*TTL'b

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

Dsb       def s(b):
R;        return last element of
f         filter(lambda T:
gb*TT                     b>=T*T,
L'b                       range(b+1))

ব্যবহারের উদাহরণ:

python3 pyth.py <<< "DsbR;fgb*TTL'b       \msd[0 1 2 3 4 8 9 15 16 65535 65536"
[0, 1, 1, 1, 2, 2, 3, 3, 4, 255, 256]

7

রেটিনা (প্রতিযোগী নয় - চ্যালেঞ্জের চেয়ে ভাষা আরও নতুন), 43

এই উত্তরে কাজ করার সময় , আমার কাছে এমনটি ঘটেছিল যে রেটিনা ব্যবহার করে পূর্ণসংখ্যার বর্গাকার শিকড় গণনা করার জন্য অনুরূপ পদ্ধতি ব্যবহার করা যেতে পারে:

.+
$*
^
1:
+`(1+):(11\1)
1 $2:
1+:$|:1+

1+

এটি নির্ভর করে যে নিখুঁত স্কোয়ারগুলি হিসাবে প্রকাশ করা যেতে পারে 1+3+5+7+..., এবং তাত্পর্যপূর্ণ যে এই অভিব্যক্তিতে পদগুলির সংখ্যা বর্গমূল root

এটি অনলাইনে চেষ্টা করুন। (একাধিক টেস্টকেসগুলি চালনার অনুমতি দেওয়ার জন্য প্রথম লাইন যুক্ত হয়েছে)

স্পষ্টতই দশমিকের দশমিকের তুলনায় অনাকাঙ্ক্ষিত রূপান্তরের কারণে, এটি কেবল অপেক্ষাকৃত ছোট ইনপুটগুলির জন্যই কাজ করবে।


4
(চ্যালেঞ্জের চেয়ে ভাষা নতুন)
এমবিম্ব ২০০7

@ mbomb007 যথেষ্ট মেলা - শিরোনাম সম্পাদিত। এই উত্তরটি অবশ্যই "কারণ এটি করা যেতে পারে" বিভাগে রয়েছে এবং এটি কোনও অর্থবহ উপায়ে চ্যালেঞ্জের প্রতিদ্বন্দ্বিতা করার উদ্দেশ্যে নয়।
ডিজিটাল ট্রমা


6

পার্ল, 133 টি অক্ষর

এখন পর্যন্ত সংক্ষিপ্ততম নয়, তবে কোনও আকারের ইনপুট পরিচালনা করতে একটি ডিজিট বাই বাই ডিজিট অ্যালগরিদম ব্যবহার করে এবং ও (লগ এন) সময়ে চলে। সংখ্যার-হিসাবে-স্ট্রিং এবং সংখ্যা-হিসাবে-সংখ্যার মধ্যে অবাধে রূপান্তর করে। যেহেতু বৃহত্তম সম্ভাব্য পণ্যটি হ'ল একক অঙ্কের বর্গক্ষেত্রের মূল, তাই এটি একটি 64৪-বিট সিস্টেমে ১২০-বিট বা এতগুলি সংখ্যার বর্গমূল নিতে সক্ষম হবে।

sub{($_)=@_;$_="0$_"if(length)%2;$a=$r="";while(/(..)/g){
$a.=$1;$y=$d=0;$a<($z=$_*(20*$r+$_))or$y=$z,$d=$_ for 1..9;$r.=$d;$a-=$y}$r}

সঙ্কুচিত, এটি হল:

sub {
  my ($n) = @_;
  $n = "0$n" if length($n) % 2; # Make an even number of digits
  my ($carry, $root);
  while ($n =~ /(..)/g) { # Take digits of $n two at a time
    $carry .= $1;         # Add them to the carry
    my ($product, $digit) = (0, 0);
    # Find the largest next digit that won't overflow, using the formula
    # (10x+y)^2 = 100x^2 + 20xy + y^2 or
    # (10x+y)^2 = 100x^2 + y(20x + y)
    for my $trial_digit (1..9) {
      my $trial_product = $trial_digit * (20 * $root + $trial_digit);
      if ($trial_product <= $carry) {
        ($product, $digit) = ($trial_product, $trial_digit);
      } 
    } 
    $root .= $digit;
    $carry -= $product;
  } 
  return $root;
}

নিস! আমি ভাবছিলাম কখন কেউ পার্ল উত্তর পোস্ট করবে। বিটিডব্লিউ, এটি কি if length%2পরিবর্তে বলার কাজ করে if(length)%2? এটি 1 অক্ষর শেভ করবে। এছাড়াও, এটি $y=$z,$d=$_ ifপরিবর্তে বলার জন্য কাজ করবে ($y,$d)=($z,$_)if? আমি মনে করি এটি আরও 3 টি চরিত্রের শেভ করবে।
টড লেহম্যান

এবং এটি কিছুটা বিকৃত হচ্ছে, তবে আমি মনে করি আপনি forলুপটি পুনরায় লিখে আরও 1 টি শেভ করতে পারেন :$a<($z=$_*(20*$r+$_))or$y=$z,$d=$_ for(1..9);
টড লেহম্যান

প্রথম পরামর্শটি কার্যকর হয় না (এটি একটি হ্যাশ নামের দৈর্ঘ্য নেওয়ার চেষ্টা করে %2), তবে অন্যটি বৈধ। আমি
এগুলিতে

1
@ টডলেহম্যান পোস্টফিক্সের প্রথম forবন্ধনী প্রয়োজন নেই; আপনার পরামর্শগুলিতে এটিকে যুক্ত করে মোট 6 টি অক্ষর জাল করে। ধন্যবাদ!
हॉবস

5

মতলব (56) / অক্টাভা (55)

এটি একটি নির্দিষ্ট পয়েন্ট পদ্ধতি ব্যবহার করে বর্গমূলের কাজ করে। এটি সর্বাধিক ৩ conver টি ধাপে রূপান্তরিত করে (2 argument 64-1 টি যুক্তি হিসাবে) এবং তারপরে এটি 'সম্ভাব্য' পূর্ণসংখ্যার শিকড়গুলির নীচের এক কিনা তা পরীক্ষা করে। যেহেতু এটি সর্বদা 36 টি পুনরাবৃত্তি ব্যবহার করে এটিতে ও (1) = পি এর একটি রানটাইম রয়েছে

যুক্তিটি uint64 হিসাবে ধরে নেওয়া হয়।

মতলব:

function x=q(s)
x=1
for i = 1:36
    x = (x+s/x)/2
end
if x*x>s
    x=x-1
end

অষ্টক:

function x=q(s)
x=1
for i = 1:36
    x = (x+s/x)/2
end
if x*x>s
    x-=1
end

এটি আমার কাছে একটি নতুন পদ্ধতি এবং এটি খুব দুর্দান্ত হতে পারে। +1 টি
seequ

1
এটি মূলত en.wikedia.org/wiki/… যা প্রাচীনতম সংখ্যাগত পদ্ধতিগুলির মধ্যে একটি যা প্রায় 3700 বছরের পুরানো বলে অনুমান করা হয়। এটা তোলে দ্বারা সমর্থনযোগ্য হতে পারে en.wikipedia.org/wiki/Banach_fixed-point_theorem যা আশ্চর্যজনক সহজ প্রমাণ আছে, এটা সত্যিই চমৎকার = থাকবে)
flawr

5

রুবি - 36 টি অক্ষর

s=->n{g=n;g=(g+n/g)/2 while g*g>n;g}

সুন্দরভাবে সম্পন্ন! সবচেয়ে খারাপ মামলার কার্যকর সময়টি কী?
টড লেহম্যান

G * g <n এবং উত্তরটি এখনও পছন্দসই মানের কাছাকাছি নয় এমন ঘটনা সম্পর্কে কী বলা যায়? স্ক্রিপ্ট কি শুধু থামবে না?
ওয়েলওয়েস্ট

1
@ টাডলিহম্যান আমি সত্যই জানি না। : - / এটি ব্যাবিলনীয় পদ্ধতি । এখানে গড় জটিলতার একটি ভাল প্রমাণ বলে মনে হয় । সংখ্যার প্রাথমিক অনুমানটি নিজেই খুব খারাপ, তবে আমার সবচেয়ে খারাপ পরিস্থিতি বুঝতে পেরে বসে বসে সত্যই প্রমাণটি সংগ্রহ করা দরকার। আমার আরও কিছু ফ্রি সময় পেলে এটিকে যাবেন। :-)
ওআই

@ ওয়াল্যুয়েস্ট আমার উপলব্ধি হ'ল whileজি ফ্লোরে (√n) রূপান্তরিত হলে লুপটি অবিকল বন্ধ হয় যা পছন্দসই মান। আপনি কি এমন কোনও মামলা দেখতে পাচ্ছেন যেখানে এটি সত্য হবে না?
ওআই

4

পাইথন (39)

f=lambda n,k=0:k*k>n and k-1or f(n,k+1)

প্রাকৃতিক পুনরাবৃত্তি পদ্ধতির। সম্ভাব্য স্কোয়ার শিকড়গুলি উচ্চ বর্ধিত না হওয়া অবধি গণনা করুন, তারপরে 1 টি নীচে নেমে যাবে আপনি যদি স্ট্যাকের গভীরতা অতিক্রম করার বিষয়ে উদ্বিগ্ন হন তবে স্ট্যাকলেস পাইথন ব্যবহার করুন ।

and/orবাগ্ধারা যেমন তিন অপারেটর সমতূল্য

f=lambda n,k=0:k-1 if k*k>n else f(n,k+1)

সম্পাদনা: আমি এর পরিবর্তে পেতে পারেন 25 অক্ষর নিয়ম "আপনি ব্যবহার করতে পারেন শোষণ দ্বারা *, /, +, -, এবং exponentiation (যেমন, **অথবা ^যদি এটি একটি বিল্ট-ইন আপনার পছন্দের ভাষায় অপারেটর, কিন্তু শুধুমাত্র ক্ষমতা exponentiation 1 বেশী না কম)। " (সম্পাদনা করুন: স্পষ্টতই ডেনিস ইতিমধ্যে এই কৌশলটি খুঁজে পেয়েছে এবং ব্যবহার করেছে))

lambda n:n**1.5//max(n,1)

আমি //পাইথন 3 এর পূর্ণসংখ্যা বিভাগ অপারেটরটি রাউন্ড ডাউন করতে ব্যবহার করি । দুর্ভাগ্যক্রমে, আমি n=0কে 0 টি ত্রুটি দ্বারা বিভাগ না দেওয়ার জন্য অক্ষর প্রচুর ব্যয় করি । যদি এটি না হয় তবে আমি 18 টি চর করতে পারি

lambda n:n**1.5//n 

বিধিগুলিও এই ফাংশনটির নামকরণ করতে পারে নি (আপনি কীভাবে "আপনার ফাংশনটির নাম নিজের পছন্দ মতো করতে পারেন" তার উপর নির্ভর করে) তবে এটি যদি হয় তবে এটি আরও দুটি চরিত্র।


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

4

C99 (58 টি অক্ষর)

এটি উত্তরের একটি উদাহরণ যা আমি উত্তম হিসাবে বিবেচনা করব না, যদিও কোড গল্ফ দৃষ্টিকোণ থেকে এটি আমার কাছে আকর্ষণীয় কারণ এটি এতটা বিকৃত, এবং আমি কেবল ভেবেছিলাম মিশ্রণটি ফেলে দেওয়া মজাদার হবে:

আসল: 64 টি অক্ষর

uint64_t r(uint64_t n){uint64_t r=1;for(;n/r/r;r++);return r-1;}

এইটি যেটি ভয়ানক তা হ'ল এটি ও (লগ (এন)) সময়ের চেয়ে ও ()n) সময়ে চলে। (যেখানে এন ইনপুট মান)

সম্পাদনা করুন: 63 টি অক্ষর

এতে পরিবর্তন r-1করা --rএবং এটিকে বন্ধ করা return:

uint64_t r(uint64_t n){uint64_t r=1;for(;n/r/r;r++);return--r;}

সম্পাদনা করুন: 62 টি অক্ষর

লুপের শর্তসাপেক্ষ অংশের অভ্যন্তরে লুপ বর্ধন সরিয়ে নেওয়া (দ্রষ্টব্য: এটির প্রকৃত আচরণ রয়েছে কারণ প্রিনক্রেনমেন্ট অপারেটরের সাথে সম্পর্কিত ক্রিয়াকলাপটি সংকলক-নির্দিষ্ট):

uint64_t r(uint64_t n){uint64_t r=0;for(;n/++r/r;);return--r;}

সম্পাদনা করুন: 60 টি অক্ষর

typedefআড়াল uint64_tকরার জন্য একটি যুক্ত করা ( এই পরামর্শের জন্য ব্যবহারকারী টেকনোসরাসকে ক্রেডিট )।

typedef uint64_t Z;Z r(Z n){Z r=0;for(;n/++r/r;);return--r;}

সম্পাদনা করুন: 58 টি অক্ষর

এখন দ্বিতীয় প্যারামিটারটি 0 টি হিসাবে ফাংশনটির অনুরোধে পাস করা প্রয়োজন, যেমন r(n,0): ঠিক পরিবর্তে r(n)। ঠিক আছে, আমার জীবনের জন্য, এই মুহুর্তে আমি দেখতে পাচ্ছি না কীভাবে এটি আরও সংক্ষেপিত করা যায় ... কেউ?

typedef uint64_t Z;Z r(Z n,Z r){for(;n/++r/r;);return--r;}

আপনি বৃদ্ধি বদলে এটা সি ++ এবং হ্রাস কল করতে ইচ্ছুক আপনি অক্ষরের একটি দম্পতি বন্ধ শেভ করতে সক্ষম হবে: uint64_t s(uint64_t n){for(uint64_t r=n;--n>r/n;);return n;}
Fors

@ ফোরস - চমৎকার পন্থা! দুর্ভাগ্যক্রমে, 1 এর ইনপুটটির জন্য শূন্যের বিভাজন ঘটবে না? এছাড়াও, 0 এর ইনপুটটির জন্য এটি কী করবে? কারণ --nকখন n==0–1 হবে এবং এগুলি স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত মান, তাই –1 2⁶⁴ – 1 হবে।
টড লেহম্যান

1
#define Z uint64_t ... বা
টাইপেডেফ

@ টেকনোসরাস - আহা হ্যাঁ, এটি 2 সাশ্রয় করে :-)
টড লেহম্যান

1
অভিব্যক্তিটির n/++r/rআচরণের সংজ্ঞা রয়েছে ....
Aschepler

4

গল্ফস্ক্রিপ্ট - 14 অক্ষর

{.,\{\.*<}+?(}

যার জন্য iইনপুটটির চেয়ে কম ছোট সংখ্যাটি সন্ধান করুন । রিটার্ন ।nn < i*ii - 1

অর্থাত [0..n-1].first(i => n < i*i) - 1

যারা গল্ফস্ক্রিপ্টও জানেন না তাদের জন্য ব্যাখ্যা, ইনপুট সহ নমুনা কল করার জন্য 5:

.        //Duplicate input.  Stack: 5 5
,        //Get array less than top of stack.  Stack: 5 [0 1 2 3 4]
\        //Switch top two elements of stack.  Stack: [0 1 2 3 4] 5
{\.*<}+  //Create a block (to be explained), and prepend the top of the stack.  
         //Stack: [0 1 2 3 4]{5\.*<}
?        //Find the first element of the array for which the block is true. 
         //So, find the first element of [0 1 2 3 4] for which {5\.*<} evaluates to true.
         //The inner block squares a number and returns true if it is greater than the input.
(        //Decrement by 1 

ওহ, এটি পূর্বের সেরা গল্ফস্ক্রিপ্ট উত্তরের চেয়ে কম 3 অক্ষর। চমৎকার কাজ!
টড লেহম্যান

ইনপুটটির সঠিক উত্তর দেওয়ার জন্য এটি স্থির করা 1সম্ভবত দুটি চর নিতে পারে।
পিটার টেলর

4

হাস্কেল, 147 138 134 128 বাইট

বিশ্বের সবচেয়ে সংক্ষিপ্ত কোড নয়, এটি ও (লগ এন) এবং স্বেচ্ছাসেবী আকারের সংখ্যায় চালিত হয়:

h x=div(x+1)2
n%(g,s)|g*g<n=(g+s,h s)|g*g>n=(g-s,h s)|0<1=(g,0)
f(x:r@(y:z:w))|x==z=min x y|0<1=f r
s n=fst$f$iterate(n%)(n,h n)

এটি স্কয়ারটি (এন) এর সর্বোত্তম নিম্ন সান্নিধ্য পেতে সীমা [0..n] এর বাইনারি অনুসন্ধান করে। এখানে একটি অবারিত সংস্করণ:

-- Perform integer division by 2, rounding up
half x = x `div` 2 + x `rem` 2

-- Given a guess and step size, refine the guess by adding 
-- or subtracting the step as needed.  Return the new guess
-- and step size; if we found the square root exactly, set
-- the new step size to 0.
refineGuess n (guess, step)
    | square < n  =  (guess + step, half step)
    | square > n  =  (guess - step, half step)
    | otherwise   =  (guess, 0)
    where square = guess * guess     

-- Begin with the guess sqrt(n) = n and step size (half n),
-- then generate the infinite sequence of refined guesses.
-- 
-- NOTE: The sequence of guesses will do one of two things:
--         - If n has an integral square root m, the guess 
--           sequence will eventually be m,m,m,...
--         - If n does not have an exact integral square root,
--           the guess sequence will eventually alternate
--           L,U,L,U,.. between the integral lower and upper
--           bounds of the true square root.
--        In either case, the sequence will reach periodic
--        behavior in O(log n) iterations.
guesses n = map fst $ iterate (refineGuess n) (n, half n)

-- Find the limiting behavior of the guess sequence and pick out
-- the lower bound (either L or m in the comments above)
isqrt n = min2Cycle (guesses n)
    where min2Cycle (x0:rest@(x1:x2:xs))
            | x0 == x2    =   min x0 x1
            | otherwise   =   min2Cycle rest

সম্পাদনা: "অন্যথায়" ধারাগুলি "0 <1" এর সাথে "সত্য" এর সংক্ষিপ্ত সংস্করণ হিসাবে প্রতিস্থাপন করে এবং আরও কয়েকটি * * জি ইনলাইন করে দুটি বাইট সংরক্ষণ করা হয়েছে।

এছাড়াও, যদি আপনি ও (স্কয়ার্ট (এন)) দিয়ে খুশি হন তবে আপনি সহজভাবে করতে পারেন

s n=(head$filter((>n).(^2))[0..])-1

35 টি চরিত্রের জন্য, তবে এটি কী মজা?

সম্পাদনা 2: আমি ঠিক বুঝতে পেরেছি যেহেতু জোড়গুলি মিনি 2 সাইকেলের পরিবর্তে অভিধানের ক্রম অনুসারে বাছাই করা হয়। মানচিত্র fst, আমি শুধু fst করতে পারেন। min2Cycle। গল্ফ কোডটিতে, এটি f st f এর সাথে f $ মানচিত্র fst প্রতিস্থাপনে অনুবাদ করে আরও 4 টি বাইট সংরক্ষণ করে।

3 সম্পাদনা করুন: গর্বিতস্কেলারের জন্য আরও ছয়টি বাইট সংরক্ষণ করা হয়েছে!


1
আপনার "অর্ধ" ফাংশনে আপনি (ডিভি এক্স 2 + রিম এক্স 2)
ডিভ

আমি আসলে আমার নিজের যা হে (লগ ঢ) 49 অক্ষর, এবং সমাধান হয়েছে একটি সমাধান আছে, কিন্তু আমি শুধু 2 upvotes আছে ;-( আমি কেন বুঝতে পারছি না।
গর্বিত haskeller

4

জাভাস্ক্রিপ্ট 91 88 86: গতির জন্য অনুকূলিত

function s(n){var a=1,b=n;while(Math.abs(a-b)>1){b=n/a;a=(a+b)/2}return Math.floor(a)}

জাভাস্ক্রিপ্ট 46: অ গতি জন্য অনুকূলিত

function s(n){a=1;while(a*a<=n)a++;return a-1}

এখানে একটি জেএসফিডাল: http://jsfiddle.net/rmadhuram/1Lnjuo4k/


1
পিপিসিজিতে আপনাকে স্বাগতম! আপনি ধর্মঘটনের জন্য <s> 91 </s> <s> 88 </s> ব্যবহার করতে পারেন। আমি সম্পাদনাটি করার চেষ্টা করেছি তবে আপনি একই সময়ে সম্পাদনা করছেন তাই আমি আপনাকে এটি করতে দেব।
রেইনবোল্ট

1
অথবা আপনি এটি এর মতো 41 টি অক্ষরে এটি করতে পারেন:function s(n){for(a=1;++a*a<n;);return a}
রেবার্ব কাস্টার্ড 1'14

4

সি 95 97

টাইপিডেফ সম্পাদনা করুন, @ মিচেলেনজেলো প্রস্তাবিত

এটি কমবেশি হেরন অ্যালগরিদমের একটি সরাসরি বাস্তবায়ন হওয়া উচিত। একমাত্র উদ্দীপনাটি গড় এড়ানো পূর্ণসংখ্যার ওভারফ্লো গণনা করার ক্ষেত্রে: a = (m + n) / 2 বিআইআইজি সংখ্যার জন্য কাজ করে না।

typedef uint64_t Z;
Z q(Z x)
{
   Z n=1,a=x,m=0;
   for(;a-m&&a-n;) n=a,m=x/n,a=m/2+n/2+(m&n&1);
   return a;
}

ওভারফ্লো এড়ানো থেকে দুর্দান্ত কাজ - এটি সঠিকভাবে করার জন্যই নয়, প্রথমে এটি সম্পর্কে চিন্তা করা এবং এটি পরীক্ষা করার জন্য যত্ন নেওয়া। অবশ্যই প্রশংসিত।
টড লেহম্যান

বিটিডাব্লু, এটি মজার বিষয় যে কয়েকটি সিপিইউতে কত ব্যয়বহুল বিভাগ হতে পারে। যদিও এই অ্যালগরিদম অ্যাবাকাস অ্যালগরিদমের প্রায় অর্ধেক ধাপে কার্যকর করে, এটি রানটাইম আছে যা অ্যাবাকাস অ্যালগরিদমের চেয়ে প্রায় 5 গুণ কম ধীরে ধীরে যখন আমি এটি আমার কোর আই 7 সিপিইউতে বেনমার্ক করি, যা ভাগ করা পছন্দ করে না। যাইহোক, তবে রানটাইম এখানে গুরুত্বপূর্ণ নয় - কেবল আকার। :) খুব সুন্দর কাজ !!!
টড লেহম্যান 19

4

সি # 64 62 55

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

decimal f(ulong a){var i=0m;while(++i*i<=a);return--i;}

( ডটনেটফিডেলে পরীক্ষা )

অবশ্যই, এটি বড় ইনপুটগুলির জন্য মারাত্মক ধীর।


1
আপনি পরিবর্তন করে একটি অক্ষর বন্ধ শেভ করতে সক্ষম হতে পারেন return i-1থেকে return--i?
টড লেহম্যান

অভিব্যক্তিতে i*i<=a, এটি কি স্বাভাবিক ধরণের পূর্ণসংখ্যার গাণিতিক হওয়ার গ্যারান্টিযুক্ত? (আমি সি # এর সাথে পরিচিত নই।) যদি তাই হয়, এবং সি # যদি সি-এর মতো বুলিয়ানের অভ্যন্তরীণ পূর্ণসংখ্যার রূপান্তরকে মঞ্জুরি দেয় তবে আপনি সেটিকে পরিবর্তন করে আরও একটি চরিত্র সংরক্ষণ করতে সক্ষম হতে পারেন a/i/i
টড লেহম্যান

1
@ টডলেহম্যান আসলে Decimalওভারফ্লো এড়াতে স্থির-পয়েন্ট গণিত ( , উচ্চতর সর্বোচ্চ মান এবং নির্ভুলতা) হিসাবে দেখা যায়, কারণ গুণটির ফলস্বরূপ সম্ভবত এক ধাপ অতিক্রান্ত হতে পারে UInt64.MaxValue। তবে সি # এর কোনওভাবেই বুলিয়ানতে অন্তর্নিহিত রূপান্তর নেই। returnধন্যবাদ, যদিও আমি পরিবর্তন করতে সক্ষম হব । আমি যখন কম্পিউটারে ফিরে আসি তখন এটি করব।
বব

3

ক্লোজার - 51 বা 55 বাইট

এন থেকে 0 চেক সব সংখ্যা, প্রথম এক যেখানে দান x^2 <= n। রানটাইম হয়O(n - sqrt n)

নামবিহীন:

(fn[x](first(filter #(<=(* % %)x)(range x -1 -1))))

নামযুক্ত:

(defn f[x](first(filter #(<=(* % %)x)(range x -1 -1))))

উদাহরণ:

(map (fn[x](first(filter #(<=(* % %)x)(range x -1 -1)))) (range 50))
=> (0 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 7)

3

বেফঞ্জ 93 - 48 বাইট বা 38 টি অক্ষর

101p&02p>02g01g:*`#v_01g1-.@
        ^  p10+1g10<        

এখানে চেষ্টা করুন।


1
ঠিক আছে, এটি দুর্দান্ত। চমৎকার কাজ! আমি 17 টি প্রবেশ করলাম, ক্রিপ ক্লিক করলাম এবং তারপরে রান করুন এবং এটি 4 টি নিয়ে আসে! :)
টড লেহম্যান

3

কোবরা - 62

do(n as uint64)as uint64
    o=n-n
    while o*o<n,o+=1
    return o

ব্যাচ - 74

set a=0
:1
set /ab=%a%*%a%
if %b% LSS %1 set /aa=%a%+1&goto 1
echo %a%

3

হাস্কেল, 53 50 49 টি অক্ষর, হে (লগ এন)

s n=until((<=n).(^2))(\g->g-1-div(g^2-n-1)(2*g))n

এই দ্রবণটি নিউটন-রাফসন পদ্ধতি প্রয়োগ করে, যদিও এটি ফ্লোটের পরিবর্তে পূর্ণসংখ্যার সন্ধান করে। উইকি: http://en.wikedia.org/wiki/Newton%27s_ স্মারক

জটিলতা O (লগ এন) সম্পর্কে মনে হয়, তবে এর কোনও প্রমাণ আছে কি? মন্তব্যে উত্তর দিন।


\g->div(n+g^2)$2*g7 বাইট সংরক্ষণ
অ্যান্ডারস কাসের্গ

3

জে (10)

@ ডেনিসের উত্তর দ্বারা খুব, খুব খুব অনুপ্রাণিত :

<.@%~^&1.5

এবং কিছুটা দীর্ঘ, তবে আরও ভাল পারফরম্যান্স সহ (আমার সন্দেহ হয়):

<.@(-:&.^.)

floor(halve under log)

এক্সিকিউট করতে, ইনডেন্ট করা অংশগুলি ইনপুট হয়:

   f=:<.@%~^&1.5
   f 0 8 12 16
0 2 3 4
   g=:<.@(-:&.^.)
   g 0 8 12 16
0 2 3 4

প্রদত্ত পূর্ণসংখ্যার জন্য আপনি কীভাবে এটি সম্পাদন করবেন?
ডেনিস

1
@ ডেনিস উত্তর দেখুন
Sepuʎs

3

এপিএল - 12 টি চর, 19 বাইট

{⌊(⍵*1.5)÷⍵}

উদাহরণস্বরূপ ব্যবহার:

{⌊(⍵*1.5)÷⍵}17

4 রিটার্ন

পরীক্ষা ভেক্টর

{⌊(⍵*1.5)÷⍵}¨0 1 2 3 4 8 9 15 16 65535 65536 18446744073709551615

আয়

1 1 1 1 2 2 3 3 4 255 256 4294967296

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

আপনাকে বড় ধন্যবাদ : অ্যালগরিদমের জন্য ব্যবহারকারী "ssdecontrol"


1
পিপিসিজিতে আপনাকে স্বাগতম! আমরা সাধারণত চরিত্র অনুযায়ী বাইট হিসাবে এপিএল স্কোর করি। চ্যালেঞ্জটি সুনির্দিষ্ট না করে, ইউটিএফ -8 এ গণনা করার দরকার নেই। যে কোনও বিদ্যমান এনকোডিং ঠিক আছে, এবং আগের দিন থেকে একটি পুরানো এপিএল কোডপেজ রয়েছে যা প্রতিটি চরিত্রের জন্য একটি একক বাইট ব্যবহার করে। এপিএল ASCII এর পূর্বাভাস দেয় এ-ASCII অক্ষর ব্যবহার না করায় এটি শাস্তি দেওয়ার একটি খারাপ কারণ। ;) (এটি বলেছে যে, এটি বরং পুরানো চ্যালেঞ্জটি যেভাবেই অক্ষর দ্বারা স্কোর করতে পারে))
মার্টিন এন্ডার

@ মার্টিনএন্ডার উষ্ণ অভ্যর্থনা এবং পরামর্শের জন্য ধন্যবাদ :)
কোয়ান্টাম কার্ল

1
01! ডায়ালগ এপিএল ব্যবহার করে , আপনি ⎕DIV←1সঠিক ফলাফল পেতে সেট করতে পারেন (যা অনেকে ডিফল্ট হিসাবে ব্যবহার করেন)।
অ্যাডম

2

C99 (108 টি অক্ষর)

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

Golfed:

uint64_t s(uint64_t n){uint64_t b=1,r=0;while(n/b/4)b*=4;for(;b;b/=4,r/=2)n>=r+b?r+=b,n-=r,r+=b:0;return r;}

আংশিকভাবে গল্ফড:

uint64 uint64_sqrt(uint64 n)
{
  uint64 b = 1, r = 0;
  while (b <= n / 4)
    b *= 4;
  for (; b; b /= 4, r /= 2)
    if (n >= r + b)
      { r += b; n -= r; r+= b; }
  return r;
}

Ungolfed:

uint64_t uint64_sqrt(uint64_t const n)
{
  uint64_t a, b, r;

  for (b = 1; ((b << 2) != 0) && ((b << 2) <= n); b <<= 2)
    ;

  a = n;
  r = 0;
  for (; b != 0; b >>= 2)
  {
    if (a >= r + b)
    {
      a -= r + b;
      r = (r >> 1) + b;
    }
    else
    {
      r >>= 1;
    }
  }

  // Validate that r² <= n < (r+1)², being careful to avoid integer overflow,
  // which would occur in the case where n==2⁶⁴-1, r==2³²-1, and could also
  // occur in the event that r is incorrect.
  assert(n>0? r<=n/r : r==0);  // Safe way of saying r*r <= n
  assert(n/(r+1) < (r+1));     // Safe way of saying n < (r+1)*(r+1)

  return r;
}

1
পরামর্শ: aব্যবহারের প্রয়োজন নেই n
edc65

অই হ্যাঁ. ধন্যবাদ. আমার আসল সংস্করণে, আমি বজায় রেখেছিলাম nযাতে ফিরে আসার ঠিক আগেই আমি যে দাবিটি (দেখানো হয়নি) সেই r ^ 2 <= n <(আর + 1) ^ 2 করতে পারি। এই দাবিটি বাদ দেওয়া সহ, এটি nঅক্ষত রাখা আরও দীর্ঘ প্রয়োজন necessary
টড লেহম্যান

@ edc65 - এটি নির্দেশ করার জন্য আবারও ধন্যবাদ। আমি এটি প্রতিফলিত করতে আমার কোড আপডেট করেছি, পাশাপাশি আরও কয়েকটি গল্ফ কৌশল যুক্ত করেছি। মূল দাবী যুক্ত করেছে এবং constঅরগল্ফড সংস্করণে এন তৈরি করেছে।
টড লেহম্যান

2

জাভাস্ক্রিপ্ট 73 81 (64-বিট সংখ্যার প্রয়োজনীয়তা মেনে চলার জন্য)

n=prompt();g=n/3;do{G=g,g=(n/g+g)/2}while(1E-9<Math.abs(G-g))alert(Math.floor(g))

আলেকজান্দ্রিয়ার অ্যালগরিদমের হেরন প্রয়োগ করছে ...


নিস! এটি কি সব স্বাক্ষরযুক্ত 64-বিট পূর্ণসংখ্যার ইনপুটগুলির জন্য কাজ করে?
টড লেহম্যান

চেষ্টা করুন আমি সম্ভবত এটি 32-বিট পর্যন্ত কাজ করতে পারে বলে মনে করি ... আমার হতাশার অনেকটাই ...
ওয়েল ওয়েস্ট

অবশ্যই শেষ | 0 কোনও মান 32 বিট কেটে যায়। পরিবর্তে ম্যাথ.ফ্লুর ব্যবহার করছেন?
edc65

@ edc65 আপনি ঠিক বলেছেন, |032-বিট পর্যন্ত প্রভাবিত হয়েছে যেখানে Math.flooreffective৪- বিটের চেয়ে বেশি কার্যকর ... আমি আমার কোড আপডেট করেছি, এমন করার জন্য অতিরিক্ত 8 টি অক্ষর নিতে হবে ...
ওয়ালিওয়েস্ট

@ edc65 আমার সবেমাত্র একটি চিন্তা ছিল ... 64 x-64-বিটে কাজ করবে?
ওয়েলওয়েস্ট

2

পাওয়ারশেল (52) সীমাবদ্ধ ইন 32 (-2,147,483,648 থেকে 2,147,483,647)

function f($n){($n/2)..0|%{if($_*$_-le$n){$_;exit}}}

আমি এই মুহুর্তে পাওয়ারশেলের দিকে চিৎকার করছি শেষ পরীক্ষার কেসটি কাজ করার চেষ্টা করছি তবে আমি পাওয়ারফেল কী করি তা পাইপলাইন ভেরিয়েবল Int _ ইন্ট 32 হিসাবে ব্যবহার করি না, এবং এখনই আমি এর আশেপাশে কোনও উপায় খুঁজে পাচ্ছি না।

সুতরাং আমি আপাতত আমার উত্তর সীমাবদ্ধ করব। আমি uint64s হ্যান্ডেল করার আরও ভাল উপায় খুঁজতে পারলে আমি সম্পাদনা করব। (শেষ পরীক্ষার কেসটি পাওয়ারশেলের সাধারণ ইনট 64৪ প্রকারের পক্ষে খুব বড়!)

এখানে কয়েকটি পরীক্ষার কেস দেওয়া হয়েছে (সময়টি ট্র্যাক করার জন্য আমি ব্যবহৃত কিছু অতিরিক্ত আউটপুট নিয়ে)

f 17
4
Elapsed Time: 0.0060006 seconds

f 65
8
Elapsed Time: 0.0050005 seconds

f 65540
256
Elapsed Time: 1.7931793 seconds

f 256554
506
Elapsed Time: 14.7395391 seconds

আমি আমার ও (গুলি) জানি না, তবে এটি বেশ সুন্দর নাটকীয় লাফের মতো মনে হচ্ছে।


2

ক্যাভেট: ২০১১ সালের হিসাবে, আর বি এর কোনও বিল্ট-ইন সমর্থন ছিল না 64৪ বিট পূর্ণসংখ্যার হিসাবে আমি এটি ধরে নিয়েছিলাম did এই উত্তরগুলি সেই প্রযুক্তিগত ক্ষেত্রে অবৈধ হতে পারে, কিন্তু তারপরে আবার গত 3 বছরে আবার অনেক পরিবর্তন হয়েছে।


আর, 85

নিউটনের পদ্ধতি ব্যবহার:

function(n){s=F
x=n
y=(1/2)*(x+n/x)
while(abs(x-y)>=1){x=y
y=(1/2)*(x+n/x)}
trunc(y)}

যা চতুর্ভুজ রূপান্তরিত হয়। বেঞ্চমার্কিংয়ের জন্য একটি চলকটিতে ফাংশনটি নির্ধারণ করতে +2 টি অক্ষর:

microbenchmark(q(113424534523616))
# Unit: microseconds
#                expr    min      lq median      uq    max neval
#  q(113424534523616) 24.489 25.9935 28.162 29.5755 46.192   100

আর, 37

পাশবিক বল:

function(n){t=0
while(t^2<n) t=t+1
t}

এবং একই চেক:

microbenchmark::microbenchmark(q(113424534523616),times=1)
# Unit: seconds
#                 expr      min       lq   median       uq      max neval
#   q(113424534523616) 4.578494 4.578494 4.578494 4.578494 4.578494     1

আর, 30

সস্তা / উজ্জ্বল exponentiation কৌতুক :

function(n) trunc(n^(1.5)/n)

যা খুব দ্রুত হতে পারে (যদিও বিল্ট-ইন হিসাবে দ্রুত নয়):

microbenchmark(q(113424534523616),sqrt(113424534523616))
# Unit: nanoseconds
#                   expr min    lq median    uq  max neval
#     z(113424534523616) 468 622.5  676.5 714.5 4067   100
#  sqrt(113424534523616)  93 101.0  119.0 160.5 2863   100

2

সি, 38

f(n){int m;while(++m*m<=n);return--m;}

আমার ফোর জমা দেওয়ার অনুবাদ। ধীর কিন্তু সঠিক। হে (√n)। ওএস এক্স (bit৪ বিট) এ পরীক্ষিত।


2

ডিসি, 50 বাইট

dc -e"?dsist[lt2/dstd*li<B]dsBx[lt1+dstd*li!<A]dsAxlt1-f"

স্পেস আউট এবং ব্যাখ্যা:

               # The idea here is to start with the input and reduce it quickly until it is
               # less than what we want, then increment it until it's just right
?              # Take input from stdin
d si st        # Duplicate input, store in `i' and in `t'
[              # Begin macro definition (when I write in dc, "macro"=="function")
 lt            # Load t, our test term
 2/            # Divide t by two
 d st          # Store a copy of this new term in `t'
 d*            # Duplicate and multiply (square)
 li<B          # Load i; if i<(t^2), execute B
] d sB x       # Duplicate, store function as `B', and execute
               # Loop ends when t^2 is less than i
[              # Begin macro definition
 lt            # Load t, our test term
 1+            # Increment
 d st          # Store a copy of this new term in `t'
 d*            # Duplicate and multiply (square)
 li!<A         # Load i; if i>=(t^2), execute A
] d sA x       # Duplicate, store function as `A', and execute
               # Loop ends when t^2 == i+1
lt 1- f        # Load t, decrement, and dump stack

আহ, দেখতে শেষ পরীক্ষার কেস ক্র্যাশের মতো দেখাচ্ছে। আমি এটি ঠিক করার চেষ্টা করব।
জো

সমাধান। এখন খুব বড় ইনপুট গ্রহণ করে; অবিলম্বে, ফিক্সটি আমাকে শুরুতে কিছু কুরুচিপূর্ণ কোড সরানোর অনুমতি দেয়।
জো

2

সি, 139 137 136 বাইট

কোড গল্ফে আমার প্রথম চেষ্টা। দেখে মনে হচ্ছে এটি সি এর মধ্যে সবচেয়ে সংক্ষিপ্ততম যা "দক্ষ" প্রয়োজনীয়তার সাথে খাপ খায়, এটি O(log n)কেবল সংযোজন এবং বিট শিফট ব্যবহার করে সময় মতো চলে। যদিও আমি নিশ্চিত যে এটি আরও কম হতে পারে ...

a=32অংশটি পরিবর্তিত হওয়া পর্যন্ত এটি বৃহত্তর পূর্ণসংখ্যার মানগুলির জন্য ঠিক কাজ করা উচিত a=NUMBITS/2

typedef uint64_t x;x f(x o){x a=32,t=0,r=0,y=0,z;for(;a--+1;){z=(x)3<<2*a;y*=2;t++<r?y++,r-=t++:t--;t*=2;r*=4;r+=(o&z)>>2*a;}return y;}

চমৎকার কাজ! আমি এটি পরীক্ষার জন্য চালাচ্ছি না, তবে কোডটি আকর্ষণীয় দেখায়। (t++)কেবলমাত্র t++অ্যাসাইনমেন্টের পরিবর্তে আপনি লিখেছেন এমন কোনও কারণ আছে r?
টড লেহম্যান

1
@ টডলেহম্যান নাপ, কেবল তাদের বের করে দেওয়া মিস করেছেন। সুন্দর ক্যাচ!
ক্রিস

BTW, আমি ভালবাসেনa--+1 এড়ানোর লেখার একটি উপায় হিসেবে a-- != UINT64_C(-1)। আপনি সেই কৌশলটি কোথাও শিখেছেন নাকি নিজে আবিষ্কার করেছেন?
টড লেহম্যান

1
@ টাডলহম্যান ধন্যবাদ! আমি নিজেই বুঝতে পেরেছি।
ক্রিস

1

সি - 50 (গ্লোবাল ছাড়া 61)

typedef uint64_t T;T n,i;f(){while(++i*i<=n);--i;}

এটি স্থান বাঁচাতে প্যারামিটার এবং রিটার্ন মান হিসাবে গ্লোবাল ভেরিয়েবল ব্যবহার করে।

কোনও বৈশ্বিক সংস্করণ নেই:

typedef uint64_t T;T f(T n){T i=0;while(++i*i<=n);return--i;}

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

@ গর্বিত হাসেলেলার বিশ্বব্যাপী পরিবর্তনগুলি কেন নিষিদ্ধ হবে?
মেন্টালে

@ ম্যান্টাল কারণ আপনার অবশ্যই একটি চলমান প্রোগ্রাম / পদ্ধতি সরবরাহ করতে হবে।
মার্সিয়ানো.আরান্দে

@ মার্সিয়ানো ।আরান্দে কোডটি দেওয়া হয়েছে এটি চালানো যায়।
মেন্টালে

1

সি ++ 125

int main()
{
uint64_t y;cin>>y;
double x=y/2,d,z;
while((d=(x*x-y))>0.5)
{
d<0?x+=0.5:x-=0.5;
}
cout<<(uint64_t)x;
}

নিস! কিভাবে x+=(d<0)-0.5;... আরও 5 টি চরিত্র সংরক্ষণ করা যায়?
টড লেহম্যান

বিটিডাব্লু, সমস্যা বিবরণীতে উল্লিখিত হিসাবে এটি কোনও ফাংশন আকারে (তবে হওয়া উচিত) নয়। (ঠিক আছে, প্রযুক্তিগতভাবে হ্যাঁ, mainএটি একটি ফাংশন, তবে এটি কোনও প্রোগ্রামের ভেতর থেকে কল করার মতো নয় not f(y))
টড লেহম্যান

আমি মনে করি আপনি অন্ত্রেরতম বন্ধনীর জুটি বাদ দিতে পারেন এবং while((d=x*x-y)>0.5)পরিবর্তে লিখতে পারেন while((d=(x*x-y))>0.5)। আরও 2 টি অক্ষর সংরক্ষণ করে। :)
টড লেহম্যান

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