দূরত্ব গণনা করা Mod N


13

আপনি দীর্ঘদিন ধরে একটি উন্নত সংগ্রহের ডিভাইস কন্ট্রোলারের কাছ থেকে ডেটা সংগ্রহ করছেন । আপনি লগগুলি পরীক্ষা করে দেখেন এবং আপনার ভয়াবহতায় আপনি আবিষ্কার করেছেন যে কিছু মারাত্মকভাবে ভুল হয়েছে: ডেটাতে কেবল সংখ্যার শেষ বিট থাকে!

ভাগ্যক্রমে, আপনি শুরুর মানটি জানেন এবং মানটি কখনই দ্রুত পরিবর্তন হয় না। এর অর্থ আপনি শুরু থেকে দূরত্ব খুঁজে বের করে বিশ্রামটি পুনরুদ্ধার করতে পারেন।

চ্যালেঞ্জ

একটি মডিউলাস Nএবং মধ্যবর্তী মানের মডুলোর একটি তালিকা প্রদত্ত, একটি মান পরিবর্তিত পরিমাণ গণনা করার জন্য আপনি একটি প্রোগ্রাম বা একটি ফাংশন লিখবেন N

প্রতিটি জোড় সংখ্যার মধ্যে পরিবর্তন সর্বদা এর চেয়ে কম থাকেN/2 , সুতরাং প্রতিটি পরীক্ষার ক্ষেত্রে কেবল একটি বৈধ উত্তর থাকবে।

আপনাকে Nনিজের পছন্দ মতো একটি বিন্যাসে ইনপুট হিসাবে একটি পূর্ণসংখ্য > 2 এবং মানগুলির তালিকা দেওয়া হবে । এসটিডিআইএন বা কমান্ড লাইন বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট দেওয়া যেতে পারে।

আপনি একটি একক পূর্ণসংখ্যা আউটপুট পাবেন, আসল মানটির পরিমাণটি পরিবর্তিত হয়েছে। আউটপুট STDOUT এ মুদ্রিত বা ফিরে আসতে পারে।

বিধি

  • আপনার প্রোগ্রামটি অবশ্যই কোনও দূরত্ব এবং মডুলাসের চেয়ে কম সময়ের জন্য কাজ করবে 2^20
  • আপনি ধরে নিতে পারেন:
    • Nঅন্তত হয় 3
    • তালিকার কমপক্ষে 2 টি মান রয়েছে।
    • তালিকার সমস্ত মান কমপক্ষে 0 এবং এর চেয়ে কম N
    • সংখ্যার সমস্ত পরিবর্তন এর চেয়ে কম N/2
  • অন্য যে কোনও কিছুই একটি অবৈধ ইনপুট এবং আপনার প্রোগ্রাম যা খুশি তা করতে পারে।
  • এই সঠিক উদ্দেশ্যে স্ট্যান্ডার্ড লুফোলস, কোনও মানহীন গ্রন্থাগার এবং অন্তর্নির্মিত কার্য নিষিদ্ধ।
  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম প্রোগ্রামটি জিতে।

উদাহরণ পরীক্ষার ক্ষেত্রে

ইনপুট:

3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1

আউটপুট:

4

ব্যাখ্যা (উদাহরণস্বরূপ মান সহ):

Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value:       0 1 2 2 3 4 3 2 1 2 3 4 5 4 4

ইনপুট:

10
5 2 8 9 5

আউটপুট:

-10

ব্যাখ্যা (উদাহরণস্বরূপ মান সহ):

Value mod 10:  5  2  8  9  5
Value:        15 12  8  9  5

অবৈধ ইনপুট:

2
0 0 0 0 0

(খুব ছোট মডুলাস)

6
2 5 4 2

(2 এবং 5 এর মধ্যে খুব বড় পরিবর্তন)


আপনার পছন্দের একটি বিন্যাস হ'ল পিচ্ছিল opeাল। আমার গল্ফস্ক্রিপ্ট সমাধানটি দেখতে মতো কোনও ইনপুট তালিকার উপর নির্ভর করতে পারে :^;[5 2 8 9 5](\ ?
লিন

3
@ মরিস সাধারণত, না ... "আপনার পছন্দের একটি ফর্ম্যাট" এর অর্থ সাধারণত "আপনার পছন্দের ভাষাতে একটি প্রচলিত উপস্থাপনা" বোঝানো হয়।
মার্টিন ইন্ডার

আপনি তবে "10 5 2 8 9 5" বা "10,5 2 8 9 5" বা "10 5,2,8,9,5" এর মতো দেখতে ইনপুট তালিকার উপর নির্ভর করতে পারেন।
স্পার

উত্তর:


2

টিআই-বেসিক, 15 বাইট

Input N
sum(N/πtan⁻¹(tan(ΔList(πAns/N

থেকে তালিকা Ansএবং মডিউল থেকে নেয় Input

                       πAns/N    ; Normalize the list to [0,π)
                 ΔList(          ; Take differences, which are in the range (-π,π)
       tan⁻¹(tan(                ; Modulo, but shorter. Now elements are in (-π/2,π/2)
    N/π                          ; Multiply by N/π. These are displacements at each step.
sum(                             ; Add up all the displacements

9

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

lambda n,l:sum((b-a+n/2)%n-n/2for a,b in zip(l,l[1:]))

সুপার সরাসরি এগিয়ে উত্তর। আরও আশ্চর্য হয়েছি যদি এখানে আরও একটি ছোট উপায় থাকে।


আমি কিছুটা মিস করেছি। ধন্যবাদ।
লিন

@ জাকুব আমি ইতিমধ্যে এটি করেছি - আমি .:_2আপনার উত্তর না পাওয়া পর্যন্ত জোড় জেনার বিষয়ে সচেতন ছিলাম না - আমি জিপ ব্যবহার করছিলাম।
orlp

1
@ জাকুব আমি এটিকে 19 এ
নামিয়েছি

7

গণিত, 30 বাইট

Tr@Mod[Differences@#2,#,-#/2]&

এটি একটি অনামী ফাংশন যা দুটি যুক্তি গ্রহণ করে। ব্যবহারের উদাহরণ:

Tr@Mod[Differences@#2,#,-#/2]&[3, {0, 1, 2, 2, 0, 1, 0, 2, 1, 2, 0, 1, 2, 1, 1}]
(* 4 *)
Tr@Mod[Differences@#2,#,-#/2]&[10, {5, 2, 8, 9, 5}]
(* -10 *)

এই গ্রহণ করে কাজ করে Differencesধারাবাহিক উপাদানের মধ্যে পরিসীমা তাদের মোড়কে, -n/2করতে +n/2সঙ্গে Mod, এবং তার অফসেট প্যারামিটার তারপর মোট গ্রহণ Tr(ম্যাট্রিক্স ট্রেস, তির্যক উপাদানের সমষ্টি)।


মনে রাখবেন এমনকি এমনকি এটি 43 43 বাইট অবরুদ্ধ!

f[n_, l_] := Total[Mod[Differences[l], n, -n/2]]

@বেকার বন্ধনী সহ আপনি ইতিমধ্যে ফাংশনটি কল করার সময় অপ্রয়োজনীয়। উভয় থাকা একটি বাক্য গঠন ত্রুটি।
ডেভিড জ্যাং

@ ডেভিডজ্যাং উফফফ, জানেন না আমি কী ভাবছিলাম। ম্যাথমেটিকাকে না খোলাই উত্তর দেওয়ার চেষ্টা করার জন্য আমার সঠিক সেবা করে!
2012campion

5

জে, 24 বাইট

[+/@(]-(>-:)~*[)[|2-~/\]

ব্যবহার:

   f=:[+/@(]-(>-:)~*[)[|2-~/\]

   3 f 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
4

   10 f 5 2 8 9 5
_10

আরও গল্ফ চেষ্টা করবে এবং এর পরে কিছু ব্যাখ্যা যুক্ত করবে।

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


1
নিশ্চিত তার জে এবং সিজেম নয়? : পি
অপ্টিমাইজার

4

পাইথ, 20 19 বাইট

sm-J/Q2%+-FdJQ.:vw2

.:_2জাকুবে থেকে চুরি , মরিস থেকে ধারণা।


3

আর, 38 বাইট

function(n,v)sum((diff(v)+n/2)%%n-n/2)

এটি একটি নামবিহীন ফাংশন তৈরি করে যা একটি পূর্ণসংখ্যা এবং ভেক্টরকে ইনপুট হিসাবে গ্রহণ করে এবং একটি একক পূর্ণসংখ্যা ফেরত দেয়। এটি কল করার জন্য, এটির একটি নাম দিন f=function(n,v)...

অবহেলিত + ব্যাখ্যা:

f <- function(n, v) {
    # Compute the differences between sequential elements of v
    d <- diff(v)

    # Add n/2 to the differences and get the result modulo n
    m <- (d + n/2) %% n

    # Subtract n/2 then sum the vector
    sum(m - n/2)
}

উদাহরণ:

> f(3, c(0, 1, 2, 2, 0, 1, 0, 2, 1, 2, 0, 1, 2, 1, 1))
[1] 4

> f(10, c(5, 2, 8, 9, 5))
[1] -10

3

ম্যাটল্যাব, 33 বাইট

@(x,y)sum(mod(diff(y)+x/2,x)-x/2)

আমার ক্ষমা, এই ওয়েবসাইটে এটি আমার প্রথম উত্তর। ম্যাটল্যাবে এটি টাইপ করার পরে ইনপুটটি ব্যবহার করে ans(modulus_value, [intermediate_values])অনুরোধ করা মানটি ফিরে আসবে, যেখানে 'মডুলাস_ভ্যালু' হল মডুলাস মান এবং 'ইন্টারমিডিয়েট_ভ্যালুস' হল ফাঁকা বা কমা দ্বারা বিভক্ত মধ্যবর্তী মানগুলির একটি তালিকা।

উদাহরণ:

ans(3, [0 1 2 2 0 1 0 2 1 2 0 1 2 1 1])

বেনামী ফাংশন মতলব এর সুবিধা নেয় mod, diffএবং sumফাংশন উত্তর গনা। প্রথমত, প্রতিটি মধ্যবর্তী মানগুলির মধ্যে পার্থক্য গণনা করা হয়। এরপরে ফলাফলটি দুটি দ্বারা বিভাজনিত মডুলাস দ্বারা অফসেট হয়, ফলস্বরূপ [-modulus / 2 মডুলাস / 2] দ্বারা আবদ্ধ পার্থক্যের মানগুলির একটি সেট তৈরি হয়। এরপরে ফলাফলটি অফসেট করে আবার যোগ করা হয়।

আমি মনে করি এটি আরও গল্ফ করা যেতে পারে, আমি খুব শীঘ্রই একটি আপডেট নিয়ে ফিরে আসব। আইডিয়াটির জন্য @ ২০১২ সিআরসিপিয়নকে বিশেষ ধন্যবাদ।

সম্পাদনা করুন: মতলবের unwrapফাংশনটি এখানে প্রায় কাজ করে তবে গল্ফ করা শক্ত। নিম্নলিখিত কোডটি একটি অ্যারে প্রদান করে যেখানে সর্বশেষ মানটি প্রথম মানটি যে পরিমাণ পরিবর্তিত হয়েছিল: @(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)

মধ্যবর্তী মানগুলি [-pi pi] এর পরিসীমাতে পরিমাপ করা হয়, তারপরে "আনারপাটেড" এমন কোনও ক্রমাগত মান পাই ছাড়া আলাদা হয় না। এর পরে এই মানগুলি আবার স্কেল করে স্থানান্তরিত হয়, যার ফলে শুরুর মান থেকে দূরত্বের অ্যারে হয়।

আকর্ষণীয়, তবে এই চ্যালেঞ্জের জন্য খুব ব্যবহারিক নয়: ডি


2

পাইথ, 29 বাইট

+sm**._K-Fdvz>y.aKvz.:Q2-eQhQ

এটি অনলাইনে ব্যবহার করে দেখুন: পাইথ কমপাইলার / এক্সিকিউটার


ইনপুট স্থান দ্বারা পৃথক, কমা দ্বারা পৃথক নয়; আপনার প্রোগ্রাম এটি হ্যান্ডেল বলে মনে হচ্ছে না।
লিন

2
@ মরিস "আপনার পছন্দের বিন্যাসে মানগুলির তালিকা"
জাকুব

ওহ! আমার দুরবস্থা! আমি অনুমানটির সেই অংশটি পুরোপুরি মিস করেছি।
লিন


2

পিপ , 39 বাইট

Qn$+({a>n/2?a-na<-n/2?a+na}Mg@>1-g@<-1)

কমান্ড-লাইন আর্গুমেন্ট এবং STDIN- এ মডুলাস হিসাবে ডেটার তালিকা প্রয়োজন। যদি এটি প্রসারিতের পরিমাণ খুব বেশি হয় তবে আমার কাছে একটি সংস্করণ রয়েছে যাতে 5 টি বাইটের জন্য দুটি কমান্ড-লাইন আরোগুলি লাগে।

ব্যাখ্যা:

                                         g is list of cmdline args (implicit)
Qn                                       Read n from stdin
                            g@>1         All but the first of the cmdline args
                                -g@<-1   ...minus all but the last of the cmdline args
                                         (i.e. a list of the differences of adjacent items)
     {                    }M             ...to which, map the following function:
      a>n/2?a-n                            If diff is too big, subtract n;
               a<-n/2?a+n                  else if too small, add n;
                         a                 else return unchanged
  $+(                                 )  Sum; print (implicit)

এবং কেবল প্রমাণ করার জন্য যে এই তুলনামূলকভাবে প্রতিযোগিতামূলক স্কোরটি আমার ভাষার চেয়ে আমার গল্ফিং দক্ষতার প্রতিফলনযোগ্য, এখানে 30 বাইটে মাউরিসের পাইথন সমাধানের একটি বন্দর রয়েছে :

Qn$+({(n/2-$-a)%n-n/2}MgZg@>1)

2

জেলি , অ-প্রতিযোগিতামূলক

6 বাইট এই উত্তরটি প্রতিদ্বন্দ্বিতামূলক নয়, যেহেতু চ্যালেঞ্জটি জেলি তৈরির পূর্বে রয়েছে।

Iæ%H}S

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

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

Iæ%H}S    Main link. Left input: A (list). Right input: N (integer).

I         Compute the increments (deltas of consecutive elements) of A.
   H}     Halve the right input (N).
 æ%       Mod the increments into (-N/2, N/2].
     S    Take the sum of all results.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.