একটি অ্যারেতে চৌম্বকীয় টান


20

পটভূমি

আমার কাছে শক্তিশালী চৌম্বকগুলির একটি সারি এবং তাদের মধ্যে ধাতব বস্তুগুলির একটি গুচ্ছ রয়েছে। চুম্বকগুলি তাদের কোথায় টানবে?

ইনপুট

আপনার ইনপুটটি অ-নেতিবাচক পূর্ণসংখ্যার অ্যারে, যাতে কমপক্ষে একটি থাকবে 1। আপনি যে কোনও যুক্তিসঙ্গত ফর্ম্যাট ব্যবহার করতে পারেন।

0অ্যারের গুলি খালি জায়গা প্রতিনিধিত্ব, এবং 1গুলি সংশোধন চুম্বক প্রতিনিধিত্ব করে। অন্য সমস্ত সংখ্যা হ'ল ধাতু বস্তু, যা চুম্বক দ্বারা টানা হয়। প্রতিটি বস্তু নিকটতম চৌম্বকের দিকে টানা হয় (যদি কোনও টাই থাকে তবে বস্তুটি ডানদিকে টানা হয়) এবং চুম্বক বা অন্য কোনও অবজেক্টটিকে আঘাত না করা পর্যন্ত এটি সেদিকে ভ্রমণ করে। শেষ পর্যন্ত, সমস্ত বস্তু চুম্বকের চারপাশে ক্লাস্টার হয়েছে। বস্তুর ক্রম সংরক্ষণ করা হয়।

আউটপুট

আপনার আউটপুটটি অ্যারে যেখানে প্রতিটি বস্তু যতটা সম্ভব নিকটতম চৌম্বকের কাছাকাছি টানা হয়েছিল। এটি ইনপুট হিসাবে একই বিন্যাস থাকা উচিত।

উদাহরণ

অ্যারে বিবেচনা করুন

[0,0,2,0,1,1,0,2,0,3,0,5,0,1,0]

বামদিকের 2প্রথম চৌম্বকটি প্রথম দিকে টানা হয়, দ্বিতীয়টির মতো 23একটি চুম্বক চার ধাপ উভয় নির্দেশাবলী মধ্যে দূরে আছে, তাই এটি ডানদিকে টানা হয়। 5এছাড়াও ডানে টানা পরার, এবং এটি মধ্যে যায় 3ও চুম্বকের। সঠিক আউটপুট হয়

[0,0,0,2,1,1,2,0,0,0,0,3,5,1,0]

বিধি এবং স্কোরিং

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন। সর্বনিম্ন বাইট গণনা জয়, এবং মান লুফোলগুলি অনুমোদিত নয়।

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

[0,1,0] -> [0,1,0]
[1,0,2,0,0,1,0] -> [1,2,0,0,0,1,0]
[7,0,5,0,0,1,0] -> [0,0,0,7,5,1,0]
[1,0,3,0,1,0,3,0,1] -> [1,0,0,3,1,0,0,3,1]
[1,0,0,0,0,0,0,7,3] -> [1,7,3,0,0,0,0,0,0]
[1,2,3,4,5,6,7,8,9,10,11,0,0,0,1] -> [1,2,3,4,5,6,7,0,0,0,8,9,10,11,1]
[12,3,0,0,1,0,1,3,0,0,6,12,0,0,0,1] -> [0,0,12,3,1,0,1,3,6,0,0,0,0,0,12,1]

উত্তর:


7

Pyth, 28 20

o@.e?bhaDk_x1QkQ~hZQ

Ho বাইট গল্ফ করার জন্য থমাসকওয়া ধন্যবাদ!

তালিকার নিকটতম 1 (ডানদিকে 1 টি ভাঙা বন্ধন) এর সূচকে 1 বা তারও বেশি মানগুলিকে নির্ধারিত করে এবং এই মানগুলি অনুসারে তালিকাটি বাছাই করে এই আপত্তিগুলি স্থিতিশীল বাছাই করে। জিরোগুলিকে তাদের সাজানোর মান হিসাবে নিজস্ব সূচক দেওয়া হয়।

পরীক্ষা স্যুট

যাচাই স্যুট

ব্যাখ্যা:

o@.e?bhaDk_x1QkQ~hZQ  ##  implicit: Q = eval(input())
o                  Q  ##  Sort Q using the values of the lambda below
 @              ~hZ   ##  select the value from the matching index of the enumerate
  .e           Q      ##  enumerate with b = value, k = index
    ?b                ##  ternary on b
      haDk_x1Q        ##  if true, this thing
              k       ##  otherwise use the index as the sort weight
          _x1Q        ##  the indices of 1 in Q, given in reverse order 
                      ##  (the reverse makes it sort to the right because of stable sorts)
       aDk            ##  sort those indices by |index - k|
      h               ##  take the first value

উদাহরণ:

[1,0,3,0,1,0,3,0,1]উদাহরণস্বরূপ, পরীক্ষার কেসটি ধরুন । যখন আমরা গণনাটি প্রয়োগ করি, শূন্যরা সকলেই একটি নিজস্ব বাছাই মান হিসাবে একটি সূচক পাবেন, তাই আমি সেগুলি এড়িয়ে যাব এবং একটি এবং একটি তিনটি করব।

প্রথম এক, আমরা বেশী সূচকের পাবেন: [0, 4, 8]। তারপরে এটি বিপরীত করুন এবং সূচকগুলির পরম মানের অনুসারে বাছাই করুন সূচকটি একটির সূচক, যা এখানে শূন্য হয়। সুতরাং আমরা [0, 4, 8]আবার ফিরে পেতে । প্রথম মানটি 0তাই আমরা এটি ব্যবহার করি।

তিনটির জন্য, আমরা বিপরীত সূচকগুলি পাই এবং একইভাবে বাছাই করি তবে দুটিকে তিনটির সূচক হিসাবে ব্যবহার করি, সুতরাং উভয় 0এবং উভয়ই 4পরম পার্থক্যের জন্য একই মান দেয়, তাই আমরা পাই: [4, 0, 8]এবং আমরা এটি নিই 4

তারপরে চূড়ান্ত "বাছাইয়ের মানগুলি" অ্যারে হবে [0, 1, 4, 3, 4, 5, 8, 7, 8]। স্থিতিশীল বাছাই করার জন্য ধন্যবাদ, মানগুলি মূলত প্রদর্শিত হয়েছিল এমন ক্রমের সাথে সম্পর্কগুলি ভেঙে গেছে, তাই আমরা আমাদের চূড়ান্ত অ্যারেটি পাই।


নিকটতমের সূচক অনুসারে বাছাই করা 1একটি দুর্দান্ত ধারণা!
জাগারব

4

রেটিনা , 97 72 বাইট

+`(?<=\b1(,1*)*?)(\B,(11+)|,(11+))\b(?!(?<-1>,1*)*,1\b)|(11+),\B
$3,$4$5

ইনপুটটি অবিচ্ছিন্ন পূর্ণসংখ্যার (যেমন [...]কাজ যেমন ঠিক আছে তেমন নেতৃস্থানীয় এবং পেছনের পেছনে ফেলে দেওয়া ) কমা-বিচ্ছিন্ন তালিকা হিসাবে প্রত্যাশিত ।

সমস্ত পরীক্ষার মামলা এখানে চালান। (সুবিধার জন্য, এটি স্বয়ংক্রিয়ভাবে থেকে দশমিক রূপান্তরটি এবং তার যত্ন নেবে))

এখানে সম্পূর্ণ ভিন্ন ধারণা যা একাধিক পর্যায় ব্যবহার করে ব্যয়বহুল ভারসাম্য গোষ্ঠীগুলি এড়িয়ে চলে। এটি বর্তমানে 6 বাইট দীর্ঘ, তবে এটি আরও গল্ফযোগ্য হতে পারে:

,1\b
>1
\b1,
1<
(T`,`<`<1*,
)T`,`>`,1*>
+`(1+>)>
>$1
+`<(<1+\b)(?!>)
$1<
<|>
,

এই চ্যালেঞ্জটি দেখার সাথে সাথেই আমি ভেবেছিলাম রেটিনা ভাল ফিট হবে (+1)
মাইকেল ক্লেইন

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

ভাল ফিট হিসাবে আমি অবিলম্বে রেটিনাতে কীভাবে সমাধান করব তা ভাবতে শুরু করি
মাইকেল ক্লেইন

3

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

a=>a.map(_=>a.map((x,i)=>x>1?a[j=(n=a.indexOf(1,i))<0|n-i>i-p?i-1:i+1]?0:a[a[i]=0,j]=x:x<1?0:p=i,p=-1/0))&&a

ব্যাখ্যা

প্রতিটি কক্ষের উপরে আইট্রেট করা হয় এবং এটিতে ধাতব উপস্থিতি থাকলে নিকটতম চৌম্বকের দিকের পরবর্তী ঘরটি খালি রয়েছে কিনা তা পরীক্ষা করে এবং এটি যদি থাকে তবে এটি সেখানে স্থানান্তরিত করে। সমস্ত ধাতু যতদূর যেতে পারে ততক্ষণ এই প্রক্রিয়াটি বহুবার পুনরাবৃত্তি হয়।

var solution =

a=>
  a.map(_=>                  // loop a.length times to ensure completeness
    a.map((x,i)=>            // for each cell item x at index i
      x>1?                   // if the cell contains metal
        a[j=                 // j = index of cell to move to
          (n=a.indexOf(1,i)) // n = index of next magnet
          <0|n-i>i-p?i-1:i+1 // set j to previous or next cell based on closest magnet
        ]?0:                 // if cell j is empty
          a[a[i]=0,j]=x      // set it to x and set cell i to 0
      :x<1?0:                // else if the cell contains a magnet
        p=i,                 // set p to the index of this magnet
      p=-1/0                 // p = index of previous magnet, initialise to -Infinity
    )
  )
  &&a                        // return a
<input type="text" id="input" value="1,2,3,4,5,6,7,8,9,10,11,0,0,0,1" />
<button onclick="result.textContent=solution(input.value.split(',').map(n=>+n))">Go</button>
<pre id="result"></pre>


2

পিএইচপি, 337 অক্ষর

<?$i=explode(",",$argv[1]);$m=$n=[];foreach($i as$k=>$v)if($v>0)eval("array_push(\$".($v<2?"m":"n").",$k);");for($p=0;$p<count($i);$p++)foreach($i as$k=>$v)if($v>1){$i[$k]=0;$r=-1;foreach($m as$_)if($r<0||abs($k-$r)>abs($_-$k))$r=$_;while($i[$r]>0)$r+=($r<$k?1:-1);$i[$r]=$v;}$s="";foreach($i as$v)$s.=$v.",";echo substr($s,0,-1)."\n";?>

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

এছাড়াও একটি ছোট বাগ বৈশিষ্ট্য রয়েছে যা মনে করে, তাই উদাহরণস্বরূপ এখানে:

root@raspberrypi:~/stack# php magnet.php 12,3,0,0,1,0,1,3,0,0,6,12,0,0,0,1
0,0,3,12,1,0,1,3,6,0,0,0,0,0,12,1

দেখে মনে হচ্ছে 12 টি যাদুতে 3 এর সামনে এসেছে তবে এটি সত্য নয়!

3টি বৃহত্তর সংখ্যাকে সম্মান করে এবং এটিকে ম্যাগেজের কাছাকাছি যেতে দেয়!

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