একটি ফাংশন লিখুন যা 4 টি দিকনির্দেশিত সংলগ্ন (x, y) এর সাথে সমস্ত বৈধ পয়েন্টগুলির একটি পুনরাবৃত্ত বস্তু ফেরত দেয়


17

সাধারণভাবে অ্যালগরিদম ক্লাস এবং কম্পিউটার বিজ্ঞানের একটি খুব সাধারণ প্রয়োজন হ'ল গ্রিড বা ম্যাট্রিক্সের (যেমন বিএফএস বা ডিএফএসে) মাধ্যমে 4-দিকনির্দেশে পুনরাবৃত্তি করা। এটি প্রায়শই লুপগুলির মধ্যে প্রচুর গাণিতিক এবং তুলনা সহ প্রচুর আড়ম্বরপূর্ণ এবং ভার্বোজ কোডের ফলাফল বলে মনে হয়। আমি এটির জন্য অনেকগুলি ভিন্ন পদ্ধতি দেখেছি, তবে এই অনুভূতিটি কাঁপতে পারি না যে এটি করার আরও একটি সংক্ষিপ্ত উপায় আছে।

চ্যালেঞ্জটি হ'ল একটি খাঁটি ফাংশন লিখুন n, mযা বিন্দুতে উত্পন্ন একটি সীমাবদ্ধ সমতলের প্রস্থ এবং উচ্চতা (0,0)এবং (x,y)যে স্থানাঙ্কগুলি যে বিমানের অভ্যন্তরে যে কোনও বৈধ পয়েন্ট উপস্থাপন করতে পারে, বিমানের মধ্যে সমস্ত পয়েন্টের একটি পুনরাবৃত্ত বস্তুটি 4-দিকনির্দেশিত করে দেয় সংলগ্ন (x,y)

লক্ষ্যটি হ'ল সেই ফাংশনটিকে যতটা সম্ভব কম বাইটে সংজ্ঞায়িত করা।

বৈধ ইনপুট / আউটপুট চিত্রিত করতে সহায়তা করার জন্য কয়েকটি উদাহরণ:

n = 5 (y-axis), m = 3 (x-axis) (zero-based)

matrix = [
    [A, B, C],
    [D, E, F],
    [G, H, I],
    [J, K, L],
    [M, N, O],
]

(x, y) => [valid iterable points]

E: (1, 1) => [(1, 0), (2, 1), (1, 2), (0, 1)]
A: (0, 0) => [(1, 0), (0, 1)]
L: (2, 3) => [(2, 2), (2, 4), (1, 3)]
N: (1, 4) => [(1, 3), (2, 4), (0, 4)]
n = 1 (y-axis), m = 1 (x-axis) (zero-based)

matrix = [
    [A],
]

(x, y) => [valid iterable points]

A: (0, 0) => []
n = 2 (y-axis), m = 1 (x-axis) (zero-based)

matrix = [
    [A],
    [B],
]

(x, y) => [valid iterable points]

A: (0, 0) => [(0, 1)]
B: (0, 1) => [(0, 0)]

এবং শর্তগুলি সন্তুষ্ট করে এমন একটি ফাংশনের উদাহরণ (পাইথনের এটি একটি) এখানে রয়েছে:

def four_directions(x, y, n, m):
    valid_coordinates = []
    for xd, yd in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
        nx, ny = x + xd, y + yd
        if 0 <= nx < m and 0 <= ny < n:
            valid_coordinates.append((nx, ny))
    return valid_coordinates

উপরের উদাহরণটি একটি নামযুক্ত ফাংশন সংজ্ঞায়িত করেছে, তবে বেনামে ফাংশনগুলিও গ্রহণযোগ্য।

ইনপুটগুলি n, m, x, yনিম্নলিখিত রেঞ্জগুলির মধ্যে সমস্ত স্বাক্ষরযুক্ত 32-বিট পূর্ণসংখ্যা:

n > 0
m > 0
0 <= x < m
0 <= y < n

আউটপুট অবশ্যই (x, y) জোড়ার জোড় (তবে আপনার পছন্দের ভাষা এটি নির্ধারণ করে) এর রূপ নিতে হবে।

অতিরিক্ত স্পষ্টতা:

জটিল সংখ্যা (এবং অন্যান্য উপস্থাপনা / সিরিয়ালাইজেশন) ঠিক আছে যতক্ষণ না পুনরাবৃত্তির গ্রাহক অ্যাক্সেস করতে পারে xএবং yকেবলমাত্র তাদের অবস্থান জেনে পূর্ণসংখ্যার হিসাবে।

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


6
সাইটে স্বাগতম! এই চ্যালেঞ্জটি আমাদের মানদণ্ড অনুসারে বেশ ভাল, তবে এখানে বেশ কয়েকটি জিনিস রয়েছে যা আমাদের শৈলীর বিপরীতে। একটির জন্য আমরা অনেকগুলি চ্যালেঞ্জগুলি পছন্দ করি যা সম্ভব হলে কোনও একক ভাষার মধ্যে সীমাবদ্ধ নয়। সবাই যখন প্রতিযোগিতা করতে পারে তখন অনেক মজা হয় is আমরা সাধারণত বাইটগুলিতে অক্ষরগুলির বিপরীতে কোড-গল্ফ স্কোর করি , বেশিরভাগ উদ্দেশ্যগুলির জন্য সেগুলি একই হয় তবে উত্তরগুলি অক্ষরগুলিতে স্কোর করা হলে আপনি করতে পারেন এমন বেশ কয়েকটি প্রতারণামূলক জিনিস রয়েছে। আশা করি আপনি এখানে মজা পাবেন!
পোস্ট রক গার্ফ হান্টার

আমরা গ্যারান্টিযুক্ত যে (x,y)নিজেই আয়তক্ষেত্রের মধ্যে আছে, তাই না?
xnor

4
ডিফল্টরূপে, সিজিসিসি সম্পূর্ণ কর্মসূচির পাশাপাশি জমা দেওয়ার মতো ফাংশনগুলিকে মঞ্জুরি দেয়। এটি যে ভাষাগুলির অগত্যা ফাংশনগুলির ধারণাগুলিও প্রতিদ্বন্দ্বিতা করতে পারে তা মঞ্জুরি দেয়
জো কিং

3
একটি আউটপুট কোনও কোড অবজেক্টের চেয়ে STDOUT এ হবে। এটি সাধারণত পরিষ্কার ডিলিমিটারগুলির সাথে কোনও আউটপুট হতে পারে তাই এটি দ্ব্যর্থহীন এবং ডিফল্ট স্ট্যান্ডার্ড আউটপুট ফর্ম্যাটগুলি
জো কিং

2
পূর্ণসংখ্যা টিউপসগুলির চেয়ে জটিল সংখ্যা হিসাবে স্থানাঙ্কগুলির প্রতিনিধিত্ব করার অনুমতি দেওয়া কি?
জোয়েল

উত্তর:


12

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

lambda m,n,x,y:[(x-1,y),(x+1,y)][~x:m-x]+[(x,y-1),(x,y+1)][~y:n-y]

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

চারটি প্রতিবেশী তালিকাবদ্ধ করুন, তারপরে সীমার বাইরে থাকাগুলিকে সরাতে তালিকা স্লাইসিং ব্যবহার করুন।


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

lambda m,n,x,y:[(k/n,k%n)for k in range(m*n)if(k/n-x)**2+(k%n-y)**2==1]

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

চারটি প্রতিবেশীর মধ্যে কোনটি আন্তঃসীমান্ত রয়েছে তা যাচাই করার পরিবর্তে, আমরা প্রতিবেশী তাদের জন্য সমস্ত আন্তঃসীমান্ত পয়েন্টগুলি পরীক্ষা করার ধীরতম পদ্ধতিটি করি, যার ইউক্যালিডিয়ান দূরত্ব ঠিক 1 থেকে (x,y)। আমরা গ্রিডের উপরে পুনরাবৃত্তি করতে ক্লাসিক ডিভ-মোড ট্রিকটিও ব্যবহার করি, যেমন দুটি লুপ লেখার প্রয়োজন সংরক্ষণ করে for i in range(m)for j in range(n)

আমি দূরত্বের শর্তটি লেখার জন্য জটিল গাণিতিকটি ব্যবহার করার চেষ্টা করেছি, তবে এটি লেখার জন্য আরও দীর্ঘ হয়েছে abs((k/n-x)*1j+k%n-y)==1


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

lambda m,n,x,y:[(x+t/3,y+t%3-1)for t in-2,0,2,4if m>x+t/3>=0<y+t%3<=n]

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


11
অভিনন্দন 100k!
আর্নল্ড

4

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

এটি জ্যামিতিক পদ্ধতির ব্যবহার করে: প্রথমে আমরা পছন্দসই আকারের শূন্যগুলির একটি ম্যাট্রিক্স তৈরি করি এবং 1পছন্দসই স্থানে সেট করি । তারপরে আমরা কার্নেলের সাথে সমঝোতা করি

[0, 1, 0]
[1, 0, 1]
[0, 1, 0]

যা মূল পয়েন্টের 4-প্রতিবেশী ব্যক্তিদের সাথে একই আকারের একটি নতুন ম্যাট্রিক্স তৈরি করে। তারপরে আমরা find()এই নতুন ম্যাট্রিক্সের ননজারো এন্ট্রিগুলির সূচকগুলি।

function [i,j]=f(s,a,b);z=zeros(s);z(a,b)=1;[i,j]=find(conv2(z,(v=[1;-1;1])*v'<0,'same'));

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

প্রত্যয় সাফল্যের মূল চাবিকাঠি।


4
প্রকৃতপক্ষে এটি হ'ল ফন্টটি যত ছোট হোক না কেন
লুইস মেন্ডো

3

ওল্ফ্রাম ভাষা (গণিত) , 42 বাইট

Cases[List~Array~#2,a_/;Norm[a-#]==1,{2}]&

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

1-ইনডেক্সড (যা ইনডেক্সিংয়ের জন্য ম্যাথমেটিকার সম্মেলন অনুসরণ করে)। হিসাবে ইনপুট লাগে {x,y}, {m,n}


0-ইনডেক্সড I / O, 45 বাইটের জন্য :

Cases[Array[List,#2,0],a_/;Norm[a-#]==1,{2}]&

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


3

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

বিরক্তিকর পদ্ধতির

(h,w,x,y)=>[x&&[x-1,y],~x+w&&[x+1,y],y&&[x,y-1],++y-h&&[x,y]].filter(_=>_)

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


জাভাস্ক্রিপ্ট (নোড.জেএস) , 74 বাইট

কম বিরক্তিকর তবে ঠিক দীর্ঘ। হিসাবে ইনপুট লাগে ([h,w,x,y])

a=>a.flatMap((_,d,[h,w,x,y])=>~(x+=--d%2)*~(y+=--d%2)&&x<w&y<h?[[x,y]]:[])

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


জাভাস্ক্রিপ্ট (ভি 8) , 67 বাইট

যদি সমস্ত স্ট্যান্ডার্ড আউটপুট পদ্ধতির অনুমতি দেওয়া হয় তবে আমরা কেবল সহ বৈধ স্থানাঙ্কগুলি মুদ্রণ করতে পারতাম:

(h,w,x,y)=>{for(;h--;)for(X=w;X--;)(x-X)**2+(y-h)**2^1||print(X,h)}

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


2

জেলি ,  13  12 বাইট

2ḶṚƬNƬẎ+⁸%ƑƇ

একটি ডায়াডিক লিংক বামদিকে দুটি (0-সূচিযুক্ত) [row, column]এবং একটি ডানদিকে দুটি পূর্ণসংখ্যার [height, width]তালিকা গ্রহণ করে, যা পূর্ণসংখ্যার তালিকার একটি তালিকা দেয় [[adjacent_row_1, adjacent_column_1], ...],।

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

কিভাবে?

2ḶṚƬNƬẎ+⁸%ƑƇ - Link: [row, column]; [height, width]   e.g. [3,2]; [5,3] (the "L" example)
2            - literal 2                                   2
 Ḷ           - lowered range                               [0,1]
   Ƭ         - collect up while distinct, applying:
  Ṛ          -   reverse                                   [[0,1],[1,0]]
     Ƭ       - collect up while distinct, applying:
    N        -   negate                                    [[[0,1],[1,0]],[[0,-1],[-1,0]]]
      Ẏ      - tighten                                     [[0,1],[1,0],[0,-1],[-1,0]]
        ⁸    - chain's left argument ([row, column])       [3,2]
       +     - add (vectorises)                            [[3,3],[4,2],[3,1],[2,2]]
           Ƈ - filter keep if:
          Ƒ  -   is invariant under:
         %   -     modulo ([height, width]) (vectorises)    [3,0] [4,2] [3,1] [2,2]
             - (...and [3,0] is not equal to [3,3] so ->)  [[4,2],[3,1],[2,2]]

আপনি প্রতিস্থাপন করতে পারেন ḶṚƬসঙ্গে Ṭ€2ḶṚƬNƬẎপ্রত্যাবর্তনকালে [[0, 1], [1, 0], [0, -1], [-1, 0]], 2Ṭ€NƬẎফেরত আসে [[1], [0, 1], [-1], [0, -1]]এবং যেহেতু সিলেটলেটগুলি মোড়ানো থাকে, +কেবল তাদের জন্য প্রথম উপাদানটি ভেক্টরাইজ করে, তাই তারা তাদের দ্বিতীয় উপাদান হিসাবে 0(যুক্ত পরিচয়) চিহ্নিত করে। ফলস্বরূপ, কেবলমাত্র আউটপুট ক্রম পরিবর্তন হতে পারে।
এরিক আউটগল্ফার

2

পার্ল 6 , 56 49 বাইট

-7 বাইট ধন্যবাদ নওহেলহোফকে!

{grep 1>(*.reals Z/@^b).all>=0,($^a X+1,-1,i,-i)}

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

অ্যারে বাউন্ডসটি 0 এবং 1 এর মধ্যে বিভক্ত হয় কিনা তা যাচাই করে বাউন্ডস এলিমেন্টের বাইরে চলে যায়। জটিল সংখ্যার মাধ্যমে ইনপুট এবং আউটপুট নেয় যেখানে আসল অংশটি xস্থায়ী হয় এবং কাল্পনিক y। আপনি এগুলি .imএবং .reফাংশনগুলির মাধ্যমে এগুলি বের করতে পারেন ।



পছন্দ করুন আমি এটা উপর নির্মাণ করা চাই ভালো কিছু করতে এই , কিন্তু divকাজ বলে মনে হচ্ছে না Numগুলি
জো রাজা

(*.reals>>.Int Zdiv@^b).noneবা (*.reals Z/@^b)>>.Int.noneকাজ করবে তবে ইন্টার-কাস্টটি খুব ব্যয়বহুল বলে মনে হচ্ছে।
nwellnhof

1

জে , 30 29 28 বাইট

(([+.@#~&,1=|@-)j./)~j./&i./

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

কিভাবে:

  • ডান হাত ঘুরিয়ে দিন m এক্স nআর্গটিকে জটিল সংখ্যার গ্রিডে পরিণত করুনj./&i./
  • বাম আর্গুমেন্টের জন্য একই (আমাদের পয়েন্ট) j./
  • আমাদের পয়েন্ট এবং গ্রিডের দূরত্ব হ'ল যেখানে একটি মাস্ক তৈরি করুন 1=|@-
  • উভয় সমতল করার পরে, গ্রিড ফিল্টার করতে এটি ব্যবহার করুন #~&,
  • ফলটিকে বাস্তব পয়েন্টগুলিতে ফিরিয়ে দিন +.@

0

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 91 বাইট

(a,b,x,y)=>new[]{(x+1,y),(x-1,y),(x,y+1),(x,y-1)}.Where(d=>((x,y)=d,p:x>=0&x<a&y>=0&y<b).p)

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

বিকল্পভাবে:

(a,b,x,y)=>new[]{(x+1,y),(x-1,y),(x,y+1),(x,y-1)}.Where(d=>((x,y)=d).Item1>=0&x<a&y>=0&y<b)

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


0

কাঠকয়লা , 29 বাইট

Jθη#FIζFIε«Jικ¿№KV#⊞υ⟦ικ⟧»⎚Iυ

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ক্রম x, y, প্রস্থ, উচ্চতাতে ইনপুট নেয়। ব্যাখ্যা:

Jθη#

#প্রদত্ত অবস্থানে একটি মুদ্রণ করুন ।

FIζFIε«

প্রদত্ত আয়তক্ষেত্রের উপর লুপ করুন।

Jικ

বর্তমান অবস্থানে ঝাঁপ দাও।

¿№KV#⊞υ⟦ικ⟧

যদি কোনও সংলগ্ন থাকে #তবে অবস্থানটি সংরক্ষণ করুন।

»⎚Iυ

লুপের শেষে আবিষ্কারকৃত অবস্থানগুলি আউটপুট করুন।

বিরক্তিকর উত্তর:

FIζFIε¿⁼¹⁺↔⁻ιIθ↔⁻κIηI⟦ικ

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। গাণিতিকভাবে সংলগ্ন অবস্থানগুলি সন্ধান করে কাজ করে।


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