ประเมินดัชนีของพิกัดหลายมิติ


9

มีการรวบรวมชุดพิกัด N ขนาดไว้ ตัวอย่างด้านล่าง:

{2,3,4}

นี่อาจเป็นอาร์เรย์ 3 มิติที่มี 2x's, 3y และ 4z's; อาจมีจำนวนมิติใด ๆ ในตัวอย่างมีทั้งหมด 24 โหนด แต่ละโหนดสามารถทำดัชนีโดยใช้ {x, y, z} ในการเข้าถึงโหนดลำดับที่ 5 ดัชนีที่ระบุจะเป็น {0, 1, 0} ตามตารางด้านล่าง

## | x y z
     0 1 2
-----------
0  | 0 0 0
1  | 0 0 1
2  | 0 0 2
3  | 0 0 3
4  | 0 1 0
5  | 0 1 1
6  | 0 1 2
7  | 0 1 3
8  | 0 2 0
...
23 | 1 2 3

วัตถุประสงค์ของแอปพลิเคชั่นนี้คือทำงานย้อนหลังเพื่อกำหนดดัชนีหากกำหนดหมายเลขโหนด

หากถูกถามถึงดัชนี "y" ของโหนดที่ 8 โปรแกรมควรพิมพ์ "2"

ด้วยอินพุตที่ให้ไว้:

{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>

ควรพิมพ์สิ่งต่อไปนี้:

2

คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลจะถูกจัดเตรียมอย่างสะดวกในภาษาที่คุณเลือกและไม่จำเป็นต้องตรวจสอบขอบเขต ตัวอย่างเช่นคุณอาจสมมติว่าดัชนีที่เลือกไว้ ("y" ในตัวอย่าง) นั้นใช้ได้กับพิกัดที่ให้ไว้ คุณอาจใช้การจัดทำดัชนีตาม 0 หรือ 1 ตัวอย่างเข้าใจ 0 ตาม

นี่เป็นสิ่งที่ตรงกันข้ามกับคำถามนี้: ดัชนีของอาร์เรย์หลายมิติ


1
อาจเพิ่มบางกรณีทดสอบ
Luis Mendo

1
เราสามารถปล่อยให้พิกัดวิ่งจาก 1 ถึง x แทนที่จะเป็น 0 ถึง x-1 ได้ไหม? ดังนั้นโหนด # 0 จะเป็น (1,1,1) และโหนด # 23 (2,3,4)
nimi

@nimi ใช่การจัดทำดัชนี 1 รายการนั้นใช้ได้
Mark Johnson

คำตอบ:


4

MATL , 8 ไบต์

PiX[vPi)

สิ่งนี้ใช้การจัดทำดัชนีแบบอิง 1 สำหรับโหนดและขนาด ดังนั้นโหนดแรก1, 2ฯลฯ ; และมิติ "x" คือ1"y" 2เป็นต้น

ลองออนไลน์!

คำอธิบาย

กุญแจสำคัญคือการใช้ฟังก์ชั่นX[(ตรงกับind2subใน Matlab หรือ Octave) ซึ่งจะแปลงดัชนีเชิงเส้นเป็นดัชนีหลายมิติ อย่างไรก็ตามลำดับของมิติถ้าตรงกันข้ามตรงตามที่กำหนดไว้ในความท้าทายดังนั้นP( flip) จำเป็นต้องมีก่อนเรียกใช้ฟังก์ชันและอีกครั้งหลังจากเชื่อมต่อ ( v) ouputs

P    % Implicit input: size as a row vector. Flip
i    % Input: node (linear) index
X[   % Convert from linear index to multidimensional indices. Produces
     % as many outputs as entries there are in the size vector
v    % Concatenate all outputs into a column vector
P    % Flip
i    % Input: dimension
)    % Index: select result for that dimension. Implicitly display

3

Haskell , 45 ไบต์

(#)[2,3,4]#8$1ใช้เวลาสามข้อโต้แย้งและส่งกลับจำนวนเต็มใช้เป็น

l#n=(zipWith mod(scanr(flip div)n$tail l)l!!)

ลองออนไลน์!

มันทำงานอย่างไร

  • lคือรายการของพิกัดnหมายเลขโหนด เป็นฟังก์ชันที่ใช้ดัชนีสุดท้ายl#ni
  • ได้รับรายการตัวอย่าง[2,3,4]และโหนดแรกหางรายการที่จะนำมาให้8 [3,4]แล้วนี้เป็นscanned จากright, dividing [0,2,8]จำนวนโหนดโดยแต่ละองค์ประกอบต่อเนื่องให้รายการ
  • จากนั้นรายการ[0,2,8]และเดิมl=[2,3,4]จะzipped ประกอบลัสให้withmod[0,2,0]
  • ในที่สุด!!ผู้ประกอบการทำดัชนีรายชื่อจะถูกนำไปใช้บางส่วนพร้อมกับฟังก์ชั่นผลลัพธ์พร้อมที่จะได้รับดัชนีสุดท้าย

3

APL (Dyalog Classic) 5 ไบต์

⎕⌷⎕⊤⎕

ไม่คุณไม่พลาดแบบอักษร นั่นคือวิธีที่มันควรจะดู

นี่เป็นโปรแกรม REPL ที่รับอินพุตจาก STDIN: หมายเลขโหนดขนาดและดัชนี (ตามลำดับนั้น) หลังสามารถ 0- หรือ 1 ⎕IOตามขึ้นอยู่กับมูลค่าของ

ลองออนไลน์!

มันทำงานอย่างไร

การทำดัชนีอาเรย์หลายมิติเป็นการแปลงฐานที่ผสมกันเป็นหลักดังนั้นสิ่งที่ส่วนแรกของความท้าทายจะถาม การเกิดขึ้นของการอ่านแต่ละครั้งและ evals บรรทัดจาก STDIN ดังนั้น

        
⎕:
      8
⎕:
      2 3 4
0 2 0

ในที่สุดใช้องค์ประกอบที่ดัชนีที่ระบุ ซ้ายสุดอ่านอินพุตที่สามและอินพุตสุดท้ายจาก STDIN และ

        (0 2 0)
⎕:
      1
2

การแปลงฐานผสมกันอีกครั้ง!
Adám

3

Haskell, 38 30 29 28 ไบต์

l#n=(mapM(\x->[1..x])l!!n!!)

สิ่งนี้ใช้ดัชนีและพิกัดแบบอิง 0 เริ่มต้นที่ 1 ลองออนไลน์!

เปิดมิติแต่ละxของท่านลงในรายการ[1..x]เช่น-> [2,3,4] ทำรายการ n-tuples ที่เป็นไปได้ทั้งหมดโดยที่องค์ประกอบแรกถูกนำมาจากรายการแรก ฯลฯ สองครั้งเพื่อจัดทำดัชนี n-tuple และส่วนข้อมูล[[1,2],[1,2,3],[1,2,3,4]]mapM!!

แก้ไข: @ Ørjan Johansen บันทึกแล้ว8 9 ไบต์ ขอบคุณ!


โอวฉลาด! mapM id.map f=mapM fแต่ และ(`take`[0..])จะสั้นกว่า
Ørjan Johansen

@ ØrjanJohansen: 8 ไบต์นั่นมันใหญ่มาก! ขอบคุณมาก! ยังคงรอคำตอบของ OP หากอนุญาตให้ใช้พิกัด 1 ตำแหน่ง
nimi

นอกจากนี้l#n=(mapM(`take`[0..])l!!n!!)จะสั้นกว่า (บังเอิญคุณไม่ต้องการf=ฟังก์ชั่นสามารถระบุชื่อได้โอ้ฉันเดาว่าคุณไม่ได้นับมัน)
Ørjan Johansen

@ ØrjanJohansen: ขอบคุณอีกครั้ง f=เป็นสำเนาและวางข้อผิดพลาดจาก TIO
nimi

2

Brachylogขนาด25 23 ไบต์

tT&bhH&h{>ℕ}ᵐ:H≜ᶠ⁾t:T∋₎

ลองออนไลน์!

อาร์กิวเมนต์ที่สองคือ 1-indexed และอีก 2 เป็น 0 ดัชนี

คำอธิบาย

tT                          Input = [_, _, T]
  &bhH                      Input = [_, H, T]
      &h{>ℕ}ᵐ               Create a list where each element is between 0 and the
                              corresponding element in the first element of the Input
             :H≜ᶠ⁾          Find the first H possible labelings of that list
                  t         Take the last one
                   :T∋₎     Output is the T'th element

1

Mathematica, 26 23 ไบต์

Array[f,#,0,Or][[##2]]&

การใช้การทำดัชนีแบบอิง 1 สำหรับอินพุตและการทำดัชนีแบบอิง 0 สำหรับเอาต์พุต

ทำไมOr? Flatเพราะมันเป็นที่สั้นที่สุดในตัวฟังก์ชั่นที่มีแอตทริบิวต์

ตัวอย่าง:

In[1]:= Array[f,#,0,Or][[##2]]&[{2,3,4},9,2]

Out[1]= 2

1

APL (Dyalog) 6 ไบต์

เพื่อรับการจัดทำดัชนีแบบ 0 ⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ พร้อมต์สำหรับมิติจากนั้นรายการที่อยู่ใน (โหนดประสานงาน)

⎕⊃↑,⍳⎕

ลองออนไลน์!

 แจ้งให้มีขนาด

 สร้างอาร์เรย์ของรูปร่างนั้นโดยที่แต่ละไอเท็มจะเป็นi ndices สำหรับไอเท็มนั้น

, ravel (ทำรายการของดัชนี)

 แปลงระดับความลึกหนึ่งระดับเป็นระดับเพิ่มเติม

⎕⊃ พรอมต์สำหรับรายการที่อยู่ภายในของ (โหนดประสานงาน) และใช้สิ่งนั้นเพื่อเลือกองค์ประกอบจากสิ่งนั้น


1

เยลลี่ , 7 6 ไบต์

Œp⁴ị⁵ị

ลองออนไลน์!

สิ่งนี้ใช้การจัดทำดัชนีแบบ 1 สำหรับอินพุตและเอาต์พุต

มันทำงานอย่างไร

Œp⁴ị⁵ị
Œp      Cartesian product of the first input
        numbers are converted to 1-based ranges
  ⁴ị    index specified by second input
    ⁵ị  index specified by third input



0

R, 52 ไบต์

function(x,y,z,n,i)expand.grid(1:z,1:y,1:x)[n,4-i]-1

ส่งกลับฟังก์ชั่นที่ไม่ระบุชื่อ 1 ดัชนี

สำหรับตัวอย่าง expand.gridสร้างรายการ z,y,xแต่อาร์กิวเมนต์แรกจะแตกต่างกันที่เร็วที่สุดเพื่อให้เรามีการป้อนข้อมูลไว้ในลำดับที่กลับคือ จากนั้นเราสามารถจัดทำดัชนี[n,4-i]ซึ่ง4-iจำเป็นสำหรับคำสั่งกลับรายการและลบ 1 เพื่อให้แน่ใจว่าพวกเขาเรียกใช้จาก0:(x-1)ฯลฯ

ลองออนไลน์!



0

JavaScript (ES6) 44 ไบต์

(a,n,i,g=j=>a[++j]?g(j)/a[j]|0:n)=>g(i)%a[i]

Ungolfed:

(a,n,i)=>a.reduceRight(([n,...a],e)=>[n/e|0,n%e,...a],[n])[i+1]

น่าเศร้าreduceอีกต่อไปสองไบต์:

(a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i]

ดูเหมือนว่าเราจะมีความคิดเดียวกัน \ o /
Leaky Nun

@LeakyNun ก็ไม่น่าแปลกใจจริงๆเพราะวิธีการจัดทำดัชนี
Neil

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.