বর্গক্ষেত্রের পার্থক্য সর্বাধিক করুন


19

থেকে পূর্ণসংখ্যা মূল্যবোধের বিন্যাস বিবেচনা 1করতে N। যেমন উদাহরণস্বরূপ N = 4:

[1, 3, 4, 2]

আমরা এই তালিকাটিকে চক্র হিসাবে বিবেচনা করব 1এবং 2এটিকে সংলগ্ন হিসাবে বিবেচনা করা হবে। এই জাতীয় তালিকার জন্য আমরা একটি পরিমাণ গণনা করতে পারি এটি সংলগ্ন মানগুলির মোট স্কোয়ার্ড পার্থক্য:

(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10

আপনার টাস্ক একটি ধনাত্মক পূর্ণসংখ্যা দেওয়া, একটি বিন্যাস যা এই পরিমাণ maximizes খুঁজে পেতে NN = 4উপরের উদাহরণের ক্ষেত্রে অনুকূল নয় (আসলে এটি সর্বনিম্ন)। আমরা 18নিম্নলিখিত ক্রমান্বয়ে (পাশাপাশি বেশ কয়েকটি অন্যান্য) এর মোট স্কোয়ার পার্থক্য অর্জন করতে পারি :

[1, 4, 2, 3]

আপনার অ্যালগরিদমটি বহুপাক্ষিক সময়ে চলবে (এর N)। বিশেষত, আপনি সমস্ত আদেশের মোট স্কোয়ার পার্থক্যটি সহজেই গণনা করতে পারবেন না।

আপনি STDIN (অথবা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে এবং STDOUT (বা নিকটতম বিকল্প), ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে ফলাফল আউটপুট করতে পারেন।

আউটপুট কোনও সুবিধাজনক, দ্ব্যর্থহীন, ফ্ল্যাট তালিকা বা স্ট্রিং বিন্যাসে থাকতে পারে। আপনি এর থেকে মান সঙ্গে একটি তালিকা আসতে করা চয়ন করতে পারেন 0করার N-1পরিবর্তে 1করতে N

স্ট্যান্ডার্ড বিধি প্রযোজ্য।

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

এই সমস্যার জন্য একটি দুর্দান্ত বিশ্লেষণাত্মক সমাধান রয়েছে। যেমন এর জন্য সমস্ত বৈধ সমাধান N = 10নিম্নলিখিত তালিকার সমতুল্য (চক্রীয় শিফট এবং বিপরীত পর্যন্ত):

[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]

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

N    Total squared difference

1                         0
2                         2
3                         6
4                        18
5                        36
6                        66
7                       106
8                       162
9                       232
10                      322
33                    11936
100                  333202
333                12308236
1000              333332002

এটি ওইআইএস এন্ট্রি A064842 (এতে যদি আপনি আটকে থাকেন তবে এই চ্যালেঞ্জটির সমাধান সহ একটি কাগজের একটি উল্লেখও রয়েছে))

উত্তর:


7

জেলি, 24 21 15 14 10 9 বাইট

RUĖµ«/€ị"

মোট স্কোয়ার পার্থক্য গণনা করতে, কোডটিতে সংযোজন করুন µ_ṙ1$²Sএটি অনলাইন চেষ্টা করুন!

পটভূমি

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

উদাহরণস্বরূপ, এন = 8, 9 এর জন্য আমাদের রয়েছে

1 2 3 4 5 6 7 8        1 2 3 4 5 6 7 8 9
  ^   ^ ^   ^            ^   ^   ^   ^

(ক্যারেটস চিহ্নটি পূর্ণসংখ্যার অদলবদল হওয়ার জন্য), যার ফলস্বরূপ

1 7 3 5 4 6 2 8        1 8 3 6 5 4 7 2 9

অদলবদল করার পরে।

এই অদলবদলগুলি অর্জনের একটি উপায়, স্বাধীনভাবে n এর সমতুল্যতা, নিম্নরূপ।

একে অপরের নীচে এবং আরোহী ক্রমে পূর্ণসংখ্যাগুলি লিখে শুরু করুন।

1 2 3 4 5 6 7 8        1 2 3 4 5 6 7 8 9
8 7 6 5 4 3 2 1        9 8 7 6 5 4 3 2 1

প্রতিটি জোড় সংখ্যার জন্য, জোড়ার ন্যূনতম গণনা করুন। এটি নিকটতম প্রান্তকে দূরত্ব দেয়, অর্থাত্ বাম বা ডান দিকের সূচকটি (যেটি নিম্নতর)।

1 2 3 4 5 6 7 8        1 2 3 4 5 6 7 8 9
8 7 6 5 4 3 2 1        9 8 7 6 5 4 3 2 1

1 2 3 4 4 3 2 1        1 2 3 4 5 4 3 2 1

যদি সর্বনিম্নটি ​​বিজোড় হয় তবে পূর্ণসংখ্যাটি তার জায়গায় থাকা উচিত, সুতরাং আমরা প্রথম সারিতে একটি নির্বাচন করি; যদি এটি সমান হয় তবে পূর্ণসংখ্যাগুলি অদলবদল করা উচিত, তাই আমরা দ্বিতীয় সারি থেকে একটিটি নির্বাচন করি।

1   3     6   8        1   3   5   7   9
  7   5 4   2            8   6   4   2

এটি পছন্দসই আউটপুট।

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

RUĖµ«/€ị"    Main link. Input: n

R            Range. Yields [1, ..., n].
 U           Upend. Yields [n, ..., 1].
  Ė          Enumerate. Yields p := [[1, n], [2, n-1], ... [n-1, 2], [n, 1]].

   µ         Begin a new, monadic chain. Argument: p
     /       Reduce...
      €        each pair of p...
    «          by minimum.
        "    For each minimum and the corresponding pair of p:
       ị       Select the element at that index.
            Indices are modular and 1-based in Jelly, so this selects the first
            element if the minimum is odd, and the second one if it is even.

6

জাভাস্ক্রিপ্ট (ES6), 52 বাইট

n=>[...Array(n)].map((_,i)=>(i<n/2|n%2)^i%2?i+1:n-i)

9 বাইট সংরক্ষিত হয়েছে @ নীলকে ধন্যবাদ!

ব্যাখ্যা

এই পদ্ধতির ফলাফলটি অ্যারেতে যুক্ত করে তুলার চেয়ে iদৈর্ঘ্যের সাথে সূচকে থাকা সংখ্যাটি নির্ধারণ করে n। এটি নিম্নলিখিত পর্যবেক্ষণের উপর ভিত্তি করে ( n = 7উদাহরণ হিসাবে ব্যবহার করে ):

  • বামদিকে সর্বনিম্ন সংখ্যা এবং ডানদিকে সর্বোচ্চ দিয়ে শুরু করুন: [ 1, 7 ]
  • অর্ডারটি স্যুইচ করুন যাতে সর্বনিম্ন ডানদিকে থাকে এবং সর্বোচ্চ বাম দিকে থাকে, সর্বনিম্ন বৃদ্ধি হয়, সর্বনিম্ন হ্রাস পায় এবং এটিকে অ্যারের মাঝখানে রাখুন:[ 1, 6, 2, 7 ]
  • সর্বোচ্চ এবং সর্বনিম্ন রূপান্তর হওয়া পর্যন্ত পুনরাবৃত্তি করুন: [ 1, 6, 3, 4, 5, 2, 7 ]

উচ্চতর এবং নিম্ন সংখ্যাগুলি যথাক্রমে n-iএবং i+1যথাক্রমে প্রকাশ করা যায়।

var solution =

n=>
  [...Array(n)] // create an array of length n
  .map((_,i)=>  // set each value of the array at index i
    (i<n/2      // if we're on the left side,
    |n%2)       // or we're on the right and n is odd, even i => lower, odd i => higher
    ^i%2?       // else even i => higher, odd i => lower
    i+1:n-i
  )
N = <input type="number" id="input" oninput="result.textContent=solution(+this.value)" />
<pre id="result"></pre>


চমৎকার অ্যালগরিদম; সেগুলি উত্পন্ন করার জন্য আমি কোনও সূত্রের কথা ভেবে চেষ্টা করেছি এবং ব্যর্থ হয়েছি যাতে আমাকে ঠেলাঠেলি এবং আনশিফিংয়ের কুরুচিপূর্ণ পদ্ধতিটি ব্যবহার করতে হয়েছিল। তবে আমি অবশ্যই আপনার যুক্তিটিকে সহজ করতে পারি (i<n/2||n%2)^i%2?i+1:n-i
নিল

@ নীল ওয়াও, আমি ঠিক জেগে উঠলাম, এইটি গল্ফ করার সিদ্ধান্ত নিয়েছি এবং আপনার সঠিক যুক্তি দিয়ে এসেছি এবং আপনি এটি পোস্ট করার সাথে সাথেই এটি টাইপ করতে শুরু করেছেন! ক্রেজি ...
user81655

5

পাইথন 2, 105 98 বাইট

@ ডেনিসের মন্তব্যে 7 বাইট সংরক্ষণ করা হয়েছে

n=input()
r=([],[n/2+1])[n%2]
for i in range(n/2,0,-1):k=[n+1-i];r=([i]+r+k,k+r+[i])[i%2]
print r

58 বাইট সম্পাদিত সংস্করণ

lambda n:[(n-i-1,i)[(i+(n,1)[i<n/2])%2]for i in range(n)]

আমি ইতিমধ্যে বিশ্বাস করেছিলাম ওয়ান-লাইনার হিসাবে এটি করা সম্ভব হওয়া উচিত, তবে যুক্তিটি আমার পক্ষে খুব জটিল ছিল। @ ব্যবহারকারী 81655 দ্বারা জাভাস্ক্রিপ্ট-উত্তর এবং @ ডেনিস পাইথন-উত্তরে ল্যাম্বডা-স্বীকৃতি দেখে আমি এটিকে নতুন করে চেষ্টা করেছি।

শর্ত সমান

if i < n/2:
    i%2 != n%2
else:
    (i+1)%2

দুর্ভাগ্যক্রমে সমস্ত রূপান্তর প্রচেষ্টা জাভাস্ক্রিপ্ট-লজিকের সরাসরি অনুবাদের সাথে তুলনায় কেবল একটিই বাইট সংরক্ষণ করে না (i<n/2or n%2)!=i%2


3
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! এটি পাইথন 2 হিসাবে উপস্থিত বলে মনে হচ্ছে, সুতরাং আপনার ইনপুটটির int()আশপাশের দরকার নেই । এছাড়াও, আপনি লুপের শরীরের জন্য একই লাইনে রাখতে পারেন for...
ডেনিস

4

পাইথন, 51 49 বাইট

lambda n:[(i^min(i,~i%n)%-2)%n for i in range(n)]

@ এক্সনরকে 2 বাইট বন্ধ করে গল্ফ করার জন্য ধন্যবাদ!

আইডিয়নে চেষ্টা করে দেখুন ।

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

যদি আমি [0, ..., n - 1] এর একটি নম্বর হয় , তবে ~ i% n = - (i + 1)% n = - (i + 1) + n = (n - 1) - i , যার অর্থ, এটির মানচিত্র 0 থেকে এন - 1 , 1 থেকে N - 2 এবং, সাধারণভাবে, তম বাঁ দিক থেকে আইটেমটি তম ডান দিক থেকে।

আমার জেলির উত্তরে যেমন ব্যাখ্যা করা হয়েছে , আমরা i এবং ~ i% n এর মধ্যে নিম্নমূল্যে উঁকি মেরে আউটপুটটি তৈরি করতে পারি এবং এটি যদি হয় তবে আমি বাছাই করতে পারি এবং এটি যদি বিজোড় হয় তবে pick i% n করব । আমরা নিম্নলিখিত হিসাবে এটি অর্জন।

  • ন্যূনতম এমনকি হয়, তাহলে min(i,~i%n)%-2সমর্পণ করা হবে 0 , তাই ফলাফলের XORing সঙ্গে আমি সমর্পণ করা হবে আমি , এবং তার অবশিষ্টাংশ মডিউল কম্পিউটিং এন ফিরে আসবে আমি

  • যদি সর্বনিম্নটি ​​বিজোড় হয়, min(i,~i%n)%-2তবে -1 দেবে , সুতরাং ফলাফলটি XORing করে আমি ফলন করব ~ i , সুতরাং সম্পূর্ণ অভিব্যক্তিটি পছন্দমতো ~ i% n এ মূল্যায়ন করে ।


শর্তসাপেক্ষে আপনি কয়েকটি চর সংরক্ষণ করতে পারেন (i^min(i,n+~i)%-2)%n
xnor

এটি কেবল সংক্ষিপ্ত নয় তবে অত্যন্ত চালাক। ধন্যবাদ!
ডেনিস

2

পিএইচপি, 77 76 51 50 49 বাইট

আইএসও 8859-1 এনকোডিং ব্যবহার করে।

অ্যারের প্রথমার্ধটি এর মতো একত্র করা:

  • বিজোড় সংখ্যাগুলির সূচকের মান থাকে (1, 3, 5 ..)
  • এমনকি সংখ্যার মান রয়েছে N+1-index(9, 7, 5)
  • এর ফলে 1, 9, 3, 7, 5

অ্যারের দ্বিতীয়ার্ধ হিসাবে, বহিরাগততম মানগুলি যুক্ত হয় N+1যার অর্থ আপনি N-[left value]বাম মানটি ইতিমধ্যে পরিচিত সেখান থেকে সঠিক ডান মান পেতে পারেন ।

for(;$k=$argv[1]-$j++;)echo" ",min($j,$k)%2?$j:$k;

এটি চালান (এটি মোট স্কোয়ার্ড পার্থক্যটিও দেখায়) ( -dকেবল নান্দনিকতার জন্য যুক্ত):

php -d error_reporting=32757 -r 'for(;$k=$argv[1]-$j++;)echo~ß,$x[]=min($j,$k)%2?$j:$k;  for(;$c=$x[+$i++];)$b+=($c-($x[$i]?:$x[0]))**2;echo"\n$b\n";' 10
  • বাম / ডান অবস্থাকে উপেক্ষা করে একটি বাইট সংরক্ষণ করেছেন যাতে দ্বিতীয় ত্রৈমাসিককে বন্ধনী ছাড়াই বাসা বাঁধতে পারে
  • ডেনিসের অ্যালগোরিদম নির্লজ্জভাবে প্রয়োগ করে 25 বাইট সংরক্ষণ করা হয়েছে
  • পরে প্রয়োজনীয় স্থান থেকে মুক্তি পেয়ে একটি বাইট সংরক্ষণ করেছেন echo
  • একটি জায়গা উত্পাদন করার জন্য একটি বাইট সংরক্ষণ করা।

1

পাইথন 2, 100

আমি জানি একটি অজগর উত্তর ইতিমধ্যে আছে, কিন্তু আমি মনে করি আমি এটি অন্যভাবে করতে পেরেছি।

n=input();a=n%2;b=n/2;x=[b+1,b+a][a:]
for i in range(b+a-1):f=1-i%2*2;x=[x[-1]-f]+x+[x[0]+f]
print x

এবং মোট স্কোর পরীক্ষা করার জন্য অতিরিক্ত হিসাবে:

def t(x,n):return sum((x[i]-x[(i+1)%n])**2for i in range(n))

def t(x,n):return sum((x[i]-x[i-1])**2for i in range(n))নেতিবাচক সূচকগুলির অন্তর্নিহিত মোড়কের চারপাশে ব্যবহার করে এবং 4 বাইট সংরক্ষণ করে। আমি জানি, প্রতিযোগিতার অংশ ছিল না। ;)
বিটিডব্লুফ

1

সিজেম, 17 15 14 বাইট

{,W%ee_::e<.=}

এটি এমন একটি ফাংশন যা স্ট্যাক থেকে একটি পূর্ণসংখ্যা n পপ করে এবং বিনিময়ে [0… n-1] এর অনুক্রমকে ধাক্কা দেয় । কোডটি আমার জেলি উত্তর হিসাবে একই পন্থা ব্যবহার করে ।

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

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

,W%ee_::e<.=    Function body. Stack: N

,               Turn N into [0 ... N-1].
 W%             Reverse to push [N-1 ... 0].
   ee           Enumerate. This pushes [[0 N-1] [1 N-2] ... [N-2 1] [N-1 0]].
     _          Push a copy of the array of pairs.
      ::e<      Reduce each pair by minimum.
          .=    Vectorized selection.
                For the Ith minimum M, select the Mth element of the Ith pair.
                Indices are modular and 0-based in CJam, so this selects the first
                element if the minimum is even, and the second one if it is odd.

1

এলআইএসপি, 86 বাইট

(defun g(n m)(if(= n m)(list n)(if(< m n)(cons m(reverse(cons n(g(- n 1)(+ m 1))))))))

ফাংশনের ইনপুটগুলি ক্রমটির শুরু (এম) এবং শেষ (এন) মানগুলি চয়ন করতে দেয়।

প্রদত্ত নমুনাগুলি অনুসারে ফাংশনটি পরীক্ষা করার জন্য, n কে N এবং m থেকে 1 নির্ধারণ করা হয়েছে।

ফাংশনটি পরীক্ষা করার জন্য এখানে কোড:

    (defun g(n m)(if(= n m)(list n)(if(< m n)(cons m(reverse(cons n(g(- n 1)(+ m 1))))))))

(defun sq (c)
    (apply #'+ (mapcar #'(lambda(x y) (* (- x y) (- x y))) c (append (cdr c) (list (car c))))))

(format t "N~20TSequence~50TSquared Difference~%")
(mapcar #'(lambda (x)(format t "~S~20T~S~50T~S~%" x (g x 1) (sq (g x 1)))) '(1 2 3 4 5 6 7 8 9 10 33 100 333 1000))

আইডিয়নে চেষ্টা করে দেখুন !


1

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

n->map(i->min(i-1,n-i)%2>0?n-~-i:i,1:n)

এটি 1: n এর একটি ক্রম ছাপায় । 0: n-1 এর ক্রমবর্ধমান বাইটের দাম বা সঞ্চয় করে না:

n->map(i->min(i,n+~i)%2>0?i:n+~i,0:n-1)

এই শেষ সংস্করণটি আমার পাইথন উত্তরের প্রত্যক্ষ বন্দর ।


0

ES6, 77 বাইট

n=>[...Array(n)].map(_=>r[++i&2?"push":"unshift"](i&1?n--:++j),i=j=0,r=[])&&r

i&1নমুনা মধ্যভাগ চরমে থেকে ডিজিটের। i&2শুরুতে বা জোড়ায় জোড়ায় ফলাফলের শেষে তাদের যোগ করা হয়েছে।


0

আর, 117 86 বাইট

z=1:(n<-scan());a=pmin(z,n:1);for(i in seq(2,,2,n%/%2))z[b]=z[rev(b<-which(a==i,T))];z

@ ডেনিসের জেলি অ্যালগরিদমের প্রয়োগের সাথে বগী দীর্ঘ সংস্করণটি সম্পাদনা করুন

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