একটি বহুমাত্রিক অ্যারের সূচক


28

নিম্ন স্তরের ভাষা যেমন সি এবং সি ++ এর আসলে বহুমাত্রিক অ্যারেগুলির কোনও ধারণা নেই। (ভেক্টর এবং গতিশীল অ্যারে ব্যতীত) যখন আপনি একটি বহুমাত্রিক অ্যারে তৈরি করেন

int foo[5][10];

এটি আসলে কেবল সিনট্যাকটিক চিনি । সি আসলে যা করে তা হ'ল 5 * 10 টি উপাদানের একটি একক সুসংগত অ্যারে তৈরি করা । এই

foo[4][2]

এছাড়াও সিনট্যাকটিক চিনি হয়। এটি প্রকৃতপক্ষে উপাদানটিকে বোঝায়

4 * 10 + 2

বা, 42 তম উপাদান। সাধারণভাবে [a][b]অ্যারেতে উপাদান সূচকটি foo[x][y]হয়

a * y + b

একই ধারণা 3 ডি অ্যারেগুলিতে প্রযোজ্য। যদি আমাদের থাকে foo[x][y][z]এবং আমরা উপাদানটি অ্যাক্সেস [a][b][c]করি আমরা সত্যিই উপাদানটিতে অ্যাক্সেস করছি:

a * y * z + b * z + c

এই ধারণাটি n- মাত্রিক অ্যারেগুলিতে প্রযোজ্য । আমাদের যদি মাত্রার সাথে একটি অ্যারে থাকে D1, D2, D3 ... Dnএবং আমরা S1, S2, S3 ... Snসূত্রটি উপাদানটিতে প্রবেশ করি

(S1 * D2 * D3 ... * Dn) + (S2 * D3 * D4 ... * Dn) + (S3 * D4 ... * Dn) ... + (Sn-1 * Dn) + Sn

চ্যালেঞ্জ

আপনাকে অবশ্যই এমন একটি প্রোগ্রাম বা ফাংশন লিখবেন যা উপরের সূত্র অনুসারে বহুমাত্রিক অ্যারের সূচক গণনা করবে। ইনপুট দুটি অ্যারে হবে। প্রথম অ্যারেটি মাত্রা এবং দ্বিতীয় অ্যারে সূচকগুলি। এই দুটি অ্যারের দৈর্ঘ্য সর্বদা সমান এবং কমপক্ষে 1 হবে।

আপনি নিরাপদে ধরে নিতে পারেন যে অ্যারের প্রতিটি সংখ্যা একটি অ-নেতিবাচক পূর্ণসংখ্যা হবে। আপনি ধরে নিতে পারেন যে আপনি 0মাত্রা অ্যারেতে পাবেন না , যদিও সূচকগুলিতে একটি 0 হতে পারে। আপনি ধরেও নিতে পারেন যে সূচকগুলি মাত্রার চেয়ে বড় হবে না।

পরীক্ষা IO

Dimensions: [5, 10]
Indices: [4, 2]
Output: 42

Dimensions: [10, 10, 4, 62, 7]
Indices: [1, 2, 3, 4, 5]
Output: 22167

Dimensions: [5, 1, 10]
Indices: [3, 0, 7]
Output: 37

Dimensions: [6, 6, 6, 6, 6, 6, 6, 6, 6, 6]
Indices: [3, 1, 5, 5, 3, 0, 5, 2, 5, 4]
Output: 33570178

4
সুতরাং এটি 0-ভিত্তিক সূচক, সঠিক? আমাদের পছন্দের ভাষার জন্য যদি এটি আরও প্রাকৃতিক হয় তবে আমরা কি 1-ভিত্তিক সূচক ব্যবহার করতে পারি?
অ্যালেক্স এ

@AlexA। হ্যাঁ, এটি গ্রহণযোগ্য।
DJMcMayhem

11
প্রকৃতপক্ষে, সি 'সত্যই যা করে' তা হ'ল পাঁচ ধরণের উপাদানের একক সুসংগত অ্যারে তৈরি করা int[10]


1
@ হার্কাইল হ্যাঁ, তবে সেই অ্যারেতে থাকা সমস্ত পূর্ণসংখ্যা এখনও সুসংগত। এটি কেবল শব্দার্থকতা।
DJMcMayhem

উত্তর:


60

এপিএল, 1 বাইট

ট্রাইএপিএলে এটি পরীক্ষা করুন ।


21
ঠিক আছে, এটা। আমরা একটি বিজয়ী আছে। বাকি সবাই এখন ঘরে যেতে পারেন।
DJMcMayhem

3
কেন ... কেন এই কাজ করে? o_O
অ্যালেক্স এ।

10
@AlexA। একটি বহুমাত্রিক অ্যারে সূচক করা মূলত মিশ্র বেস রূপান্তর।
ডেনিস

21
ওহ, দেখুন, গল্ফ করার সময় একটির মধ্যে একটি গর্ত!
মনিকার লকসুট

8
বেশিরভাগ সময় আমি এখানে মজাদার জন্য আসি। তারপরে এমন কিছু সময় আসে যখন আমি ঘটনাক্রমে গভীর অন্তর্দৃষ্টি
পাই

11

জে, 2 বাইট

#.

যেখানে একটি এপিএল আছে, সেখানে জে আছে! ধরনের। বাম আরগ এবং ডায়াগন আর্গ হিসাবে সূচী হিসাবে মাত্রা নেয়। "একটি বহুমাত্রিক অ্যারে সূচক করা মূলত মিশ্র বেস রূপান্তর is"


11

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

(d,a)=>a.reduce((r,i,j)=>r*d[j]+i)

অবশ্যই reduceতুলনায় ভাল হতে হবে map



7

জেলি , 7 6 বাইট

Ṇ;żḅ@/

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

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

Ṇ;żḅ@/  Main link. Arguments: D (list of dimensions), I (list of indices)

Ṇ       Yield 0, the logical NOT of D.
  ż     Zip D with I.
        If D = [10, 10, 4, 62, 7] and I = [1, 2, 3, 4, 5], this yields
        [[10, 1], [10, 2], [4, 3], [62, 4], [7, 5]].
 ;      Concatenate, yielding [0, [10, 1], [10, 2], [4, 3], [62, 4], [7, 5]].
   ḅ@/  Reduce by swapped base conversion to integer.
        [10, 1] in base    0 is    0 × 10 + 1 = 1.
        [10, 2] in base    1 is    1 × 10 + 2 = 12.
        [ 4, 3] in base   12 is   12 ×  4 + 3 = 51.
        [62, 4] in base   51 is   51 × 62 + 4 = 3166.
        [ 7, 5] in base 3166 is 3166 ×  7 + 5 = 22167.


5

এমএটিএল , 9 বাইট

PiPZ}N$X]

এটি 1-ভিত্তিক সূচক ব্যবহার করে (এখন চ্যালেঞ্জের দ্বারা অনুমোদিত), যা এমএটিএল-এ প্রাকৃতিক পছন্দ।

চ্যালেঞ্জের পরীক্ষার কেসের সাথে তুলনা 1করতে ইনপুট সূচক ভেক্টরের প্রতিটি এন্ট্রি যুক্ত করুন এবং 1আউটপুট থেকে বিয়োগ করুন।

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

ব্যাখ্যা

কোডটি বিল্টিন X]ফাংশনের উপর ভিত্তি করে তৈরি করা হয়েছে , যা বহুমাত্রিক সূচকগুলিকে একক, লিনিয়ার সূচকগুলিতে রূপান্তর করে (মতলব বা অক্টাভের sub2indফাংশনের মতো)।

P      % Take dimension vector implicitly. Reverse
iP     % Take vector of indices. Reverse
Z}     % Split vector into its elements
N$X]   % Convert indices to linear index (`sub2ind` function). Implicitly display


5

এমএটিএল , 11 বাইট

4L)1hPYpP*s

এটি আসল চ্যালেঞ্জের মতো 0-ভিত্তিক সূচক ব্যবহার করে।

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

ব্যাখ্যা

কোড সুস্পষ্টভাবে প্রয়োজনীয় গুণ এবং সংযোজন করে।

4L)    % Take first input array implicitly. Remove its first entry
1h     % Append a 1
PYpP   % Cumulative product from right to left
*      % Take second input array implicitly. Multiply the two arrays element-wise
s      % Sum of resulting array. Implicitly display

4

পাইথন, 85 বাইট

lambda a,b:sum(b[i]*eval('*'.join(str(n)for n in a[i+1:])or'1')for i in range(len(a)))

আমি সম্ভবত আমার বাটটিকে আরও ভাল পাইথন গল্ফারদের দ্বারা লাথি মেরে ফেলব।


4

পাইথন 3.5, 69

lambda d,i:sum(eval("*".join(map(str,[z,*d])))for z in i if d.pop(0))

পরীক্ষা এখানে


চমৎকার উত্তর! আমার চেয়ে অনেক ভাল।
DJMcMayhem

@ ডিগ্রিগ্রিনএগ্রস এবং হামডিজে আমি আপনার সমাধান থেকে ইওল পদ্ধতিটি চুরি করেছি :)
আলেকজান্ডার নিগল

4

হাস্কেল, 34 বাইট

a#b=sum$zipWith(*)(0:b)$scanr(*)1a

ব্যবহারের উদাহরণ: [10,10,4,62,7] # [1,2,3,4,5]-> 22167

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

      scanr(*)1a  -- build partial products of the first parameter from the right,
                  -- starting with 1, e.g. [173600,17360,1736,434,7,1]
    (0:b)         -- prepend 0 to second parameter, e.g. [0,1,2,3,4,5]
  zipWith(*)      -- multiply both lists elementwise, e.g. [0,17360,3472,1302,28,5]
sum               -- calculate sum

4

সি ++, 66 বাইট

একটি দ্রুত ম্যাক্রো:

#include<stdio.h>
#define F(d,i) int x d;printf("%d",&x i-(int*)x)

এর মতো ব্যবহার করুন:

int main(){
    F([5][1][10], [3][0][7]);
}

এটি বিধিগুলির অপব্যবহারের কিছুটা হতে পারে। প্রদত্ত সূচকগুলি পয়েন্টারটি কতদূর অফসেট করে তা দেখার জন্য পরীক্ষার চেয়ে প্রদত্ত আকারের সাথে একটি অ্যারে তৈরি করে। STDOUT এ আউটপুট।

এটিকে খুব নোংরা লাগছে ... তবে আমি ঠিক এটি সত্য যে এটি বৈধ।


3

গণিত, 27 বাইট

#~FromDigits~MixedRadix@#2&

একটি নামবিহীন ফাংশন যা সূচকগুলির তালিকাটিকে প্রথম আর্গুমেন্ট হিসাবে এবং দ্বিতীয় মাত্রার তালিকা হিসাবে গ্রহণ করে। ডেনিসের এপিএল উত্তরের অনুরূপ পর্যবেক্ষণের ভিত্তিতে যে সূচিটি গণনা করা আসলেই একটি মিশ্র-বেস রূপান্তর।


3

অক্টাভ, 58 54 বাইট

@ অ্যালেক্সা ধন্যবাদ। তার পরামর্শের জন্য, যা 4 বাইট সরিয়েছে

@(d,i)reshape(1:prod(d),flip(d))(num2cell(flip(i)){:})

ইনপুট এবং আউটপুট 1-ভিত্তিক। পরীক্ষার কেসের সাথে তুলনা করতে, 1ইনপুটটিতে প্রতিটি প্রবেশের জন্য ওটি যুক্ত করুন এবং 1আউটপুট থেকে বিয়োগ করুন ।

এটি একটি বেনামে ফাংশন। এটি কল করতে, এটি একটি ভেরিয়েবলের জন্য বরাদ্দ করুন।

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

ব্যাখ্যা

এটি আসলে বহুমাত্রিক অ্যারে তৈরি করে কাজ করে (reshape(...) ), মান ভরা 1, 2... রৈখিক অনুক্রমে ( 1:prod(d)), এবং তারপর বহুমাত্রিক সূচকের সাথে সূচিবদ্ধ corrresponding মান জন্য।

ইনপুটটি বহুমাত্রিক সূচককে iএকটি ঘর অ্যারে ( num2cell(...)) এবং তারপরে একটি কমা-বিচ্ছিন্ন তালিকায় ( {:}) পরিবর্তিত করে সূচক করা হয় ।

flipসি থেকে অক্টেভের সাথে মাত্রাগুলির ক্রমটি মানিয়ে নিতে দুটি ক্রিয়াকলাপ প্রয়োজন।


পুনরায় আকারের দ্বিতীয় যুগল বন্ধনী কেন সেই সিনট্যাকটিক নয়?
Abr001am

@ আগওয়া 1001 আপনি কি দ্বিতীয় যুগের পরে বোঝাচ্ছেন reshape? এটি মাতলাব-তে সিনট্যাকটিক নয়, তবে অক্টাভেতে গৃহীত। এটি একটি সূচক হিসাবে কাজ করে
লুইস মেন্ডো

ওহ অক্টোব !! জ্ঞানার্জনের জন্য মাতলাব, থা, কে-এর চেয়ে এটি অবশ্যই ভাল এবং আরও অর্গনোমিক হতে হবে।
Abr001am

@ আগওয়া 1001 এটি কিছুটা বিভ্রান্তির কারণও হতে পারে , যদিও
লুইস মেন্ডো

উদাহরণ কোডে বেনাম ফাংশনগুলির জন্য একটি পরামর্শ: আমি @(...) ...আমার কোডের প্রথম লাইনে ব্যবহার করি, তারপরে f = ans;দ্বিতীয়টিতে। এটি প্রথম লাইনের দৈর্ঘ্য প্রতিবেদনের বাইটের সংখ্যার সমান করে।
বিয়ার্স

3

সিজেম, 7 বাইট

0q~z+:b

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

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

0        e# Push 0 on the stack.
 q       e# Read and push all input, e.g., "[[10 10 4 62 7] [1 2 3 4 5]]".
  ~      e# Eval, pushing [[10 10 4 62 7] [1 2 3 4 5]].
   z     e# Zip, pushing [[10 1] [10 2] [4 3] [62 4] [7 5]].
    +    e# Concatenate, pushing [0 [10 1] [10 2] [4 3] [62 4] [7 5]]
     :b  e# Reduce by base conversion.
         e# [10 1] in base    0 is    0 * 10 + 1 = 1.
         e# [10 2] in base    1 is    1 * 10 + 2 = 12.
         e# [ 4 3] in base   12 is   12 *  4 + 3 = 51.
         e# [62 4] in base   51 is   51 * 62 + 4 = 3166.
         e# [ 7 5] in base 3166 is 3166 *  7 + 5 = 22167.

আমাদের একটি সুযোগ দিন, ডেনিস! : ডি
হাইপারনিউট্রিনো

2

হাস্কেল, 47 বাইট

দুটি সমান দৈর্ঘ্যের সমাধান:

s(a:b)(x:y)=a*product y:s b y
s _ _=[]
(sum.).s

যেমন বলা হয়: ((sum.).s)[4,2][5,10]

এখানে একটি ইনফিক্স সংস্করণ রয়েছে:

(a:b)&(x:y)=a*product y:b&y
_ & _=[]
(sum.).(&)

2

অক্টেভ, 47 / 43 /31 বাইট

@(d,i)sub2ind(flip(d),num2cell(flip(i+1)){:})-1

এটি এখানে পরীক্ষা করুন

এটি বলার পরে, যেমন এটি একটি মন্তব্যে জিজ্ঞাসা করা হয়েছিল , 1-ভিত্তিক সূচকগুলি যখন ভাষা ব্যবহার করা স্বাভাবিক তখন এটি ঠিক ছিল। এই ক্ষেত্রে, আমরা 4 বাইট সংরক্ষণ করতে পারি:

@(d,i)sub2ind(flip(d),num2cell(flip(i)){:})

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

@(d,i)sub2ind(d,num2cell(i){:})

এখানে এটি পরীক্ষা করুন


হ্যালো, এবং পিপিসিজিতে আপনাকে স্বাগতম! দুর্দান্ত উত্তর!
নন ইনি এখানে

1

গণিত, 47 বাইট

Fold[Last@#2#+First@#2&,First@#,Rest/@{##}]&

(ইউনিকোডটি ইউ + এফ 3 সি 7, বা \[Transpose]।) এর জন্য আমি এক্সপ্রেশনটি আবার ডি এন ( ডি এন -1 (⋯ ( ডি 3 ( ডি 2 এস 1 + এস 2 )) + এস 3 ) ⋯) + এস এন -1 হিসাবে আবার লিখেছি ) + এস এন । শুধু Foldউভয় তালিকার উপর ফাংশন।


1

আসলে, 13 বাইট

;pX╗lr`╜tπ`M*

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

এই প্রোগ্রামটি প্রথম ইনপুট হিসাবে সূচকগুলির তালিকা এবং দ্বিতীয় ইনপুট হিসাবে মাত্রাগুলির তালিকা গ্রহণ করে।

ব্যাখ্যা:

;pX╗lr`╜tπ`M*
;pX╗            push dims[1:] to reg0
    lr`   `M    map: for n in range(len(dims)):
       ╜tπ        push product of last n values in reg0
            *   dot product of indices and map result

1

র্যাকেট 76 বাইট

(λ(l i(s 0))(if(null? i)s(f(cdr l)(cdr i)(+ s(*(car i)(apply *(cdr l)))))))

Ungolfed:

(define f
  (λ (ll il (sum 0))
    (if (null? il)
        sum
        (f (rest ll)
           (rest il)
           (+ sum
              (* (first il)
                 (apply * (rest ll))))))))

পরীক্ষামূলক:

(f '(5 10) '(4 2))
(f '(10 10 4 62 7) '(1 2 3 4 5))
(f '(5 1 10) '(3 0 7))

আউটপুট:

42
22167
37

0

সি #, 73 বাইট

d=>i=>{int n=d.Length,x=0,y=1;for(;n>0;){x+=y*i[--n];y*=d[n];}return x;};

পরীক্ষার কেস সহ সম্পূর্ণ প্রোগ্রাম:

using System;

namespace IndexOfAMultidimensionalArray
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int[],Func<int[],int>>f= d=>i=>{int n=d.Length,x=0,y=1;for(;n>0;){x+=y*i[--n];y*=d[n];}return x;};

            int[] dimensions, indices;
            dimensions =new int[]{5, 10};
            indices=new int[]{4,2};
            Console.WriteLine(f(dimensions)(indices));      //42

            dimensions=new int[]{10, 10, 4, 62, 7};
            indices=new int[]{1, 2, 3, 4, 5};
            Console.WriteLine(f(dimensions)(indices));      //22167

            dimensions=new int[]{5, 1, 10};
            indices=new int[]{3, 0, 7};
            Console.WriteLine(f(dimensions)(indices));      //37

            dimensions=new int[]{6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
            indices=new int[]{3, 1, 5, 5, 3, 0, 5, 2, 5, 4};
            Console.WriteLine(f(dimensions)(indices));      //33570178
        }
    }
}

0

পার্ল 6, 39 বাইট

->\d,\i{sum i.map:{[×] $_,|d[++$ ..*]}}

এখানে একটি বরং নিষ্পাপ গল্ফ, সবেমাত্র একটি বেনামে সাব।

পার্ল 6 এর একটি বেনামি রাষ্ট্র পরিবর্তনশীল রয়েছে $যা একটি লুপে কাউন্টার তৈরি করতে দরকারী (উদাহরণস্বরূপ, পোস্ট-ইনক্রিমেন্ট $++বা প্রাক-ইনক্রিমেন্ট ব্যবহার করে)++$ )আমি মানচিত্রের ভিতরে মাত্রা অ্যারে স্লাইসের প্রারম্ভিক সূচকটি বাড়ানোর জন্য এই রাজ্যের পরিবর্তনশীলটিকে প্রাক-বর্ধন করি।

এখানে একটি অদ্বিতীয় ফাংশন যা উপ-তালিকা তৈরি করে

sub md-index(@dim, @idx) {
    @idx.map(-> $i { $i, |@dim[++$ .. *] })
}
say md-index([10, 10, 4, 62, 7], [1, 2, 3, 4, 5]);
# OUTPUT: ((1 10 4 62 7) (2 4 62 7) (3 62 7) (4 7) (5))

তারপরে এটি কেবল গুণ ( ×) অপারেটরের সাথে উপ-তালিকা হ্রাস sumকরার এবং ফলাফলগুলি আনার বিষয়।

sub md-index(@dim, @idx) {
    @idx.map(-> $i { [×] $i, |@dim[++$ .. *] }).sum
}
say md-index([10, 10, 4, 62, 7], [1, 2, 3, 4, 5]);
# OUTPUT: 22167

0

পার্ল, 71 বাইট

sub{$s+=$_[1][-$_]*($p*=$_[0][1-$_])for($p=$_[0][$s=0]=1)..@{$_[0]};$s}

Ungolfed:

sub {
    my $s = 0;
    my $p = 1;

    $_[0]->[0] = 1;
    for (1 .. @{$_[1]}) {
        $p *= $_[0]->[1 - $_];
        $s += $_[1]->[-$_] * $p;
    }

    return $s;
}

0

সি ++ 17, 133 115 বাইট

ব্যবহারের জন্য -18 বাইট auto...

template<int d,int ...D>struct M{int f(int s){return s;}int f(int s,auto...S){return(s*...*D)+M<D...>().f(S...);}};

Ungolfed:

template <int d,int ...D> //extract first dimension
struct M{
 int f(int s){return s;} //base case for Sn
 int f(int s, auto... S) { //extract first index 
  return (s*...*D)+M<D...>().f(S...); 
  //S_i * D_(i+1) * D(i+2) * ... + recursive without first dimension and first index
 }
};

ব্যবহার:

M<5,10>().f(4,2)
M<10,10,4,62,7>().f(1,2,3,4,5)

বিকল্প, শুধুমাত্র ফাংশন, 116 বাইট

#define R return
#define A auto
A f(A d){R[](A s){R s;};}A f(A d,A...D){R[=](A s,A...S){R(s*...*D)+f(D...)(S...);};}

Ungolfed:

auto f(auto d){
  return [](auto s){
   return s;
  };
}
auto f(auto d, auto...D){
  return [=](auto s, auto...S){
    return (s*...*D)+f(D...)(S...);
  };
}

ব্যবহার:

f(5,10)(4,2)
f(10,10,10)(4,3,2)
f(10,10,4,62,7)(1,2,3,4,5)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.