Karel J. AlphaBot Dizi Üreteci


14

Skorlar

Gönderimler girildikçe bu bölüm doldurulacaktır.

Normal

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

Bonus Turu

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

Karel J. AlphaBot

Arka fon

Java için popüler bir tanıtım dersi Karel J. Robot'tur. (kendim kullanıyorum). Robot, bir ızgaralar (pozitif tamsayı y-koordinatları) ve caddeler (pozitif tamsayı x-koordinatları) ve ızgaraya yerleştirilebilecek ve depolanabilecek bip sesleri ile etkileşime girer (Karel ve herhangi bir bip sesi yalnızca kafes üzerinde mevcut olabilir puan). Karel (robot) sadece beş eylem gerçekleştirir: 1 ileri git, sola dön, bir bip sesi çıkar, bir bip sesi al ve kendini kapat.

Bilgisayar Bilimi dersimde ilk ödevlerimizden biri, Karel'i sağa dönmeyi, geri dönmeyi ve 1 ileri hareket etmenin ve bir bip sesi çıkarmanın birleşik eylemini nasıl yapacağını öğrenmek için programlamaktı. Birkaç gün sonra bir ödev bu yöntemleri kullanmak ve alfabenin harflerini üretmek için yeni yöntemler yazmaktı.

Doğal olarak, bu ödevi bitirdiğimde, alfabenin her harfini yapmak için daha fazla yöntem yazdım ve on sayısal haneyi yazdım ve bir tür kelime işlemcisini robottan nasıl çıkaracağımı anlamaya çalışıyorum, burada bir dize STDIN'e girer ve robot harflere benzeyen şekilde beepersı ızgaraya koyar.

Her private void draw#karakter için her yazışımda# , ihtiyacım olan komut dizisi için kısaltmaları söyleyecek bir yorum ekledim.

Benim emrinde (açıklama - bunlar sadece yararlı komutlar) aşağıdaki komutları (sözde kodla yazılmış ) var.

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"

Koşullar

Robot aşağıdaki sırada ilerlemelidir.

  • Robot, mektubun çizileceği minimum alanın 5xN dikdörtgeninin sol alt köşesinde başlar.
  • Robot mektubu çizer.
  • Robot, dikdörtgenin sağ alt köşesine hareket eder.
  • Robot iki boşluk sağa hareket eder ve kuzeye / yukarıya bakmalıdır

Bir örnek üzerinde çalışalım. Diyelim ki çizmek istiyoruz A. Robotun yeri, yönünü gösteren harftir (kuzey, güney, doğu, batı). Robot, sesli uyarı veren bir noktadaysa ve büyük harf, robot sesli uyarı vermeyen bir noktadaysa büyük harfle yazılır. osesli uyarı veren noktaları ve sesli uyarı .içermeyen noktaları temsil eder.

Daha sonra göreceğimiz gibi A, bu.

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

İşte olası bir çözüm.

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

mmlDördüncü mermiyi tamamlamak için final , her harfte göründüğü ve yukarıda önerilen çözümdeki her şeye geri dönmek ve iki sütun daha eklemek istemediğim için örtüktür.

Böylece yapılması Agereken bir çözüm pddrdddammmrdmrdddmrddddlmml.

Bunun çözümünüz olması gerekmediğini unutmayın. Algoritmanız, her bir bipten geçerek bip seslerini doğru yerlere yerleştirebilir ve diğer bip seslerinin yerleştirildiği veya yerleştirileceği yerlere güvenmeyebilir. Algoritmanız ne olursa olsun, robot ızgaradaki alan başına sadece bir bip sesi verebilir.


Program

Programınız girdisi olarak harfin ızgarasının 5xN ızgarasını alır. Girişte robot olmadığını unutmayın; robotun sol alt (güneybatı) köşede, kuzeye baktığı varsayılmaktadır.

Çıktı, sıra için kısayol olan harf sırası olacaktır.

Örnek girişler

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

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

Örnek çıktılar

pddrdddammmrdmrdddmrddddlmml

prmmmlmlmmdrdrdddlmlmmdrdrmmmdrddddlmmlprdddlmldmmrmrmdmlmldmmrdrddddrmmmdlmml

Bu kod golf, beyler. Standart CG kuralları geçerlidir. Bayt cinsinden en kısa kod kazanır.


Bonus Turu

kurallar

Bonus turuna katılmak istiyorsanız, kodlarınızı hareket ettirdiğinizden emin olun! Aşağıda, programımın çalıştığında oluşturduğu 5x5 harfin tümünü içeren bir kütüphane bulunmaktadır. Bonus turunun amacı ABCDEFGHIJKLMNOPQRSTUVWXYZ, olabildiğince az hareket içeren bir dizi yazdıran bir program yazmaktır . STDIN için girdi yok. Kod notlandırılacaktır değil kodunun uzunluğuna ama onun üzerinde "hareket skor." Hareket puanı, dikdörtgenin her noktasını ziyaret eden süpürme aracı algoritmalarını caydırmak için tasarlanmıştır.

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

harfler

.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

Orijinal sınama ile aynı prosedür izlenmelidir: harfler her harf arasında bir boşluk bırakarak teker teker çizilmelidir.

Standart CG kuralları geçerlidir. En düşük hamle puanı ile giriş kazanır.




Özetlemek gerekirse, her iki kod da aynı şeyleri yapacaktır. İlk kod, kodda en az sayıda bayt içermeli ve ikinci kod en az sayıda hamle kullanmalıdır.


Düzgün bir meydan okuma - neden aşağı indirildiğiniz hakkında hiçbir fikrim yok.
Deusovi

1
Teşekkürler @ Deusovi. Keşke nedenini açıklasalardı, böylece mantıklı olmayan veya iyileştirmeyen bir şeyi temizleyebilirim.
Arcturus

" Karel (robot) sadece beş eylem gerçekleştirmek için ": Bence " mümkün " eksik ve kesinlikle beşinci eylem eksik. Bonus turunun ne hakkında olduğundan emin değilim: en iyi çözümü yazan kişiye bir ödül verecek misiniz?
Peter Taylor

Belki bir kod golf meydan okuma yerine minimal hareket golf meydan okuma değiştirmek? Bu verimlilikle ilgili olduğu için.
LukStorms

1
Sınırlı bir hamle seti ile minimal bir hamle meydan okuması, kod golf kısmı olmadan ilginç değildir. Optimal yolu BFS yapmak oldukça kolay olmalıdır.
bopjesvla

Yanıtlar:


5

perl -p0, 60 56 54 + 2 bayt

golf

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

notlar

/\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

Güzel kullanımı, Perl soru golf ipuçları için@- paylaşmak için yararlı bir tane olabilir !
Dom Hastings

2

JavaScript (ES6), 91

Temel mücadeleye ilk denemede.

Aşağıdaki snippet'i EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin (Firefox'ta test edilmiştir)

BONUS CHALLENGE CEVAP - Tam alfabe puanı = 869

Aşağıdaki wnippet'i Firefox'ta çalıştırmayı test edin (daha iyi tam ekran)

Sabit giriş / sabit çıkış zorluklarını sevmediğim için girişinizi deneyebilirsiniz. Unutmayın, sadece harfler yazdırılır.

// 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>


Bonus nasıl gidiyor?
Arcturus

@Eridan bonusu iyi gidiyor. Ne yazık ki ben de bir işim var ... :)
edc65

Tamam! Seni suçlamıyorum. Bonusu deneyen tek kişi sensin.
Arcturus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.