ধারাবাহিক পূর্ণসংখ্যার যোগফল


27

কেউ কি কিছু বলছেন আগে অনুরূপ এবং অনুরূপ । তবে এটি কোনও দ্বাপ নয়।


কিছু ধনাত্মক পূর্ণসংখ্যাকে কমপক্ষে পরপর দুটি ধনাত্মক পূর্ণসংখ্যার যোগফল হিসাবে লেখা যায়। উদাহরণস্বরূপ 9=2+3+4=4+5,। একটি ফাংশন লিখুন যা তার ইনপুট হিসাবে ধনাত্মক পূর্ণসংখ্যার গ্রহণ করে এবং এর আউটপুট হিসাবে এটির যোগফল ক্রমবর্ধমান ধনাত্মক পূর্ণসংখ্যার দীর্ঘতম ক্রম প্রিন্ট করে (যে কোনও বিন্যাস গ্রহণযোগ্য হয়, যদিও আউটপুটটি +উপরে দেখানো অনুসারে পৃথক ক্রমবর্ধমান ক্রম হয়) । যদি এরকম কোনও অনুক্রম না থাকে তবে সংখ্যাটি নিজেই প্রিন্ট করা উচিত।

এটি কোড গল্ফ। স্ট্যান্ডার্ড বিধি প্রয়োগ। বাইটস মধ্যে সংক্ষিপ্ত কোড।


নমুনা (নোট করুন যে বিন্যাসটি পরিবর্তিত হয়)

Input:   9
Output:  2,3,4

Input:   8
Output:  8

Input:   25
Output:  [3,4,5,6,7]

2
আউটপুট করা সংখ্যাগুলি কি একটি নির্দিষ্ট ক্রমে থাকতে হবে (বাড়ার মতো)?
xnor

2
সংখ্যাগুলি কি হতে হবে> 0: 6 = 0 + 1 + 2 + 3 বা 6 = 1 + 2 + 3
ড্যামিয়েন

5
একটি পার্শ্ব নোট হিসাবে, যদি ঘনিষ্ঠভাবে সম্পর্কিত চ্যালেঞ্জগুলি থাকে, তবে "এটি কোনও ধূপ নয়" বললে লোকেরা যদি তাদের মনে করে যে এটি ডুপু বলে মনে করে তবে তারা তা বোঝাতে খুব সামান্য কাজ করবে। আপনি কেন এটি ভাবেন না তা ব্যাখ্যা করলে এটি আরও সহায়ক হবে।
মার্টিন এন্ডার

1
@ ডামিয়েন "পজিটিভ" এর অর্থ সাধারণত> 0 হয়। যদি 0 অন্তর্ভুক্ত করা হয়, তবে এটি "অ-নেতিবাচক" নামে পরিচিত।
মার্টিন এন্ডার

3
সিসি @ ভিক্সেন ^ (এছাড়াও যদি নেতিবাচক সংখ্যার অনুমতি দেওয়া হয় তবে সর্বোত্তম সমাধানটি সর্বদা থেকে শুরু করে পরিসীমা হতে -n+1পারে n)
মার্টিন এন্ডার

উত্তর:


11

পাইথন, 67 বাইট

f=lambda n,R=[1]:n-sum(R)and f(n,[R+[R[-1]+1],R[1:]][sum(R)>n])or R

অদ্ভুতভাবে সোজাসাপ্ট কৌশল: সঠিক যোগফল সহ বিরতি আর এর জন্য অনুসন্ধান করুন।

  • যদি যোগফলটি খুব কম হয় তবে পরের সর্বোচ্চ সংখ্যাকে সংযোজন করে অন্তরের ডান প্রান্তটি স্থানান্তর করুন।
  • যদি যোগফলটি খুব বড় হয় তবে ক্ষুদ্রতম এলিমেন্টটি সরিয়ে বাম প্রান্তটি স্থানান্তর করুন
  • যোগফলটি সঠিক হলে, আউটপুট আর।

যেহেতু বিরতিটির নীচের প্রান্তটি কেবল বৃদ্ধি পায়, তাই দীর্ঘতর ব্যবধানগুলি ছোট হওয়ার আগে পাওয়া যায়।


অদ্ভুতভাবে পাশাপাশি দক্ষ। পুনরাবৃত্তি স্ট্যাকটি শেষ পর্যন্ত উপচে পড়েছে, যেমন এন = 8192।
প্রিমো

7

পাইথ, 12 10 বাইট

j\+hfqsTQ}M^SQ2

কোডটি 15 বাইট দীর্ঘ এবং -5 বাইট বোনাসের জন্য যোগ্যতা অর্জন করে । পাইথ সংকলকটিতে এটি অনলাইনে চেষ্টা করুন ।

2 জ্যাকেট বন্ধ করে দেওয়ার জন্য @ জাকুবকে ধন্যবাদ!

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

j\+hfqsTQ}M^SQ2    (implicit) Store evaluated input in Q.

            S      Compute [1, ..., Q].
           ^  2    Get all pairs of elements of [1, ..., Q].
         }M        Reduce each pair by inclusive range. Maps [a, b] to [a, ..., b].
    f              Filter; for each pair T:
      sT             Add the integers in T.
     q  Q            Check if the sum equals Q.
                   Keep the pair if it does.
   h               Retrieve the first match.
                   Since the ranges [a, ..., b] are sorted by the value of a,
                   the first will be the longest, in ascending order.
j\+                Join, using '+' as separator.

1
আমরা যারা পাইথ অঞ্চলে আলোকিত নন, আপনি কি দয়া করে একটি ব্যাখ্যা যুক্ত করতে পারেন? :)
ETH প্রোডাকশন

আমি আমার উত্তর সম্পাদনা করেছি।
ডেনিস

অান্তরিক ধন্যবাদ! আমি আপনার কৌশল পছন্দ।
ETH প্রোডাকশনস

1
ইনপুট 1000: 30 মিনিট এবং গণনা ...
প্রিমো

3

গণিত, 73 68 65 56 43 বাইট

Cases[Range~Array~{#,#},i_/;Tr@i==#,{2},1]&

1
+1 আমি গত রাতের মতো একই সমাধান দিয়ে শেষ করেছি, তবে আমার ইন্টারনেট ডাউন হয়েছে। এছাড়াও আপনি Tuplesএকটি ইনফিক্স এক্সপ্রেশন করতে পারেন ।
LegionMammal978

3

হাস্কেল, 49 48 বাইট

f n=[[a..b]|a<-[1..n],b<-[a..n],sum[a..b]==n]!!0

1
সংরক্ষণ করতে 1 বাইট: [...]!!0পরিবর্তে ব্যবহার করুন head[...]
নিমি

2

ম্যাটল্যাব, 87 79 বাইট

আমি জানি যে ইতিমধ্যে একটি ম্যাটল্যাব উত্তর রয়েছে, তবে এটির ক্ষেত্রে এটির দিক থেকে উল্লেখযোগ্যভাবে আলাদা।

x=input('');m=1:x;n=.5-m/2+x./m;l=max(find(~mod(n(n>0),1)));disp(m(1:l)+n(l)-1)

এটি অষ্টাভেও কাজ করে । আপনি এখানে অনলাইনে চেষ্টা করতে পারেন । আমি consecutiveSum.mলিংকড ওয়ার্কস্পেসে কোডটি ইতিমধ্যে যুক্ত করেছি , সুতরাং কেবলমাত্র consecutiveSumকমান্ড প্রম্পটে প্রবেশ করুন, তারপরে মানটি লিখুন (যেমন 25)।

আমি এখনও এটি হ্রাস করার জন্য কাজ করছি (সম্ভবত সামান্য ব্যবহৃত সমীকরণটি সামঞ্জস্য করা), তবে মূলত এটি সবচেয়ে বড় মান খুঁজে পায় nযার mজন্য একটি পূর্ণসংখ্যা, তারপরে প্রথম mসংখ্যাটি প্রদর্শন করে n

তাহলে এই কাজ কেন? ভাল মূলত এই সমস্ত সংখ্যার উপর একটি গাণিতিক সমীকরণ রয়েছে ation আপনি যদি বিবেচনা করেন যে এগুলি সবই ধারাবাহিক, এবং কিছুটা থেকে শুরু হয় তবে আপনি মূলত বলতে পারেন:

n+(n+1)+(n+2)+(n+3)+...+(n+p)=x

এখন এটি থেকে এটি স্পষ্ট হয়ে ওঠে যে অনুক্রমটি মূলত কেবল প্রথম pত্রিভুজ সংখ্যা (0'th সহ) p+1প্রচুর পরিমাণে যুক্ত হয় n। এখন যদি আমরা করি তবে আমরা m=p+1বলতে পারি:

m*(n+(m-1)/2)==x

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


25 ইনপুট জন্য, আউটপুট হবে:

3     4     5     6     7

2
ত্রিভুজ সংখ্যাগুলির বিষয়ে আপনার বক্তব্য সম্পর্কে, এই চ্যালেঞ্জটি মূলত ইনপুটটির ইতিবাচক পার্থক্য সহ ত্রিভুজাকার সংখ্যাগুলি সন্ধান করার চেষ্টা করছে যেমন অনুক্রমের ত্রিভুজাকার সংখ্যার সূচকগুলি 1,3,6,10,...সর্বাধিকতর হয়।
আর্কটরাস

1

পাইথন 2, 94 বাইট

n=input()
r=int((2*n)**.5)
while r:
 if~r%2*r/2==n%r:print range(n/r-~-r/2,n/r-~r/2);r=1
 r-=1

স্ট্যান্ডিন থেকে ইনপুট নেওয়া হয়। এই সমাধানটি খুব বড় ইনপুটগুলির জন্য উপযুক্ত।

এটি সম্ভাব্য সমাধানের দৈর্ঘ্যের উপর পুনরাবৃত্তি করে, r , ≤ √ (2 এন) রয়েছে এবং স্পষ্টভাবে সমাধানের জন্য পরীক্ষা করে। কোনও সমাধানের অস্তিত্বের জন্য, r যদি বিজোড় হয় তবে n মোড আর অবশ্যই শূন্য হতে হবে, এবং যদি r হয় তবে n মোড আর অবশ্যই r / 2 হতে হবে ।


নমুনা ব্যবহার

$ echo 8192 | python sum-con-int.py
[8192]

$ echo 1000002 | python sum-con-int.py
[83328, 83329, 83330, 83331, 83332, 83333, 83334, 83335, 83336, 83337, 83338, 83339]

$ echo 1000000006 | python sum-con-int.py
[250000000, 250000001, 250000002, 250000003]

আমি তুলনামূলকভাবে ছোট আউটপুটগুলির সাথে উদাহরণগুলি বেছে নিয়েছি।


1

অক্টাভা, 89 বাইট

অষ্টাভেতে এটিই সেরা। অ্যালগরিদম এক্সনোরের মতোই।

x=input('');k=i=1;while x;s=sum(k:i);if s<x;i++;elseif s>x;k++;else;x=0;end;end;disp(k:1)

ম্যাটল্যাবে এটি 95 বাইট হবে:

x=input('');k=1;i=1;while x;s=sum(k:i);if s<x;i=i+1;elseif s>x;k=k+1;else x=0;end;end;disp(k:i)

ম্যাটল্যাবে এটি ইনপুটটির জন্য প্রায় 0.1 সেকেন্ড এবং ইনপুটটির জন্য 20000001 সেকেন্ডে চলে 1000002


1

awk, 51 বাইট

{while($0!=s+=s<$0?++j:-++i);while(++i-j)r=r i"+"}$0=r j

কোডটি 56 বাইট, আউটপুট বিন্যাসের জন্য বিয়োগ 5 বাইট। এই ফর্ম্যাটটি তৈরি করতে আমাকে 4 টি অতিরিক্ত বাইট ব্যবহার করতে হয়েছিল, তাই আমি আসলে 1 বাইট সংরক্ষণ করেছি। হুররে! ;)

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

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

echo 303 | awk '{while($0!=s+=s<$0?++j:-++i);while(++i-j)r=r i"+"}$0=r j'

উদাহরণস্বরূপ ফলাফল

48 + 49 + 50 + 51 + 52 + 53

আমি একটি ইনপুট জন্য 1e12এটি চেষ্টা করেছি এবং এটি 464562+...+1488562প্রায় অবিলম্বে সঠিক ফলাফল দিয়েছে ( )। যদিও এটি অবশ্যই মুদ্রণ করতে কিছু সময় নিয়েছে ...


অ্যাওক পদ্ধতিকে ভালবাসুন। বাইন্ডিংগুলিতে অগ্রাধিকার ক্রমটি কাজ করতে আমার সমস্যা হচ্ছে। আপনি কি আরও কিছু স্পষ্ট করে তুলতে আরও বেশি বন্ধনী যুক্ত সংস্করণ যুক্ত করে কিছু মনে করবেন? :)
ওয়াইল্ডকার্ড

1
আশা করি এটি সহায়তা করে: {while($0!=s)s+=(s<$0) ? (++j) : -(++i); while(++i<j)r=r i"+"}$0=r j আমি সর্বদা সর্বশেষ পূর্ণসংখ্যা যা চেইনের শুরু থেকে বিয়োগ করেছিলাম, জে সর্বদা সর্বশেষ
সংখ্যার সাথে

0

জাপট , 33 বাইট

এটি ডেনিসের পাইথ কৌশল ব্যবহার করে , যদিও এটি বেশ দীর্ঘ ...

1oU à2 £W=Xg o1+Xg1¹x ¥U©W} rª ªU

এটি অনলাইন চেষ্টা করুন! সতর্কতা: বৃহত ইনপুটগুলির জন্য (<= 20), এটি শেষ করতে কিছুটা সময় সময় নেয় এবং আপনার ব্রাউজারটি এটি না হওয়া পর্যন্ত স্থির করে দেয়।

অবহেলিত এবং ব্যাখ্যা

1oU à2 £    W=Xg o1+Xg1¹ x ¥ U© W} rª  ª U
1oU à2 mXYZ{W=Xg o1+Xg1) x ==U&&W} r|| ||U

          // Implicit: U = input integer
1oU à2    // Generate a range from 1 to U, and take all combinations of length 2.
mXYZ{     // Map each item X in this range to:
W=Xg o    //  Set variable W to the range of integers starting at the first item in X,
1+Xg1)    //  and ending at 1 + the second item in X.
x ==U&&W  //  If the sum of this range equals U, return W; otherwise, return false.
r||       // Reduce the result with the || operator, returning the first non-false value.
||U       // If this is still false, there are no consecutive ranges that sum to U,
          // so resort to U itself.
          // Implicit: output last expression

বোনাস উপার্জন সংস্করণ: (38 বাইট - 5 = 33)

1oU à2 £W=Xg o1+Xg1¹x ¥U©W} rª ªU² q'+

0

জুলিয়া, 92 বাইট

x->(t=filter(i->all(j->j==1,diff(sort(i))),partitions(x));collect(t)[indmax(map(length,t))])

এটি একটি বেনামে ফাংশন যা একটি পূর্ণসংখ্যা গ্রহণ করে এবং একটি অ্যারে প্রদান করে। এটি কল করার জন্য, এটির একটি নাম দিন f=x->...

Ungolfed:

function f(x::Integer)
    # Get all arrays of integers that sum to x
    p = partitions(x)

    # Filter these down to only consecutive runs by checking whether
    # all differences are 1
    t = filter(i -> all(j -> j == 1, diff(sort(i))), p)

    # Find the index of the longest element of t
    i = indmax(map(length, t))

    return collect(t)[i]
end

0

রুবি, 94 বাইট

->n{([*1..n].permutation(2).map{|i,j|[*i..j]if(i..j).reduce(:+)==n}-[p]).max_by{|k|k.size}||n}

Ungolfed:

-> n {
  ([*1..n].permutation(2).map { |i,j|   # Finds all the possible sets of size 2
     [*i..j] if(i..j).reduce(:+) == n   # Adds a set to an array if sum of the set is n.
   }-[p]                                # Removes nil from the array
  ).max_by { |k|                        # Finds the longest sequence
    k.size
  } || n                                # Returns n if no sequence found.
}

ব্যবহার:

->n{([*1..n].permutation(2).map{|i,j|[*i..j]if(i..j).reduce(:+)==n}-[p]).max_by{|k|k.size}||n}[25]
=> [3, 4, 5, 6, 7]

0

গুরুতরভাবে, 53 - 5 = 48 বাইট

,;;;╝`;u@n╟(D;)`n(XXk`iu@u@x;Σ╛=[])Ii`╗`ñ╜M`M;░p@X'+j

হেক্স ডাম্প

2c3b3b3bbc603b75406ec728443b29606e2858586b60697540754
0783be4be3d5b5d29496960bb60a4bd4d604d3bb0704058272b6a

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

এটি ডানিসের পাইথের অনুরূপ হিংস্র বাহিনীর পন্থা।

থেকে সবকিছু আপ kঠিক সার্চ ইনপুট nরেজিস্টার 1 মধ্যে এবং তারপর তালিকার সৃষ্টি [[1],[2,2],[3,3,3],[4,4,4,4],...]পর্যন্ত n nএর।

পরবর্তী বিট আপটি হ'ল রেজিস্টার 0 এ সঞ্চিত একটি ফাংশন যা একটি জুড়ি নেয়, উভয় উপাদানকে বাড়ায়, তাদের একটি পরিসরে রূপান্তরিত করে, ব্যাপ্তির যোগফল খুঁজে বের করে এবং নিবন্ধটির 1 যোগফলের মান কিনা তা পরীক্ষা করে থাকে যদি এটি হয়, এটি সম্পর্কিত ব্যাপ্তিটি প্রদান করে এবং যদি তা না হয় তবে এটি একটি খালি তালিকা দেয়।

Mউপরের বর্ণিত তালিকার অভিনব তালিকার উপরে ফাংশন মানচিত্রের সর্বশেষ অংশ পর্যন্ত enumerateপ্রতিটি তালিকা করে, তারপরে সঞ্চিত ফাংশনটি ম্যাপিং করে। এটি সম্পন্ন হয়ে গেলে, আমাদের তালিকার একটি তালিকা রয়েছে যার প্রত্যেকটি খালি বা একটি পরিসীমা যার পরিমাণ n

;░খালি তালিকা সরিয়ে দেয়। p@Xপ্রথম তালিকাটি নিয়ে যায় যা অবশেষে ( 0@Eএছাড়াও কাজ করবে)। বোনাসের জন্য একটি স্ট্রিংয়ে তালিকাকে রূপান্তর করার সাথে সাথে প্রতিটি সংখ্যাটির মধ্যে '+jরাখে +


0

ES6, 72 বাইট

n=>{for(l=u=1;n;)n>0?n-=u++:n+=l++;return[...Array(u).keys()].slice(l);}

@ ক্যাবি 407 এর সহজ সমাধানের সোজা বন্দর, তবে বিন্যাস বোনাস ছাড়াই, কারণ এটি এখানে শাস্তি।


0

পাইথন 3, 239 236 215 203 বাইট

এটি একটু কষ্টকর। আমি পরে এটি গল্ফ করতে হবে।

def x(n):
 r=[n]
 for i in range(2,n):
  t=[]
  if i%2*(n%i<1):t=[j+n//i-i//2for j in range(i)]
  elif i%2<1and n%i==i//2:t=[j+n//i-i//2+1for j in range(i)]
  if t[:1]>[0]*(sum(t)==n):r+=t,
 return r[-1]

kকারণ যদি আপনি চেক t[0]একটি খালি উপর t, পাইথন তোমার দিকে অভদ্র শব্দ তোলে। আবার, এটি গল্ফের প্রয়োজন। ধন্যবাদ t[:1], আর কোনও অভদ্র শব্দ নেই! আপনার কেবল অন্য অ্যারে পরীক্ষা করা দরকার।


0

জেলি , 8 বাইট (প্রতিদ্বন্দ্বী)

ẆS⁼¥Ðf⁸Ṫ

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

আমি যদি সঠিকভাবে বুঝতে পারি তবে এটি (11-5 = 6) -বাইট সংস্করণ হতে পারে:

ẆS⁼¥Ðf⁸Ṫj”+

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

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


0

পিএইচপি, 70 বাইট

while(fmod($q=sqrt(2*$argn+(++$p-.5)**2)-.5,1));print_r(range($p,$q));

পাইপ হিসাবে চালান -nRবা এটি অনলাইনে চেষ্টা করুন

বাড়তি pপর্যন্ত এটি জন্য একটি পূর্ণসংখ্যা সমাধান খুঁজে বের করে argument==(p+q)*(q-p+1)/2,
তারপর থেকে পরিসীমা ছাপে pকরতে q


0

এক্সেল ভিবিএ, 119 - 5 = 114 বাইট

Subরুটিন যা nপ্রত্যাশিত ধরণের পূর্ণসংখ্যার ইনপুট নেয় এবং ধারাবাহিক সংখ্যার দীর্ঘতম ক্রমকে আউটপুট দেয় যা এটির সাথে যোগ হয়[A1]

Sub a(n)
For i=1To n
s=0
For j=i To n
s=s+j
If s=n Then:For k=i To j-1:r=r &k &"+":Next:[A1]=r &j:End
Next
Next
End Sub
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.