কারেল জে আলফাবোট সিকোয়েন্স জেনারেটর


14

স্কোর

জমাগুলি প্রবেশ করায় এই বিভাগটি পূরণ করা হবে।

সাধারণ

1. bopjesvla    Perl                54
2. edc65        Javascript (ES6)    91
3. name         language            score
4. name         language            score
5. name         language            score

বোনাস রাউন্ড

1. name   language   score
2. name   language   score
3. name   language   score
4. name   language   score
5. name   language   score

কারেল জে আলফাবোট

পটভূমি

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

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

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

যতবার আমি private void draw#প্রতিটি চরিত্রের জন্য লিখেছি #, আমি তার পরে একটি মন্তব্য যুক্ত করেছি যা আমাকে যে আদেশগুলি প্রয়োজন তার ক্রমটির সংক্ষিপ্ত বিবরণ জানাবে।

আমার নিকট আমার নীচের কমান্ডগুলি (সিউডোকোডে লিখিত) রয়েছে (স্পষ্টকরণ - এগুলি কেবলমাত্র কার্যকর আদেশ)।

Turn Left
    Rotate the robot 90˚ counterclockwise
    Abbreviated as "l"

Turn Right
    Rotate the robot 90˚ clockwise
    Abbreviated as "r"

Move
    Move one space forwards
    Abbreviated as "m"

Put Beeper
    Put a beeper on the spot that Karel is on
    Abbreviated as "p"

Drop Beeper
    Move, then Put Beeper
    Abbreviated as "d"

Turn Around
    Turn Left, then Turn Left
    Abbreviated as "a"

পরিবেশ

রোবট অবশ্যই নিম্নলিখিত ক্রমে এগিয়ে যেতে হবে।

  • নূন্যতম অঞ্চলের 5xN আয়তক্ষেত্রের নীচে বাম কোণে রোবটটি শুরু হবে চিঠিটি আঁকতে হবে।
  • রোবট চিঠিটি আঁকবে।
  • রোবটটি আয়তক্ষেত্রের নীচে ডান কোণে চলে আসে।
  • রোবট দুটি স্পেস ডানদিকে নিয়ে যায় এবং অবশ্যই উত্তর / উপরে মুখোমুখি হয়

একটি উদাহরণ মাধ্যমে কাজ করা যাক। ধরুন আমরা আকর্ষণ করতে চাই A। রোবটের অবস্থান হ'ল অক্ষর যা এর দিক নির্দেশ করে (উত্তর, দক্ষিণ, পূর্ব, পশ্চিম)। চিঠিটি মূলধন করা হয় যদি রোবটটি একটি বিপার এবং ছোট হাতের স্পট নিয়ে থাকে তবে যদি রোবটটি কোনও বিপার ছাড়াই কোনও স্থানে থাকে। oবিপার এবং দাগগুলি উপস্থাপন করে. বিপার ছাড়াই দাগগুলি উপস্থাপন করে।

আমরা পরে দেখতে হবে, Aএটি হয়।

.ooo.
o...o
ooooo
o...o
o...o

এখানে একটি সম্ভাব্য সমাধান।

Grids   .....   .....   .....   .....   .....   .....   .....   .....   .....
        .....   .....   .....   .....   .....   .....   .....   .....   .....
        .....   .....   .....   N....   E....   oE...   ooE..   oooE.   oooW.
        .....   .....   N....   o....   o....   o....   o....   o....   o....
        n....   N....   o....   o....   o....   o....   o....   o....   o....

Letters           p       d       d       r       d       d       d       a

        .....   .....   .....   .....   .....   n....   e....   .E...   .oE..
        .....   .....   .....   .....   N....   o....   o....   o....   o....
        ooWo.   oWoo.   Wooo.   Nooo.   oooo.   oooo.   oooo.   oooo.   oooo.
        o....   o....   o....   o....   o....   o....   o....   o....   o....
        o....   o....   o....   o....   o....   o....   o....   o....   o....

          m       m       m       r       d       m       r       d       d

        .ooE.   .oooe   .ooos   .ooo.   .ooo.   .ooo.   .ooo.   .ooo.
        o....   o....   o....   o...S   o...o   o...o   o...o   o...o
        oooo.   oooo.   oooo.   oooo.   ooooS   ooooo   ooooo   ooooo
        o....   o....   o....   o....   o....   o...S   o...o   o...o
        o....   o....   o....   o....   o....   o....   o...S   o...E

          d       m       r       d       d       d       d       l

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

সুতরাং, একটি সমাধান করা Aহয় pddrdddammmrdmrdddmrddddlmml

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


কার্যক্রম

আপনার প্রোগ্রামটি তার ইনপুট হিসাবে লেটারের গ্রিডটি কী হবে তার একটি 5xN গ্রিড গ্রহণ করবে। নোট করুন যে ইনপুটটিতে কোনও রোবট নেই; রোবটটি উত্তর দিকে মুখ করে নীচে বাম দিকে (দক্ষিণ-পশ্চিম) কোণে রয়েছে বলে ধারণা করা হচ্ছে।

আউটপুট হ'ল অক্ষরের ক্রম যা ক্রমের জন্য শর্টহ্যান্ড।

নমুনা ইনপুট

.ooo.
o...o
ooooo
o...o
o...o

o...o.ooooo
o...o...o..
ooooo...o..
o...o...o..
o...o.ooooo

নমুনা আউটপুট

pddrdddammmrdmrdddmrddddlmml

prmmmlmlmmdrdrdddlmlmmdrdrmmmdrddddlmmlprdddlmldmmrmrmdmlmldmmrdrddddrmmmdlmml

এটি কোড গল্ফ, ফেলা। স্ট্যান্ডার্ড সিজি বিধি প্রযোজ্য। বাইটস মধ্যে সংক্ষিপ্ত কোড।


বোনাস রাউন্ড

বিধি

আপনি যদি বোনাস রাউন্ডে অংশ নিতে চান তবে আপনার কোডগুলি মুভি-দক্ষ করে তোলার বিষয়ে নিশ্চিত হন! নীচে আমার প্রোগ্রামটি যখন চলতে থাকে তখন তৈরি 5x5 অক্ষরের সমস্ত একটি গ্রন্থাগার রয়েছে। বোনাস রাউন্ডের উদ্দেশ্য হ'ল এমন একটি প্রোগ্রাম লিখুন যা এর জন্য একটি সিকোয়েন্স মুদ্রণ ABCDEFGHIJKLMNOPQRSTUVWXYZকরে যতটা সম্ভব কম পদক্ষেপ থাকে। STDIN এ কোনও ইনপুট নেই। কোড কোডের দৈর্ঘ্যে নয় বরং এর "মুভ স্কোর" এ গ্রেড করা হবে । সরানো স্কোরটি সুইপার অ্যালগরিদমগুলিকে নিরুৎসাহিত করার জন্য ডিজাইন করা হয়েছে যা আয়তক্ষেত্রের প্রতিটি পয়েন্ট দেখতে আসে।

d: 1
l: 1
m: 4
p: 1
r: 1

চিঠিপত্র

.ooo.   oooo.   ooooo   oooo.   ooooo   ooooo   .oooo   o...o
o...o   o...o   o....   o...o   o....   o....   o....   o...o
ooooo   oooo.   o....   o...o   oooo    oooo.   o.ooo   ooooo
o...o   o...o   o....   o...o   o....   o....   o...o   o...o
o...o   oooo.   ooooo   oooo.   ooooo   o....   oooo.   o...o

ooooo   ....o   o...o   o....   ooooo   o...o   ooooo   oooo.
..o..   ....o   o..o.   o....   o.o.o   oo..o   o...o   o...o
..o..   ....o   oo...   o....   o.o.o   o.o.o   o...o   oooo.
..o..   o...o   o..o.   o....   o...o   o..oo   o...o   o....
ooooo   .ooo.   o...o   ooooo   o...o   o...o   ooooo   o....

oooo.   oooo.   ooooo   ooooo   o...o   o...o   o...o   o...o
o..o.   o...o   o....   ..o..   o...o   o...o   o...o   .o.o.
o..o.   oooo.   ooooo   ..o..   o...o   .o.o.   o.o.o   ..o..
oooo.   o..o.   ....o   ..o..   o...o   .o.o.   o.o.o   .o.o.
....o   o...o   ooooo   ..o..   ooooo   ..o..   ooooo   o...o

o...o   ooooo
.o.o.   ...o.
..o..   ..o..
.o...   .o...
o....   ooooo

মূল চ্যালেঞ্জ হিসাবে একই পদ্ধতি অনুসরণ করতে হবে: প্রতিটি অক্ষরের মধ্যে একটি স্থান পৃথকীকরণের সাথে অক্ষরগুলি একবারে আঁকতে হবে।

স্ট্যান্ডার্ড সিজি বিধি প্রযোজ্য। সর্বনিম্ন মুভ স্কোর জিততে প্রবেশ করুন।




সংক্ষিপ্তসার হিসাবে, উভয় কোডই মূলত একই জিনিস করবে। প্রথম কোডটিতে কোডে ন্যূনতম সংখ্যক বাইট থাকতে হবে এবং দ্বিতীয় কোডের মধ্যে ন্যূনতম চালের সংখ্যা ব্যবহার করা উচিত।


ঝরঝরে চ্যালেঞ্জ - কেন আপনি নিম্নচালিত হচ্ছেন তা ধারণা নেই।
দেউসোভি

1
ধন্যবাদ @ দেউসোভি। আমি আশা করি তারা ব্যাখ্যা করতেন কেন তাই আমি এমন কোনও কিছু সাফ করতে পারি যা বোধগম্য হয় না বা এটি উন্নত করে না।
আর্কটরাস

" কারেল (রোবট) কেবল পাঁচটি ক্রিয়া সম্পাদন করার জন্য ": আমি মনে করি আপনি " সক্ষম " মিস করছেন , এবং আপনি অবশ্যই পঞ্চম ক্রিয়াটি মিস করছেন। এবং আমি নিশ্চিত নন যে বোনাস রাউন্ডটি কী: আপনি যে সমাধানটি সবচেয়ে ভাল সমাধান লিখেছেন তাকে কি কোনও অনুদান প্রদান করতে যাচ্ছেন?
পিটার টেলর

সম্ভবত একটি কোড গল্ফ চ্যালেঞ্জ পরিবর্তে এটি একটি ন্যূনতম পদক্ষেপ গল্ফ চ্যালেঞ্জ পরিবর্তন? যেহেতু এটি দক্ষতা সম্পর্কে।
LukStorms

1
সীমিত সেটগুলির চাল সহ একটি ন্যূনতম সরানো চ্যালেঞ্জ কোড গল্ফ অংশ ব্যতীত আকর্ষণীয় নয়। এটি সর্বোত্তম পথ বিএফএসের পক্ষে বেশ সহজ হওয়া উচিত।
bopjesvla

উত্তর:


5

perl -p0, 60 56 54 + 2 বাইট

গলফ

/
/;$:="m"x"@-";$_=mmmmlma.s/
/rmr$:a/gr.mml;y/.o/md/;

মন্তব্য

/\n/; # capture the length of the first line
$:="m"x"@-"; # assign a string of m's with that length to $:
s/^/mmmmlmll/; # move to the starting position (-1,0)
s/\n/rmr$:rr/g; # replace all newlines with kareliage returns
y/.o/md/; # replace dots with moves and o's with drops
s/$/mml/; # append mml

পার্ল প্রশ্নে গল্ফ@- করার টিপসের উপর ভাগ করে নেওয়ার জন্য দুর্দান্ত ব্যবহার হতে পারে !
ডোম হেস্টিংস

2

জাভাস্ক্রিপ্ট (ES6), 91

প্রাথমিক চ্যালেঞ্জের জন্য প্রথম চেষ্টা।

নীচে স্নিপেটটি একটি ইকামাস্ক্রিপ্ট comp অনুবর্তী ব্রাউজারে চালিত করে পরীক্ষা করুন (ফায়ারফক্সে পরীক্ষিত)

বোনাস চ্যালেঞ্জ উত্তর - সম্পূর্ণ বর্ণমালার জন্য স্কোর = 869

ফায়ারফক্সে নীচে উইনিপেট চালানোর পরীক্ষা করুন (আরও ভাল পূর্ণ পর্দা)

আমি স্থির ইনপুট / স্থির আউটপুট চ্যালেঞ্জগুলি পছন্দ না করায় আপনি নিজের ইনপুটটি চেষ্টা করতে পারেন। শুধু মনে রাখবেন, কেবল অক্ষরগুলি মুদ্রিত হবে।

// Optimal - working on small pattern but too slow (scale bad)
// So I build the total command letter by letter - that surely is NOT globally optimal

Key=sol=>sol.pos+' '+sol.setBits

Solve=(target, startRow, startDir, cmd)=>{
  // Target is a rectangle string 5x5, newline separated for total (5+1)*5 chars
  if (target[target.length-1] != '\n') target += '\n';
  
  var T = ~new Date()
  var width = 5, height = 5, startPos = (width+1)*startRow;
  var offset = [-width-1, 1, width+1, -1];
  var turns = [ "", "r", "rr", "l" ];
  var cmds = [ "m", "rm", "rrm", "lm", "d", "rd", "rrd", "ld" ];
  var visited = {}, scan =[[],[],[],[],[],[],[],[]], cscan;
  
  var baseSol = { steps:[], pos: startPos, dir: startDir, setBits: 0};
  var score = 0, j = 0
  var bit, key, turn, curSol, move, result
  var targetBits = 0; 
  [...target].map((c,i)=>targetBits |= ((c=='o')<<i)) // 30 bits
  
  // First step, from outside, set bit in mask if it's set in target
  if (target[startPos]=='o') baseSol.setBits = 1<<startPos;
  console.log(target, targetBits.toString(16))
  visited[Key(baseSol)] = scan[0].push(baseSol);
  

  for (j = 0; j<99; j++)
  {
     cscan = scan[j];
     scan.push([])
     
     // console.log(`T: ${T-~new Date} J: ${j} SC: ${cscan.length}`)
     while (cscan.length > 0)
     {
        baseSol = cscan.pop()
        //console.log('Base', baseSol.dir, baseSol.pos, baseSol.setBits.toString(16), baseSol.steps.length)
        for(turn = 0; turn < 4; turn++)
        {
           // set direction, move and drop if you can
           curSol = {};
           curSol.dir = baseSol.dir + turn & 3;
           curSol.pos = baseSol.pos + offset[curSol.dir];
           // console.log(turn, curSol.dir, curSol.pos)
           if(target[curSol.pos] > ' '
              || curSol.dir == 1 && target[curSol.pos]=='\n'
             ) // if inside grid or on right border facing east
           {
              score = j + (turn == 2 ? 3 : turn == 0 ? 1 : 2);
              bit = 1 << curSol.pos;
              if (targetBits & bit)
                 curSol.setBits = baseSol.setBits | bit, move = 4 | turn;
              else
                 curSol.setBits = baseSol.setBits, score += 3, move = turn;
              if (!visited[key = Key(curSol)]) 
              {
                 curSol.steps = [...baseSol.steps, move] // clone and add
                 // task completed if on  right border and all bits ok
                 if (target[curSol.pos]>' ')
                 { // not on right border, proceed  
                    visited[key] = scan[score].push(curSol)
                 }  
                 else if (curSol.setBits == targetBits)
                 {
                    result = curSol.steps.map(v=>cmds[v]).join``
                    result = (cmd == '' 
                    ? target[startPos]=='o' ? 'p' : '' 
                    : target[startPos]=='o' ? 'd' : 'm') + result;
                    console.log(`T: ${T-~new Date} J: ${j} CMD: ${result}`)
                    return [cmd+result, curSol.pos / (width+1) | 0];
                 }
              }
           }
        }
     }
  }
  // Miserable failure!
  return []
}  

console.log=(...x)=>LOG.innerHTML+=x+'\n';
// TEST
Karel=(cmd, width, height) =>  // even if for this test we have a limited height to handle
{ 
  var grid = [...('.'.repeat(width)+'\n').repeat(height)],
  o = width+1,p = o*(height-2)+1,d = [-o, 1, o, -1], // direction offsets
  steps = [],s = [...grid],q = 0; // face up

  s[p] = 'n';
  steps.push([s.join``,'-']);
  
  [...cmd].forEach(c => 
    (
      c == 'l' ? q = q-1 &3
      : c == 'r' ? q = q+1 &3
      : c == 'a' ? q = q+2 &3
      : c == 'm' ? p += d[q]
      : c == 'p' ? grid[p] = 'o'
      : c == 'd' ? grid[p += d[q]] = 'o'
      : 0,
      s = [...grid],  
      s[p] = s[p] == 'o' ? 'NESW'[q] : 'nesw'[q],
      steps.push([s.join``,c])
    )
  )
  return [s.join``,steps]
}  


var AlphabetMap = `.ooo..oooo..ooooo.oooo..ooooo.ooooo..oooo.o...o.ooooo.....o.o...o.o.....ooooo.o...o.ooooo.oooo..oooo..oooo..ooooo.ooooo.o...o.o...o.o...o.o...o.o...o.ooooo
o...o.o...o.o.....o...o.o.....o.....o.....o...o...o.......o.o..o..o.....o.o.o.oo..o.o...o.o...o.o..o..o...o.o.......o...o...o.o...o.o...o..o.o...o.o.....o.
ooooo.oooo..o.....o...o.oooo..oooo..o.ooo.ooooo...o.......o.oo....o.....o.o.o.o.o.o.o...o.oooo..o..o..oooo..ooooo...o...o...o..o.o..o.o.o...o.....o.....o..
o...o.o...o.o.....o...o.o.....o.....o...o.o...o...o...o...o.o..o..o.....o...o.o..oo.o...o.o.....oooo..o..o......o...o...o...o..o.o..o.o.o..o.o...o.....o...
o...o.oooo..ooooo.oooo..ooooo.o.....oooo..o...o.ooooo..ooo..o...o.ooooo.o...o.o...o.ooooo.o.........o.o...o.ooooo...o...ooooo...o...ooooo.o...o.o.....ooooo`.split('\n')
var LetterMap = [];
var l,row,m;

for (l=0;l<26;l++)
{
  for(m='',row=0;row<5;row++)
    m += AlphabetMap[row].substr(l*6,5)+'\n'
  LetterMap[l]=m;  
}

print=Message=>{
  var Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  var startRow = 4, cmd=''
  var startDir = 0 // start facing UP
  ;[...Message].forEach(l => (
    [cmd, startRow] = Solve(LetterMap[Alphabet.search(l)], startRow, startDir, cmd),
    startDir = 1, // after each letter will be facing RIGHT
    cmd += '\n' // addin a newline (scoring 0) just for readability
  ))

  if (startRow != 4) 
    cmd += 'mr'+'m'.repeat(4-startRow)+'rr' // on last row and facing up
  else 
    cmd += 'ml' // ...facing up

  // Recalc score
  var score = 0
  ;[...cmd].forEach(c=>score += c=='m'? 4 : c<' '? 0: 1)

  var robot = Karel(cmd.replace(/\n/g,''), 26*7, 7)
  O.innerHTML=cmd+'\nScore:'+score
  R.innerHTML=robot[0]
  RS.innerHTML=robot[1].join`\n`
}  

function test()
{
  var msg = I.value.toUpperCase()
  msg=msg.replace(/[^A-Z]/g,'')
  I.value=msg
  print(I.value)
}

test()
fieldset {
  padding:0;
}

pre {
  margin: 2px;
}

#RS {
  height: 200px;
  width: 50%;
  overflow:auto;
}

#I { width: 50% }
<fieldset ><legend>Message to print</legend>
<input id=I value='ABCDEFGHIJKLMNOPQRSTUVWXYZ'><button onclick='test()'>go</button></fieldset>
<fieldset ><legend>Command Result (newlines added for readability)</legend>
<pre id=O></pre></fieldset>
<fieldset ><legend>Robot output</legend>
<pre id=R></pre></fieldset>
<fieldset ><legend>Robot step by step</legend>
<pre id=RS></pre></fieldset>
<fieldset ><legend>log</legend>
<pre id=LOG></pre></fieldset>


কেমন চলছে বোনাস?
আর্কটরাস

@ ইরান বোনাস ভাল চলছে দুর্ভাগ্যক্রমে আমার একটি চাকরিও আছে ... :)
edc65

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